From 89cd3d352da44960b6490ee7f2fe677aab840362 Mon Sep 17 00:00:00 2001 From: aarne Date: Tue, 17 Jan 2006 19:15:13 +0000 Subject: [PATCH] German numerals and almost all Basic --- lib/resource-1.0/german/BasicGer.gf | 191 ++++++++++++------------ lib/resource-1.0/german/CatGer.gf | 4 +- lib/resource-1.0/german/LangGer.gf | 2 +- lib/resource-1.0/german/MorphoGer.gf | 27 ++++ lib/resource-1.0/german/NounGer.gf | 10 +- lib/resource-1.0/german/NumeralGer.gf | 90 +++++------ lib/resource-1.0/german/ParadigmsGer.gf | 9 ++ lib/resource-1.0/german/ParamGer.gf | 2 +- lib/resource-1.0/german/QuestionGer.gf | 2 +- lib/resource-1.0/german/ResGer.gf | 26 ---- 10 files changed, 187 insertions(+), 176 deletions(-) diff --git a/lib/resource-1.0/german/BasicGer.gf b/lib/resource-1.0/german/BasicGer.gf index cf2ac0808..b4149afa7 100644 --- a/lib/resource-1.0/german/BasicGer.gf +++ b/lib/resource-1.0/german/BasicGer.gf @@ -7,7 +7,7 @@ flags lin airplane_N = regN "Flugzeug" ; - already_Adv = ss "schon" ; + already_Adv = mkAdv "schon" ; answer_V2S = mkV2S (regV "antworten") datPrep ; apartment_N = regN "Wohnung" ; apple_N = reg2N "Apfel" "Äpfel" masculine ; @@ -127,102 +127,101 @@ lin narrow_A = regA "schmal" ; new_A = regA "neu" ; newspaper_N = regN "Zeitung" ; -{- oil_N = regN "Öl" ; ---- - old_A = mkA "alt" "gammalt" "gamla" "gamla" "äldre" "äldst" "äldsta" ; - open_V2 = dirV2 (regV "öppna") ; - paint_V2A = mkV2A (regV "måla") [] ; - paper_N = mkN "papper" "pappret" "papper" "pappren" ; - peace_N = regN "fred" ; ---- ar? - pen_N = regN "penna" ; - planet_N = reg2N "planet" "planeter" ; - plastic_N = reg2N "plast" "plaster" ; - play_V2 = dirV2 (regV "spela") ; - policeman_N = reg2N "polis" "poliser" ; - priest_N = reg2N "präst" "präster" ; - probable_AS = mkAS (regA "sannolik") ; - queen_N = regN "drottning" ; - radio_N = regN "radio" ; ---- - rain_V0 = mkV0 (regV "regna") ; - read_V2 = dirV2 (mk2V "läsa" "läste") ; - red_A = mk2A "röd" "rött" ; - religion_N = reg2N "religion" "religioner" ; - restaurant_N = reg2N "restaurang" "restauranger" ; - river_N = mkN "å" "ån" "åar" "åarna" ; - rock_N = regN "sten" ; - roof_N = regN "tak" ; - rubber_N = mkN "gummi" "gummit" "gummin" "gummina" ; - run_V = (irregV "springa" "sprang" "sprungit") ; - say_VS = mkVS (mkV "säga" "säger" "säg" "sade" "sagt" "sagd") ; - school_N = regN "skola"; - science_N = reg2N "vetenskap" "vetenskaper" ; - sea_N = mkN "sjö" "sjön" "sjöar" "sjöarna" ; - seek_V2 = dirV2 (mk2V "söka" "sökte") ; - see_V2 = dirV2 (mkV "se" "ser" "se" "såg" "sett" "sedd") ; - sell_V3 = dirV3 (irregV "sälja" "sålde" "sålt") "till" ; - send_V3 = dirV3 (regV "skicka") "till" ; - sheep_N = reg2N "får" "får" ; - ship_N = regN "skepp" ; - shirt_N = regN "skjorta" ; - shoe_N = regN "sko" ; - shop_N = reg2N "affär" "affären" ; - short_A = regA "kort" ; - silver_N = mkN "silver" "silvret" "silver" "silvren" ; - sister_N = reg2N "syster" "systrar" ; - sleep_V = (irregV "sova" "sov" "sovit") ; - small_A = mkA "liten" "litet" "lilla" "små" "mindre" "minst" "minsta" ; - snake_N = regN "orm" ; - sock_N = regN "strumpa" ; - speak_V2 = dirV2 (regV "tala") ; - star_N = regN "stjärna" ; - steel_N = regN "stål" ; - stone_N = regN "sten" ; - stove_N = regN "spis" ; - student_N = reg2N "student" "studenter" ; - stupid_A = mk3A "dum" "dumt" "dumma" ; - sun_N = regN "sol" ; - switch8off_V2 = dirV2 (partV (irregV "stänga" "stängde" "stängt") "av") ; - switch8on_V2 = dirV2 (partV (irregV "slå" "slog" "slagit") "på") ; - table_N = regN "bord" ; - talk_V3 = mkV3 (regV "prata") "till" "om" ; - teacher_N = reg2N "lärare" "lärare" ; - teach_V2 = dirV2 (regV "undervisa") ; - television_N = reg2N "television" "televisioner" ; - thick_A = regA "tjock" ; - thin_A = mk2A "tunn" "tunt" ; - train_N = regN "tåg" ; - travel_V = mk2V "resa" "reste" ; - tree_N = regN "träd" ; + old_A = mkA "alt" "alt" "älter" "ältest" ; + open_V2 = dirV2 (regV "öffnen") ; + paint_V2A = + mkV2A (irregV "streichen" "streicht" "strich" "striche" "gestrichen") accPrep ; ---- + paper_N = reg2N "Papier" "Papiere" neuter ; + peace_N = regN "Frieden" ; ---- + pen_N = regN "Bleistift" ; ---- + planet_N = regN "Planete" ; ---- + plastic_N = reg2N "Plastik" "Plastiken" feminine ; ---- + play_V2 = dirV2 (regV "spielen") ; + policeman_N = reg2N "Polizist" "Polizisten" masculine ; + priest_N = regN "Priest" ; ---- + probable_AS = mkAS (regA "wahrscheinlich") ; + queen_N = reg2N "Königin" "königinnen" feminine ; + radio_N = reg2N "Radio" "Radios" neuter ; ---- + rain_V0 = mkV0 (regV "regnen") ; + read_V2 = dirV2 (irregV "lesen" "liest" "las" "läse" "gelesen") ; + red_A = regA "rot" ; + religion_N = regN "Religion" ; + restaurant_N = reg2N "Restaurant" "Restaurants" neuter ; + river_N = reg2N "Fluß" "Flüße" masculine ; + rock_N = regN "Stein" ; +---- roof_N = regN "tak" ; +---- rubber_N = mkN "gummi" "gummit" "gummin" "gummina" ; + run_V = seinV (irregV "laufen" "läuft" "lief" "liefe" "gelaufen") ; + say_VS = mkVS (regV "sagen") ; + school_N = regN "Schule"; + science_N = reg2N "Wissenschaft" "Wissenschaften" feminine ; + sea_N = reg2N "Meer" "Meere" neuter ; + seek_V2 = dirV2 (regV "suchen") ; + see_V2 = dirV2 (irregV "sehen" "sieht" "sah" "sähe" "gesehen") ; + sell_V3 = accdatV3 (regV "verkaufen") ; + send_V3 = accdatV3 (regV "schicken") ; + sheep_N = reg2N "Schaf" "Schäfe" feminine ; ---- + ship_N = regN "Schiff" ; ---- + shirt_N = reg2N "Hemd" "Hemde" neuter ; ---- + shoe_N = regN "Schuh" ; + shop_N = reg2N "Laden" "Läden" masculine ; + short_A = regA "kurz" ; + silver_N = reg2N "Silber" "Silber" neuter ; ---- + sister_N = reg2N "Schwester" "Schwester" feminine ; + sleep_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ; + small_A = regA "Klein" ; + snake_N = regN "Schlange" ; + sock_N = reg2N "Strumpf" "Strümpfe" masculine ; ---- + speak_V2 = dirV2 (irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen") ; + star_N = regN "Sterne" ; + steel_N = regN "Stahl" ; ---- + stone_N = regN "Stein" ; ---- +---- stove_N = regN "spis" ; + student_N = reg2N "Student" "Studenten" masculine ; + stupid_A = mkA "dumm" "dumm" "dümmer" "dümmst" ; ---- + sun_N = regN "Sonne" ; + switch8off_V2 = dirV2 (prefixV "aus" (regV "schalten")) ; + switch8on_V2 = dirV2 (prefixV "ein" (regV "schalten")) ; + table_N = regN "Tisch" ; + talk_V3 = mkV3 (regV "reden") datPrep von_Prep ; + teacher_N = reg2N "Lehrer" "Lehrer" masculine ; + teach_V2 = dirV2 (no_geV (regV "unterrichten")) ; + television_N = reg2N "Ferhsehen" "Fernsehen" neuter; + thick_A = regA "dick" ; + thin_A = regA "dünn" ; + train_N = reg2N "Zug" "Züge" masculine ; + travel_V = regV "reisen" ; + tree_N = reg2N "Baum" "Bäume" masculine ; ---- ---- trousers_N = regN "trousers" ; ---- pl t ! - ugly_A = regA "ful" ; - understand_V2 = dirV2 (mkV "förstå" "förstår" "förstå" "förstod" "förstått" "förstådd") ; - university_N = regN "universitet" ; - village_N = mkN "by" "byn" "byar" "byarna" ; - wait_V2 = mkV2 (regV "vänta") "på" ; - walk_V = (mkV "gå" "går" "gå" "gick" "gått" "gången") ; - warm_A = regA "varm" ; - war_N = regN "krig" ; - watch_V2 = mkV2 (regV "titta") "på" ; - water_N = mkN "vatten" "vattnet" "vatten" "vattnen" ; - white_A = regA "vit" ; - window_N = mkN "fönster" "fönstret" "fönster" "fönstren" ; - wine_N = mkN "vin" "vinet" "viner" "vinerna" ; ---- - win_V2 = dirV2 (irregV "vinna" "vann" "vunnit") ; - woman_N = regN "kvinna" ; - wonder_VQ = mkVQ (regV "undra") ; - wood_N = mkN "trä" "träet" "träen" "träena" ; ---- ? - write_V2 = dirV2 (irregV "skriva" "skrev" "skrivit") ; - yellow_A = regA "gul" ; - young_A = irregA "ung" "yngre" "yngst" ; + ugly_A = regA "häßlich" ; + understand_V2 = dirV2 (irregV "verstehen" "versteht" "verstand" "verstände" "verstanden") ; + university_N = reg2N "Universitet" "Universiteten" feminine ; + village_N = reg2N "Dorf" "Dörfer" neuter ; + wait_V2 = mkV2 (regV "warten") (mkPrep "auf" accusative) ; + walk_V = seinV (irregV "gehen" "geht" "ging" "ginge" "gegangen") ; + warm_A = mkA "warm" "warm" "wärmer" "wärmst" ; + war_N = regN "Krieg" ; ---- + watch_V2 = mkV2 (regV "schauen") (mkPrep "an" accusative) ; + water_N = reg2N "Wasser" "Wasser" neuter ; + white_A = regA "weiß" ; + window_N = reg2N "Fenster" "Fenster" neuter ; ---- + wine_N = regN "Wein" ; + win_V2 = dirV2 (irregV "gewinnen" "gewinnt" "gewann" "gewänne" "gewonnen") ; ---- + woman_N = reg2N "Frau" "Frauen" feminine ; + wonder_VQ = mkVQ (reflV (regV "wundern") accusative) ; ---- + wood_N = reg2N "Holz" "Hölzer" neuter ; ---- + write_V2 = dirV2 (irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben") ; + yellow_A = regA "gelb" ; + young_A = mkA "jung" "jung" "jünger" "jüngst" ; + + do_V2 = dirV2 (irregV "tun" "tut" "tat" "täte" "getan") ; + now_Adv = mkAdv "jetzt" ; + song_N = reg2N "Lied" "Lieder" neuter ; +-- add_V3 = mkV3 (partV (irregV "lägga" "lade" "lagt") "till") [] "till" ; + number_N = reg2N "Zahl" "Zahlen" feminine ; + put_V2 = dirV2 (regV "setzen") ; + stop_V = seinV (irregV "halten" "hält" "hielt" "hielte" "gehalten") ; +-- jump_V = regV "hoppa" ; - do_V2 = dirV2 (mkV "göra" "gör" "gör" "gjorde" "gjort" "gjord") ; - now_Adv = mkAdv "nu" ; - already_Adv = mkAdv "redan" ; - song_N = reg2N "sång" "sånger" ; - add_V3 = mkV3 (partV (irregV "lägga" "lade" "lagt") "till") [] "till" ; - number_N = mkN "nummer" "numret" "numren" "numren" ; - put_V2 = mkV2 (mkV "sätta" "sätter" "sätt" "satte" "satt" "satt") [] ; - stop_V = regV "stanna" ; - jump_V = regV "hoppa" ; --} } ; diff --git a/lib/resource-1.0/german/CatGer.gf b/lib/resource-1.0/german/CatGer.gf index 65f472ba9..0f4654f86 100644 --- a/lib/resource-1.0/german/CatGer.gf +++ b/lib/resource-1.0/german/CatGer.gf @@ -51,7 +51,7 @@ concrete CatGer of Cat = open ResGer, Prelude in { Det = {s : Gender => Case => Str ; n : Number ; a : Adjf} ; QuantSg, QuantPl = {s : Gender => Case => Str ; a : Adjf} ; Predet = {s : Number => Gender => Case => Str} ; - Num = {s : Gender => Case => Str} ; + Num = {s : Str} ; Ord = {s : AForm => Str} ; -- Adverb @@ -60,7 +60,7 @@ concrete CatGer of Cat = open ResGer, Prelude in { -- Numeral - Numeral = {s : CardOrd => Str ; n : Number} ; + Numeral = {s : CardOrd => Str} ; -- Structural diff --git a/lib/resource-1.0/german/LangGer.gf b/lib/resource-1.0/german/LangGer.gf index 80bf47227..ef10e4a1a 100644 --- a/lib/resource-1.0/german/LangGer.gf +++ b/lib/resource-1.0/german/LangGer.gf @@ -5,7 +5,7 @@ concrete LangGer of Lang = VerbGer, AdjectiveGer, AdverbGer, --- NumeralGer, + NumeralGer, SentenceGer, QuestionGer, RelativeGer, diff --git a/lib/resource-1.0/german/MorphoGer.gf b/lib/resource-1.0/german/MorphoGer.gf index aa6bf5108..d7c8d0f99 100644 --- a/lib/resource-1.0/german/MorphoGer.gf +++ b/lib/resource-1.0/german/MorphoGer.gf @@ -61,5 +61,32 @@ oper _ => Predef.tk 2 v } ; +-- For $Numeral$. + + LinDigit = {s : DForm => CardOrd => Str} ; + + cardOrd : Str -> Str -> CardOrd => Str = \drei,dritte -> + table { + NCard => drei ; + NOrd a => (regA (init dritte)).s ! Posit ! a + } ; + + cardReg : Str -> CardOrd => Str = \zehn -> + cardOrd zehn (zehn + "te") ; + + mkDigit : (x1,_,_,x4 : Str) -> LinDigit = + \drei,dreizehn,dreissig,dritte -> + {s = table { + DUnit => cardOrd drei dritte ; + DTeen => cardReg dreizehn ; + DTen => cardOrd dreissig (dreissig + "ste") + } + } ; + + regDigit : Str -> LinDigit = \vier -> + mkDigit vier (vier + "zehn") (vier + "zig") (vier + "te") ; + + invNum : CardOrd = NCard ; + } ; diff --git a/lib/resource-1.0/german/NounGer.gf b/lib/resource-1.0/german/NounGer.gf index fcf313035..38f6d9561 100644 --- a/lib/resource-1.0/german/NounGer.gf +++ b/lib/resource-1.0/german/NounGer.gf @@ -37,7 +37,7 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { a = quant.a in { s = \\g,c => quant.s ! g ! c ++ - num.s ! g ! c ++ ord.s ! agrAdj g (adjfCase a c) n c ; + num.s ++ ord.s ! agrAdj g (adjfCase a c) n c ; n = n ; a = a } ; @@ -54,16 +54,16 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { a = Weak } ; - NoNum = {s = \\_,_ => []} ; + NoNum = {s = []} ; NoOrd = {s = \\_ => []} ; - NumInt n = {s = \\_,_ => n.s} ; + NumInt n = {s = n.s} ; OrdInt n = {s = \\_ => n.s ++ "."} ; - NumNumeral numeral = {s = \\_,_ => numeral.s ! NCard} ; + NumNumeral numeral = {s = numeral.s ! NCard} ; OrdNumeral numeral = {s = \\af => numeral.s ! NOrd af} ; - AdNum adn num = {s = \\g,c => adn.s ++ num.s ! g ! c} ; + AdNum adn num = {s = adn.s ++ num.s} ; OrdSuperl a = {s = a.s ! Superl} ; diff --git a/lib/resource-1.0/german/NumeralGer.gf b/lib/resource-1.0/german/NumeralGer.gf index efc028483..cb641e3a2 100644 --- a/lib/resource-1.0/german/NumeralGer.gf +++ b/lib/resource-1.0/german/NumeralGer.gf @@ -1,44 +1,46 @@ ---concrete NumeralGer of Numeral = CatGer ** open ResGer in { --- ---lincat --- Digit = {s : DForm => CardOrd => Str} ; --- Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; --- Sub100 = {s : CardOrd => Str ; n : Number} ; --- Sub1000 = {s : CardOrd => Str ; n : Number} ; --- Sub1000000 = {s : CardOrd => Str ; n : Number} ; --- ---lin num x = x ; ---lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in --- {s = \\f,c => case of { --- => "twelfth" ; --- _ => two.s ! f ! c --- } --- } ; --- ---lin n3 = mkNum "three" "thirteen" "thirty" "third" ; ---lin n4 = mkNum "four" "fourteen" "forty" "fourth" ; ---lin n5 = mkNum "five" "fifteen" "fifty" "fifth" ; ---lin n6 = regNum "six" ; ---lin n7 = regNum "seven" ; ---lin n8 = mkNum "eight" "eighteen" "eighty" "eighth" ; ---lin n9 = regNum "nine" ; --- ---lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ; ---lin pot0 d = d ** {n = Pl} ; ---lin pot110 = regCardOrd "ten" ** {n = Pl} ; ---lin pot111 = regCardOrd "eleven" ** {n = Pl} ; ---lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ; ---lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ; ---lin pot1 d = {s = d.s ! ten} ** {n = Pl} ; ---lin pot1plus d e = { --- s = \\c => d.s ! ten ! NCard ++ "-" ++ e.s ! unit ! c ; n = Pl} ; ---lin pot1as2 n = n ; ---lin pot2 d = {s = \\c => d.s ! unit ! NCard ++ mkCard c "hundred"} ** {n = Pl} ; ---lin pot2plus d e = { --- s = \\c => d.s ! unit ! NCard ++ "hundred" ++ "and" ++ e.s ! c ; n = Pl} ; ---lin pot2as3 n = n ; ---lin pot3 n = { --- s = \\c => n.s ! NCard ++ mkCard c "thousand" ; n = Pl} ; ---lin pot3plus n m = { --- s = \\c => n.s ! NCard ++ "thousand" ++ m.s ! c ; n = Pl} ; ---} +concrete NumeralGer of Numeral = CatGer ** open MorphoGer in { + +lincat + Digit = {s : DForm => CardOrd => Str} ; + Sub10 = {s : DForm => CardOrd => Str} ; + Sub100, Sub1000, Sub1000000 = + {s : CardOrd => Str} ; + +lin + num x = x ; + + n2 = mkDigit "zwei" "zwölf" "zwanzig" "zweite" ; + n3 = mkDigit "drei" "dreizehn" "dreissig" "dritte" ; + n4 = regDigit "vier" ; + n5 = regDigit "fünf" ; + n6 = regDigit "sechs" ; + n7 = mkDigit "sieben" "siebzehn" "siebzig" "siebte" ; + n8 = mkDigit "acht" "achzehn" "achzig" "achte" ; + n9 = regDigit "neun" ; + + pot01 = { + s = \\f => table { + NCard => "ein" ; ---- + NOrd af => (regA "erst").s ! Posit ! af + } ; + n = Sg + } ; + pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ; + pot110 = {s = cardReg "zehn"} ; + pot111 = {s = cardReg "elf"} ; + pot1to19 d = {s = d.s ! DTeen} ; + pot0as1 n = {s = n.s ! DUnit} ; + pot1 d = {s = d.s ! DTen} ; + pot1plus d e = {s = \\g => e.s ! DUnit ! invNum ++ "und" ++ d.s ! DTen ! g} ; + pot1as2 n = n ; + pot2 d = + {s = \\g => d.s ! DUnit ! invNum ++ cardOrd "hundert" "hunderte" ! g} ; + pot2plus d e = + {s = \\g => d.s ! DUnit ! invNum ++ "hundert" ++ e.s ! g} ; + pot2as3 n = n ; + pot3 n = + {s = \\g => n.s ! invNum ++ cardOrd "tausend" "tausendte" ! g} ; ---- + pot3plus n m = + {s = \\g => n.s ! invNum ++ "tausend" ++ m.s ! g ; n = Pl} ; + +} \ No newline at end of file diff --git a/lib/resource-1.0/german/ParadigmsGer.gf b/lib/resource-1.0/german/ParadigmsGer.gf index 7e83849c3..89aaf1aee 100644 --- a/lib/resource-1.0/german/ParadigmsGer.gf +++ b/lib/resource-1.0/german/ParadigmsGer.gf @@ -122,6 +122,13 @@ oper mkA2 : A -> Prep -> A2 ; +--2 Adverbs + +-- Adverbs are just strings. + + mkAdv : Str -> Adv ; + + --2 Prepositions -- A preposition is formed from a string and a case. @@ -301,6 +308,8 @@ oper mkA2 = \a,p -> a ** {c2 = p ; lock_A2 = <>} ; + mkAdv s = {s = s ; lock_Adv = <>} ; + mkPrep s c = {s = s ; c = c ; lock_Prep = <>} ; accPrep = mkPrep [] accusative ; datPrep = mkPrep [] dative ; diff --git a/lib/resource-1.0/german/ParamGer.gf b/lib/resource-1.0/german/ParamGer.gf index 60b519225..ce005e0a2 100644 --- a/lib/resource-1.0/german/ParamGer.gf +++ b/lib/resource-1.0/german/ParamGer.gf @@ -73,7 +73,7 @@ resource ParamGer = ParamX ** { --2 For $Numeral$ CardOrd = NCard | NOrd AForm ; - DForm = unit | teen | ten ; + DForm = DUnit | DTeen | DTen ; --2 Transformations between parameter types diff --git a/lib/resource-1.0/german/QuestionGer.gf b/lib/resource-1.0/german/QuestionGer.gf index 1405a3718..3a5c2e5d8 100644 --- a/lib/resource-1.0/german/QuestionGer.gf +++ b/lib/resource-1.0/german/QuestionGer.gf @@ -61,7 +61,7 @@ concrete QuestionGer of Question = CatGer ** open ResGer in { n = idet.n in { s = \\c => - idet.s ! g ! c ++ num.s ! g ! c ++ ord.s ! agrAdj g Weak n c ++ + idet.s ! g ! c ++ num.s ++ ord.s ! agrAdj g Weak n c ++ cn.s ! Weak ! n ! c ; n = n } ; diff --git a/lib/resource-1.0/german/ResGer.gf b/lib/resource-1.0/german/ResGer.gf index f1d28704c..881d63630 100644 --- a/lib/resource-1.0/german/ResGer.gf +++ b/lib/resource-1.0/german/ResGer.gf @@ -385,30 +385,4 @@ resource ResGer = ParamGer ** open Prelude in { infPart : Bool -> Str = \b -> if_then_Str b [] "zu" ; --- For $Numeral$. --- --- mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} = --- \two, twelve, twenty, second -> --- {s = table { --- unit => table {NCard => two ; NOrd => second} ; --- teen => \\c => mkCard c twelve ; --- ten => \\c => mkCard c twenty --- } --- } ; --- --- regNum : Str -> {s : DForm => CardOrd => Str} = --- \six -> mkNum six (six + "teen") (six + "ty") (regOrd six) ; --- --- regCardOrd : Str -> {s : CardOrd => Str} = \ten -> --- {s = table {NCard => ten ; NOrd => regOrd ten}} ; --- --- mkCard : CardOrd -> Str -> Str = \c,ten -> --- (regCardOrd ten).s ! c ; --- --- regOrd : Str -> Str = \ten -> --- case last ten of { --- "y" => init ten + "ieth" ; --- _ => ten + "th" --- } ; --- }