diff --git a/examples/uusisuomi/Declensions.gf b/examples/uusisuomi/Declensions.gf new file mode 100644 index 000000000..d36343c4b --- /dev/null +++ b/examples/uusisuomi/Declensions.gf @@ -0,0 +1,353 @@ +--# -path=.:alltenses + +resource Declensions = ResFin ** open MorphoFin,CatFin,Prelude in { + + flags optimize=all ; + + oper + + dLujuus : Str -> NForms = \lujuus -> + let + lujuu = init lujuus ; + lujuuksi = lujuu + "ksi" ; + a = vowelHarmony (last lujuu) ; + in nForms10 + lujuus (lujuu + "den") (lujuu + "tt" + a) + (lujuu + "ten" + a) (lujuu + "teen") + (lujuuksi + "en") (lujuuksi + a) + (lujuuksi + "n" + a) (lujuuksi + "ss" + a) (lujuuksi + "in") ; + + dNainen : Str -> NForms = \nainen -> + let + a = vowelHarmony nainen ; + nais = Predef.tk 3 nainen + "s" + in nForms10 + nainen (nais + "en") (nais + "t" + a) (nais + "en" + a) (nais + "een") + (nais + "ten") (nais + "i" + a) + (nais + "in" + a) (nais + "iss" + a) (nais + "iin") ; + + dPuu : Str -> NForms = \puu -> + let + a = vowelHarmony puu ; + pui = init puu + "i" ; + u = last puu ; + in nForms10 + puu (puu + "n") (puu + "t" + a) (puu + "n" + a) (puu + "h" + u + "n") + (pui + "den") (pui + "t" + a) + (pui + "n" + a) (pui + "ss" + a) (pui + "hin") ; + + dSuo : Str -> NForms = \suo -> + let + o = last suo ; + a = vowelHarmony o ; + soi = Predef.tk 2 suo + o + "i" ; + in nForms10 + suo (suo + "n") (suo + "t" + a) (suo + "n" + a) (suo + "h" + o + "n") + (soi + "den") (soi + "t" + a) + (soi + "n" + a) (soi + "ss" + a) (soi + "hin") ; + + dKorkea : Str -> NForms = \korkea -> + let + a = last korkea ; + korke = init korkea ; + in nForms10 + korkea (korkea + "n") (korkea + a) + (korkea + "n" + a) (korkea + a + "n") + (korke + "iden") (korke + "it" + a) + (korke + "in" + a) (korke + "iss" + a) + (korke + "isiin") ; --- NSSK: korkeihin + + dKaunis : Str -> NForms = \kaunis -> + let + a = vowelHarmony kaunis ; + kaunii = init kaunis + "i" ; + in nForms10 + kaunis (kaunii + "n") (kaunis + "t" + a) + (kaunii + "n" + a) (kaunii + "seen") + (kaunii + "den") (kaunii + "t" + a) + (kaunii + "n" + a) (kaunii + "ss" + a) + (kaunii + "siin") ; + + dLiitin : (_,_ : Str) -> NForms = \liitin,liittimen -> + let + a = vowelHarmony liitin ; + liittim = Predef.tk 2 liittimen ; + in nForms10 + liitin (liittim + "en") (liitin + "t" + a) + (liittim + "en" + a) (liittim + "een") + (liittim + "ien") (liittim + "i" + a) + (liittim + "in" + a) (liittim + "iss" + a) + (liittim + "iin") ; + + dOnneton : Str -> NForms = \onneton -> + let + a = vowelHarmony onneton ; + onnettom = Predef.tk 2 onneton + "t" + last (init onneton) + "m" ; + in nForms10 + onneton (onnettom + a + "n") (onneton + "t" + a) + (onnettom + a + "n" + a) (onnettom + a + a + "n") + (onnettom + "ien") (onnettom + "i" + a) + (onnettom + "in" + a) (onnettom + "iss" + a) + (onnettom + "iin") ; + + + dUkko : (_,_ : Str) -> NForms = \ukko,ukon -> + let + o = last ukko ; + a = vowelHarmony o ; + ukk = init ukko ; + uko = init ukon ; + uk = init uko ; + ukkoja = case of { + _ + "ä" => -- kylä,kyliä,kylien,kylissä,kyliin + ; + _ + ("au" | "eu") + _ + "a" => -- kauhojen,seurojen + ; + _ + ("o" | "u") + _ + "a" => -- pula,pulia,pulien,pulissa,puliin + ; + _ + "a" => -- kala,kaloja,kalojen,-oissa,-oihin + ; + _ => -- suku,sukuja,sukujen,-uissa,-uihin + + } ; + ukkoina = ukkoja.p3 + "in" + a ; + ukoissa = ukkoja.p4 + "iss" + a ; + in nForms10 + ukko ukon (ukko + a) (ukko + "n" + a) (ukko + o + "n") + ukkoja.p2 ukkoja.p1 + ukkoina ukoissa ukkoja.p5 ; + + dSilakka : (_,_,_ : Str) -> NForms = \silakka,silakan,silakoita -> + let + a = last silakka ; + silakk = init silakka ; + silaka = init silakan ; + silak = init silaka ; + silakoiden = case of { + _ + "i" + ("a" | "ä") => -- asemia + ; + _ + o@("o" | "ö") + ("ja" | "jä") => -- pasuunoja + ; + _ + o@("o" | "ö") + ("ita" | "itä") => -- silakoita + ; + _ => Predef.error silakoita + } ; + silakkoina = silakoiden.p2 + "in" + a ; + silakoissa = silakoiden.p3 + "iss" + a ; + in nForms10 + silakka silakan (silakka + a) (silakka + "n" + a) (silakka + a + "n") + silakoiden.p1 silakoita + silakkoina silakoissa silakoiden.p4 ; + + dArpi : (_,_ : Str) -> NForms = \arpi,arven -> + let + a = vowelHarmony arpi ; + arp = init arpi ; + arv = Predef.tk 2 arven ; + ar = init arp ; + arpe = case last arp of { + "s" => case last arv of { + "d" | "l" | "n" | "r" => -- suden,sutta ; jälsi ; kansi ; hirsi + ; + _ => -- kuusta,kuusien + + } ; + "r" | "n" => -- suurta,suurten + ; + "l" | "h" => -- tuulta,tuulien + ; + _ => -- arpea,arpien,arvissa + + } ; ---- pieni,pientä; uni,unta + in nForms10 + arpi arven arpe.p1 (arpe.p4 + "en" + a) (arpe.p4 + "een") + arpe.p2 (arpi + a) + (arp + "in" + a) (arpe.p3 + "ss" + a) (arp + "iin") ; + + dRae : (_,_ : Str) -> NForms = \rae,rakeen -> + let + a = vowelHarmony rae ; + rakee = init rakeen ; + rakei = init rakee + "i" ; + raetta = case of { + _ + "e" => + ; -- raetta,rakeeseen + _ + "s" => + ; -- rengasta,renkaaseen + _ + "t" => + ; -- olutta,olueen + _ + "r" => + ; -- sisarta,sisareen + _ => Predef.error (["expected ending e/t/s/r, found"] ++ rae) + } ; + in nForms10 + rae rakeen raetta.p1 (rakee + "n"+ a) raetta.p2 + (rakei + "den") (rakei + "t" + a) + (rakei + "n" + a) (rakei + "ss" + a) (rakei + "siin") ; ---- sisariin + + dPaatti : (_,_ : Str) -> NForms = \paatti,paatin -> + let + a = vowelHarmony paatti ; + paatte = init paatti + "e" ; + paati = init paatin ; + paate = init paati + "e" ; + in nForms10 + paatti paatin (paatti + a) (paatti + "n" + a) (paatti + "in") + (paatti + "en") (paatte + "j" + a) + (paatte + "in" + a) (paate + "iss" + a) (paatte + "ihin") ; + + dPiennar : (_,_ : Str) -> NForms = \piennar,pientaren -> + let + a = vowelHarmony piennar ; + pientar = Predef.tk 2 pientaren ; + in nForms10 + piennar pientaren (piennar +"t" + a) + (pientar + "en" + a) (pientar + "een") + (piennar + "ten") (pientar + "i" + a) (pientar + "in" + a) + (pientar + "iss" + a) (pientar + "iin") ; + + dUnix : (_ : Str) -> NForms = \unix -> + let + a = vowelHarmony unix ; + unixi = unix + "i" ; + unixe = unix + "e" ; + in nForms10 + unix (unixi + "n") (unixi + a) (unixi + "n" + a) (unixi + "in") + (unixi + "en") (unixe + "j" + a) (unixe + "in" + a) + (unixe + "iss" + a) (unixe + "ihin") ; + + dNukke : (_,_ : Str) -> NForms = \nukke,nuken -> + let + a = vowelHarmony nukke ; + nukk = init nukke ; + nuke = init nuken ; + in + nForms10 + nukke nuken (nukke + a) (nukk +"en" + a) (nukk + "een") + (nukk + "ien") (nukk + "ej" + a) (nukk + "ein" + a) + (nuke + "iss" + a) (nukk + "eihin") ; + + dJalas : Str -> NForms = \jalas -> + let + a = vowelHarmony jalas ; + jalaks = init jalas + "ks" ; + jalaksi = jalaks + "i" ; + in nForms10 + jalas (jalaks + "en") (jalas + "t" + a) + (jalaks + "en" + a) (jalaks + "een") + (jalas + "ten") (jalaksi + a) + (jalaksi + "n" + a) (jalaksi + "ss" + a) (jalaksi + "in") ; + + + NForms : Type = Predef.Ints 9 => Str ; + + nForms10 : (x1,_,_,_,_,_,_,_,_,x10 : Str) -> NForms = + \Ukko,ukon,ukkoa,ukkona,ukkoon, + ukkojen,ukkoja,ukkoina,ukoissa,ukkoihin -> table { + 0 => Ukko ; + 1 => ukon ; + 2 => ukkoa ; + 3 => ukkona ; + 4 => ukkoon ; + 5 => ukkojen ; + 6 => ukkoja ; + 7 => ukkoina ; + 8 => ukoissa ; + 9 => ukkoihin + } ; + + nForms2N : NForms -> N = \f -> + let + Ukko = f ! 0 ; + ukon = f ! 1 ; + ukkoa = f ! 2 ; + ukkona = f ! 3 ; + ukkoon = f ! 4 ; + ukkojen = f ! 5 ; + ukkoja = f ! 6 ; + ukkoina = f ! 7 ; + ukoissa = f ! 8 ; + ukkoihin = f ! 9 ; + a = last ukkoja ; + uko = init ukon ; + ukko = Predef.tk 2 ukkona ; + ukkoi = Predef.tk 2 ukkoina ; + ukoi = Predef.tk 3 ukoissa ; + in + {s = table { + NCase Sg Nom => Ukko ; + NCase Sg Gen => uko + "n" ; + NCase Sg Part => ukkoa ; + NCase Sg Transl => uko + "ksi" ; + NCase Sg Ess => ukkona ; + NCase Sg Iness => uko + ("ss" + a) ; + NCase Sg Elat => uko + ("st" + a) ; + NCase Sg Illat => ukkoon ; + NCase Sg Adess => uko + ("ll" + a) ; + NCase Sg Ablat => uko + ("lt" + a) ; + NCase Sg Allat => uko + "lle" ; + NCase Sg Abess => uko + ("tt" + a) ; + + NCase Pl Nom => uko + "t" ; + NCase Pl Gen => ukkojen ; + NCase Pl Part => ukkoja ; + NCase Pl Transl => ukoi + "ksi" ; + NCase Pl Ess => ukkoina ; + NCase Pl Iness => ukoissa ; + NCase Pl Elat => ukoi + ("st" + a) ; + NCase Pl Illat => ukkoihin ; + NCase Pl Adess => ukoi + ("ll" + a) ; + NCase Pl Ablat => ukoi + ("lt" + a) ; + NCase Pl Allat => ukoi + "lle" ; + NCase Pl Abess => ukoi + ("tt" + a) ; + + NComit => ukkoi + "ne" ; + NInstruct => ukoi + "n" ; + + NPossNom _ => ukko ; + NPossGen Sg => ukko ; + NPossGen Pl => init ukkojen ; + NPossTransl Sg => uko + "kse" ; + NPossTransl Pl => ukoi + "kse" ; + NPossIllat Sg => init ukkoon ; + NPossIllat Pl => init ukkoihin + } ; + lock_N = <> + } ; + + +--- This is used to analyse nouns "rae", "hake", "rengas", "laidun", etc. + + strongGrade : Str -> Str = \hanke -> + let + ha = Predef.tk 3 hanke ; + nke = Predef.dp 3 hanke ; + in + ha + case nke of { + "ng" + a => "nk" + a ; + "nn" + e => "nt" + e ; + "mm" + e => "mp" + e ; + "rr" + e => "rt" + e ; + "ll" + a => "lt" + a ; + h@("h" | "l") + "j" + e => h + "k" + e ; -- pohje/lahje impossible + ("hk" | "sk" | "sp" | "st") + _ => nke ; -- viuhke,kuiske + a + k@("k" | "p" | "t") + e@("e"|"a"|"ä"|"u"|"i") => a + k + k + e ; + a + "d" + e@("e"|"a"|"ä"|"u"|"i") => a + "t" + e ; + s + a@("a" | "ä") + "e" => s + a + "ke" ; -- säe, tae + a + "v" + e@("e"|"a"|"ä"|"u"|"i") => a + "p" + e ; -- taive/toive imposs + ase => ase + } ; + + part2casePl : Str -> Str * Str * Str * Str = \savia -> case savia of { + sav + "i" + a@("a" | "ä") => + ; + elio + "it" + a@("a" | "ä") => + ; + maal + "ej" + a@("a" | "ä") => + ; + talo + "j" + a@("a" | "ä") => + ; + _ => Predef.error (["impossible plural partitive"] ++ savia) + } ; + +} diff --git a/examples/uusisuomi/Nominal.gf b/examples/uusisuomi/Nominal.gf index 8cf60ec57..e8ab2262a 100644 --- a/examples/uusisuomi/Nominal.gf +++ b/examples/uusisuomi/Nominal.gf @@ -1,8 +1,8 @@ --# -path=.:alltenses -resource Nominal = ResFin ** open MorphoFin,CatFin,Prelude in { +resource Nominal = ResFin ** open MorphoFin,Declensions,CatFin,Prelude in { - flags optimize=all ; + flags optimize=noexpand ; oper @@ -16,198 +16,68 @@ resource Nominal = ResFin ** open MorphoFin,CatFin,Prelude in { nForms1 : Str -> NForms = \ukko -> let - a = vowelHarmony ukko ; ukk = init ukko ; uko = weakGrade ukko ; - rake = Nominal.strongGrade ukko ; - renka = Nominal.strongGrade (init ukko) ; - o = last ukko ; + renka = Declensions.strongGrade (init ukko) ; + rake = Declensions.strongGrade ukko ; in case ukko of { - _ + ("us" | "ys") => - let - lujuus = ukko ; - lujuu = ukk ; - lujuuksi = ukk + "ksi" - in nForms10 - lujuus (lujuu + "den") (lujuu + "tt" + a) - (lujuu + "ten" + a) (lujuu + "teen") - (lujuuksi + "en") (lujuuksi + a) - (lujuuksi + "n" + a) (lujuuksi + "ss" + a) (lujuuksi + "in") ; - _ + "nen" => - let - nainen = ukko ; - nais = Predef.tk 3 ukko + "s" - in nForms10 - nainen (nais + "en") (nais + "t" + a) (nais + "en" + a) (nais + "een") - (nais + "ten") (nais + "i" + a) - (nais + "in" + a) (nais + "iss" + a) (nais + "iin") ; - _ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö") => - let - puu = ukko ; - pui = ukk + "i" ; - u = o ; - in nForms10 - puu (puu + "n") (puu + "t" + a) (puu + "n" + a) (puu + "h" + u + "n") - (pui + "den") (pui + "t" + a) - (pui + "n" + a) (pui + "ss" + a) (pui + "hin") ; - _ + ("ie" | "uo" | "yö") => - let - suo = ukko ; - soi = init ukk + o + "i" ; - in nForms10 - suo (suo + "n") (suo + "t" + a) (suo + "n" + a) (suo + "h" + o + "n") - (soi + "den") (soi + "t" + a) - (soi + "n" + a) (soi + "ss" + a) (soi + "hin") ; - _ + ("ea" | "eä") => - let - korkea = ukko ; - korke = init ukko ; - in nForms10 - korkea (korkea + "n") (korkea + a) - (korkea + "n" + a) (korkea + a + "n") - (korke + "iden") (korke + "it" + a) - (korke + "in" + a) (korke + "iss" + a) - (korke + "isiin") ; --- NSSK: korkeihin - _ + "is" => - let - kaunis = ukko ; - kaunii = init kaunis + "i" ; - in nForms10 - kaunis (kaunii + "n") (kaunis + "t" + a) - (kaunii + "n" + a) (kaunii + "seen") - (kaunii + "den") (kaunii + "t" + a) - (kaunii + "n" + a) (kaunii + "ss" + a) - (kaunii + "siin") ; - - _ + ("i" | "u") + "n" => -- liitin,laidun - let - liitin = ukko ; - liittim = renka + "m" ; - in nForms10 - liitin (liittim + "en") (liitin + "t" + a) - (liittim + "en" + a) (liittim + "een") - (liittim + "ien") (liittim + "i" + a) - (liittim + "in" + a) (liittim + "iss" + a) - (liittim + "iin") ; - - onne + "t" + on@("on" | "ön") => - let - onneton = ukko ; - onnettom = onne + "tt" + init on + "m" ; - in nForms10 - onneton (onnettom + a + "n") (onneton + "t" + a) - (onnettom + a + "n" + a) (onnettom + a + a + "n") - (onnettom + "ien") (onnettom + "i" + a) - (onnettom + "in" + a) (onnettom + "iss" + a) - (onnettom + "iin") ; - - _ + ("ut" | "yt") => -- olut,kätkyt - nForms_rae ukko (ukk + "en" + a) ; - _ + ("as" | "äs") => -- rengas,rypäs - nForms_rae ukko (renka + a + "n" + a) ; - _ + ("ar" | "är") => -- piennar,tytär - nForms_rae ukko (renka + "ren" + a) ; - _ + "e" => - nForms_rae ukko (rake + "en" + a) ; - - _ + ("a" | "o" | "u" | "y" | "ä" | "ö") => - nForms_ukko ukko (uko + "n") ; - - _ + "i" => - let - paatte = ukk + "e" ; - paate = init uko + "e" ; - in nForms10 - ukko (uko + "n") (ukko + a) (ukko + "n" + a) (ukko + "in") - (ukko + "en") (paatte + "j" + a) - (paatte + "in" + a) (paate + "iss" + a) (paatte + "ihin") ; - _ + "e" + ("l" | "n") => - let - ahven = ukko ; - in nForms10 - ahven (ahven + "en") (ahven +"t" + a) - (ahven + "en" + a) (ahven + "een") - (ahven + "ten") (ahven + "i" + a) (ahven + "in" + a) - (ahven + "iss" + a) (ahven + "iin") ; - _ => - let - unixi = ukko + "i" ; - unixe = ukko + "e" ; - in nForms10 - ukko (unixi + "n") (unixi + a) (unixi + "n" + a) (unixi + "in") - (unixi + "en") (unixe + "j" + a) (unixe + "in" + a) - (unixe + "iss" + a) (unixe + "ihin") + _ + ("us" | "ys") => dLujuus ukko ; + _ + "nen" => dNainen ukko ; + _ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" |"ää"|"öö") => dPuu ukko ; + _ + ("ai" | "ei" | "oi" | "ui" | "yi" | "äi" | "öi") => dPuu ukko ; + _ + ("ie" | "uo" | "yö") => dSuo ukko ; + _ + ("ea" | "eä") => dKorkea ukko ; + _ + "is" => dKaunis ukko ; + _ + ("i" | "u") + "n" => dLiitin ukko (renka + "men") ; + _ + ("ton" | "tön") => dOnneton ukko ; + _ + ("ut" | "yt") => dRae ukko (ukk + "en") ; + _ + ("as" | "äs") => dRae ukko (renka + last renka + "n") ; + _ + "e" => dRae ukko (rake + "en") ; + _ + ("a" | "o" | "u" | "y" | "ä" | "ö") => dUkko ukko (uko + "n") ; + _ + "i" => dPaatti ukko (uko + "n") ; + _ + ("ar" | "är") => dPiennar ukko (renka + "ren") ; + _ + "e" + ("l" | "n") => dPiennar ukko (ukko + "en") ; + _ => dUnix ukko } ; - nForms2 : (_,_ : Str) -> NForms = \ukko,ukon -> let - a = vowelHarmony ukko ; ukk = init ukko ; - ukot = nForms1 ukko ; in case of { <_ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" | - "ie" | "uo" | "yö"), _ + "n"> => ukot ; --- to protect these + "ie" | "uo" | "yö" | "ea" | "eä"), _ + "n"> => + nForms1 ukko ; --- to protect <_ + ("a" | "o" | "u" | "y" | "ä" | "ö"), _ + "n"> => - nForms_ukko ukko ukon ; -- auto,auton - => - nForms_arpi ukko ukon (arp + "i" + a) ; + dUkko ukko ukon ; -- auto,auton + => dArpi ukko ukon ; => -- for b-w compat. - nForms_arpi ukko (init (weakGrade ukko) + "en") ukon ; + dArpi ukko (init (weakGrade ukko) + "en") ; => - nForms_rae ukko (terv + "een" + a) ; - => - nForms10 - ukko ukon (ukko + a) (nukk +"en" + a) (nukk + "een") - (nukk + "ien") (nukk + "ej" + a) (nukk + "ein" + a) - (nuk + "eiss" + a) (nukk + "eihin") ; - <_ + "s", _ + "ksen"> => table { - 1 => ukon ; - 2 => ukko + "t" + a ; - 3 => ukk + "ksen" + a ; - 4 => ukk + "kseen" ; - n => ukot ! n - } ; - <_,_ + "n"> => table { - 1 => ukon ; - n => ukot ! n - } ; - <_,_ + ("a" | "ä")> => table { -- for b-w compat. - 5 => (part2casePl ukon).p1 ; - 6 => ukon ; - n => ukot ! n - } ; + dRae ukko (terv + "een") ; + => dNukke ukko ukon ; + <_ + "s", _ + "ksen"> => dJalas ukko ; + <_, _ + "n"> => nForms1 ukko ; _ => Predef.error (["second argument should end in n, not"] ++ ukon) } ; nForms3 : (_,_,_ : Str) -> NForms = \ukko,ukon,ukkoja -> let - ukot = nForms2 ukko ukon ; + ukot = nForms2 ukko ukon ; in case of { + + <_ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" | + "ie" | "uo" | "yö" | "ea" | "eä"), _ + "n", _> => + nForms1 ukko ; --- to protect <_ + "a" | "ä", _ + "n", _ + ("a" | "ä")> => - let ukkojen = part2casePl ukkoja in - table { - 5 => ukkojen.p1 ; - 6 => ukkoja ; - 7 => ukkojen.p2 ; - 8 => ukkojen.p3 ; - 9 => ukkojen.p4 ; - n => ukot ! n - } ; - <_,_ + "n", _ + ("a" | "ä")> => - let ukkojen = part2casePl ukkoja in - table { - 5 => ukkojen.p1 ; - 6 => ukkoja ; - n => ukot ! n - } ; + dSilakka ukko ukon ukkoja ; + <_, _ + "n", _ + ("a" | "ä")> => ukot ; _ => Predef.error - (["last arguments should end in n and a/ä, not"] ++ ukon ++ ukkoja) + (["last arguments should end in n and a/ä, not"] ++ ukon ++ ukkoja) } ; nForms4 : (_,_,_,_ : Str) -> NForms = \ukko,ukon,ukkoa,ukkoja -> @@ -226,191 +96,4 @@ resource Nominal = ResFin ** open MorphoFin,CatFin,Prelude in { ukon ++ ukkoa ++ ukkoja) } ; - --- auxiliary "declensions" - - nForms_ukko : (_,_ : Str) -> NForms = \ukko,ukon -> - let - o = last ukko ; - a = getHarmony o ; - ukk = init ukko ; - uko = init ukon ; - uk = init uko ; - ukkoja = case of { - _ + "ä" => -- kylä,kyliä,kylien,kylissä,kyliin - ; - _ + ("au" | "eu") + _ + "a" => -- kauhojen,seurojen - ; - _ + ("o" | "u") + _ + "a" => -- pula,pulia,pulien,pulissa,puliin - ; - _ + "a" => -- kala,kaloja,kalojen,-oissa,-oihin - ; - _ => -- suku,sukuja,sukujen,-uissa,-uihin - - } ; - ukkoina = ukkoja.p3 + "in" + a ; - ukoissa = ukkoja.p4 + "iss" + a ; - in nForms10 - ukko ukon (ukko + a) (ukko + "n" + a) (ukko + o + "n") - ukkoja.p2 ukkoja.p1 - ukkoina ukoissa ukkoja.p5 ; - - - nForms_arpi : (_,_,_ : Str) -> NForms = \arpi,arven,arpia -> - let - a = last arpia ; - arp = init arpi ; - arv = Predef.tk 2 arven ; - ar = init arp ; - arpe = case last arp of { - "s" => case last arv of { - "d" | "l" | "n" | "r" => -- suden,sutta ; jälsi ; kansi ; hirsi - ; - _ => -- kuusen,kuusta - ---- suksi,suksen - } ; - "r" => -- suurta,suurten - ; - "l" | "h" => -- tuulta,tuulien - ; - _ => -- arpea,arpien,arvissa - - } ; ---- pieni,pientä; uni,unta - in nForms10 - arpi arven arpe.p1 (arpe.p4 + "en" + a) (arpe.p4 + "een") - arpe.p2 arpia - (arp + "in" + a) (arpe.p3 + "ss" + a) (arp + "iin") ; - - nForms_rae : (_,_ : Str) -> NForms = \rae,rakeena -> - let - a = last rakeena ; - rakee = Predef.tk 2 rakeena ; - rakei = init rakee + "i" ; - raetta = case of { - _ + "e" => - ; -- raetta,rakeeseen - _ + "s" => - ; -- rengasta,renkaaseen - _ + "t" => - ; -- olutta,olueen - _ + "r" => - ; -- sisarta,sisareen - _ => Predef.error (["expected ending e/t/s/r, found"] ++ rae) - } ; - in nForms10 - rae (rakee + "n") raetta.p1 (rakee + "n"+ a) raetta.p2 - (rakei + "den") (rakei + "t" + a) - (rakei + "n" + a) (rakei + "ss" + a) (rakei + "siin") ; ---- sisariin - - NForms : Type = Predef.Ints 9 => Str ; - - nForms10 : (x1,_,_,_,_,_,_,_,_,x10 : Str) -> NForms = - \Ukko,ukon,ukkoa,ukkona,ukkoon, - ukkojen,ukkoja,ukkoina,ukoissa,ukkoihin -> table { - 0 => Ukko ; - 1 => ukon ; - 2 => ukkoa ; - 3 => ukkona ; - 4 => ukkoon ; - 5 => ukkojen ; - 6 => ukkoja ; - 7 => ukkoina ; - 8 => ukoissa ; - 9 => ukkoihin - } ; - - nForms2N : NForms -> N = \f -> - let - Ukko = f ! 0 ; - ukon = f ! 1 ; - ukkoa = f ! 2 ; - ukkona = f ! 3 ; - ukkoon = f ! 4 ; - ukkojen = f ! 5 ; - ukkoja = f ! 6 ; - ukkoina = f ! 7 ; - ukoissa = f ! 8 ; - ukkoihin = f ! 9 ; - a = last ukkoja ; - uko = init ukon ; - ukko = Predef.tk 2 ukkona ; - ukkoi = Predef.tk 2 ukkoina ; - ukoi = Predef.tk 3 ukoissa ; - in - {s = table { - NCase Sg Nom => Ukko ; - NCase Sg Gen => uko + "n" ; - NCase Sg Part => ukkoa ; - NCase Sg Transl => uko + "ksi" ; - NCase Sg Ess => ukkona ; - NCase Sg Iness => uko + ("ss" + a) ; - NCase Sg Elat => uko + ("st" + a) ; - NCase Sg Illat => ukkoon ; - NCase Sg Adess => uko + ("ll" + a) ; - NCase Sg Ablat => uko + ("lt" + a) ; - NCase Sg Allat => uko + "lle" ; - NCase Sg Abess => uko + ("tt" + a) ; - - NCase Pl Nom => uko + "t" ; - NCase Pl Gen => ukkojen ; - NCase Pl Part => ukkoja ; - NCase Pl Transl => ukoi + "ksi" ; - NCase Pl Ess => ukkoina ; - NCase Pl Iness => ukoissa ; - NCase Pl Elat => ukoi + ("st" + a) ; - NCase Pl Illat => ukkoihin ; - NCase Pl Adess => ukoi + ("ll" + a) ; - NCase Pl Ablat => ukoi + ("lt" + a) ; - NCase Pl Allat => ukoi + "lle" ; - NCase Pl Abess => ukoi + ("tt" + a) ; - - NComit => ukkoi + "ne" ; - NInstruct => ukoi + "n" ; - - NPossNom _ => ukko ; - NPossGen Sg => ukko ; - NPossGen Pl => init ukkojen ; - NPossTransl Sg => uko + "kse" ; - NPossTransl Pl => ukoi + "kse" ; - NPossIllat Sg => init ukkoon ; - NPossIllat Pl => init ukkoihin - } ; - lock_N = <> - } ; - - ---- This is used to analyse nouns "rae", "hake", "rengas", "laidun", etc. - - strongGrade : Str -> Str = \hanke -> - let - ha = Predef.tk 3 hanke ; - nke = Predef.dp 3 hanke ; - in - ha + case nke of { - "ng" + a => "nk" + a ; - "nn" + e => "nt" + e ; - "mm" + e => "mp" + e ; - "rr" + e => "rt" + e ; - "ll" + a => "lt" + a ; - h@("h" | "l") + "j" + e => h + "k" + e ; -- pohje/lahje impossible - ("hk" | "sk" | "sp" | "st") + _ => nke ; -- viuhke,kuiske - a + k@("k" | "p" | "t") + e@("e"|"a"|"ä"|"u"|"i") => a + k + k + e ; - a + "d" + e@("e"|"a"|"ä"|"u"|"i") => a + "t" + e ; - s + a@("a" | "ä") + "e" => s + a + "ke" ; -- säe, tae - a + "v" + e@("e"|"a"|"ä"|"u"|"i") => a + "p" + e ; -- taive/toive imposs - ase => ase - } ; - - part2casePl : Str -> Str * Str * Str * Str = \savia -> case savia of { - sav + "i" + a@("a" | "ä") => - ; - elio + "it" + a@("a" | "ä") => - ; - maal + "ej" + a@("a" | "ä") => - ; - talo + "j" + a@("a" | "ä") => - ; - _ => Predef.error (["impossible plural partitive"] ++ savia) - } ; - } diff --git a/examples/uusisuomi/Nominal1.gf b/examples/uusisuomi/Nominal1.gf new file mode 100644 index 000000000..1cbbf1298 --- /dev/null +++ b/examples/uusisuomi/Nominal1.gf @@ -0,0 +1,415 @@ +--# -path=.:alltenses + +resource Nominal = ResFin ** open MorphoFin,CatFin,Prelude in { + + flags optimize=all ; + + oper + +-- mkN = overload { + mk1N : (talo : Str) -> N = \s -> nForms2N (nForms1 s) ; + mk2N : (talo,talon : Str) -> N = \s,t -> nForms2N (nForms2 s t) ; + mk3N : (talo,talon,taloja : Str) -> N = \s,t,u -> nForms2N (nForms3 s t u) ; + mk4N : (talo,talon,taloa,taloja : Str) -> N = \s,t,u,v -> + nForms2N (nForms4 s t u v) ; +-- } ; + + nForms1 : Str -> NForms = \ukko -> + let + a = vowelHarmony ukko ; + ukk = init ukko ; + uko = weakGrade ukko ; + rake = Nominal.strongGrade ukko ; + renka = Nominal.strongGrade (init ukko) ; + o = last ukko ; + in + case ukko of { + _ + ("us" | "ys") => + let + lujuus = ukko ; + lujuu = ukk ; + lujuuksi = ukk + "ksi" + in nForms10 + lujuus (lujuu + "den") (lujuu + "tt" + a) + (lujuu + "ten" + a) (lujuu + "teen") + (lujuuksi + "en") (lujuuksi + a) + (lujuuksi + "n" + a) (lujuuksi + "ss" + a) (lujuuksi + "in") ; + _ + "nen" => + let + nainen = ukko ; + nais = Predef.tk 3 ukko + "s" + in nForms10 + nainen (nais + "en") (nais + "t" + a) (nais + "en" + a) (nais + "een") + (nais + "ten") (nais + "i" + a) + (nais + "in" + a) (nais + "iss" + a) (nais + "iin") ; + _ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö") => + let + puu = ukko ; + pui = ukk + "i" ; + u = o ; + in nForms10 + puu (puu + "n") (puu + "t" + a) (puu + "n" + a) (puu + "h" + u + "n") + (pui + "den") (pui + "t" + a) + (pui + "n" + a) (pui + "ss" + a) (pui + "hin") ; + _ + ("ie" | "uo" | "yö") => + let + suo = ukko ; + soi = init ukk + o + "i" ; + in nForms10 + suo (suo + "n") (suo + "t" + a) (suo + "n" + a) (suo + "h" + o + "n") + (soi + "den") (soi + "t" + a) + (soi + "n" + a) (soi + "ss" + a) (soi + "hin") ; + _ + ("ea" | "eä") => + let + korkea = ukko ; + korke = init ukko ; + in nForms10 + korkea (korkea + "n") (korkea + a) + (korkea + "n" + a) (korkea + a + "n") + (korke + "iden") (korke + "it" + a) + (korke + "in" + a) (korke + "iss" + a) + (korke + "isiin") ; --- NSSK: korkeihin + _ + "is" => + let + kaunis = ukko ; + kaunii = init kaunis + "i" ; + in nForms10 + kaunis (kaunii + "n") (kaunis + "t" + a) + (kaunii + "n" + a) (kaunii + "seen") + (kaunii + "den") (kaunii + "t" + a) + (kaunii + "n" + a) (kaunii + "ss" + a) + (kaunii + "siin") ; + _ + ("i" | "u") + "n" => -- liitin,laidun + let + liitin = ukko ; + liittim = renka + "m" ; + in nForms10 + liitin (liittim + "en") (liitin + "t" + a) + (liittim + "en" + a) (liittim + "een") + (liittim + "ien") (liittim + "i" + a) + (liittim + "in" + a) (liittim + "iss" + a) + (liittim + "iin") ; + + onne + "t" + on@("on" | "ön") => + let + onneton = ukko ; + onnettom = onne + "tt" + init on + "m" ; + in nForms10 + onneton (onnettom + a + "n") (onneton + "t" + a) + (onnettom + a + "n" + a) (onnettom + a + a + "n") + (onnettom + "ien") (onnettom + "i" + a) + (onnettom + "in" + a) (onnettom + "iss" + a) + (onnettom + "iin") ; + + _ + ("ut" | "yt") => -- olut,kätkyt + nForms_rae ukko (ukk + "en" + a) ; + _ + ("as" | "äs") => -- rengas,rypäs + nForms_rae ukko (renka + a + "n" + a) ; + _ + ("ar" | "är") => -- piennar,tytär + nForms_rae ukko (renka + "ren" + a) ; + _ + "e" => + nForms_rae ukko (rake + "en" + a) ; + + _ + ("a" | "o" | "u" | "y" | "ä" | "ö") => + nForms_ukko ukko (uko + "n") ; + + _ + "i" => + let + paatte = ukk + "e" ; + paate = init uko + "e" ; + in nForms10 + ukko (uko + "n") (ukko + a) (ukko + "n" + a) (ukko + "in") + (ukko + "en") (paatte + "j" + a) + (paatte + "in" + a) (paate + "iss" + a) (paatte + "ihin") ; + _ + "e" + ("l" | "n") => + let + ahven = ukko ; + in nForms10 + ahven (ahven + "en") (ahven +"t" + a) + (ahven + "en" + a) (ahven + "een") + (ahven + "ten") (ahven + "i" + a) (ahven + "in" + a) + (ahven + "iss" + a) (ahven + "iin") ; + _ => + let + unixi = ukko + "i" ; + unixe = ukko + "e" ; + in nForms10 + ukko (unixi + "n") (unixi + a) (unixi + "n" + a) (unixi + "in") + (unixi + "en") (unixe + "j" + a) (unixe + "in" + a) + (unixe + "iss" + a) (unixe + "ihin") + } ; + + + nForms2 : (_,_ : Str) -> NForms = \ukko,ukon -> + let + a = vowelHarmony ukko ; + ukk = init ukko ; + ukot = nForms1 ukko ; + in + case of { + <_ + ("aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" | + "ie" | "uo" | "yö"), _ + "n"> => ukot ; --- to protect these + <_ + ("a" | "o" | "u" | "y" | "ä" | "ö"), _ + "n"> => + nForms_ukko ukko ukon ; -- auto,auton + => + nForms_arpi ukko ukon (arp + "i" + a) ; + => -- for b-w compat. + nForms_arpi ukko (init (weakGrade ukko) + "en") ukon ; + => + nForms_rae ukko (terv + "een" + a) ; + => + nForms10 + ukko ukon (ukko + a) (nukk +"en" + a) (nukk + "een") + (nukk + "ien") (nukk + "ej" + a) (nukk + "ein" + a) + (nuk + "eiss" + a) (nukk + "eihin") ; + <_ + "s", _ + "ksen"> => table { + 1 => ukon ; + 2 => ukko + "t" + a ; + 3 => ukk + "ksen" + a ; + 4 => ukk + "kseen" ; + n => ukot ! n + } ; + <_,_ + "n"> => table { + 1 => ukon ; + n => ukot ! n + } ; + <_,_ + ("a" | "ä")> => table { -- for b-w compat. + 5 => (part2casePl ukon).p1 ; + 6 => ukon ; + n => ukot ! n + } ; + _ => + Predef.error (["second argument should end in n, not"] ++ ukon) + } ; + + nForms3 : (_,_,_ : Str) -> NForms = \ukko,ukon,ukkoja -> + let + ukot = nForms2 ukko ukon ; + in + case of { + <_ + "a" | "ä", _ + "n", _ + ("a" | "ä")> => + let ukkojen = part2casePl ukkoja in + table { + 5 => ukkojen.p1 ; + 6 => ukkoja ; + 7 => ukkojen.p2 ; + 8 => ukkojen.p3 ; + 9 => ukkojen.p4 ; + n => ukot ! n + } ; + <_,_ + "n", _ + ("a" | "ä")> => + let ukkojen = part2casePl ukkoja in + table { + 5 => ukkojen.p1 ; + 6 => ukkoja ; + n => ukot ! n + } ; + _ => + Predef.error + (["last arguments should end in n and a/ä, not"] ++ ukon ++ ukkoja) + } ; + + nForms4 : (_,_,_,_ : Str) -> NForms = \ukko,ukon,ukkoa,ukkoja -> + let + ukot = nForms3 ukko ukon ukkoja ; + in + case of { + <_,_ + "n", _ + ("a" | "ä"), _ + ("a" | "ä")> => + table { + 2 => ukkoa ; + n => ukot ! n + } ; + _ => + Predef.error + (["last arguments should end in n, a/ä, and a/ä, not"] ++ + ukon ++ ukkoa ++ ukkoja) + } ; + + +-- auxiliary "declensions" + + nForms_ukko : (_,_ : Str) -> NForms = \ukko,ukon -> + let + o = last ukko ; + a = getHarmony o ; + ukk = init ukko ; + uko = init ukon ; + uk = init uko ; + ukkoja = case of { + _ + "ä" => -- kylä,kyliä,kylien,kylissä,kyliin + ; + _ + ("au" | "eu") + _ + "a" => -- kauhojen,seurojen + ; + _ + ("o" | "u") + _ + "a" => -- pula,pulia,pulien,pulissa,puliin + ; + _ + "a" => -- kala,kaloja,kalojen,-oissa,-oihin + ; + _ => -- suku,sukuja,sukujen,-uissa,-uihin + + } ; + ukkoina = ukkoja.p3 + "in" + a ; + ukoissa = ukkoja.p4 + "iss" + a ; + in nForms10 + ukko ukon (ukko + a) (ukko + "n" + a) (ukko + o + "n") + ukkoja.p2 ukkoja.p1 + ukkoina ukoissa ukkoja.p5 ; + + + nForms_arpi : (_,_,_ : Str) -> NForms = \arpi,arven,arpia -> + let + a = last arpia ; + arp = init arpi ; + arv = Predef.tk 2 arven ; + ar = init arp ; + arpe = case last arp of { + "s" => case last arv of { + "d" | "l" | "n" | "r" => -- suden,sutta ; jälsi ; kansi ; hirsi + ; + _ => -- kuusen,kuusta + ---- suksi,suksen + } ; + "r" => -- suurta,suurten + ; + "l" | "h" => -- tuulta,tuulien + ; + _ => -- arpea,arpien,arvissa + + } ; ---- pieni,pientä; uni,unta + in nForms10 + arpi arven arpe.p1 (arpe.p4 + "en" + a) (arpe.p4 + "een") + arpe.p2 arpia + (arp + "in" + a) (arpe.p3 + "ss" + a) (arp + "iin") ; + + nForms_rae : (_,_ : Str) -> NForms = \rae,rakeena -> + let + a = last rakeena ; + rakee = Predef.tk 2 rakeena ; + rakei = init rakee + "i" ; + raetta = case of { + _ + "e" => + ; -- raetta,rakeeseen + _ + "s" => + ; -- rengasta,renkaaseen + _ + "t" => + ; -- olutta,olueen + _ + "r" => + ; -- sisarta,sisareen + _ => Predef.error (["expected ending e/t/s/r, found"] ++ rae) + } ; + in nForms10 + rae (rakee + "n") raetta.p1 (rakee + "n"+ a) raetta.p2 + (rakei + "den") (rakei + "t" + a) + (rakei + "n" + a) (rakei + "ss" + a) (rakei + "siin") ; ---- sisariin + + NForms : Type = Predef.Ints 9 => Str ; + + nForms10 : (x1,_,_,_,_,_,_,_,_,x10 : Str) -> NForms = + \Ukko,ukon,ukkoa,ukkona,ukkoon, + ukkojen,ukkoja,ukkoina,ukoissa,ukkoihin -> table { + 0 => Ukko ; + 1 => ukon ; + 2 => ukkoa ; + 3 => ukkona ; + 4 => ukkoon ; + 5 => ukkojen ; + 6 => ukkoja ; + 7 => ukkoina ; + 8 => ukoissa ; + 9 => ukkoihin + } ; + + nForms2N : NForms -> N = \f -> + let + Ukko = f ! 0 ; + ukon = f ! 1 ; + ukkoa = f ! 2 ; + ukkona = f ! 3 ; + ukkoon = f ! 4 ; + ukkojen = f ! 5 ; + ukkoja = f ! 6 ; + ukkoina = f ! 7 ; + ukoissa = f ! 8 ; + ukkoihin = f ! 9 ; + a = last ukkoja ; + uko = init ukon ; + ukko = Predef.tk 2 ukkona ; + ukkoi = Predef.tk 2 ukkoina ; + ukoi = Predef.tk 3 ukoissa ; + in + {s = table { + NCase Sg Nom => Ukko ; + NCase Sg Gen => uko + "n" ; + NCase Sg Part => ukkoa ; + NCase Sg Transl => uko + "ksi" ; + NCase Sg Ess => ukkona ; + NCase Sg Iness => uko + ("ss" + a) ; + NCase Sg Elat => uko + ("st" + a) ; + NCase Sg Illat => ukkoon ; + NCase Sg Adess => uko + ("ll" + a) ; + NCase Sg Ablat => uko + ("lt" + a) ; + NCase Sg Allat => uko + "lle" ; + NCase Sg Abess => uko + ("tt" + a) ; + + NCase Pl Nom => uko + "t" ; + NCase Pl Gen => ukkojen ; + NCase Pl Part => ukkoja ; + NCase Pl Transl => ukoi + "ksi" ; + NCase Pl Ess => ukkoina ; + NCase Pl Iness => ukoissa ; + NCase Pl Elat => ukoi + ("st" + a) ; + NCase Pl Illat => ukkoihin ; + NCase Pl Adess => ukoi + ("ll" + a) ; + NCase Pl Ablat => ukoi + ("lt" + a) ; + NCase Pl Allat => ukoi + "lle" ; + NCase Pl Abess => ukoi + ("tt" + a) ; + + NComit => ukkoi + "ne" ; + NInstruct => ukoi + "n" ; + + NPossNom _ => ukko ; + NPossGen Sg => ukko ; + NPossGen Pl => init ukkojen ; + NPossTransl Sg => uko + "kse" ; + NPossTransl Pl => ukoi + "kse" ; + NPossIllat Sg => init ukkoon ; + NPossIllat Pl => init ukkoihin + } ; + lock_N = <> + } ; + + +--- This is used to analyse nouns "rae", "hake", "rengas", "laidun", etc. + + strongGrade : Str -> Str = \hanke -> + let + ha = Predef.tk 3 hanke ; + nke = Predef.dp 3 hanke ; + in + ha + case nke of { + "ng" + a => "nk" + a ; + "nn" + e => "nt" + e ; + "mm" + e => "mp" + e ; + "rr" + e => "rt" + e ; + "ll" + a => "lt" + a ; + h@("h" | "l") + "j" + e => h + "k" + e ; -- pohje/lahje impossible + ("hk" | "sk" | "sp" | "st") + _ => nke ; -- viuhke,kuiske + a + k@("k" | "p" | "t") + e@("e"|"a"|"ä"|"u"|"i") => a + k + k + e ; + a + "d" + e@("e"|"a"|"ä"|"u"|"i") => a + "t" + e ; + s + a@("a" | "ä") + "e" => s + a + "ke" ; -- säe, tae + a + "v" + e@("e"|"a"|"ä"|"u"|"i") => a + "p" + e ; -- taive/toive imposs + ase => ase + } ; + + part2casePl : Str -> Str * Str * Str * Str = \savia -> case savia of { + sav + "i" + a@("a" | "ä") => + ; + elio + "it" + a@("a" | "ä") => + ; + maal + "ej" + a@("a" | "ä") => + ; + talo + "j" + a@("a" | "ä") => + ; + _ => Predef.error (["impossible plural partitive"] ++ savia) + } ; + +} diff --git a/examples/uusisuomi/correct-Omat.txt b/examples/uusisuomi/correct-Omat.txt index cd3fe61ed..1c78b60a5 100644 --- a/examples/uusisuomi/correct-Omat.txt +++ b/examples/uusisuomi/correct-Omat.txt @@ -14,6 +14,8 @@ syy syyn syyt pii piin piitä piinä piihin piiden piitä piinä piissä piihin +hai hain haita haina haihin haiden haita haina haissa haihin + tienoo tienoon tienoota tienoona tienoohon tienoiden tienoita tienoina tienoissa tienoihin suo suon suota suona suohon soiden soita soina soissa soihin @@ -52,9 +54,9 @@ rengas renkaan rengasta renkaana renkaaseen renkaiden renkaita renkaina renkaiss taivas taivaan taivasta taivaana taivaaseen taivaiden taivaita taivaina taivaissa taivaisiin -piennar pientaren piennarta pientarena pientaren piennarten pientaria pientarina pientarissa pientariin +piennar pientaren piennarta pientarena pientareen pientarien/piennarten pientaria pientarina pientarissa pientariin -sisar sisaren sisarta sisarena sisareen sisarien sisaria sisarina sisarissa sisariin +sisar sisaren sisarta sisarena sisareen sisarien/sisarten sisaria sisarina sisarissa sisariin rae rakeen raetta rakeena rakeeseen rakeiden rakeita rakeina rakeissa rakeisiin @@ -104,7 +106,7 @@ j korsi korren kortta kortena korteen korsien korsia korsina korsissa korsiin -kuusi kuusen kuusta kuusena kuuseen kuusten kuusia kuusina kuusissa kuusiin +kuusi kuusen kuusta kuusena kuuseen kuusten/kuusien kuusia kuusina kuusissa kuusiin saari saaren saarta saarena saareen saarten saaria saarina saarissa saariin @@ -114,17 +116,17 @@ arpi arven arpea arpena arpeen arpien arpia arpina arvissa arpiin jälki jäljen jälkeä jälkenä jälkeen jälkien jälkiä jälkinä jäljissä jälkiin -veitsi veitsen veistä veitsenä veitseen veisten veitsiä veitsinä veitsissä veitsiin +veitsi veitsen veistä veitsenä veitseen veisten/veitsien veitsiä veitsinä veitsissä veitsiin meri meren merta merenä mereen merten meriä merinä merissä meriin veri veren verta verenä vereen verten veriä verinä verissä veriin -pakkaus pakkauksen pakkausta pakkauksena pakkaukseen pakkauksien pakkauksia pakkauksina pakkauksissa pakkauksiin +pakkaus pakkauksen pakkausta pakkauksena pakkaukseen pakkauksien/pakkausten pakkauksia pakkauksina pakkauksissa pakkauksiin -julius juliuksen juliusta juliuksena juliukseen juliuksien juliuksia juliuksina juliuksissa juliuksiin +julius juliuksen juliusta juliuksena juliukseen juliuksien/juliusten juliuksia juliuksina juliuksissa juliuksiin -hius hiuksen hiusta hiuksena hiukseen hiuksien hiuksia hiuksina hiuksissa hiuksiin +hius hiuksen hiusta hiuksena hiukseen hiuksien/hiusten hiuksia hiuksina hiuksissa hiuksiin paperi paperin paperia paperina paperiin papereiden papereita papereina papereissa papereihin @@ -174,8 +176,6 @@ sankari sankarin sankaria sankarina sankariin sankareiden sankareita sankareina jumala jumalan jumalaa jumalana jumalaan jumalien jumalia jumalina jumalissa jumaliin -sisar sisaren sisarta sisarena sisareen sisarien sisaria sisarina sisarissa sisariin - kirves kirveen kirvestä kirveenä kirveeseen kirvesten/kirveiden kirveitä kirveinä kirveissä kirveisiin/kirveihin kives kiveksen kivestä kiveksenä kivekseen kivesten/kiveksien kiveksiä kiveksinä kiveksissä kiveksiin