summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-01-06 12:16:07 +0000
committeraarne <aarne@cs.chalmers.se>2008-01-06 12:16:07 +0000
commit330350325f79f8a229abe3ed460c814464d574e7 (patch)
tree1c960828187df2cdcb79858fd58ef0cfde638367
parent238dba62642686b2d1354885cefa94088d4a3b2b (diff)
tests for verbs in uusisuomi
-rw-r--r--examples/uusisuomi/Conjugations.gf284
-rw-r--r--examples/uusisuomi/Declensions.gf18
-rw-r--r--examples/uusisuomi/Makefile21
-rw-r--r--examples/uusisuomi/MkLex.hs57
-rw-r--r--examples/uusisuomi/Nominal.gf13
-rw-r--r--examples/uusisuomi/Verbal.gf85
-rw-r--r--examples/uusisuomi/correct-VNSSK.txt90
-rw-r--r--examples/uusisuomi/correct-VOmat.txt108
-rw-r--r--src/GF/Grammar/Compute.hs1
9 files changed, 641 insertions, 36 deletions
diff --git a/examples/uusisuomi/Conjugations.gf b/examples/uusisuomi/Conjugations.gf
new file mode 100644
index 000000000..c4448a7ad
--- /dev/null
+++ b/examples/uusisuomi/Conjugations.gf
@@ -0,0 +1,284 @@
+--# -path=.:alltenses
+
+resource Conjugations = ResFin ** open MorphoFin,Declensions,CatFin,Prelude in {
+
+ flags optimize=all ;
+
+ oper
+
+ cHukkua : (_,_ : Str) -> VForms = \hukkua,hukun ->
+ let
+ a = last hukkua ;
+ hukku = init hukkua ;
+ huku = init hukun ;
+ u = last huku ;
+ i = case u of {
+ "e" | "i" => [] ;
+ _ => u
+ } ;
+ y = uyHarmony a ;
+ hukkui = init hukku + i + "i" ;
+ hukui = init huku + i + "i" ;
+ in vForms12
+ hukkua
+ hukun
+ (hukku + u)
+ (hukku + "v" + a + "t")
+ (hukku + "k" + a + a)
+ (huku + "t" + a + a + "n")
+ (hukui + "n")
+ hukkui
+ (hukkui + "si")
+ (hukku + "n" + y + "t")
+ (huku + "tt" + y)
+ (hukku + "nee") ;
+
+ cOttaa : (_,_,_,_ : Str) -> VForms = \ottaa,otan,otin,otti ->
+ let
+ a = last ottaa ;
+ aa = a + a ;
+ u = uyHarmony a ;
+ ota = init otan ;
+ otta = init ottaa ;
+ ote = init ota + "e" ;
+ in vForms12
+ ottaa
+ otan
+ ottaa
+ (otta + "v" + a + "t")
+ (otta + "k" + aa)
+ (ote + "t" + aa + "n")
+ otin
+ otti
+ (otta + "isi")
+ (otta + "n" + u + "t")
+ (ote + "tt" + u)
+ (otta + "nee") ;
+
+ cJuosta : (_,_ : Str) -> VForms = \juosta,juoksen ->
+ let
+ a = last juosta ;
+ juos = Predef.tk 2 juosta ;
+ juoss = juos + last juos ;
+ juokse = init juoksen ;
+ juoks = init juokse ;
+ u = uyHarmony a ;
+ juoksi = juoks + "i" ;
+ in vForms12
+ juosta
+ (juoksen)
+ (juokse + "e")
+ (juokse + "v" + a + "t")
+ (juos + "k" + a + a)
+ (juosta + a + "n")
+ (juoks + "in")
+ (juoks + "i")
+ (juoks + "isi")
+ (juoss + u + "t")
+ (juos + "t" + u)
+ (juoss + "ee") ;
+
+ cJuoda : (_ : Str) -> VForms = \juoda ->
+ let
+ a = last juoda ;
+ juo = Predef.tk 2 juoda ;
+ joi = case last juo of {
+ "i" => juo ; -- naida
+ o => Predef.tk 2 juo + o + "i"
+ } ;
+ u = uyHarmony a ;
+ in vForms12
+ juoda
+ (juo + "n")
+ (juo)
+ (juo + "v" + a + "t")
+ (juo + "k" + a + a)
+ (juoda + a + "n")
+ (joi + "n")
+ (joi)
+ (joi + "si")
+ (juo + "n" + u + "t")
+ (juo + "t" + u)
+ (juo + "nee") ;
+
+ cPudota : (_,_ : Str) -> VForms = \pudota,putosi ->
+ let
+ a = last pudota ;
+ pudot = init pudota ;
+ pudo = init pudot ;
+ ai = case last pudo of {
+ "a" | "ä" => <[], "i"> ;
+ _ => <a, a + "i">
+ } ;
+ puto = Predef.tk 2 putosi ;
+ u = uyHarmony a ;
+ in vForms12
+ pudota
+ (puto + a + "n")
+ (puto + ai.p1 + a)
+ (puto + a + "v" + a + "t")
+ (pudot + "k" + a + a)
+ (pudot + a + a + "n")
+ (puto + "sin")
+ (puto + "si")
+ (puto + ai.p2 + "si")
+ (pudo + "nn" + u + "t")
+ (pudot + "t" + u)
+ (pudo + "nnee") ;
+
+ cHarkita : (_ : Str) -> VForms = \harkita ->
+ let
+ a = last harkita ;
+ harkit = init harkita ;
+ harki = init harkit ;
+ u = uyHarmony a ;
+ in vForms12
+ harkita
+ (harkit + "sen")
+ (harkit + "se")
+ (harkit + "sev" + a + "t")
+ (harkit + "k" + a + a)
+ (harkit + a + a + "n")
+ (harkit + "sin")
+ (harkit + "si")
+ (harkit + "sisi")
+ (harki + "nn" + u + "t")
+ (harkit + "t" + u)
+ (harki + "nnee") ;
+
+ cValjeta : (_,_ : Str) -> VForms = \valjeta,valkeni ->
+ let
+ a = last valjeta ;
+ valjet = init valjeta ;
+ valken = init valkeni ;
+ valje = init valjet ;
+ u = uyHarmony a ;
+ in vForms12
+ valjeta
+ (valken + "en")
+ (valken + "ee")
+ (valken + "ev" + a + "t")
+ (valjet + "k" + a + a)
+ (valjet + a + a + "n")
+ (valken + "in")
+ (valken + "i")
+ (valken + "isi")
+ (valje + "nn" + u + "t")
+ (valjet + "t" + u)
+ (valje + "nnee") ;
+
+ cKuunnella : (_,_ : Str) -> VForms = \kuunnella,kuuntelin ->
+ let
+ a = last kuunnella ;
+ kuunnel = Predef.tk 2 kuunnella ;
+ kuuntel = Predef.tk 2 kuuntelin ;
+ u = uyHarmony a ;
+ in vForms12
+ kuunnella
+ (kuuntel + "en")
+ (kuuntel + "ee")
+ (kuuntel + "ev" + a + "t")
+ (kuunnel + "k" + a + a)
+ (kuunnella + a + "n")
+ (kuuntel + "in")
+ (kuuntel + "i")
+ (kuuntel + "isi")
+ (kuunnel + "l" + u + "t")
+ (kuunnel + "t" + u)
+ (kuunnel + "lee") ;
+
+-- auxiliaries
+
+ uyHarmony : Str -> Str = \a -> case a of {
+ "a" => "u" ;
+ _ => "y"
+ } ;
+
+ VForms : Type = Predef.Ints 11 => Str ;
+
+ vForms12 : (x1,_,_,_,_,_,_,_,_,_,_,x12 : Str) -> VForms =
+ \olla,olen,on,ovat,olkaa,ollaan,olin,oli,olisi,ollut,oltu,lienee ->
+ table {
+ 0 => olla ;
+ 1 => olen ;
+ 2 => on ;
+ 3 => ovat ;
+ 4 => olkaa ;
+ 5 => ollaan ;
+ 6 => olin ;
+ 7 => oli ;
+ 8 => olisi ;
+ 9 => ollut ;
+ 10 => oltu ;
+ 11 => lienee
+ } ;
+
+ vforms2V : VForms -> V = \vh ->
+ let
+ tulla = vh ! 0 ;
+ tulen = vh ! 1 ;
+ tulee = vh ! 2 ;
+ tulevat = vh ! 3 ;
+ tulkaa = vh ! 4 ;
+ tullaan = vh ! 5 ;
+ tulin = vh ! 6 ;
+ tuli = vh ! 7 ;
+ tulisi = vh ! 8 ;
+ tullut = vh ! 9 ;
+ tultu = vh ! 10 ;
+ tullun = vh ! 11 ;
+ tule_ = init tulen ;
+ tuli_ = init tulin ;
+ a = last tulkaa ;
+ tulko = Predef.tk 2 tulkaa + (ifTok Str a "a" "o" "ö") ;
+ tulkoo = tulko + last tulko ;
+ tullee = Predef.tk 2 tullut + "ee" ;
+ tulleen = (nForms2N (dRae tullut (tullee + "n"))).s ;
+ tullu : Str = weakGrade tultu ;
+ tullun = (nForms2N (dUkko tultu (tullu + "n"))).s ;
+ tulema = Predef.tk 3 tulevat + "m" + a ;
+ vat = "v" + a + "t"
+ in
+ {s = table {
+ Inf Inf1 => tulla ;
+ Presn Sg P1 => tule_ + "n" ;
+ Presn Sg P2 => tule_ + "t" ;
+ Presn Sg P3 => tulee ;
+ Presn Pl P1 => tule_ + "mme" ;
+ Presn Pl P2 => tule_ + "tte" ;
+ Presn Pl P3 => tulevat ;
+ Impf Sg P1 => tuli_ + "n" ; --# notpresent
+ Impf Sg P2 => tuli_ + "t" ; --# notpresent
+ Impf Sg P3 => tuli ; --# notpresent
+ Impf Pl P1 => tuli_ + "mme" ; --# notpresent
+ Impf Pl P2 => tuli_ + "tte" ; --# notpresent
+ Impf Pl P3 => tuli + vat ; --# notpresent
+ Condit Sg P1 => tulisi + "n" ; --# notpresent
+ Condit Sg P2 => tulisi + "t" ; --# notpresent
+ Condit Sg P3 => tulisi ; --# notpresent
+ Condit Pl P1 => tulisi + "mme" ; --# notpresent
+ Condit Pl P2 => tulisi + "tte" ; --# notpresent
+ Condit Pl P3 => tulisi + vat ; --# notpresent
+ Imper Sg => tule_ ;
+ Imper Pl => tulkaa ;
+ ImperP3 Sg => tulkoo + "n" ;
+ ImperP3 Pl => tulkoo + "t" ;
+ ImperP1Pl => tulkaa + "mme" ;
+ ImpNegPl => tulko ;
+ Pass True => tullaan ;
+ Pass False => Predef.tk 2 tullaan ;
+ PastPartAct (AN n) => tulleen ! n ;
+ PastPartAct AAdv => tullee + "sti" ;
+ PastPartPass (AN n) => tullun ! n ;
+ PastPartPass AAdv => tullu + "sti" ;
+ Inf Inf3Iness => tulema + "ss" + a ;
+ Inf Inf3Elat => tulema + "st" + a ;
+ Inf Inf3Illat => tulema + a + "n" ;
+ Inf Inf3Adess => tulema + "ll" + a ;
+ Inf Inf3Abess => tulema + "tt" + a
+ } ;
+ sc = NPCase Nom ;
+ lock_V = <>
+ } ;
+}
+
diff --git a/examples/uusisuomi/Declensions.gf b/examples/uusisuomi/Declensions.gf
index 6bcd1ae06..c9971af50 100644
--- a/examples/uusisuomi/Declensions.gf
+++ b/examples/uusisuomi/Declensions.gf
@@ -305,6 +305,18 @@ resource Declensions = ResFin ** open MorphoFin,CatFin,Prelude in {
(suurimp + "ien") (suurimp + "i" + a)
(suurimp + "in" + a) (suurimm + "iss" + a) (suurimp + "iin") ;
+-- for verb participle forms
+
+ dOttanut : Str -> NForms = \ottanut ->
+ let
+ a = vowHarmony ottanut ;
+ ottane = init ottanut + "e" ;
+ ottanee = ottane + "e" ;
+ in nForms10
+ ottanut (ottanee + "n") (ottanut + "t" + a)
+ (ottanee + "n" + a) (ottanee + "seen")
+ (ottane + "iden") (ottane + "it" + a)
+ (ottane + "in" + a) (ottane + "iss" + a) (ottane + "isiin") ;
-------------------
-- auxiliaries ----
@@ -455,9 +467,9 @@ resource Declensions = ResFin ** open MorphoFin,CatFin,Prelude in {
"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 ;
+ ("tk" | "hk" | "sk" | "sp" | "st") + _ => nke ; -- viuhke,kuiske
+ a + k@("k"|"p"|"t") + e@("e"|"a"|"ä"|"u"|"i"|"o"|"ö") => a + k + k + e ;
+ a + "d" + e@("e"|"a"|"ä"|"u"|"i"|"o"|"ö") => 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
diff --git a/examples/uusisuomi/Makefile b/examples/uusisuomi/Makefile
index a054f0a20..43899cbc1 100644
--- a/examples/uusisuomi/Makefile
+++ b/examples/uusisuomi/Makefile
@@ -1,6 +1,15 @@
LEX=Omat
+CAT=N
-all:
+all: nouns
+
+verbs:
+ export CAT=V ; export LEX=VNSSK ; make -e tests
+ export CAT=V ; export LEX=VOmat ; make -e tests
+ cat all-diff-V* >all-differences-V
+ cat all-differences-V
+
+nouns:
export LEX=NSSK ; make -e tests
export LEX=Omat ; make -e tests
export LEX=Swadesh ; make -e tests
@@ -11,11 +20,11 @@ all:
cat all-differences
gf-files:
- runghc MkLex.hs 0 $(LEX) > $(LEX)Abs.gf
- runghc MkLex.hs 1 $(LEX) > $(LEX)1.gf
- runghc MkLex.hs 2 $(LEX) > $(LEX)2.gf
- runghc MkLex.hs 3 $(LEX) > $(LEX)3.gf
- runghc MkLex.hs 4 $(LEX) > $(LEX)4.gf
+ runghc MkLex.hs 0 $(CAT) $(LEX) > $(LEX)Abs.gf
+ runghc MkLex.hs 1 $(CAT) $(LEX) > $(LEX)1.gf
+ runghc MkLex.hs 2 $(CAT) $(LEX) > $(LEX)2.gf
+ runghc MkLex.hs 3 $(CAT) $(LEX) > $(LEX)3.gf
+ runghc MkLex.hs 4 $(CAT) $(LEX) > $(LEX)4.gf
experiments: gf-files
echo "gt -cat=Utt | l | wf exper1-$(LEX).txt" | gf -s $(LEX)1.gf
diff --git a/examples/uusisuomi/MkLex.hs b/examples/uusisuomi/MkLex.hs
index 9e35e88a0..faf980d75 100644
--- a/examples/uusisuomi/MkLex.hs
+++ b/examples/uusisuomi/MkLex.hs
@@ -5,17 +5,17 @@ import Char
-- generate Finnish lexicon implementations with 1 or more
-- characteristic arguments
--- usage: runghc MkLex.hs 3 name
+-- usage: runghc MkLex.hs 3 cat name
main = do
- i:tgt:_ <- getArgs
+ i:cat:tgt:_ <- getArgs
let src = "correct-" ++ tgt ++ ".txt"
ss <- readFile src >>= return . filter (not . (all isSpace)) . lines
- initiate tgt i
- mapM_ (mkLex (read i) . uncurry (++)) (zip nums ss)
+ initiate tgt cat i
+ mapM_ (mkLex cat (read i) . uncurry (++)) (zip nums ss)
putStrLn "}"
-initiate tgt i = mapM_ putStrLn [
+initiate tgt cat i = mapM_ putStrLn [
"--# -path=.:alltenses",
"",
header i,
@@ -23,55 +23,58 @@ initiate tgt i = mapM_ putStrLn [
]
where
header i = case i of
- "0" -> "abstract " ++ tgt ++ "Abs = Cat ** {\n\nfun testN : N -> Utt ;\n"
+ "0" -> unlines [
+ "abstract " ++ tgt ++ "Abs = Cat ** {",
+ "fun testN : N -> Utt ;",
+ "fun testV : V -> Utt ;"
+ ]
_ -> unlines [
"concrete " ++ tgt ++ i ++
- " of " ++ tgt ++ "Abs = CatFin ** open Nominal, ResFin, Prelude in {",
+ " of " ++ tgt ++
+ "Abs = CatFin ** open Nominal, Verbal, 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",
- " ) ;"
+ "lin testN = showN ;",
+ "lin testV = showV ;"
]
nums = map prt [1 ..] where
prt i = (if i < 10 then "0" else "") ++ show i ++ ". "
-mkLex 0 line = case words line of
+mkLex cat 0 line = case words line of
num:sana:_ -> do
let nimi = "n" ++ init num ++ "_" ++ sana
- putStrLn $ "fun " ++ nimi ++ "_N : N ;"
+ putStrLn $ "fun " ++ nimi ++ "_" ++ cat ++ " : " ++ cat ++ " ;"
_ -> return ()
-mkLex 1 line = case words line of
+mkLex cat 1 line = case words line of
num:sana:_ -> do
let nimi = "n" ++ init num ++ "_" ++ sana
- putStrLn $ "lin " ++ nimi ++ "_N = mkN \"" ++ sana ++ "\" ;"
+ putStrLn $ "lin " ++ nimi ++
+ "_" ++ cat ++ " = mk" ++ cat ++ " \"" ++ sana ++ "\" ;"
+ _ -> return ()
+
+mkLex "V" _ line = case words line of
+ num:sana:_:_:_:_:_:_:sanan:_ -> do
+ let nimi = "n" ++ init num ++ "_" ++ sana
+ putStrLn $ "lin " ++ nimi ++
+ "_V = mk2V <\"" ++ sana ++ "\", \"" ++ sanan ++ "\"> ;"
_ -> return ()
-mkLex 2 line = case words line of
+mkLex "N" 2 line = case words line of
num:sana:sanan:_ -> do
let nimi = "n" ++ init num ++ "_" ++ sana
putStrLn $ "lin " ++ nimi ++
"_N = mkN \"" ++ sana ++ "\" \"" ++ sanan ++ "\" ;"
_ -> return ()
-mkLex 3 line = case words line of
+mkLex "N" 3 line = case words line of
num:sana:sanan:_:_:_:_:sanoja:_ -> do
let nimi = "n" ++ init num ++ "_" ++ sana
putStrLn $ "lin " ++ nimi ++
"_N = mkN \"" ++ sana ++ "\" \"" ++ sanan ++ "\" \"" ++ sanoja ++ "\" ;"
_ -> return ()
-mkLex 4 line = case words line of
+mkLex "N" 4 line = case words line of
num:sana:sanan:sanaa:_:_:_:sanoja:_ -> do
let nimi = "n" ++ init num ++ "_" ++ sana
putStrLn $ "lin " ++ nimi ++
@@ -82,7 +85,7 @@ mkLex 4 line = case words line of
-- to initiate from a noun list that has compounds
-mkLex 11 line = case words line of
+mkLex "N" 11 line = case words line of
_:"--":_ -> return ()
num:sana0:_ -> do
let sana = uncompound sana0
diff --git a/examples/uusisuomi/Nominal.gf b/examples/uusisuomi/Nominal.gf
index 349c7dae2..e9973f95d 100644
--- a/examples/uusisuomi/Nominal.gf
+++ b/examples/uusisuomi/Nominal.gf
@@ -21,6 +21,19 @@ resource Nominal = ResFin ** open MorphoFin,Declensions,CatFin,Prelude in {
mkA : (hyva,parempi,paras : N) -> (hyvin,paremmin,parhaiten : Str) -> A ;
} ;
+ showN : N -> Utt = \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
+ ) ** {lock_Utt = <>} ;
mkN = overload {
mkN : (talo : Str) -> N = mk1N ;
diff --git a/examples/uusisuomi/Verbal.gf b/examples/uusisuomi/Verbal.gf
new file mode 100644
index 000000000..cdf61f88e
--- /dev/null
+++ b/examples/uusisuomi/Verbal.gf
@@ -0,0 +1,85 @@
+--# -path=.:alltenses
+
+resource Verbal = ResFin **
+ open MorphoFin,Declensions,Conjugations,CatFin,Prelude in {
+
+ flags optimize=noexpand ;
+
+ oper
+
+ mkV = overload {
+ mkV : (huutaa : Str) -> V = mk1V ;
+ mkV : (huutaa,huusi : Str) -> V = \s,t -> mk2V <s,t> ;
+ } ;
+
+ showV : V -> Utt = \v -> ss (
+ v.s ! Inf Inf1 ++
+ v.s ! Presn Sg P1 ++
+ v.s ! Presn Sg P3 ++
+ v.s ! Presn Pl P3 ++
+ v.s ! Imper Pl ++
+ v.s ! Pass True ++
+ v.s ! Impf Sg P1 ++
+ v.s ! Impf Sg P3 ++
+ v.s ! Condit Sg P3 ++
+ v.s ! PastPartAct (AN (NCase Sg Nom)) ++
+ v.s ! PastPartPass (AN (NCase Sg Nom))
+ ) ** {lock_Utt = <>} ;
+
+ mk1V : Str -> V = \s -> vforms2V (vForms1 s) ;
+ mk2V : (_ : Str * Str) -> V = \st ->
+ vforms2V (vForms2 st.p1 st.p2) ;
+
+ vForms1 : Str -> VForms = \ottaa ->
+ let
+ a = last ottaa ;
+ otta = init ottaa ;
+ ott = init otta ;
+ ots = init ott + "s" ;
+ ota = weakGrade otta ;
+ otin = init (Declensions.strongGrade (init ott)) + "elin" ;
+ ot = init ota ;
+ in
+ case ottaa of {
+ _ + ("e" | "i" | "o" | "u" | "y" | "ö") + ("a" | "ä") =>
+ cHukkua ottaa (ota + "n") ;
+ _ + ("l" | "n" | "r") + ("taa" | "tää") =>
+ cOttaa ottaa (ota + "n") (ots + "in") (ots + "i") ;
+ ("" | C_) + ("a" | "e" | "i") + _ + "aa" =>
+ cOttaa ottaa (ota + "n") (ot + "oin") (ott + "oi") ;
+ _ + ("aa" | "ää") =>
+ cOttaa ottaa (ota + "n") (ot + "in") (ott + "i") ;
+ _ + ("ella" | "ellä") =>
+ cKuunnella ottaa otin ;
+ _ + ("osta" | "östä") =>
+ cJuosta ottaa (init ott + "ksen") ;
+ _ + ("st" | "nn" | "ll" | "rr") + ("a" | "ä") =>
+ cJuosta ottaa (ott + "en") ;
+ _ + ("ita" | "itä") =>
+ cHarkita ottaa ;
+ _ + ("eta" | "etä" | "ota" | "ata" | "uta" | "ytä" | "ätä" | "ötä") =>
+ cPudota ottaa (Declensions.strongGrade ott + "si") ;
+ _ + ("da" | "dä") =>
+ cJuoda ottaa ;
+ _ => Predef.error (["expected infinitive, found"] ++ ottaa)
+ } ;
+
+ vForms2 : (_,_ : Str) -> VForms = \huutaa,huusi ->
+ let
+ huuda = weakGrade (init huutaa) ;
+ huusin = weakGrade huusi + "n" ;
+ autoin = weakGrade (init huusi) + "in" ;
+ in
+ case <huutaa,huusi> of {
+ <_ + ("taa" | "tää"), _ + ("oi" | "öi")> =>
+ cOttaa huutaa (huuda + "n") autoin huusi ;
+ <_ + ("taa" | "tää"), _ + "i"> =>
+ cOttaa huutaa (huuda + "n") huusin huusi ;
+ <_ + ("eta" | "etä"), _ + "eni"> =>
+ cValjeta huutaa huusi ;
+ <_ + ("ita" | "itä"), _ + "isi"> =>
+ cPudota huutaa huusi ;
+ _ => vForms1 huutaa
+ } ;
+
+}
diff --git a/examples/uusisuomi/correct-VNSSK.txt b/examples/uusisuomi/correct-VNSSK.txt
new file mode 100644
index 000000000..ea13446b4
--- /dev/null
+++ b/examples/uusisuomi/correct-VNSSK.txt
@@ -0,0 +1,90 @@
+punoa punon punoo punovat punokaa punotaan punoin punoi punoisi punonut punottu
+
+muistaa muistan muistaa muistavat muistakaa muistetaan muistin muisti muistaisi muistanut muistettu
+
+huutaa huudan huutaa huutavat huutakaa huudetaan huusin huusi huutaisi huutanut huudettu
+
+soutaa soudan soutaa soutavat soutakaa soudetaan soudin souti soutaisi soutanut soudettu
+
+puoltaa puollan puoltaa puoltavat puoltakaa puolletaan puolsin puolsi puoltaisi puoltanut puollettu
+
+murtaa murran murtaa murtavat murtakaa murretaan mursin mursi murtaisi murtanut murrettu
+
+sortaa sorran sortaa sortavat sortakaa sorretaan sorsin sorsi sortaisi sortanut sorrettu
+
+pahentaa pahennan pahentaa pahentavat pahentakaa pahennetaan pahensin pahensi pahentaisi pahentanut pahennettu
+
+kaivaa kaivan kaivaa kaivavat kaivakaa kaivetaan kaivoin kaivoi kaivaisi kaivanut kaivettu
+
+haastaa haastan haastaa haastavat haastakaa haastetaan haastoin haastoi haastaisi haastanut haastettu
+
+paistaa paistan paistaa paistavat paistakaa paistetaan paistoin paistoi paistaisi paistanut paistettu
+
+saartaa saarran saartaa saartavat saartakaa saarretaan saarsin saarsi saartaisi saartanut saarrettu
+
+laskea lasken laskee laskevat laskekaa lasketaan laskin laski laskisi laskenut laskettu
+
+tuntea tunnen tuntee tuntevat tuntekaa tunnetaan tunsin tunsi tuntisi tuntenut tunnettu
+
+potea poden potee potevat potekaa podetaan podin poti potisi potenut podettu
+
+lähteä lähden lähtee lähtevät lähtekää lähdetään lähdin lähti lähtisi lähtenyt lähdetty
+
+sallia sallin sallii sallivat sallikaa sallitaan sallin salli sallisi sallinut sallittu
+
+naida nain nai naivat naikaa naidaan nain nai naisi nainut naitu
+
+saada saan saa saavat saakaa saadaan sain sai saisi saanut saatu
+
+myydä myyn myy myyvät myykää myydään myin myi myisi myynyt myyty
+
+juoda juon juo juovat juokaa juodaan join joi joisi juonut juotu
+
+viedä vien vie vievät viekää viedään vein vei veisi vienyt viety
+
+käydä käyn käy käyvät käykää käykö kävin kävi kävisi käynyt käyty
+
+nuolaista nuolaisen nuolaisee nuolaisevat nuolaiskaa nuolaistaan nuolaisin nuolaisi nuolaisisi nuolaissut nuolaistu
+
+tulla tulen tulee tulevat tulkaa tullaan tulin tuli tulisi tullut tultu
+
+purra puren puree purevat purkaa purraan purin puri purisi purrut purtu
+
+mennä menen menee menevät menkää mennään menin meni menisi mennyt menty
+
+katsella katselen katselee katselevat katselkaa katsellaan katselin katseli katselisi katsellut katseltu
+
+arvailla arvailen arvailee arvailevat arvailkaa arvaillaan arvailin arvaili arvailisi arvaillut arvailtu
+
+haravoida haravoin haravoi haravoivat haravoikaa haravoidaan haravoin haravoi haravoisi haravoinut haravoitu
+
+valita valitsen valitse valitsevat valitkaa valitaan valitsin valitsi valitsisi valinnut valittu
+
+juosta juoksen juoksee juoksevat juoskaa juostaan juoksin juoksi juoksisi juossut juostu
+
+nähdä näen näkee näkevät nähkää nähkö näin näki näkisi nähnyt nähty
+
+aleta alenen alenee alenevat aletkaa aletaan alenin aleni alenisi alennut alettu
+
+salata salaan salaa salaavat salatkaa salataan salasin salasi salaisi salannut salattu
+
+katketa katkean katkeaa katkeavat katketkaa katketaan katkesin katkesi katkeaisi katkennut katkettu
+
+selvitä selviän selviää selviävät selvitkää selvitään selvisin selvisi selviäisi selvinnyt selvitty
+
+kohota kohoan kohoaa kohoavat kohotkaa kohotaan kohosin kohosi kohoaisi kohonnut kohottu
+
+haluta haluan haluaa haluavat halutkaa halutaan halusin halusi haluaisi halunnut haluttu
+
+palata palaan palaa palaavat palatkaa palataan palasin palasi palaisi palannut palattu
+
+kihistä kihisen kihisee kihisevät kihiskää kihistään kihisin kihisi kihisisi kihissyt kihisty
+
+rakentaa rakennan rakentaa rakentavat rakentakaa rakennetaan rakensin rakensi rakentaisi rakentanut rakennettu
+
+taitaa taidan taitaa taitavat taitakaa taidetaan taisin taisi taitaisi tainnut/taitanut taidettu
+
+antautua antaudun antautuu antautuvat antautukaa antaudutaan antauduin antautui antautuisi antautunut antauduttu
+
+kaata kaadan kaataa kaatavat kaatkaa kaatko kaasin kaasi kaataisi kaannut kaattu
+
diff --git a/examples/uusisuomi/correct-VOmat.txt b/examples/uusisuomi/correct-VOmat.txt
new file mode 100644
index 000000000..261008c37
--- /dev/null
+++ b/examples/uusisuomi/correct-VOmat.txt
@@ -0,0 +1,108 @@
+hakea haen hakee hakevat hakekaa haetaan hain haki hakisi hakenut haettu
+
+päteä päden pätee pätevät pätekää pädetään pädin päti pätisi pätenyt pädetty
+
+sopia sovin sopii sopivat sopikaa sovitaan sovin sopi sopisi sopinut sovittu
+
+räkiä räin räkii räkivät räkikää räitään räin räki räkisi räkinyt räitty
+
+sitoa sidon sitoo sitovat sitokaa sidotaan sidoin sitoi sitoisi sitonut sidottu
+
+hukkua hukun hukkuu hukkuvat hukkukaa hukutaan hukuin hukkui hukkuisi hukkunut hukuttu
+
+häipyä häivyn häipyy häipyvät häipykää häivytään häivyin häipyi häipyisi häipynyt häivytty
+
+mysöä mysön mysöö mysövät mysökää mysötään mysöin mysöi mysöisi mysönyt mysötty
+
+kiiltää kiillän kiiltää kiiltävät kiiltäkää kiilletään kiilsin kiilsi kiiltäisi kiiltänyt kiilletty
+
+sammaltaa sammallan sammaltaa sammaltavat sammaltakaa sammalletaan sammalsin sammalsi sammaltaisi sammaltanut sammallettu
+
+oksentaa oksennan oksentaa oksentavat oksentakaa oksennetaan oksensin oksensi oksentaisi oksentanut oksennettu
+
+kumartaa kumarran kumartaa kumartavat kumartakaa kumarretaan kumarsin kumarsi kumartaisi kumartanut kumarrettu
+
+kattaa katan kattaa kattavat kattakaa katetaan katoin kattoi kattaisi kattanut katettu
+
+otattaa otatan otattaa otattavat otattakaa otatetaan otatin otatti otattaisi otattanut otatettu
+
+opastaa opastan opastaa opastavat opastakaa opastetaan opastin opasti opastaisi opastanut opastettu
+
+sataa sadan sataa satavat satakaa sadetaan sadoin satoi sataisi satanut sadettu
+
+auttaa autan auttaa auttavat auttakaa autetaan autoin auttoi auttaisi auttanut autettu
+
+pitää pidän pitää pitävät pitäkää pidetään pidin piti pitäisi pitänyt pidetty
+
+vetää vedän vetää vetävät vetäkää vedetään vedin veti vetäisi vetänyt vedetty
+
+ravistaa ravistan ravistaa ravistavat ravistakaa ravistetaan ravistin ravisti ravistaisi ravistanut ravistettu
+
+kuunnella kuuntelen kuuntelee kuuntelevat kuunnelkaa kuunnellaan kuuntelin kuunteli kuuntelisi kuunnellut kuunneltu
+
+hypellä hyppelen hyppelee hyppelevät hypelkää hypellään hyppelin hyppeli hyppelisi hypellyt hypelty
+
+kävellä kävelen kävelee kävelevät kävelkää kävellään kävelin käveli kävelisi kävellyt kävelty
+
+juosta juoksen juoksee juoksevat juoskaa juostaan juoksin juoksi juoksisi juossut juostu
+
+syöstä syöksen syöksee syöksevät syöskää syöstään syöksin syöksi syöksisi syössyt syösty
+
+panna panen panee panevat pankaa pannaan panin pani panisi pannut pantu
+
+haista haisen haisee haisevat haiskaa haistaan haisin haisi haisisi haissut haistu
+
+purra puren puree purevat purkaa purraan purin puri purisi purrut purtu
+
+mennä menen menee menevät menkää mennään menin meni menisi mennyt menty
+
+palella palelen palelee palelevat palelkaa palellaan palelin paleli palelisi palellut paleltu
+
+harkita harkitsen harkitse harkitsevat harkitkaa harkitaan harkitsin harkitsi harkitsisi harkinnut harkittu
+
+merkitä merkitsen merkitse merkitsevät merkitkää merkitään merkitsin merkitsi merkitsisi merkinnyt merkitty
+
+haljeta halkean halkeaa halkeavat haljetkaa haljetaan halkesin halkesi halkeaisi haljennut haljettu
+
+valjeta valkenen valkenee valkenevat valjetkaa valjetaan valkenin valkeni valkenisi valjennut valjettu
+
+kerjetä kerkeän kerkeää kerkeävät kerjetkää kerjetään kerkesin kerkesi kerkeäisi kerjennyt kerjetty
+
+pelätä pelkään pelkää pelkäävät pelätkää pelätään pelkäsin pelkäsi pelkäisi pelännyt pelätty
+
+paeta pakenen pakenee pakenevat paetkaa paetaan pakenin pakeni pakenisi paennut paettu
+
+pudota putoan putoaa putoavat pudotkaa pudotaan putosin putosi putoaisi pudonnut pudottu
+
+vastata vastaan vastaa vastaavat vastatkaa vastataan vastasin vastasi vastaisi vastannut vastattu
+
+karhuta karhuan karhuaa karhuavat karhutkaa karhutaan karhusin karhusi karhuaisi karhunnut karhuttu
+
+älytä älyän älyää älyävät älytkää älytään älysin älysi älyäisi älynnyt älytty
+
+hypätä hyppään hyppää hyppäävät hypätkää hypätään hyppäsin hyppäsi hyppäisi hypännyt hypätty
+
+yrjötä yrjöän yrjöää yrjöävät yrjötkää yrjötään yrjösin yrjösi yrjöäisi yrjönnyt yrjötty
+
+ällötä ällöän ällöää ällöävät ällötkää ällötään ällösin ällösi ällöäisi ällönnyt ällötty
+
+naida nain nai naivat naikaa naidaan nain nai naisi nainut naitu
+
+uida uin ui uivat uikaa uidaan uin ui uisi uinut uitu
+
+haravoida haravoin haravoi haravoivat haravoikaa haravoidaan haravoin haravoi haravoisi haravoinut haravoitu
+
+saada saan saa saavat saakaa saadaan sain sai saisi saanut saatu
+
+jäädä jään jää jäävät jääkää jäädään jäin jäi jäisi jäänyt jääty
+
+huutaa huudan huutaa huutavat huutakaa huudetaan huudin huuti huutaisi huutanut huudettu
+
+olla olen olee olevat olkaa ollaan olin oli olisi ollut oltu
+
+tehdä teen tekee tekevät tehkää tehdään tein teki tekisi tehnyt tehty
+
+nähdä näen näkee näkevät nähkää nähdään näin näki näkisi nähnyt nähty
+
+käydä käyn käy käyvät käykää käydään kävin kävi kävisi käynyt käyty
+
diff --git a/src/GF/Grammar/Compute.hs b/src/GF/Grammar/Compute.hs
index e3185849c..f75a092b1 100644
--- a/src/GF/Grammar/Compute.hs
+++ b/src/GF/Grammar/Compute.hs
@@ -85,6 +85,7 @@ computeTermOpt rec gr = comp where
(_, FV as) -> mapM (\c -> comp g (App f' c)) as >>= return . variants
(FV fs, _) -> mapM (\c -> comp g (App c a')) fs >>= return . variants
(Abs x b,_) -> comp (ext x a' g) b
+
(QC _ _,_) -> returnC $ App f' a'
(Alias _ _ d, _) -> comp g (App d a')