diff --git a/lib/resource/danish/MorphoDan.gf b/lib/resource/danish/MorphoDan.gf index ec0a88da7..a057e022a 100644 --- a/lib/resource/danish/MorphoDan.gf +++ b/lib/resource/danish/MorphoDan.gf @@ -29,6 +29,11 @@ oper Gen => bil + "s" --- but: hus --> hus } ; + extNGen : Str -> NounGender = \s -> case last s of { + "n" => NUtr ; + _ => NNeutr + } ; + nDreng : Str -> Subst = \dreng -> mkSubstantive dreng (dreng + "en") (dreng + "e") (dreng + "ene") ** {h1 = Utr} ; @@ -67,6 +72,9 @@ oper aRask : Str -> Adj = \rask -> mkAdjective rask rask (rask + "e") (rask + "ere") (rask + "est") ; + extractPositive : Adj -> {s : AdjFormPos => Case => Str} = \adj -> + {s = \\a,c => adj.s ! (AF (Posit a) c)} ; + -- verbs mkVerb : (_,_,_,_,_,_ : Str) -> Verbum = @@ -81,6 +89,31 @@ oper } } ; + irregVerb : (drikke,drakk,drukket : Str) -> Verbum = + \drikke,drakk,drukket -> + let + drikk = init drikke ; + drikker = case last (init drikke) of { + "r" => drikk ; + _ => drikke + "r" + } + in + mkVerb drikke drikker (drikke + "s") drakk drukket drikk ; + + regVerb : Str -> Str -> Verbum = \spise, spiste -> + let + spis = init spise ; + te = Predef.dp 2 spiste + in + case te of { + "te" => vSpis spis ; + "de" => case last spise of { + "e" => vHusk spis ; + _ => vBo spise + } ; + _ => vHusk spis + } ; + mkVoice : Voice -> Str -> Str = \v,s -> case v of { Act => s ; Pass => s + case last s of { diff --git a/lib/resource/finnish/BasicFin.gf b/lib/resource/finnish/BasicFin.gf index 8ec732742..edd928a95 100644 --- a/lib/resource/finnish/BasicFin.gf +++ b/lib/resource/finnish/BasicFin.gf @@ -4,7 +4,6 @@ concrete BasicFin of Basic = CategoriesFin ** open ParadigmsFin in { flags - startcat=Phr ; lexer=textlit ; unlexer=text ; optimize=values ; lin @@ -12,133 +11,135 @@ lin airplane_N = regN "lentokone" ; answer_V2S = mkV2S (caseV2 (regV "vastata") allative) ; apartment_N = regN "asunto" ; - apple_N = regN "omena" ; --- omenia, not omenoita + apple_N = nLukko "omena" ; --- omenia, not omenoita art_N = regN "taide" ; ask_V2Q = mkV2Q (caseV2 (regV "kysyä") ablative) ; - baby_N = regN "vauva" ; - bad_ADeg = mkADeg (regN "paha") "pahempi" "pahin" ; + baby_N = nLukko "vauva" ; + bad_ADeg = mkADeg (nLukko "paha") "pahempi" "pahin" ; bank_N = regN "pankki" ; beautiful_ADeg = mkADeg (regN "kaunis") "kauniimpi" "kaunein" ; become_VA = mkVA (regV "tulla") translative ; beer_N = regN "olut" ; beg_V2V = mkV2V (caseV2 (reg2V "pyytää" "pyysi") partitive) ; - big_ADeg = mkADeg (reg2N "suuri" "suuria") "suurempi" "suurin" ; + big_ADeg = mkADeg (sgpartN (nArpi "suuri") "suurta") "suurempi" "suurin" ; bike_N = nLukko "polkupyörä" ; --- for correct vowel harmony - bird_N = regN "lintu" ; - black_ADeg = mkADeg (regN "musta") "mustempi" "mustin" ; + bird_N = nLukko "lintu" ; + black_ADeg = mkADeg (nLukko "musta") "mustempi" "mustin" ; blue_ADeg = mkADeg (regN "sininen") "sinisempi" "sinisin" ; boat_N = regN "vene" ; - book_N = regN "kirja" ; + book_N = nLukko "kirja" ; boot_N = regN "saapas" ; - boss_N = regN "pomo" ; - boy_N = reg3N "poika" "pojan" "poikia" ; - bread_N = regN "leipä" ; + boss_N = nLukko "pomo" ; + boy_N = nKukko "poika" "pojan" "poikia" ; + bread_N = nLukko "leipä" ; break_V2 = dirV2 (regV "rikkoa") ; broad_ADeg = mkADeg (regN "leveä") "leveämpi" "levein" ; - brother_N2 = genN2 (reg3N "veli" "veljen" "veljiä") ; ---- errors in Pl + brother_N2 = genN2 ( + mkN "veli" "veljen" "veljenä" "veljeä" "veljeen" + "veljinä" "veljissä" "veljien" "veljiä" "veljiin" human) ; brown_ADeg = mkADeg (regN "ruskea") "ruskeampi" "ruskein" ; butter_N = reg3N "voi" "voin" "voita" ; ---- errors in Part buy_V2 = dirV2 (regV "ostaa") ; - camera_N = regN "kamera" ; + camera_N = nLukko "kamera" ; cap_N = regN "lakki" ; car_N = reg3N "auto" "auton" "autoja" ; -- regN: audon - carpet_N = regN "matto" ; - cat_N = regN "kissa" ; - ceiling_N = regN "katto" ; + carpet_N = nLukko "matto" ; + cat_N = nLukko "kissa" ; + ceiling_N = nLukko "katto" ; chair_N = regN "tuoli" ; - cheese_N = regN "juusto" ; + cheese_N = nLukko "juusto" ; child_N = mkN "lapsi" "lapsen" "lapsena" "lasta" "lapseen" "lapsina" "lapsissa" "lasten" "lapsia" "lapsiin" human ; - church_N = regN "kirkko" ; + church_N = nLukko "kirkko" ; city_N = regN "kaupunki" ; clean_ADeg = regADeg "puhdas" ; clever_ADeg = regADeg "viisas" ; close_V2 = dirV2 (regV "sulkea") ; coat_N = regN "takki" ; - cold_ADeg = mkADeg (regN "kylmä") "kylmempi" "kylmin" ; + cold_ADeg = mkADeg (nLukko "kylmä") "kylmempi" "kylmin" ; come_V = regV "tulla" ; computer_N = regN "tietokone" ; country_N = regN "maa" ; - cousin_N = regN "serkku" ; - cow_N = regN "lehmä" ; + cousin_N = nLukko "serkku" ; + cow_N = nLukko "lehmä" ; die_V = regV "kuolla" ; dirty_ADeg = mkADeg (regN "likainen") "likaisempi" "likaisin" ; distance_N3 = mkN3 (regN "etäisyys") elative illative ; doctor_N = reg2N "tohtori" "tohtoreita" ; - dog_N = regN "koira" ; - door_N = reg2N "ovi" "ovia" ; + dog_N = nLukko "koira" ; + door_N = nArpi "ovi" ; drink_V2 = dirV2 (regV "juoda") ; - easy_A2V = mkA2V (mkA2 (mkA (regN "helppo")) allative) ; + easy_A2V = mkA2V (mkA2 (mkA (nLukko "helppo")) allative) ; eat_V2 = dirV2 (regV "syödä") ; - empty_ADeg = mkADeg (regN "tyhjä") "tyhjempi" "tyhjin" ; + empty_ADeg = mkADeg (nLukko "tyhjä") "tyhjempi" "tyhjin" ; enemy_N = regN "vihollinen" ; factory_N = regN "tehdas" ; - father_N2 = genN2 (regN "isä") ; + father_N2 = genN2 (nLukko "isä") ; fear_VS = mkVS (reg2V "pelätä" "pelkäsi") ; find_V2 = dirV2 (reg2V "löytää" "löysi") ; - fish_N = regN "kala" ; + fish_N = nLukko "kala" ; floor_N = reg2N "lattia" "lattioita" ; forget_V2 = dirV2 (regV "unohtaa") ; fridge_N = regN "jääkaappi" ; - friend_N = regN "ystävä" ; - fruit_N = regN "hedelmä" ; - fun_AV = mkAV (mkA (regN "hauska")) ; - garden_N = regN "puutarha" ; - girl_N = regN "tyttö" ; + friend_N = nLukko "ystävä" ; + fruit_N = nLukko "hedelmä" ; + fun_AV = mkAV (mkA (nLukko "hauska")) ; + garden_N = nKukko "puutarha" "puutarhan" "puutarhoja" ; + girl_N = nLukko "tyttö" ; glove_N = regN "käsine" ; - gold_N = regN "kulta" ; - good_ADeg = mkADeg (regN "hyvä") "parempi" "parhain" ; --- paras + gold_N = nLukko "kulta" ; + good_ADeg = mkADeg (nLukko "hyvä") "parempi" "parhain" ; --- paras go_V = regV "mennä" ; green_ADeg = mkADeg (regN "vihreä") "vihreämpi" "vihrein" ; - harbour_N = reg3N "satama" "sataman" "satamia" ; + harbour_N = nKukko "satama" "sataman" "satamia" ; hate_V2 = dirV2 (regV "vihata") ; - hat_N = regN "hattu" ; + hat_N = nLukko "hattu" ; have_V2 = dirV2 (caseV adessive vOlla) ; hear_V2 = dirV2 (regV "kuulla") ; - hill_N = regN "kukkula" ; + hill_N = nLukko "kukkula" ; hope_VS = mkVS (regV "toivoa") ; horse_N = regN "hevonen" ; - hot_ADeg = mkADeg (regN "kuuma") "kuumempi" "kuumin" ; - house_N = regN "talo" ; + hot_ADeg = mkADeg (nLukko "kuuma") "kuumempi" "kuumin" ; + house_N = nLukko "talo" ; important_ADeg = mkADeg (regN "tärkeä") "tärkeämpi" "tärkein" ; industry_N = regN "teollisuus" ; - iron_N = regN "rauta" ; + iron_N = nLukko "rauta" ; king_N = regN "kuningas" ; know_V2 = dirV2 (reg2V "tietää" "tiesi") ; --- tuntea; gives tietänyt - lake_N = reg2N "järvi" "järviä" ; - lamp_N = regN "lamppu" ; + lake_N = nSylki "järvi" ; + lamp_N = nLukko "lamppu" ; learn_V2 = dirV2 (mkV "oppia" "oppii" "opin" "oppivat" "oppikaa" "opitaan" "oppi" "opin" "oppisi" "oppinut" "opittu" "opitun") ; - leather_N = regN "nahka" ; --- nahan + leather_N = nLukko "nahka" ; --- nahan leave_V2 = dirV2 (regV "jättää") ; like_V2 = caseV2 (regV "pitää") elative ; listen_V2 = caseV2 (reg3V "kuunnella" "kuuntelen" "kuunteli") partitive ; live_V = regV "elää" ; - long_ADeg = mkADeg (regN "pitkä") "pitempi" "pisin" ; + long_ADeg = mkADeg (nLukko "pitkä") "pitempi" "pisin" ; lose_V2 = dirV2 (regV "hävitä") ; --- hukata love_N = reg3N "rakkaus" "rakkauden" "rakkauksia" ; love_V2 = caseV2 (regV "rakastaa") partitive ; man_N = mkN "mies" "miehen" "miehenä" "miestä" "mieheen" "miehinä" "miehissä" "miesten" "miehiä" "miehiin" human ; ---- married_A2 = mkA2 (regA "married") "to" ; - meat_N = regN "liha" ; - milk_N = regN "maito" ; + meat_N = nLukko "liha" ; + milk_N = nLukko "maito" ; moon_N = regN "kuu" ; mother_N2 = genN2 (regN "äiti") ; - mountain_N = reg2N "vuori" "vuoria" ; + mountain_N = nArpi "vuori" ; music_N = regN "musiikki" ; narrow_ADeg = mkADeg (regN "kapea") "kapeampi" "kapein" ; new_ADeg = mkADeg (reg3N "uusi" "uuden" "uusia") "uudempi" "uusin" ; newspaper_N = nSylki "sanomalehti" ; --- for correct vowel harmony - oil_N = regN "öljy" ; - old_ADeg = mkADeg (regN "vanha") "vanhempi" "vanhin" ; + oil_N = nLukko "öljy" ; + old_ADeg = mkADeg (nLukko "vanha") "vanhempi" "vanhin" ; open_V2 = dirV2 (regV "avata") ; paint_V2A = mkV2A (dirV2 (regV "maalata")) translative ; paper_N = reg2N "paperi" "papereita" ; - peace_N = regN "rauha" ; - pen_N = regN "kynä" ; - planet_N = regN "planeetta" ; + peace_N = nLukko "rauha" ; + pen_N = nLukko "kynä" ; + planet_N = nLukko "planeetta" ; plastic_N = regN "muovi" ; play_V2 = dirV2 (regV "pelata") ; --- leikkiä, soittaa policeman_N = regN "poliisi" ; @@ -149,15 +150,15 @@ lin rain_V0 = mkV0 (reg2V "sataa" "satoi") ; read_V2 = dirV2 (regV "lukea") ; red_ADeg = regADeg "punainen" ; - religion_N = regN "uskonto" ; - restaurant_N = regN "ravintola" ; + religion_N = nLukko "uskonto" ; + restaurant_N = nLukko "ravintola" ; river_N = nArpi "joki" ; rock_N = reg2N "kallio" "kallioita" ; - roof_N = regN "katto" ; + roof_N = nLukko "katto" ; rubber_N = regN "kumi" ; run_V = reg2V "juosta" "juoksi" ; say_VS = mkVS (regV "sanoa") ; - school_N = regN "koulu" ; + school_N = nLukko "koulu" ; science_N = regN "tiede" ; sea_N = nMeri "meri" ; seek_V2 = dirV2 (regV "etsiä") ; @@ -167,42 +168,42 @@ lin sell_V3 = dirV3 (regV "myydä") allative ; send_V3 = dirV3 (regV "lähettää") allative ; sheep_N = regN "lammas" ; - ship_N = regN "laiva" ; - shirt_N = regN "paita" ; - shoe_N = regN "kenkä" ; - shop_N = regN "kauppa" ; + ship_N = nLukko "laiva" ; + shirt_N = nLukko "paita" ; + shoe_N = nLukko "kenkä" ; + shop_N = nLukko "kauppa" ; short_ADeg = regADeg "lyhyt" ; silver_N = regN "hopea" ; - sister_N = regN "sisko" ; + sister_N = nLukko "sisko" ; sleep_V = regV "nukkua" ; - small_ADeg = mkADeg (reg3N "pieni" "pienen" "pieniä") "pienempi" "pienin" ; + small_ADeg = mkADeg (reg2N "pieni" "pieniä") "pienempi" "pienin" ; snake_N = regN "käärme" ; - sock_N = regN "sukka" ; + sock_N = nLukko "sukka" ; speak_V2 = dirV2 (regV "puhua") ; - star_N = reg2N "tähti" "tähtiä" ; + star_N = nSylki "tähti" ; steel_N = regN "teräs" ; - stone_N = reg2N "kivi" "kiviä" ; + stone_N = nSylki "kivi" ; stove_N = reg3N "liesi" "lieden" "liesiä" ; student_N = reg2N "opiskelija" "opiskelijoita" ; stupid_ADeg = regADeg "tyhmä" ; - sun_N = regN "aurinko" ; + sun_N = nLukko "aurinko" ; switch8off_V2 = dirV2 (regV "sammuttaa") ; --- switch8on_V2 = dirV2 (regV "sytyttää") ; --- - table_N = regN "pöytä" ; + table_N = nLukko "pöytä" ; talk_V3 = mkV3 (regV "puhua") (caseP allative) (caseP elative) ; - teacher_N = regN "opettaja" ; + teacher_N = nLukko "opettaja" ; teach_V2 = dirV2 (regV "opettaa") ; - television_N = reg2N "televisio" "telievisioita" ; + television_N = reg2N "televisio" "televisioita" ; thick_ADeg = regADeg "paksu" ; thin_ADeg = regADeg "ohut" ; - train_N = regN "juna" ; + train_N = nLukko "juna" ; travel_V = regV "matkustaa" ; tree_N = regN "puu" ; ---- trousers_N = regN "trousers" ; - ugly_ADeg = mkADeg (regN "ruma") "rumempi" "rumin" ; + ugly_ADeg = mkADeg (nLukko "ruma") "rumempi" "rumin" ; understand_V2 = dirV2 (reg3V "ymmärtää" "ymmärrän" "ymmärsi") ; - university_N = regN "yliopisto" ; - village_N = regN "kylä" ; + university_N = nLukko "yliopisto" ; + village_N = nLukko "kylä" ; wait_V2 = caseV2 (regV "odottaa") partitive ; walk_V = regV "kävellä" ; warm_ADeg = mkADeg @@ -210,7 +211,7 @@ lin "lämpiminä" "lämpimissä" "lämpimien" "lämpimiä" "lämpimiin" nonhuman) "lämpimämpi" "lämpimin" ; - war_N = regN "sota" ; + war_N = nLukko "sota" ; watch_V2 = dirV2 (regV "katsella") ; water_N = reg3N "vesi" "veden" "vesiä" ; white_ADeg = regADeg "valkoinen" ; @@ -222,7 +223,7 @@ lin wood_N = regN "puu" ; write_V2 = dirV2 (regV "kirjoittaa") ; yellow_ADeg = regADeg "keltainen" ; - young_ADeg = mkADeg (reg2N "nuori" "nuoria") "nuorempi" "nuorin" ; + young_ADeg = mkADeg (nArpi "nuori") "nuorempi" "nuorin" ; do_V2 = dirV2 ( mkV "tehdä" "tekee" "teen" "tekevät" "tehkää" "tehdään" @@ -230,7 +231,7 @@ lin now_Adv = mkAdv "nyt" ; already_Adv = mkAdv "jo" ; - song_N = regN "laulu" ; + song_N = nLukko "laulu" ; add_V3 = dirV3 (regV "lisätä") illative ; number_N = reg2N "numero" "numeroita" ; put_V2 = dirV2 (regV "panna") ; diff --git a/lib/resource/finnish/ClauseFin.gf b/lib/resource/finnish/ClauseFin.gf index 2b2c8eaf0..ce9762136 100644 --- a/lib/resource/finnish/ClauseFin.gf +++ b/lib/resource/finnish/ClauseFin.gf @@ -22,7 +22,7 @@ concrete ClauseFin of Clause = CategoriesFin ** ---- (reflPronNounPhrase (pgen2gen subj.g) subj.n subj.p)) ; SPredVS subj verb sent = sats2clause ( - insertComplement (mkSats subj verb) sent.s) ; + insertComplement (mkSats subj verb) (embedConj ++ sent.s)) ; SPredVQ subj verb quest = sats2clause ( insertComplement (mkSats subj verb) quest.s) ; @@ -30,7 +30,7 @@ concrete ClauseFin of Clause = CategoriesFin ** sats2clause ( insertComplement (mkSatsObject subj verb obj) - sent.s + (embedConj ++ sent.s) ) ; SPredV2Q subj verb obj quest = sats2clause ( diff --git a/lib/resource/finnish/MorphoFin.gf b/lib/resource/finnish/MorphoFin.gf index 2e78152ea..b75cf9647 100644 --- a/lib/resource/finnish/MorphoFin.gf +++ b/lib/resource/finnish/MorphoFin.gf @@ -18,10 +18,41 @@ resource MorphoFin = TypesFin ** open Prelude in { oper + NounH : Type = { + a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin : Str + } ; + -- worst-case macro - mkSubst : Str -> (_,_,_,_,_,_,_,_,_,_ : Str) -> CommonNoun = + mkSubst : Str -> (_,_,_,_,_,_,_,_,_,_ : Str) -> NounH = \a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin -> + {a = a ; + vesi = vesi ; + vede = vede ; + vete = vete ; + vetta = vetta ; + veteen = veteen ; + vetii = vetii ; + vesii = vesii ; + vesien = vesien ; + vesia = vesia ; + vesiin = vesiin + } ; + + nhn : NounH -> CommonNoun = \nh -> + let + a = nh.a ; + vesi = nh.vesi ; + vede = nh.vede ; + vete = nh.vete ; + vetta = nh.vetta ; + veteen = nh.veteen ; + vetii = nh.vetii ; + vesii = nh.vesii ; + vesien = nh.vesien ; + vesia = nh.vesia ; + vesiin = nh.vesiin + in {s = table { NCase Sg Nom => vesi ; NCase Sg Gen => vede + "n" ; @@ -65,9 +96,71 @@ oper mkNoun : (_,_,_,_,_,_,_,_,_,_ : Str) -> CommonNoun = \talo,talon,talona,taloa,taloon,taloina,taloissa,talojen,taloja,taloihin -> - mkSubst (ifTok Str (Predef.dp 1 talona) "a" "a" "ä") + nhn (mkSubst (ifTok Str (Predef.dp 1 talona) "a" "a" "ä") talo (Predef.tk 1 talon) (Predef.tk 2 talona) taloa taloon - (Predef.tk 2 taloina) (Predef.tk 3 taloissa) talojen taloja taloihin ; + (Predef.tk 2 taloina) (Predef.tk 3 taloissa) talojen taloja taloihin) ; + +-- Regular heuristics. + +{- + regNounH : Str -> NounH = \vesi -> + let + esi = Predef.dp 3 vesi ; -- analysis: suffixes + si = Predef.dp 2 esi ; + i = last si ; + s = init si ; + a = if_then_Str (pbool2bool (Predef.occurs "aou" vesi)) "a" "ä" ; + ves = init vesi ; -- synthesis: prefixes + vet = strongGrade ves ; + ve = init ves ; + in + case esi of { + "uus" | "yys" => sRakkaus vesi ; + "nen" => sNainen (Predef.tk 3 vesi + ("st" + a)) ; + + _ => case si of { + "aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" => sPuu vesi ; + "ie" | "uo" | "yö" => sSuo vesi ; + "ea" | "eä" => + mkSubst + a + vesi (vesi) (vesi) (vesi + a) (vesi + a+"n") + (ves + "i") (ves + "i") (ves + "iden") (ves + "it"+a) + (ves + "isiin") ; + "is" => sNauris (vesi + ("t" + a)) ; + "ut" | "yt" => sRae vesi (ves + ("en" + a)) ; + "as" | "äs" => sRae vesi (vet + (a + "n" + a)) ; + "ar" | "är" => sRae vesi (vet + ("ren" + a)) ; + _ => case i of { + "n" => sLiitin vesi (vet + "men") ; + "s" => sTilaus vesi (ves + ("ksen" + a)) ; + "i" => sBaari (vesi + a) ; + "e" => sRae vesi (strongGrade vesi + "en" + a) ; + "a" | "o" | "u" | "y" | "ä" | "ö" => sLukko vesi ; + _ => sLinux (vesi + "i" + a) + } + } + } ; + + reg2NounH : (savi,savia : Str) -> NounH = \savi,savia -> + let + savit = regNounH savi ; + ia = Predef.dp 2 savia ; + i = init ia ; + a = last ia ; + o = last savi ; + savin = weakGrade savi + "n" ; + in + case of { + <"i","ia"> => sArpi savi ; + <"i","iä"> => sSylki savi ; + <"i","ta"> | <"i","tä"> => sTohtori (savi + a) ; + <"o","ta"> | <"ö","tä"> => sRadio savi ; + <"a","ta"> | <"ä","tä"> => sPeruna savi ; + <"a","ia"> | <"a","ja"> => sKukko savi savin savia ; + _ => savit + } ; +-} -- Here some useful special cases; more will be given in $paradigms.Fin.gf$. -- @@ -75,7 +168,7 @@ oper -- to account for grade and vowel alternation, three forms are usually enough -- Examples: "talo", "kukko", "huippu", "koira", "kukka", "syylä",... - sKukko : (_,_,_ : Str) -> CommonNoun = \kukko,kukon,kukkoja -> + sKukko : (_,_,_ : Str) -> NounH = \kukko,kukon,kukkoja -> let { o = Predef.dp 1 kukko ; a = Predef.dp 1 kukkoja ; @@ -99,7 +192,7 @@ oper kukkoja (kukkoi + ifi "in" "ihin") ; - sLukko : Str -> CommonNoun = \lukko -> + sLukko : Str -> NounH = \lukko -> let o = last lukko ; lukk = init lukko ; @@ -114,9 +207,9 @@ oper -- The special case with no alternations. - sTalo : Str -> CommonNoun = sLukko ; + sTalo : Str -> NounH = sLukko ; - sBaari : Str -> CommonNoun = \baaria -> + sBaari : Str -> NounH = \baaria -> let baari = Predef.tk 1 baaria ; baar = Predef.tk 1 baari ; @@ -124,32 +217,40 @@ oper in sKukko baari (weakGrade baari + "n") (baar + ("ej" + a)) ; - sKorpi : (_,_,_ : Str) -> CommonNoun = \korpi,korven,korpena -> - let { + sKorpi : (_,_,_ : Str) -> NounH = \korpi,korven,korpena -> + let a = Predef.dp 1 korpena ; korpe = Predef.tk 2 korpena ; + korp = init korpi ; + korpea = case last korp of { + "r" | "l" | "n" => korp + "t" + a ; + _ => korpe + a + } ; korve = Predef.tk 1 korven ; - korvi = Predef.tk 1 korve + "i" - } + korvi = Predef.tk 1 korve + "i" ; + korpien = case last korp of { + "r" | "l" | "n" => korp + "ten" ; + _ => korpi + "en" + } ; in mkSubst a korpi korve korpe - (korpe + a) + korpea (korpe + "en") korpi korvi - (korpi + "en") + korpien (korpi + a) (korpi + "in") ; - sArpi : Str -> CommonNoun = \arpi -> + sArpi : Str -> NounH = \arpi -> sKorpi arpi (init (weakGrade arpi) + "en") (init arpi + "ena") ; - sSylki : Str -> CommonNoun = \sylki -> + sSylki : Str -> NounH = \sylki -> sKorpi sylki (init (weakGrade sylki) + "en") (init sylki + "enä") ; - sKoira : Str -> CommonNoun = \koira -> + sKoira : Str -> NounH = \koira -> let a = getHarmony (last koira) in sKukko koira (koira + "n") (init koira + "i" + a) ; @@ -157,7 +258,7 @@ oper -- "malli"/"mallin"/"malleja", with the exception that the "i" is not attached -- to the singular nominative. - sLinux : Str -> CommonNoun = \linuxia -> + sLinux : Str -> NounH = \linuxia -> let { linux = Predef.tk 2 linuxia ; a = getHarmony (Predef.dp 1 linuxia) ; @@ -177,7 +278,7 @@ oper -- Nouns of at least 3 syllables ending with "a" or "ä", like "peruna", "rytinä". - sPeruna : Str -> CommonNoun = \peruna -> + sPeruna : Str -> NounH = \peruna -> let { a = Predef.dp 1 peruna ; perun = Predef.tk 1 peruna ; @@ -196,7 +297,7 @@ oper (perunoi + ("t" + a)) (perunoi + "hin") ; - sTohtori : Str -> CommonNoun = \tohtoria -> + sTohtori : Str -> NounH = \tohtoria -> let a = last tohtoria ; tohtori = init tohtoria ; @@ -214,7 +315,7 @@ oper (tohtorei + "t" + a) (tohtorei + "hin") ; - sRadio : Str -> CommonNoun = \radio -> + sRadio : Str -> NounH = \radio -> let o = last radio ; a = getHarmony o ; @@ -235,7 +336,7 @@ oper -- Surpraisingly, making the test for the partitive, this not only covers -- "rae", "perhe", "savuke", but also "rengas", "lyhyt" (except $Sg Illat$), etc. - sRae : (_,_ : Str) -> CommonNoun = \rae,rakeena -> + sRae : (_,_ : Str) -> NounH = \rae,rakeena -> let { a = Predef.dp 1 rakeena ; rakee = Predef.tk 2 rakeena ; @@ -255,7 +356,7 @@ oper (rakei + ("t" + a)) (rakei + "siin") ; - sSusi : (_,_,_ : Str) -> CommonNoun = \susi,suden,sutena -> + sSusi : (_,_,_ : Str) -> NounH = \susi,suden,sutena -> let a = Predef.dp 1 sutena ; sude = Predef.tk 1 suden ; @@ -274,7 +375,7 @@ oper (susi + a) (susi + "in") ; - sPuu : Str -> CommonNoun = \puu -> + sPuu : Str -> NounH = \puu -> let { u = Predef.dp 1 puu ; a = getHarmony u ; @@ -294,7 +395,7 @@ oper (pui + ("t" + a)) (pui + "hin") ; - sSuo : Str -> CommonNoun = \suo -> + sSuo : Str -> NounH = \suo -> let { o = Predef.dp 1 suo ; a = getHarmony o ; @@ -315,7 +416,7 @@ oper -- Here in fact it is handy to use the partitive form as the only stem. - sNainen : Str -> CommonNoun = \naista -> + sNainen : Str -> NounH = \naista -> let { nainen = Predef.tk 3 naista + "nen" ; nais = Predef.tk 2 naista ; @@ -339,7 +440,7 @@ oper -- The following covers: "tilaus", "kaulin", "paimen", "laidun", "sammal", -- "kyynel" (excep $Sg Iness$ for the last two?). - sTilaus : (_,_ : Str) -> CommonNoun = \tilaus, tilauksena -> + sTilaus : (_,_ : Str) -> NounH = \tilaus, tilauksena -> let { tilauks = Predef.tk 3 tilauksena ; tilaukse = tilauks + "e" ; @@ -362,7 +463,7 @@ oper -- Some words have the three grades ("rakkaus","rakkauden","rakkautena"), which -- are however derivable from the stem. - sRakkaus : Str -> CommonNoun = \rakkaus -> + sRakkaus : Str -> NounH = \rakkaus -> let { rakkau = Predef.tk 1 rakkaus ; rakkaut = rakkau + "t" ; @@ -387,7 +488,7 @@ oper -- The following covers nouns like "nauris" and adjectives like "kallis", "tyyris". - sNauris : (_ : Str) -> CommonNoun = \naurista -> + sNauris : (_ : Str) -> NounH = \naurista -> let { a = Predef.dp 1 naurista ; nauris = Predef.tk 2 naurista ; @@ -411,7 +512,7 @@ oper -- Words of the form "siitin", "avain", "höyhen" (w or wo grade alternation). - sLiitin : Str -> Str -> CommonNoun = \liitin,liittimen -> + sLiitin : Str -> Str -> NounH = \liitin,liittimen -> let liittime = init liittimen ; liitti = Predef.tk 2 liittime ; @@ -433,7 +534,7 @@ oper -- The following covers adjectives like "kapea", "leveä". - sKapea : (_ : Str) -> CommonNoun = \kapea -> + sKapea : (_ : Str) -> NounH = \kapea -> let a = last kapea ; kape = init kapea ; @@ -453,7 +554,7 @@ oper -- The following two are used for adjective comparison. - sSuurempi : Str -> CommonNoun = \suurempaa -> + sSuurempi : Str -> NounH = \suurempaa -> let { a = Predef.dp 1 suurempaa ; suure = Predef.tk 4 suurempaa ; @@ -474,7 +575,7 @@ oper (suurempi + a) (suurempi + "in") ; - sSuurin : Str -> CommonNoun = \suurinta -> + sSuurin : Str -> NounH = \suurinta -> let { a = Predef.dp 1 suurinta ; suuri = Predef.tk 3 suurinta ; @@ -682,7 +783,7 @@ vowelHarmony : Str -> Str = \liitin -> -- The inflextion shows a surprising similarity with "suo". relPron : RelPron = - let {jo = sSuo "jo"} in {s = + let {jo = nhn (sSuo "jo")} in {s = table { Sg => table { Nom => "joka" ; @@ -698,7 +799,7 @@ vowelHarmony : Str -> Str = \liitin -> mikaInt : Number => Case => Str = let { - mi = sSuo "mi" + mi = nhn (sSuo "mi") } in table { Sg => table { @@ -715,8 +816,8 @@ vowelHarmony : Str -> Str = \liitin -> kukaInt : Number => Case => Str = let { - ku = sRae "kuka" "kenenä" ; - ket = sRae "kuka" "keinä"} in + ku = nhn (sRae "kuka" "kenenä") ; + ket = nhn (sRae "kuka" "keinä")} in table { Sg => table { Nom => "kuka" ; @@ -773,8 +874,8 @@ vowelHarmony : Str -> Str = \liitin -> jokuPron : Number => Case => Str = let - ku = sPuu "ku" ; - kui = sPuu "kuu" + ku = nhn (sPuu "ku") ; + kui = nhn (sPuu "kuu") in table { Sg => table { @@ -801,7 +902,7 @@ vowelHarmony : Str -> Str = \liitin -> } } ; -moniPron : Case => Str = caseTable singular (sSusi "moni" "monen" "monena") ; +moniPron : Case => Str = caseTable singular (nhn (sSusi "moni" "monen" "monena")) ; caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> \\c => cn.s ! NCase n c ; @@ -841,8 +942,8 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> regAdjDegr : CommonNoun -> Str -> Str -> AdjDegr = \kiva, kivempaa, kivinta -> mkAdjDegr (noun2adj kiva) - (noun2adjComp False (sSuurempi kivempaa)) - (noun2adjComp False (sSuurin kivinta)) ; + (noun2adjComp False (nhn (sSuurempi kivempaa))) + (noun2adjComp False (nhn (sSuurin kivinta))) ; --3 Verbs @@ -857,13 +958,33 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> mkVerb : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = \tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun -> + v2v (mkVerbH + tulla tulee tulen tulevat tulkaa tullaan tuli tulin tulisi tullut tultu tullun + ) ; + + v2v : VerbH -> Verb = \vh -> let + tulla = vh.tulla ; + tulee = vh.tulee ; + tulen = vh.tulen ; + tulevat = vh.tulevat ; + tulkaa = vh.tulkaa ; + tullaan = vh.tullaan ; + tuli = vh.tuli ; + tulin = vh.tulin ; + tulisi = vh.tulisi ; + tullut = vh.tullut ; + tultu = vh.tultu ; + tultu = vh.tultu ; + tullun = vh.tullun ; tuje = init tulen ; tuji = init tulin ; a = Predef.dp 1 tulkaa ; + tulko = Predef.tk 2 tulkaa + (ifTok Str a "a" "o" "ö") ; + o = last tulko ; tulleena = Predef.tk 2 tullut + ("een" + a) ; - tulleen = (noun2adj (sRae tullut tulleena)).s ; - tullun = (noun2adj (sKukko tultu tullun (tultu + ("j"+a)))).s ; + tulleen = (noun2adj (nhn (sRae tullut tulleena))).s ; + tullun = (noun2adj (nhn (sKukko tultu tullun (tultu + ("j"+a))))).s ; tulema = Predef.tk 3 tulevat + "m" + a ; vat = "v" + a + "t" in @@ -889,7 +1010,10 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> Cond Pl P3 => tulisi + vat ; Imper Sg => tuje ; Imper Pl => tulkaa ; - ImpNegPl => Predef.tk 2 tulkaa + (ifTok Str a "a" "o" "ö") ; + ImperP3 Sg => tulko + o + "n" ; + ImperP3 Pl => tulko + o + "t" ; + ImperP1Pl => tulkaa + "mme" ; + ImpNegPl => tulko ; Pass True => tullaan ; Pass False => Predef.tk 2 tullaan ; PastPartAct n => tulleen ! n ; @@ -902,9 +1026,95 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> } } ; + VerbH : Type = { + tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun + : Str + } ; + + mkVerbH : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> VerbH = + \tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun -> + {tulla = tulla ; + tulee = tulee ; + tulen = tulen ; + tulevat = tulevat ; + tulkaa = tulkaa ; + tullaan = tullaan ; + tuli = tuli ; + tulin = tulin ; + tulisi = tulisi ; + tullut = tullut ; + tultu = tultu ; + tullun = tullun + } ; + + regVerbH : Str -> VerbH = \soutaa -> + let + taa = Predef.dp 3 soutaa ; + ta = init taa ; + aa = Predef.dp 2 taa ; + juo = Predef.tk 2 soutaa ; + souda = weakGrade (init soutaa) ; + soudan = juo + "en" ; + o = Predef.dp 1 juo ; + a = last aa ; + u = ifTok Str a "a" "u" "y" ; + joi = Predef.tk 2 juo + (o + "i") + in case ta of { + "it" => vHarkita soutaa ; + "st" | "nn" | "rr" | "ll" => vJuosta soutaa soudan (juo + o+u+"t") (juo + "t"+u) ; + _ => case aa of { + "aa" | "ää" => vOttaa soutaa (souda + "n") ; + "da" | "dä" => vJuoda soutaa joi ; + "ta" | "tä" => vOsata soutaa ; + _ => vHukkua soutaa souda + }} ; + + reg2VerbH : (soutaa,souti : Str) -> VerbH = \soutaa,souti -> + let + soudat = regVerbH soutaa ; + soudan = weakGrade (init soutaa) + "n" ; + soudin = weakGrade souti + "n" ; + souden = init souti + "en" ; + juo = Predef.tk 2 soutaa ; + o = Predef.dp 1 juo ; + u = ifTok Str (last soutaa) "a" "u" "y" ; + aa = Predef.dp 2 soutaa ; + taa = Predef.dp 3 soutaa ; + ta = Predef.tk 1 taa ; + in + case aa of { + "aa" | "ää" => vHuoltaa soutaa soudan souti soudin ; + _ => case ta of { + "at" | "ät" => vPalkata soutaa souti ; + "st" => vJuosta soutaa souden (juo + o+u+"t") (juo + "t"+u) ; + _ => soudat + }} ** {sc = Nom ; lock_V = <>} ; + + reg3VerbH : (_,_,_ : Str) -> VerbH = \soutaa,soudan,souti -> + let + taa = Predef.dp 3 soutaa ; + ta = init taa ; + aa = Predef.dp 2 taa ; + souda = init soudan ; + juo = Predef.tk 2 soutaa ; + o = last juo ; + a = last aa ; + u = ifTok Str a "a" "u" "y" ; + soudin = weakGrade souti + "n" ; + soudat = reg2VerbH soutaa souti ; + in case ta of { + "ll" => vJuosta soutaa soudan (juo + o+u+"t") (juo + "t"+u) ; + "ot" | "öt" => vPudota soutaa souti ; + _ => case aa of { + "aa" | "ää" => vHuoltaa soutaa soudan souti soudin ; + "da" | "dä" => vJuoda soutaa souti ; + _ => soudat + }} ** {sc = Nom ; lock_V = <>} ; + + -- For "harppoa", "hukkua", "löytyä", with grade alternation. - vHukkua : (_,_ : Str) -> Verb = \hukkua,huku -> + vHukkua : (_,_ : Str) -> VerbH = \hukkua,huku -> let { a = Predef.dp 1 hukkua ; hukku = Predef.tk 1 hukkua ; @@ -920,7 +1130,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> hukkui = init hukku + i + "i" ; hukui = init huku + i + "i" ; } in - mkVerb + mkVerbH hukkua (hukku + u) (huku + "n") @@ -936,14 +1146,14 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- For cases with or without alternation: "sanoa", "valua", "kysyä". - vSanoa : Str -> Verb = \sanoa -> + vSanoa : Str -> VerbH = \sanoa -> vHukkua sanoa (Predef.tk 1 sanoa) ; ---- vHukkua sanoa (weakGrade (Predef.tk 1 sanoa)) ; ---- The gfr file becomes 6* bigger if this change is done -- For "ottaa", "käyttää", "löytää", "huoltaa", "hiihtää", "siirtää". - vHuoltaa : (_,_,_,_ : Str) -> Verb = \ottaa,otan,otti,otin -> + vHuoltaa : (_,_,_,_ : Str) -> VerbH = \ottaa,otan,otti,otin -> let { a = Predef.dp 1 ottaa ; aa = a + a ; @@ -952,7 +1162,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> otta = Predef.tk 1 ottaa ; ote = Predef.tk 1 ota + "e" } in - mkVerb + mkVerbH ottaa ottaa otan @@ -968,7 +1178,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- For cases where grade alternation is not affected by the imperfect "i". - vOttaa : (_,_ : Str) -> Verb = \ottaa,otan -> + vOttaa : (_,_ : Str) -> VerbH = \ottaa,otan -> let i = "i" ; --- wrong rule if_then_Str (pbool2bool (Predef.occurs "ou" ottaa)) "i" "oi" in @@ -976,7 +1186,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- For "poistaa", "ryystää". - vPoistaa : Str -> Verb = \poistaa -> + vPoistaa : Str -> VerbH = \poistaa -> vOttaa poistaa ((Predef.tk 1 poistaa + "n")) ; @@ -984,17 +1194,17 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- from "pelätä-pelkäsi" vs. "palata-palasi" - vOsata : Str -> Verb = \osata -> + vOsata : Str -> VerbH = \osata -> vPalkata osata (Predef.tk 2 osata + "si") ; - vPalkata : Str -> Str -> Verb = \palkata,palkkasi -> + vPalkata : Str -> Str -> VerbH = \palkata,palkkasi -> let a = Predef.dp 1 palkata ; palka = Predef.tk 2 palkata ; palkka = Predef.tk 2 palkkasi ; u = case a of {"a" => "u" ; _ => "y"} in - mkVerb + mkVerbH palkata (palkka + a) (palkka + (a + "n")) @@ -1008,7 +1218,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> (palka + "tt" + u) (palka + "t" + u + "n") ; - vPudota : Str -> Str -> Verb = \pudota, putosi -> + vPudota : Str -> Str -> VerbH = \pudota, putosi -> let a = Predef.dp 1 pudota ; pudo = Predef.tk 2 pudota ; @@ -1016,7 +1226,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> putoa = puto + a ; u = case a of {"a" => "u" ; _ => "y"} in - mkVerb + mkVerbH pudota (putoa + a) (putoa + "n") @@ -1030,7 +1240,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> (pudo + "tt" + u) (pudo + "t" + u + "n") ; - vHarkita : Str -> Verb = \harkita -> + vHarkita : Str -> VerbH = \harkita -> let a = Predef.dp 1 harkita ; harki = Predef.tk 2 harkita ; @@ -1038,7 +1248,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> harkitsi = harki + "tsi" ; u = case a of {"a" => "u" ; _ => "y"} in - mkVerb + mkVerbH harkita (harkitse + "e") (harkitse + "n") @@ -1057,7 +1267,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- For "juosta", "piestä", "nousta", "rangaista", "kävellä", "surra", "panna". - vJuosta : (_,_,_,_ : Str) -> Verb = \juosta,juoksen,juossut,juostu -> + vJuosta : (_,_,_,_ : Str) -> VerbH = \juosta,juoksen,juossut,juostu -> let a = Predef.dp 1 juosta ; t = last (init juosta) ; @@ -1066,7 +1276,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> juos = Predef.tk 2 juosta ; juostun = ifTok Str t "t" (juostu + "n") (init juossut + "n") ; in - mkVerb + mkVerbH juosta (juokse + "e") juoksen @@ -1082,13 +1292,13 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> -- For "juoda", "syödä", "viedä", "naida", "saada". - vJuoda : (_,_ : Str) -> Verb = \juoda, joi -> + vJuoda : (_,_ : Str) -> VerbH = \juoda, joi -> let a = Predef.dp 1 juoda ; juo = Predef.tk 2 juoda ; u = case a of {"a" => "u" ; _ => "y"} in - mkVerb + mkVerbH juoda juo (juo + "n") @@ -1137,7 +1347,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> } ; kaikkiPron : Number -> Case => Str = \n -> - let {kaiket = caseTable n (sKorpi "kaikki" "kaiken" "kaikkena")} in + let {kaiket = caseTable n (nhn (sKorpi "kaikki" "kaiken" "kaikkena"))} in table { Nom => "kaikki" ; c => kaiket ! c @@ -1155,21 +1365,22 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> param NumPlace = NumIndep | NumAttr ; oper - yksiN = mkSubst "ä" "yksi" "yhde" "yhte" "yhtä" "yhteen" "yksi" "yksi" - "yksien" "yksiä" "yksiin" ; - kymmenenN = mkSubst "ä" "kymmenen" "kymmene" "kymmene" "kymmentä" + yksiN = nhn (mkSubst "ä" "yksi" "yhde" "yhte" "yhtä" "yhteen" "yksi" "yksi" + "yksien" "yksiä" "yksiin") ; + kymmenenN = nhn (mkSubst "ä" "kymmenen" "kymmene" "kymmene" "kymmentä" "kymmeneen" "kymmeni" "kymmeni" "kymmenien" "kymmeniä" - "kymmeniin" ; - sataN = sLukko "sata" ; + "kymmeniin") ; + sataN = nhn (sLukko "sata") ; - tuhatN = mkSubst "a" "tuhat" "tuhanne" "tuhante" "tuhatta" "tuhanteen" - "tuhansi" "tuhansi" "tuhansien" "tuhansia" "tuhansiin" ; + tuhatN = nhn (mkSubst "a" "tuhat" "tuhanne" "tuhante" "tuhatta" "tuhanteen" + "tuhansi" "tuhansi" "tuhansien" "tuhansia" "tuhansiin") ; kymmentaN = {s = table { NCase Sg Nom => "kymmentä" ; c => kymmenenN.s ! c } } ; + sataaN = {s = table { Sg => sataN.s ; Pl => table { diff --git a/lib/resource/finnish/NumeralsFin.gf b/lib/resource/finnish/NumeralsFin.gf index a15feeb70..2d246ce92 100644 --- a/lib/resource/finnish/NumeralsFin.gf +++ b/lib/resource/finnish/NumeralsFin.gf @@ -9,21 +9,21 @@ lincat lin num x = x ; - n2 = mkSubst "a" "kaksi" "kahde" "kahte" "kahta" "kahteen" "kaksi" "kaksi" - "kaksien" "kaksia" "kaksiin" ; - n3 = mkSubst "a" "kolme" "kolme" "kolme" "kolmea" "kolmeen" "kolmi" "kolmi" - "kolmien" "kolmia" "kolmiin" ; + n2 = nhn (mkSubst "a" "kaksi" "kahde" "kahte" "kahta" "kahteen" "kaksi" "kaksi" + "kaksien" "kaksia" "kaksiin") ; + n3 = nhn (mkSubst "a" "kolme" "kolme" "kolme" "kolmea" "kolmeen" "kolmi" "kolmi" + "kolmien" "kolmia" "kolmiin") ; n4 = regN "neljä" ; n5 = reg3N "viisi" "viiden" "viisiä" ; n6 = reg3N "kuusi" "kuuden" "kuusia" ; - n7 = mkSubst "ä" "seitsemän" "seitsemä" "seitsemä" "seitsemää" + n7 = nhn (mkSubst "ä" "seitsemän" "seitsemä" "seitsemä" "seitsemää" "seitsemään" "seitsemi" "seitsemi" "seitsemien" "seitsemiä" - "seitsemiin" ; - n8 = mkSubst "a" "kahdeksan" "kahdeksa" "kahdeksa" "kahdeksaa" + "seitsemiin") ; + n8 = nhn (mkSubst "a" "kahdeksan" "kahdeksa" "kahdeksa" "kahdeksaa" "kahdeksaan" "kahdeksi" "kahdeksi" "kahdeksien" "kahdeksia" - "kahdeksiin" ; - n9 = mkSubst "ä" "yhdeksän" "yhdeksä" "yhdeksä" "yhdeksää" - "yhdeksään" "yhdeksi" "yhdeksi" "yhdeksien" "yhdeksiä" "yhdeksiin" ; + "kahdeksiin") ; + n9 = nhn (mkSubst "ä" "yhdeksän" "yhdeksä" "yhdeksä" "yhdeksää" + "yhdeksään" "yhdeksi" "yhdeksi" "yhdeksien" "yhdeksiä" "yhdeksiin") ; pot01 = {s = table { diff --git a/lib/resource/finnish/ParadigmsFin.gf b/lib/resource/finnish/ParadigmsFin.gf index 253b6fd08..35f0e4db5 100644 --- a/lib/resource/finnish/ParadigmsFin.gf +++ b/lib/resource/finnish/ParadigmsFin.gf @@ -358,7 +358,8 @@ oper mkN = \a,b,c,d,e,f,g,h,i,j,k -> mkNoun a b c d e f g h i j ** {g = k ; lock_N = <>} ; -regN = \vesi -> + regN = \vesi -> + ---- nhn (regNounH vesi) ** {g = NonHuman ; lock_N = <>} ; let esi = Predef.dp 3 vesi ; -- analysis: suffixes si = Predef.dp 2 esi ; @@ -366,8 +367,9 @@ regN = \vesi -> s = init si ; a = if_then_Str (pbool2bool (Predef.occurs "aou" vesi)) "a" "ä" ; ves = init vesi ; -- synthesis: prefixes + vet = strongGrade ves ; ve = init ves ; - in + in nhn ( case esi of { "uus" | "yys" => sRakkaus vesi ; "nen" => sNainen (Predef.tk 3 vesi + ("st" + a)) ; @@ -376,26 +378,29 @@ regN = \vesi -> "aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" => sPuu vesi ; "ie" | "uo" | "yö" => sSuo vesi ; "ea" | "eä" => - mkNoun - vesi (vesi + "n") (vesi + "n"+a) (vesi + a) (vesi + a+"n") - (ves + "in"+a) (ves + "iss"+a) (ves + "iden") (ves + "it"+a) + mkSubst + a + vesi (vesi) (vesi) (vesi + a) (vesi + a+"n") + (ves + "i") (ves + "i") (ves + "iden") (ves + "it"+a) (ves + "isiin") ; "is" => sNauris (vesi + ("t" + a)) ; "ut" | "yt" => sRae vesi (ves + ("en" + a)) ; - "as" | "äs" => sRae vesi (strongGrade ves + (a + "n" + a)) ; - "ar" | "är" => sRae vesi (strongGrade ves + ("ren" + a)) ; + "as" | "äs" => sRae vesi (vet + (a + "n" + a)) ; + "ar" | "är" => sRae vesi (vet + ("ren" + a)) ; _ => case i of { - "n" => sLiitin vesi (strongGrade (init vesi) + "men") ; + "n" => sLiitin vesi (vet + "men") ; "s" => sTilaus vesi (ves + ("ksen" + a)) ; "i" => sBaari (vesi + a) ; - "e" => sRae vesi (strongGrade (ves + "e") + "en" + a) ; + "e" => sRae vesi (strongGrade vesi + "en" + a) ; "a" | "o" | "u" | "y" | "ä" | "ö" => sLukko vesi ; - _ => sLinux (vesi + "i" + a) + _ => sLinux (vesi + "i" + a) } } - } ** {g = NonHuman ; lock_N = <>} ; + } + ) ** {g = NonHuman ; lock_N = <>} ; -reg2N : (savi,savia : Str) -> N = \savi,savia -> + reg2N : (savi,savia : Str) -> N = \savi,savia -> + ---- nhn (reg2NounH savi savia) let savit = regN savi ; ia = Predef.dp 2 savia ; @@ -405,14 +410,15 @@ reg2N : (savi,savia : Str) -> N = \savi,savia -> savin = weakGrade savi + "n" ; in case of { - <"i","ia"> => sArpi savi ; - <"i","iä"> => sSylki savi ; - <"i","ta"> | <"i","tä"> => sTohtori (savi + a) ; - <"o","ta"> | <"ö","tä"> => sRadio savi ; - <"a","ta"> | <"ä","tä"> => sPeruna savi ; - <"a","ia"> | <"a","ja"> => sKukko savi savin savia ; + <"i","ia"> => nhn (sArpi savi) ; + <"i","iä"> => nhn (sSylki savi) ; + <"i","ta"> | <"i","tä"> => nhn (sTohtori (savi + a)) ; + <"o","ta"> | <"ö","tä"> => nhn (sRadio savi) ; + <"a","ta"> | <"ä","tä"> => nhn (sPeruna savi) ; + <"a","ia"> | <"a","ja"> => nhn (sKukko savi savin savia) ; _ => savit - } ** {g = NonHuman ; lock_N = <>} ; + } + ** {g = NonHuman ; lock_N = <>} ; reg3N = \vesi,veden,vesiä -> let @@ -425,38 +431,38 @@ reg3N = \vesi,veden,vesi case si of { "us" | "ys" => ifTok CommonNoun (Predef.dp 3 veden) "den" - (sRakkaus vesi) - (sTilaus vesi (veden + a)) ; - "as" | "äs" => sRae vesi (veden + a) ; - "li" | "ni" | "ri" => sSusi vesi veden (Predef.tk 1 vesi + ("en" + a)) ; - "si" => sSusi vesi veden (Predef.tk 2 vesi + ("ten" + a)) ; - "in" | "en" | "än" => sLiitin vesi veden ; + (nhn (sRakkaus vesi)) + (nhn (sTilaus vesi (veden + a))) ; + "as" | "äs" => nhn (sRae vesi (veden + a)) ; + "li" | "ni" | "ri" => nhn (sSusi vesi veden (Predef.tk 1 vesi + ("en" + a))) ; + "si" => nhn (sSusi vesi veden (Predef.tk 2 vesi + ("ten" + a))) ; + "in" | "en" | "än" => nhn (sLiitin vesi veden) ; _ => case i of { - "a" | "o" | "u" | "y" | "ä" | "ö" => sKukko vesi veden vesiä ; - "i" => sKorpi vesi veden (init veden + "n" + a) ; + "a" | "o" | "u" | "y" | "ä" | "ö" => nhn (sKukko vesi veden vesiä) ; + "i" => nhn (sKorpi vesi veden (init veden + "n" + a)) ; _ => vesit } } ** {g = NonHuman ; lock_N = <>} ; - nKukko = \a,b,c -> sKukko a b c ** {g = nonhuman ; lock_N = <>} ; + nKukko = \a,b,c -> nhn (sKukko a b c) ** {g = nonhuman ; lock_N = <>} ; humanN = \n -> {s = n.s ; lock_N = n.lock_N ; g = human} ; - nLukko = \a -> sLukko a ** {g = nonhuman ; lock_N = <>} ; - nTalo = \a -> sTalo a ** {g = nonhuman ; lock_N = <>} ; - nArpi = \a -> sArpi a ** {g = nonhuman ; lock_N = <>} ; - nSylki = \a -> sSylki a ** {g = nonhuman ; lock_N = <>} ; - nLinux = \a -> sLinux a ** {g = nonhuman ; lock_N = <>} ; - nPeruna = \a -> sPeruna a ** {g = nonhuman ; lock_N = <>} ; - nRae = \a,b -> sRae a b ** {g = nonhuman ; lock_N = <>} ; - nSusi = \a,b,c -> sSusi a b c ** {g = nonhuman ; lock_N = <>} ; - nPuu = \a -> sPuu a ** {g = nonhuman ; lock_N = <>} ; - nSuo = \a -> sSuo a ** {g = nonhuman ; lock_N = <>} ; - nNainen = \a -> sNainen a ** {g = nonhuman ; lock_N = <>} ; - nTilaus = \a,b -> sTilaus a b ** {g = nonhuman ; lock_N = <>} ; + nLukko = \a -> nhn (sLukko a) ** {g = nonhuman ; lock_N = <>} ; + nTalo = \a -> nhn (sTalo a) ** {g = nonhuman ; lock_N = <>} ; + nArpi = \a -> nhn (sArpi a) ** {g = nonhuman ; lock_N = <>} ; + nSylki = \a -> nhn (sSylki a) ** {g = nonhuman ; lock_N = <>} ; + nLinux = \a -> nhn (sLinux a) ** {g = nonhuman ; lock_N = <>} ; + nPeruna = \a -> nhn (sPeruna a) ** {g = nonhuman ; lock_N = <>} ; + nRae = \a,b -> nhn (sRae a b) ** {g = nonhuman ; lock_N = <>} ; + nSusi = \a,b,c -> nhn (sSusi a b c) ** {g = nonhuman ; lock_N = <>} ; + nPuu = \a -> nhn (sPuu a) ** {g = nonhuman ; lock_N = <>} ; + nSuo = \a -> nhn (sSuo a) ** {g = nonhuman ; lock_N = <>} ; + nNainen = \a -> nhn (sNainen a) ** {g = nonhuman ; lock_N = <>} ; + nTilaus = \a,b -> nhn (sTilaus a b) ** {g = nonhuman ; lock_N = <>} ; nKulaus = \a -> nTilaus a (init a + "ksen" + getHarmony (last (init a))) ; - nNauris = \a -> sNauris a ** {g = nonhuman ; lock_N = <>} ; + nNauris = \a -> nhn (sNauris a) ** {g = nonhuman ; lock_N = <>} ; sgpartN noun part = { s = table { NCase Sg Part => part ; @@ -495,83 +501,26 @@ reg3N = \vesi,veden,vesi mkV a b c d e f g h i j k l = mkVerb a b c d e f g h i j k l ** {sc = Nom ; lock_V = <>} ; -regV soutaa = - let - taa = Predef.dp 3 soutaa ; - ta = init taa ; - aa = Predef.dp 2 taa ; - juo = Predef.tk 2 soutaa ; - souda = weakGrade (init soutaa) ; - soudan = juo + "en" ; - o = Predef.dp 1 juo ; - a = last aa ; - u = ifTok Str a "a" "u" "y" ; - joi = Predef.tk 2 juo + (o + "i") - in case ta of { - "it" => vHarkita soutaa ; - "st" | "nn" | "rr" | "ll" => vJuosta soutaa soudan (juo + o+u+"t") (juo + "t"+u) ; - _ => case aa of { - "aa" | "ää" => vOttaa soutaa (souda + "n") ; - "da" | "dä" => vJuoda soutaa joi ; - "ta" | "tä" => vOsata soutaa ; - _ => vHukkua soutaa souda - }} ** {sc = Nom ; lock_V = <>} ; + regV soutaa = v2v (regVerbH soutaa) ** {sc = Nom ; lock_V = <>} ; -reg2V : (soutaa,souti : Str) -> V = \soutaa,souti -> - let - soudat = regV soutaa ; - soudan = weakGrade (init soutaa) + "n" ; - soudin = weakGrade souti + "n" ; - souden = init souti + "en" ; - juo = Predef.tk 2 soutaa ; - o = Predef.dp 1 juo ; - u = ifTok Str (last soutaa) "a" "u" "y" ; - aa = Predef.dp 2 soutaa ; - taa = Predef.dp 3 soutaa ; - ta = Predef.tk 1 taa ; - in - case aa of { - "aa" | "ää" => vHuoltaa soutaa soudan souti soudin ; - _ => case ta of { - "at" | "ät" => vPalkata soutaa souti ; - "st" => vJuosta soutaa souden (juo + o+u+"t") (juo + "t"+u) ; - _ => soudat - }} ** {sc = Nom ; lock_V = <>} ; + reg2V : (soutaa,souti : Str) -> V = \soutaa,souti -> + v2v (reg2VerbH soutaa souti) ** {sc = Nom ; lock_V = <>} ; -reg3V soutaa soudan souti = - let - taa = Predef.dp 3 soutaa ; - ta = init taa ; - aa = Predef.dp 2 taa ; - souda = init soudan ; - juo = Predef.tk 2 soutaa ; - o = last juo ; - a = last aa ; - u = ifTok Str a "a" "u" "y" ; - soudin = weakGrade souti + "n" ; - soudat = reg2V soutaa souti ; - in case ta of { - "ll" => vJuosta soutaa soudan (juo + o+u+"t") (juo + "t"+u) ; - "ot" | "öt" => vPudota soutaa souti ; - _ => case aa of { - "aa" | "ää" => vHuoltaa soutaa soudan souti soudin ; - "da" | "dä" => vJuoda soutaa souti ; - _ => soudat - }} ** {sc = Nom ; lock_V = <>} ; + reg3V soutaa soudan souti = + v2v (reg3VerbH soutaa soudan souti) ** {sc = Nom ; lock_V = <>} ; - vValua v = vSanoa v ** {sc = Nom ; lock_V = <>} ; - vKattaa v u = vOttaa v u ** {sc = Nom ; lock_V = <>} ; - vOstaa v = vPoistaa v ** {sc = Nom ; lock_V = <>} ; - vNousta v u = vJuosta v u [] [] ** {sc = Nom ; lock_V = <>} ; ----- - vTuoda v = vJuoda v [] ** {sc = Nom ; lock_V = <>} ; ----- + vValua v = v2v (vSanoa v) ** {sc = Nom ; lock_V = <>} ; + vKattaa v u = v2v (vOttaa v u) ** {sc = Nom ; lock_V = <>} ; + vOstaa v = v2v (vPoistaa v) ** {sc = Nom ; lock_V = <>} ; + vNousta v u = v2v (vJuosta v u [] []) ** {sc = Nom ; lock_V = <>} ; ----- + vTuoda v = v2v (vJuoda v []) ** {sc = Nom ; lock_V = <>} ; ----- caseV c v = {s = v.s ; sc = c ; lock_V = <>} ; vOlla = verbOlla ** {sc = Nom ; lock_V = <>} ; vEi = verbEi ** {sc = Nom ; lock_V = <>} ; - vHuoltaa : (_,_,_,_ : Str) -> Verb = \ottaa,otan,otti,otin -> - SyntaxFin.vHuoltaa ottaa otan otti otin ** {sc = Nom ; lock_V = <>} ; + v2v (SyntaxFin.vHuoltaa ottaa otan otti otin) ** {sc = Nom ; lock_V = <>} ; mkV2 = \v,c -> v ** {s3 = c.s3 ; p = c.p ; c = c.c ; lock_V2 = <>} ; caseV2 = \v,c -> mkV2 v (caseP c) ; dirV2 v = mkTransVerbDir v ** {lock_V2 = <>} ; diff --git a/lib/resource/finnish/StructuralFin.gf b/lib/resource/finnish/StructuralFin.gf index ced177ceb..79ff08979 100644 --- a/lib/resource/finnish/StructuralFin.gf +++ b/lib/resource/finnish/StructuralFin.gf @@ -53,8 +53,8 @@ concrete StructuralFin of Structural = it_NP = nameNounPhrase pronSe ; many_Det = mkDeterminer singular moniPron ; most8many_Det = useimmatDet ; - most_Det = mkDeterminer singular (caseTable singular (sSuurin "enintä")) ; - much_Det = mkDeterminer singular (caseTable singular (sNauris "runsasta")) ; + most_Det = mkDeterminer singular (caseTable singular (nhn (sSuurin "enintä"))) ; + much_Det = mkDeterminer singular (caseTable singular (nhn (sNauris "runsasta"))) ; ---- must_VV = vHukkua "täytyä" "täydy" ** {c = CCase Gen} ; no_Phr = ss ("Ei" ++ stopPunct) ; on_Prep = prepCase Adess ; diff --git a/lib/resource/finnish/SwadeshLexFin.gf b/lib/resource/finnish/SwadeshLexFin.gf index ca56fd045..81cc4da2d 100644 --- a/lib/resource/finnish/SwadeshLexFin.gf +++ b/lib/resource/finnish/SwadeshLexFin.gf @@ -4,6 +4,8 @@ concrete SwadeshLexFin of SwadeshLex = CategoriesFin ** open ResourceFin, SyntaxFin, ParadigmsFin, BasicFin, Prelude in { + flags optimize=values ; + lin -- Pronouns @@ -26,8 +28,8 @@ concrete SwadeshLexFin of SwadeshLex = CategoriesFin all_NDet = ResourceFin.all_NDet ; many_Det = many_Det ; some_Det = some_Det ; - few_Det = mkDeterminer Pl (\\c => (sTalo "muutama").s ! NCase Pl c) ; - other_Det = mkDeterminer Pl (\\c => (sPuu "muu").s ! NCase Pl c) ; + few_Det = mkDeterminer Pl (\\c => (nhn (sTalo "muutama")).s ! NCase Pl c) ; + other_Det = mkDeterminer Pl (\\c => (nhn (sPuu "muu")).s ! NCase Pl c) ; -- Adverbs @@ -157,7 +159,7 @@ concrete SwadeshLexFin of SwadeshLex = CategoriesFin rain_N = regN "sade" ; river_N = river_N ; road_N = regN "tie" ; - root_N = reg3N "juuri" "juuren" "juuria" ; + root_N = reg2N "juuri" "juuria" ; rope_N = reg3N "köysi" "köyden" "köysiä" ; salt_N = regN "suola" ; sand_N = regN "hiekka" ; @@ -206,7 +208,7 @@ concrete SwadeshLexFin of SwadeshLex = CategoriesFin freeze_V = regV "jäätyä" ; give_V = regV "antaa" ; hear_V = UseV2 hear_V2 ; - hit_V = regV "syödä" ; + hit_V = regV "lyödä" ; hold_V = regV "pitää" ; hunt_V = regV "metsästää" ; kill_V = regV "tappaa" ; diff --git a/lib/resource/finnish/SyntaxFin.gf b/lib/resource/finnish/SyntaxFin.gf index 47760815a..9dd8e4d37 100644 --- a/lib/resource/finnish/SyntaxFin.gf +++ b/lib/resource/finnish/SyntaxFin.gf @@ -124,7 +124,7 @@ oper f => pron.s ! npForm2PForm f } ; n = pron.n ; - p = NPP pron.p + p = NP3 } ; -- *Partitive noun phrases* use the partitive instead of the nominative @@ -202,9 +202,9 @@ oper mkDeterminerGenNum : (_,_ : Case => Str) -> DeterminerNum = mkDeterminerGen Pl ; - jokainenDet = mkDeterminer Sg (caseTable Sg (sNainen "jokaista")) ; + jokainenDet = mkDeterminer Sg (caseTable Sg (nhn (sNainen "jokaista"))) ; kaikkiDet : DeterminerNum = mkDeterminerNum (kaikkiPron Pl) ; - useimmatDet = mkDeterminer Pl (caseTable Pl (sSuurin "useinta")) ; + useimmatDet = mkDeterminer Pl (caseTable Pl (nhn (sSuurin "useinta"))) ; mikaDet = mkDeterminerGen Sg (mikaInt ! Sg) (kukaInt ! Sg) ; mitkaDet : DeterminerNum = mkDeterminerGenNum (mikaInt ! Pl) (kukaInt ! Pl) ; @@ -435,7 +435,7 @@ oper appFunComm : Function -> NounPhrase -> CommNounPhrase = \vaimo, jussi -> {s = \\p,n,c => case vaimo.c of { NPCase Gen => jussi.s ! NPCase Gen ++ - ifPossSuffix vaimo jussi.p jussi.n c ; + ifPossSuffix vaimo jussi.p n c ; h => vaimo.s ! False ! n ! c ++ jussi.s ! h } ; g = vaimo.g @@ -636,7 +636,7 @@ oper let vs = verb.s ; olla = verbOlla.s ; - tulla = (vJuosta "tulla" "tulen" "tullut" "tultu").s ; + tulla = (v2v (vJuosta "tulla" "tulen" "tullut" "tultu")).s ; eis = verbEi.s ; part = PastPartAct (AN (NCase n Nom)) ; abess = vs ! Inf3Abess ; @@ -903,6 +903,7 @@ oper -- To generate "sanoo että Jussi ui" / "ei sano että Jussi ui" + embedConj : Str = "," ++ "että" ; --3 Verb-complement verbs -- diff --git a/lib/resource/finnish/TypesFin.gf b/lib/resource/finnish/TypesFin.gf index 3d5d3d779..51d95ef06 100644 --- a/lib/resource/finnish/TypesFin.gf +++ b/lib/resource/finnish/TypesFin.gf @@ -91,6 +91,8 @@ param | Impf Number Person | Cond Number Person | Imper Number + | ImperP3 Number + | ImperP1Pl | ImpNegPl | Pass Bool | PastPartAct AForm