summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-01-02 16:54:22 +0000
committeraarne <aarne@cs.chalmers.se>2008-01-02 16:54:22 +0000
commitcbfb9d5e7d76616b5490083a9f4071fd977c2ec0 (patch)
treebdbd570e6615b2fe2aa0c6033472750d0f5b75fc /examples
parentb3da2791fdea27bd5061ad939e31915e36c03f1d (diff)
experiment with Finnish morphology
Diffstat (limited to 'examples')
-rw-r--r--examples/uusisuomi/Makefile23
-rw-r--r--examples/uusisuomi/MkLex.hs85
-rw-r--r--examples/uusisuomi/MyDiff.hs25
-rw-r--r--examples/uusisuomi/Nominal.gf416
-rw-r--r--examples/uusisuomi/correct-NSK.txt164
-rw-r--r--examples/uusisuomi/correct-Omat.txt188
6 files changed, 901 insertions, 0 deletions
diff --git a/examples/uusisuomi/Makefile b/examples/uusisuomi/Makefile
new file mode 100644
index 000000000..d3a8d96c2
--- /dev/null
+++ b/examples/uusisuomi/Makefile
@@ -0,0 +1,23 @@
+LEX=Omat
+
+all: tests
+
+gf-files:
+ runghc MkLex.hs 0 > $(LEX)Abs.gf
+ runghc MkLex.hs 1 > $(LEX)1.gf
+ runghc MkLex.hs 2 > $(LEX)2.gf
+ runghc MkLex.hs 3 > $(LEX)3.gf
+ runghc MkLex.hs 4 > $(LEX)4.gf
+
+experiments: gf-files
+ echo "gt -cat=Utt | l | wf exper1-$(LEX).txt" | gf $(LEX)1.gf
+ echo "gt -cat=Utt | l | wf exper2-$(LEX).txt" | gf $(LEX)2.gf
+ echo "gt -cat=Utt | l | wf exper3-$(LEX).txt" | gf $(LEX)3.gf
+ echo "gt -cat=Utt | l | wf exper4-$(LEX).txt" | gf $(LEX)4.gf
+
+tests: experiments
+ runghc MyDiff.hs correct-$(LEX).txt exper1-$(LEX).txt >diff1.txt
+ runghc MyDiff.hs correct-$(LEX).txt exper2-$(LEX).txt >diff2.txt
+ runghc MyDiff.hs correct-$(LEX).txt exper3-$(LEX).txt >diff3.txt
+ runghc MyDiff.hs correct-$(LEX).txt exper4-$(LEX).txt >diff4.txt
+ wc -l diff?.txt
diff --git a/examples/uusisuomi/MkLex.hs b/examples/uusisuomi/MkLex.hs
new file mode 100644
index 000000000..77b8beb4a
--- /dev/null
+++ b/examples/uusisuomi/MkLex.hs
@@ -0,0 +1,85 @@
+module Main where
+
+import System
+import Char
+
+-- generate Finnish lexicon implementations with 1 or more
+-- characteristic arguments
+-- usage: runghc MkLex.hs 3
+
+main = do
+ i:_ <- getArgs
+ ss <- readFile src >>= return . filter (not . (all isSpace)) . lines
+ initiate i
+ mapM_ (mkLex (read i) . uncurry (++)) (zip nums ss)
+ putStrLn "}"
+
+--src = "correct-NSK.txt"
+--tgt = "NSK"
+src = "correct-Omat.txt"
+tgt = "Omat"
+
+initiate i = mapM_ putStrLn [
+ "--# -path=.:alltenses",
+ "",
+ header i,
+ ""
+ ]
+ where
+ header i = case i of
+ "0" -> "abstract " ++ tgt ++ "Abs = Cat ** {\n\nfun testN : N -> Utt ;\n"
+ _ -> unlines [
+ "concrete " ++ tgt ++ i ++
+ " of " ++ tgt ++ "Abs = CatFin ** open Nominal, ResFin, Prelude in {",
+ "",
+ "lin testN talo = let t = talo.s in ss (",
+ " t ! NCase Sg Nom ++",
+ " t ! NCase Sg Gen ++",
+ " t ! NCase Sg Part ++",
+ " t ! NCase Sg Ess ++",
+ " t ! NCase Sg Illat ++",
+ " t ! NCase Pl Gen ++",
+ " t ! NCase Pl Part ++",
+ " t ! NCase Pl Ess ++",
+ " t ! NCase Pl Iness ++",
+ " t ! NCase Pl Illat",
+ " ) ;"
+ ]
+
+nums = map prt [1 ..] where
+ prt i = (if i < 10 then "0" else "") ++ show i ++ ". "
+
+mkLex 0 line = case words line of
+ num:sana:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "fun " ++ nimi ++ "_N : N ;"
+ _ -> return ()
+
+mkLex 1 line = case words line of
+ num:sana:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "lin " ++ nimi ++ "_N = mk1N \"" ++ sana ++ "\" ;"
+ _ -> return ()
+
+mkLex 2 line = case words line of
+ num:sana:sanan:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "lin " ++ nimi ++
+ "_N = mk2N \"" ++ sana ++ "\" \"" ++ sanan ++ "\" ;"
+ _ -> return ()
+
+mkLex 3 line = case words line of
+ num:sana:sanan:_:_:_:_:sanoja:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "lin " ++ nimi ++
+ "_N = mk3N \"" ++ sana ++ "\" \"" ++ sanan ++ "\" \"" ++ sanoja ++ "\" ;"
+ _ -> return ()
+
+mkLex 4 line = case words line of
+ num:sana:sanan:sanaa:_:_:_:sanoja:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "lin " ++ nimi ++
+ "_N = mk4N \"" ++ sana ++ "\" \"" ++ sanan ++
+ "\" \"" ++ sanaa ++ "\" \"" ++ sanoja ++ "\" ;"
+ _ -> return ()
+
diff --git a/examples/uusisuomi/MyDiff.hs b/examples/uusisuomi/MyDiff.hs
new file mode 100644
index 000000000..f695978aa
--- /dev/null
+++ b/examples/uusisuomi/MyDiff.hs
@@ -0,0 +1,25 @@
+module Main where
+
+import System
+
+-- compare lines word-by-word, returning difference pairs with their positions
+
+main = do
+ x:y:_ <- getArgs
+ old <- readFile x >>= return . lines
+ new <- readFile y >>= return . lines
+ mapM_ comp (zip old new)
+
+comp (ws1,ws2) = do
+ let diffs = [form ++ ":" ++ w1 ++ "-" ++ w2 |
+ (form,(w1,w2)) <- zip forms (zip (words ws1) (words ws2)), diff w2 w1]
+ putStr $ unwords diffs
+ if null diffs then return () else putStrLn ""
+
+forms = map show [1..]
+
+diff w ws = notElem w (chop ws) where
+ chop cs = case span (/='/') cs of
+ ([],_) -> []
+ (w1,ww) -> w1:chop (drop 1 ww)
+
diff --git a/examples/uusisuomi/Nominal.gf b/examples/uusisuomi/Nominal.gf
new file mode 100644
index 000000000..8cf60ec57
--- /dev/null
+++ b/examples/uusisuomi/Nominal.gf
@@ -0,0 +1,416 @@
+--# -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 <ukko,ukon> 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
+ <arp + "i", arv + "en"> =>
+ nForms_arpi ukko ukon (arp + "i" + a) ;
+ <arp + "i", _ + "i" + ("a" | "ä")> => -- for b-w compat.
+ nForms_arpi ukko (init (weakGrade ukko) + "en") ukon ;
+ <terv + "e", terv + "een"> =>
+ nForms_rae ukko (terv + "een" + a) ;
+ <nukk + "e", nuk + "en"> =>
+ 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 <ukko,ukon,ukkoja> 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 <ukko,ukon,ukkoa,ukkoja> 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 <ukko : Str> of {
+ _ + "ä" => -- kylä,kyliä,kylien,kylissä,kyliin
+ <ukk + "iä", ukk + "ien", ukk, uk, ukk + "iin"> ;
+ _ + ("au" | "eu") + _ + "a" => -- kauhojen,seurojen
+ <ukk + "oja",ukk + "ojen",ukk + "o", uk + "o", ukk + "oihin"> ;
+ _ + ("o" | "u") + _ + "a" => -- pula,pulia,pulien,pulissa,puliin
+ <ukk + "ia", ukk + "ien", ukk, uk, ukk + "iin"> ;
+ _ + "a" => -- kala,kaloja,kalojen,-oissa,-oihin
+ <ukk + "oja",ukk + "ojen",ukk + "o", uk + "o", ukk + "oihin"> ;
+ _ => -- suku,sukuja,sukujen,-uissa,-uihin
+ <ukko + "j" + a,ukko + "jen",ukko, uko, ukko + "ihin">
+ } ;
+ 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
+ <ar + "tt" + a, arpi + "en",arpi,ar + "t"> ;
+ _ => -- kuusen,kuusta
+ <arp + "t" + a,arp + "ten",arpi, arp> ---- suksi,suksen
+ } ;
+ "r" => -- suurta,suurten
+ <arp + "t" + a,arp + "ten",arpi, arp>;
+ "l" | "h" => -- tuulta,tuulien
+ <arp + "t" + a,arp + "ien",arpi, arp>;
+ _ => -- arpea,arpien,arvissa
+ <arp + "e" + a,arp + "ien",arv+"i",arp>
+ } ; ---- 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 <rae : Str> of {
+ _ + "e" =>
+ <rae + "tt" + a, rakee + "seen"> ; -- raetta,rakeeseen
+ _ + "s" =>
+ <rae + "t" + a, rakee + "seen"> ; -- rengasta,renkaaseen
+ _ + "t" =>
+ <rae + "t" + a, rakee + "en"> ; -- olutta,olueen
+ _ + "r" =>
+ <rae + "t" + a, rakee + "en"> ; -- 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" | "ä") =>
+ <sav + "ien", sav + "in" + a, sav + "iss" + a, sav + "iin"> ;
+ elio + "it" + a@("a" | "ä") =>
+ <elio + "iden", elio + "in" + a, elio + "iss" + a, elio + "ihin"> ;
+ maal + "ej" + a@("a" | "ä") =>
+ <maal + "ien", maal + "ein" + a, maal + "eiss" + a, maal + "eihin"> ;
+ talo + "j" + a@("a" | "ä") =>
+ <talo + "jen", talo + "in" + a, talo + "iss" + a, talo + "ihin"> ;
+ _ => Predef.error (["impossible plural partitive"] ++ savia)
+ } ;
+
+}
diff --git a/examples/uusisuomi/correct-NSK.txt b/examples/uusisuomi/correct-NSK.txt
new file mode 100644
index 000000000..32c3eb79e
--- /dev/null
+++ b/examples/uusisuomi/correct-NSK.txt
@@ -0,0 +1,164 @@
+valo valon valoa valona valoon valojen valoja valoina valoissa valoihin
+
+arvelu arvelun arvelua arveluna arveluun arvelujen arveluja arveluina arveluissa arveluihin
+
+autio aution autiota autiona autioon autioiden autioita autioina autioissa autioihin
+
+risti ristin ristiä ristinä ristiin ristien ristejä risteinä risteissä risteihin
+
+paperi paperin paperia paperina paperiin papereiden papereita papereina papereissa papereihin
+
+banaali banaalin banaalia banaalina banaaliin banaalien banaaleja banaaleina banaaleissa banaaleihin
+
+kalsium kalsiumin kalsiumia kalsiumina kalsiumiin kalsiumien kalsiumeja kalsiumeina kalsiumeissa kalsiumeihin
+
+lovi loven lovea lovena loveen lovien lovia lovina lovissa loviin
+
+nalle nallen nallea nallena nalleen nallien nalleja nalleina nalleissa nalleihin
+
+kala kalan kalaa kalana kalaan kalojen kaloja kaloina kaloissa kaloihin
+
+koira koiran koiraa koirana koiraan koirien koiria koirina koirissa koiriin
+
+matala matalan matalaa matalana matalaan matalien matalia matalina matalissa mataliin
+
+asema aseman asemaa asemana asemaan asemien asemia asemina asemissa asemiin
+
+kulkija kulkijan kulkijaa kulkijana kulkijaan kulkijoiden kulkijoita kulkijoina kulkijoissa kulkijoihin
+
+karahka karahkan karahkaa karahkana karahkaan karahkojen karahkoja karahkoina karahkoissa karahkoihin
+
+kantaja kantajan kantajaa kantajana kantajaan kantajien kantajia kantajina kantajissa kantajiin
+
+peruna perunan perunaa perunana perunaan perunien perunia perunina perunissa peruniin
+
+pasuuna pasuunan pasuunaa pasuunana pasuunaan pasuunojen pasuunoja pasuunoina pasuunoissa pasuunoihin
+
+ainoa ainoan ainoata ainoana ainoaan ainoiden ainoita ainoina ainoissa ainoihin
+
+herttua herttuan herttuaa herttuana herttuaan herttuoiden herttuoita herttuoina herttuoissa herttuoihin
+
+korkea korkean korkeaa korkeana korkeaan korkeiden korkeita korkeina korkeissa korkeisiin/korkeihin
+
+suurempi suuremman suurempaa suurempana suurempaan suurempien suurempia suurempina suuremmissa suurempiin
+
+vapaa vapaan vapaata vapaana vapaaseen vapaiden vapaita vapaina vapaissa vapaisiin
+
+tienoo tienoon tienoota tienoona tienoohon tienoiden tienoita tienoina tienoissa tienoihin
+
+leikkuu leikkuun leikkuuta leikkuuna leikkuuhun leikkuiden leikkuita leikkuina leikkuissa leikkuihin
+
+kamee kameen kameeta kameena kameehen/kameeseen kameiden kameita kameina kameissa kameihin/kameisiin
+
+pii piin piitä piinä piihin piiden piitä piinä piissä piihin
+
+maa maan maata maana maahan maiden maita maina maissa maihin
+
+puu puun puuta puuna puuhun puiden puita puina puissa puihin
+
+suo suon suota suona suohon soiden soita soina soissa soihin
+
+bébé bébén bébétä bébénä bébéhen bébéiden bébéijä bébéinä bébéissä bébéihin
+
+tuohi tuohen tuohta tuohena tuoheen tuohien tuohia tuohina tuohissa tuohiin
+
+lohi lohen lohta lohena loheen lohien lohia lohina lohissa lohiin
+
+lahti lahden lahtea lahtena lahteen lahtien lahtia lahtina lahdissa lahtiin
+
+lumi lumen lunta lumena lumeen lumien lumia lumina lumissa lumiin
+
+tuomi tuomen tuomea tuomena tuomeen tuomien tuomia tuomina tuomissa tuomiin
+
+niemi niemen niemeä niemenä niemeen niemien niemiä nieminä niemissä niemiin
+
+pieni pienen pientä pienenä pieneen pienten pieniä pieninä pienissä pieniin
+
+nuori nuoren nuorta nuorena nuoreen nuorten nuoria nuorina nuorissa nuoriin
+
+susi suden sutta sutena suteen susien susia susina susissa susiin
+
+tosi toden totta totena toteen tosien tosia tosina tosissa tosiin
+
+hirsi hirren hirttä hirtenä hirteen hirsien hirsiä hirsinä hirsissä hirsiin
+
+jälsi jällen jälttä jältenä jälteen jälsien jälsiä jälsinä jälsissä jälsiin
+
+kansi kannen kantta kantena kanteen kansien kansia kansina kansissa kansiin
+
+lapsi lapsen lasta lapsena lapseen lasten/lapsien lapsia lapsina lapsissa lapsiin
+
+hapsi hapsen hapsea hapsena hapseen hapsien hapsia hapsina hapsissa hapsiin
+
+veitsi veitsen veistä veitsenä veitseen veisten/veitsien veitsiä veitsinä veitsissä veitsiin
+
+peitsi peitsen peistä peitsenä peitseen peisten/peitsien peitsiä peitsinä peitsissä peitsiin
+
+suksi suksen suksea suksena sukseen suksien suksia suksina suksissa suksiin
+
+uksi uksen uksea uksena ukseen uksien uksia uksina uksissa uksiin
+
+kaksi kahden kahta kahtena kahteen kaksien kaksia kaksina kaksissa kaksiin
+
+sankari sankarin sankaria sankarina sankariin sankareiden sankareita sankareina sankareissa sankareihin
+
+jumala jumalan jumalaa jumalana jumalaan jumalien jumalia jumalina jumalissa jumaliin
+
+sisar sisaren sisarta sisarena sisareen sisarien sisaria sisarina sisarissa sisariin
+
+ahven ahvenen ahventa ahvenena ahveneen ahventen/ahvenien ahvenia ahvenina ahvenissa ahveniin
+
+uistin uistimen uistinta uistimena uistimeen uistimien uistimia uistimina uistimissa uistimiin
+
+onneton onnettoman onnetonta onnettomana onnettomaan onnettomien onnettomia onnettomina onnettomissa onnettomiin
+
+lämmin lämpimän lämmintä lämpimänä lämpimään lämpimien lämpimiä lämpiminä lämpimissä lämpimiin
+
+pahin pahimman pahinta pahimpana pahimpaan pahimpien pahimpia pahimpina pahimmissa pahimpiin
+
+vasen vasemman vasenta vasempana vasempaan vasempien vasempia vasempina vasemmissa vasempiin
+
+muudan muudannen muudatta muudanna muudanteen muudansien muudansia muudansina muudansissa muudansiin
+
+seitsemän seitsemän seitsemää seitsemänä seitsemään seitsemien seitsemiä seitseminä seitsemissä seitsemiin
+
+hevonen hevosen hevosta hevosena hevoseen hevosten/hevosien hevosia hevosina hevosissa hevosiin
+
+vastaus vastauksen vastausta vastauksena vastaukseen vastauksien vastauksia vastauksina vastauksissa vastauksiin
+
+kalleus kalleuden kalleutta kalleutena kalleuteen kalleuksien kalleuksia kalleuksina kalleuksissa kalleuksiin
+
+vieras vieraan vierasta vieraana vieraaseen vieraiden vieraita vieraina vieraissa vieraisiin/vieraihin
+
+kirves kirveen kirvestä kirveenä kirveeseen kirvesten/kirveiden kirveitä kirveinä kirveissä kirveisiin/kirveihin
+
+kauris kauriin kaurista kauriina kauriiseen kauriiden kauriita kauriina kauriissa kauriisiin
+
+kaunis kauniin kaunista kauniina kauniiseen kauniiden kauniita kauniina kauniissa kauniisiin
+
+koiras koiraan koirasta koiraana koiraaseen koiraiden koiraita koiraina koiraissa koiraisiin
+
+uros uroon urosta uroina uroisiin urosten uroita uroina uroissa uroihin
+
+mies miehen miestä miehenä mieheen miesten miehiä miehinä miehissä miehiin
+
+airut airuen airutta airuena airueen airuiden airuita airuina airuissa airuisiin/airuihin
+
+kevät kevään kevättä keväänä kevääseen keväiden keväitä keväinä keväissä keväihin/keväisiin
+
+kahdeksan kahdeksan kahdeksaa kahdeksana kahdeksaan kahdeksien kahdeksia kahdeksina kahdeksissa kahdeksiin
+
+tuhat tuhannen tuhatta tuhantena tuhanteen tuhansien tuhansia tuhansina tuhansissa tuhansiin
+
+kuollut kuolleen kuollutta kuolleena kuolleeseen kuolleiden kuolleita kuolleina kuolleissa kuolleisiin
+
+hame hameen hametta hameena hameeseen hameiden hameita hameina hameissa hameisiin/hameihin
+
+terve terveen tervettä terveenä terveeseen terveiden terveitä terveinä terveissä terveisiin/terveihin
+
+ori oriin oritta oriina oriiseen oritten oriita oriina oriissa oriihin
+
+kiiru kiiruun kiirutta kiiruuna kiiruuseen kiiruiden kiiruita kiiruina kiiruissa kiiruihin
+
+askel askelen askelta askelena askeleen askelten/askelien askelia askelina askelissa askeliin
+
diff --git a/examples/uusisuomi/correct-Omat.txt b/examples/uusisuomi/correct-Omat.txt
new file mode 100644
index 000000000..cd3fe61ed
--- /dev/null
+++ b/examples/uusisuomi/correct-Omat.txt
@@ -0,0 +1,188 @@
+rakkaus rakkauden rakkautta rakkautena rakkauteen rakkauksien rakkauksia rakkauksina rakkauksissa rakkauksiin
+
+hyvyys hyvyyden hyvyyttä hyvyytenä hyvyyteen hyvyyksien hyvyyksiä hyvyyksinä hyvyyksissä hyvyyksiin
+
+nainen naisen naista naisena naiseen naisten naisia naisina naisissa naisiin
+
+hyinen hyisen hyistä hyisenä hyiseen hyisten hyisiä hyisinä hyisissä hyisiin
+
+maa maan maata maana maahan maiden maita maina maissa maihin
+
+paluu paluun paluuta paluuna paluuhun paluiden paluita paluina paluissa paluihin
+
+syy syyn syytä syynä syyhyn syiden syitä syinä syissä syihin
+
+pii piin piitä piinä piihin piiden piitä piinä piissä piihin
+
+tienoo tienoon tienoota tienoona tienoohon tienoiden tienoita tienoina tienoissa tienoihin
+
+suo suon suota suona suohon soiden soita soina soissa soihin
+
+yö yön yötä yönä yöhön öiden öitä öinä öissä öihin
+
+tie tien tietä tienä tiehen teiden teitä teinä teissä teihin
+
+korkea korkean korkeaa korkeana korkeaan korkeiden korkeita korkeina korkeissa korkeisiin
+
+äkeä äkeän äkeää äkeänä äkeään äkeiden äkeitä äkeinä äkeissä äkeisiin
+
+kaunis kauniin kaunista kauniina kauniiseen kauniiden kauniita kauniina kauniissa kauniisiin
+
+tyyris tyyriin tyyristä tyyriinä tyyriiseen tyyriiden tyyriitä tyyriinä tyyriissä tyyriisiin
+
+ruis rukiin ruista rukiina rukiiseen rukiiden rukiita rukiina rukiissa rukiisiin
+
+liitin liittimen liitintä liittimenä liittimeen liittimien liittimiä liittiminä liittimissä liittimiin
+
+laidun laitumen laidunta laitumena laitumeen laitumien laitumia laitumina laitumissa laitumiin
+
+luistin luistimen luistinta luistimena luistimeen luistimien luistimia luistimina luistimissa luistimiin
+
+onneton onnettoman onnetonta onnettomana onnettomaan onnettomien onnettomia onnettomina onnettomissa onnettomiin
+
+nimetön nimettömän nimetöntä nimettömänä nimettömään nimettömien nimettömiä nimettöminä nimettömissä nimettömiin
+
+perhe perheen perhettä perheenä perheeseen perheiden perheitä perheinä perheissä perheisiin
+
+olut oluen olutta oluena olueen oluiden oluita oluina oluissa oluisiin
+
+lyhyt lyhyen lyhyttä lyhyenä lyhyeen lyhyiden lyhyitä lyhyinä lyhyissä lyhyisiin
+
+rengas renkaan rengasta renkaana renkaaseen renkaiden renkaita renkaina renkaissa renkaisiin
+
+taivas taivaan taivasta taivaana taivaaseen taivaiden taivaita taivaina taivaissa taivaisiin
+
+piennar pientaren piennarta pientarena pientaren piennarten pientaria pientarina pientarissa pientariin
+
+sisar sisaren sisarta sisarena sisareen sisarien sisaria sisarina sisarissa sisariin
+
+rae rakeen raetta rakeena rakeeseen rakeiden rakeita rakeina rakeissa rakeisiin
+
+syke sykkeen sykettä sykkeenä sykkeeseen sykkeiden sykkeitä sykkeinä sykkeissä sykkeisiin
+
+taive taipeen taivetta taipeena taipeeseen taipeiden taipeita taipeina taipeissa taipeisiin
+
+toive toiveen toivetta toiveena toiveeseen toiveiden toiveita toiveina toiveissa toiveisiin
+
+selkä selän selkää selkänä selkään selkien selkiä selkinä selissä selkiin
+
+sukka sukan sukkaa sukkana sukkaan sukkien sukkia sukkina sukissa sukkiin
+
+kappa kapan kappaa kappana kappaan kappojen kappoja kappoina kapoissa kappoihin
+
+kauppa kaupan kauppaa kauppana kauppaan kauppojen kauppoja kauppoina kaupoissa kauppoihin
+
+seura seuran seuraa seurana seuraan seurojen seuroja seuroina seuroissa seuroihin
+
+suku suvun sukua sukuna sukuun sukujen sukuja sukuina suvuissa sukuihin
+
+ukko ukon ukkoa ukkona ukkoon ukkojen ukkoja ukkoina ukoissa ukkoihin
+
+auto auton autoa autona autoon autojen autoja autoina autoissa autoihin
+
+outo oudon outoa outona outoon outojen outoja outoina oudoissa outoihin
+
+satu satun satua satuna satuun satujen satuja satuina satuissa satuihin
+
+satu sadun satua satuna satuun satujen satuja satuina saduissa satuihin
+
+hyppy hypyn hyppyä hyppynä hyppyyn hyppyjen hyppyjä hyppyinä hypyissä hyppyihin
+
+baari baarin baaria baarina baariin baarien baareja baareina baareissa baareihin
+
+paatti paatin paattia paattina paattiin paattien paatteja paatteina paateissa paatteihin
+
+ahven ahvenen ahventa ahvenena ahveneen ahventen ahvenia ahvenina ahvenissa ahveniin
+
+sävel sävelen säveltä sävelenä säveleen sävelten säveliä sävelinä sävelissä säveliin
+
+kalsium kalsiumin kalsiumia kalsiumina kalsiumiin kalsiumien kalsiumeja kalsiumeina kalsiumeissa kalsiumeihin
+
+susi suden sutta sutena suteen susien susia susina susissa susiin
+
+jälsi jällen jälttä jältenä jälteen jälsien jälsiä jälsinä jälsissä jälsiin
+
+korsi korren kortta kortena korteen korsien korsia korsina korsissa korsiin
+
+kuusi kuusen kuusta kuusena kuuseen kuusten kuusia kuusina kuusissa kuusiin
+
+saari saaren saarta saarena saareen saarten saaria saarina saarissa saariin
+
+nuoli nuolen nuolta nuolena nuoleen nuolien nuolia nuolina nuolissa nuoliin
+
+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
+
+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
+
+julius juliuksen juliusta juliuksena juliukseen juliuksien juliuksia juliuksina juliuksissa juliuksiin
+
+hius hiuksen hiusta hiuksena hiukseen hiuksien hiuksia hiuksina hiuksissa hiuksiin
+
+paperi paperin paperia paperina paperiin papereiden papereita papereina papereissa papereihin
+
+banaali banaalin banaalia banaalina banaaliin banaalien banaaleja banaaleina banaaleissa banaaleihin
+
+nalle nallen nallea nallena nalleen nallien nalleja nalleina nalleissa nalleihin
+
+matala matalan matalaa matalana matalaan matalien matalia matalina matalissa mataliin
+
+asema aseman asemaa asemana asemaan asemien asemia asemina asemissa asemiin
+
+kulkija kulkijan kulkijaa kulkijana kulkijaan kulkijoiden kulkijoita kulkijoina kulkijoissa kulkijoihin
+
+karahka karahkan karahkaa karahkana karahkaan karahkojen karahkoja karahkoina karahkoissa karahkoihin
+
+kantaja kantajan kantajaa kantajana kantajaan kantajien kantajia kantajina kantajissa kantajiin
+
+peruna perunan perunaa perunana perunaan perunien perunia perunina perunissa peruniin
+
+pasuuna pasuunan pasuunaa pasuunana pasuunaan pasuunojen pasuunoja pasuunoina pasuunoissa pasuunoihin
+
+ainoa ainoan ainoata ainoana ainoaan ainoiden ainoita ainoina ainoissa ainoihin
+
+herttua herttuan herttuaa herttuana herttuaan herttuoiden herttuoita herttuoina herttuoissa herttuoihin
+
+vapaa vapaan vapaata vapaana vapaaseen vapaiden vapaita vapaina vapaissa vapaisiin
+
+tuohi tuohen tuohta tuohena tuoheen tuohien tuohia tuohina tuohissa tuohiin
+
+lohi lohen lohta lohena loheen lohien lohia lohina lohissa lohiin
+
+lumi lumen lunta lumena lumeen lumien lumia lumina lumissa lumiin
+
+tuomi tuomen tuomea tuomena tuomeen tuomien tuomia tuomina tuomissa tuomiin
+
+niemi niemen niemeä niemenä niemeen niemien niemiä nieminä niemissä niemiin
+
+pieni pienen pientä pienenä pieneen pienten pieniä pieninä pienissä pieniin
+
+nuori nuoren nuorta nuorena nuoreen nuorten nuoria nuorina nuorissa nuoriin
+
+suksi suksen suksea suksena sukseen suksien suksia suksina suksissa suksiin
+
+uksi uksen uksea uksena ukseen uksien uksia uksina uksissa uksiin
+
+sankari sankarin sankaria sankarina sankariin sankareiden sankareita sankareina sankareissa sankareihin
+
+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
+
+mies miehen miestä miehenä mieheen miesten miehiä miehinä miehissä miehiin
+
+kevät kevään kevättä keväänä kevääseen keväiden keväitä keväinä keväissä keväihin/keväisiin
+
+sydän sydämen sydäntä sydämenä sydämeen sydanten/sydämien sydämiä sydäminä sydämissä sydämiin
+