diff --git a/lib/src/finnish/CatFin.gf b/lib/src/finnish/CatFin.gf index d2b56e665..92a843023 100644 --- a/lib/src/finnish/CatFin.gf +++ b/lib/src/finnish/CatFin.gf @@ -47,12 +47,12 @@ concrete CatFin of Cat = CommonX ** open ResFin, Prelude in { -- The $Bool$ tells if a possessive suffix is attached, which affects the case. - CN = {s : NForm => Str} ; + CN = {s : NForm => Str ; h : Harmony} ; Pron = {s : NPForm => Str ; a : Agr} ; NP = {s : NPForm => Str ; a : Agr ; isPron : Bool ; isNeg : Bool} ; Det = { s1 : Case => Str ; -- minun kolme - s2 : Str ; -- -ni + s2 : Harmony => Str ; -- -ni (Front for -nsä, Back for -nsa) sp : Case => Str ; -- se (substantival form) n : Number ; -- Pl (agreement feature for verb) isNum : Bool ; -- True (a numeral is present) @@ -63,7 +63,7 @@ concrete CatFin of Cat = CommonX ** open ResFin, Prelude in { ---- QuantSg, QuantPl = {s1 : Case => Str ; s2 : Str ; isPoss, isDef : Bool} ; Ord = {s : NForm => Str} ; Predet = {s : Number => NPForm => Str} ; - Quant = {s1,sp : Number => Case => Str ; s2 : Str ; isPoss : Bool ; isDef : Bool ; isNeg : Bool} ; + Quant = {s1,sp : Number => Case => Str ; s2 : Harmony => Str ; isPoss : Bool ; isDef : Bool ; isNeg : Bool} ; Card = {s : Number => Case => Str ; n : Number} ; Num = {s : Number => Case => Str ; isNum : Bool ; n : Number} ; @@ -91,9 +91,9 @@ concrete CatFin of Cat = CommonX ** open ResFin, Prelude in { A = {s : Degree => AForm => Str} ; A2 = {s : Degree => AForm => Str ; c2 : Compl} ; - N = {s : NForm => Str} ; - N2 = {s : NForm => Str} ** {c2 : Compl ; isPre : Bool} ; - N3 = {s : NForm => Str} ** {c2,c3 : Compl ; isPre,isPre2 : Bool} ; + N = {s : NForm => Str ; h : Harmony} ; + N2 = {s : NForm => Str ; h: Harmony} ** {c2 : Compl ; isPre : Bool} ; + N3 = {s : NForm => Str ; h: Harmony} ** {c2,c3 : Compl ; isPre,isPre2 : Bool} ; PN = {s : Case => Str} ; oper Verb1 = {s : VForm => Str ; sc : NPForm ; qp : Bool} ; diff --git a/lib/src/finnish/ConjunctionFin.gf b/lib/src/finnish/ConjunctionFin.gf index 35983156f..69660f8c2 100644 --- a/lib/src/finnish/ConjunctionFin.gf +++ b/lib/src/finnish/ConjunctionFin.gf @@ -20,7 +20,9 @@ concrete ConjunctionFin of Conjunction = c = ss.c } ; - ConjCN conj ss = conjunctDistrTable NForm conj ss ; + ConjCN conj ss = + let s = (conjunctDistrTable NForm conj ss).s + in {s = s ; h = Back } ; ---- harmony? -- These fun's are generated from the list cat's. diff --git a/lib/src/finnish/ExtraFin.gf b/lib/src/finnish/ExtraFin.gf index 8da63dfac..e65aed465 100644 --- a/lib/src/finnish/ExtraFin.gf +++ b/lib/src/finnish/ExtraFin.gf @@ -6,7 +6,7 @@ concrete ExtraFin of ExtraFinAbs = CatFin ** lin GenNP np = { s1,sp = \\_,_ => np.s ! NPCase Gen ; - s2 = [] ; + s2 = \\_ => [] ; isNum = False ; isPoss = False ; isDef = True ; --- "Jussin kolme autoa ovat" ; thus "...on" is missing @@ -15,7 +15,8 @@ concrete ExtraFin of ExtraFinAbs = CatFin ** GenIP ip = {s = \\_,_ => ip.s ! NPCase Gen} ; - GenCN n1 n2 = {s = \\nf => n1.s ! NPCase Gen ++ n2.s ! nf} ; + GenCN n1 n2 = {s = \\nf => n1.s ! NPCase Gen ++ n2.s ! nf ; + h = n2.h } ; lincat VPI = {s : Str} ; @@ -153,7 +154,8 @@ concrete ExtraFin of ExtraFinAbs = CatFin ** ProDropPoss p = { s1 = \\_,_ => [] ; sp = \\_,_ => p.s ! NPCase Gen ; - s2 = BIND ++ possSuffix p.a ; + s2 = table {Front => BIND ++ possSuffixFront p.a ; + Back => BIND ++ possSuffix p.a } ; isNum = False ; isPoss = True ; isDef = True ; --- "minun kolme autoani ovat" ; thus "...on" is missing diff --git a/lib/src/finnish/MorphoFin.gf b/lib/src/finnish/MorphoFin.gf index 84fbee0b5..50a9632db 100644 --- a/lib/src/finnish/MorphoFin.gf +++ b/lib/src/finnish/MorphoFin.gf @@ -365,7 +365,7 @@ resource MorphoFin = ResFin ** open Prelude in { 9 => ukkoihin } ; - Noun = {s : NForm => Str; lock_N : {}} ; + Noun = {s : NForm => Str; h : Harmony; lock_N : {}} ; nForms2N : NForms -> Noun = \f -> let @@ -384,6 +384,8 @@ resource MorphoFin = ResFin ** open Prelude in { ukko = Predef.tk 2 ukkona ; ukkoi = Predef.tk 2 ukkoina ; ukoi = Predef.tk 3 ukoissa ; + harmony : Harmony = case a of + {"a" => Back ; _ => Front } ; in {s = table { NCase Sg Nom => Ukko ; @@ -423,6 +425,7 @@ resource MorphoFin = ResFin ** open Prelude in { NPossIllat Sg => init ukkoon ; NPossIllat Pl => init ukkoihin } ; + h = harmony ; lock_N = <> } ; @@ -839,7 +842,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> mkDet : Number -> CommonNoun -> { s1,sp : Case => Str ; -- minun kolme - s2 : Str ; -- -ni + s2 : Harmony => Str ; -- -ni ; nsa/nsä n : Number ; -- Pl (agreement feature for verb) isNum : Bool ; -- True (a numeral is present) isPoss : Bool ; -- True (a possessive suffix is present) @@ -847,7 +850,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn -> isNeg : Bool } = \n, noun -> heavyDet { s1 = \\c => noun.s ! NCase n c ; - s2 = [] ; + s2 = \\_ => [] ; n = n ; isNum, isPoss = False ; isDef = True ; --- does this hold for all new dets? diff --git a/lib/src/finnish/NounFin.gf b/lib/src/finnish/NounFin.gf index 4cf6a6fc1..d9cb0d0c1 100644 --- a/lib/src/finnish/NounFin.gf +++ b/lib/src/finnish/NounFin.gf @@ -33,7 +33,7 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { s = \\c => let k = ncase c ; in - det.s1 ! k.p1 ++ cn.s ! k.p2 ++ det.s2 ; + det.s1 ! k.p1 ++ cn.s ! k.p2 ++ det.s2 ! cn.h ; a = agrP3 (case of { => Sg ; -- kolme kytkintä on _ => det.n @@ -108,7 +108,8 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { PossPron p = { s1,sp = \\_,_ => p.s ! NPCase Gen ; - s2 = BIND ++ possSuffix p.a ; + s2 = table {Front => BIND ++ possSuffixFront p.a ; + Back => BIND ++ possSuffix p.a } ; isNum = False ; isPoss = True ; isDef = True ; --- "minun kolme autoani ovat" ; thus "...on" is missing @@ -142,7 +143,7 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { DefArt = { s1 = \\_,_ => [] ; sp = table {Sg => pronSe.s ; Pl => pronNe.s} ; - s2 = [] ; + s2 = \\_ => [] ; isNum,isPoss,isNeg = False ; isDef = True -- autot ovat } ; @@ -152,7 +153,7 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { sp = \\n,c => (nhn (mkSubst "ä" "yksi" "yhde" "yhte" "yhtä" "yhteen" "yksi" "yksi" "yksien" "yksiä" "yksiin")).s ! NCase n c ; - s2 = [] ; + s2 = \\_ => [] ; isNum,isPoss,isDef,isNeg = False -- autoja on } ; @@ -174,11 +175,13 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { Use2N3 f = { s = f.s ; c2 = f.c2 ; + h = f.h ; isPre = f.isPre } ; Use3N3 f = { s = f.s ; c2 = f.c3 ; + h = f.h ; isPre = f.isPre2 } ; @@ -186,19 +189,21 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { --- If a possessive suffix is added here it goes after the complements... ComplN2 f x = { - s = \\nf => preOrPost f.isPre (f.s ! nf) (appCompl True Pos f.c2 x) - } ; + s = \\nf => preOrPost f.isPre (f.s ! nf) (appCompl True Pos f.c2 x) ; + h = f.h } ; ComplN3 f x = { s = \\nf => preOrPost f.isPre (f.s ! nf) (appCompl True Pos f.c2 x) ; c2 = f.c3 ; + h = f.h ; isPre = f.isPre2 } ; AdjCN ap cn = { - s = \\nf => ap.s ! True ! (n2nform nf) ++ cn.s ! nf - } ; + s = \\nf => ap.s ! True ! (n2nform nf) ++ cn.s ! nf ; + h = cn.h } ; - RelCN cn rs = {s = \\nf => cn.s ! nf ++ rs.s ! agrP3 (numN nf)} ; + RelCN cn rs = {s = \\nf => cn.s ! nf ++ rs.s ! agrP3 (numN nf) ; + h = cn.h } ; RelNP np rs = { s = \\c => np.s ! c ++ "," ++ rs.s ! np.a ; @@ -207,11 +212,14 @@ concrete NounFin of Noun = CatFin ** open ResFin, MorphoFin, Prelude in { isNeg = np.isNeg } ; - AdvCN cn ad = {s = \\nf => cn.s ! nf ++ ad.s} ; + AdvCN cn ad = {s = \\nf => cn.s ! nf ++ ad.s ; + h = cn.h} ; - SentCN cn sc = {s = \\nf=> cn.s ! nf ++ sc.s} ; + SentCN cn sc = {s = \\nf=> cn.s ! nf ++ sc.s; + h = cn.h } ; - ApposCN cn np = {s = \\nf=> cn.s ! nf ++ np.s ! NPCase Nom} ; --- luvun x + ApposCN cn np = {s = \\nf=> cn.s ! nf ++ np.s ! NPCase Nom ; + h = cn.h } ; --- luvun x oper numN : NForm -> Number = \nf -> case nf of { diff --git a/lib/src/finnish/NumeralFin.gf b/lib/src/finnish/NumeralFin.gf index cbd86437d..f2ea521e7 100644 --- a/lib/src/finnish/NumeralFin.gf +++ b/lib/src/finnish/NumeralFin.gf @@ -75,7 +75,8 @@ lin } ; oper - co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> { +-- co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> { + co : (c,o : CommonNoun) -> {s : CardOrd => Str} = \c,o -> { s = table { NCard nf => c.s ! nf ; NOrd nf => o.s ! nf @@ -86,7 +87,8 @@ oper -- Too much trouble to infer vowel, cf. "kuudes" vs. "viides". - ordN : Str -> Str -> {s : NForm => Str} = \a,sadas -> +-- ordN : Str -> Str -> {s : NForm => Str} = \a,sadas -> + ordN : Str -> Str -> CommonNoun = \a,sadas -> let sada = init sadas in diff --git a/lib/src/finnish/ParadigmsFin.gf b/lib/src/finnish/ParadigmsFin.gf index e8aa5987f..3da750262 100644 --- a/lib/src/finnish/ParadigmsFin.gf +++ b/lib/src/finnish/ParadigmsFin.gf @@ -293,7 +293,8 @@ oper s = table { NCase Sg Nom => nom ; f => noun.s ! f - } + } ; + h = noun.h } ; @@ -311,10 +312,14 @@ oper nForms2N (nForms10 a b c d e f g h i j) ; mkStrN : Str -> N -> N = \sora,tie -> { - s = \\c => sora + tie.s ! c ; lock_N = <> + s = \\c => sora + tie.s ! c ; + h = tie.h ; + lock_N = <> } ; mkNN : N -> N -> N = \oma,tunto -> { - s = \\c => oma.s ! c + tunto.s ! c ; lock_N = <> + s = \\c => oma.s ! c + tunto.s ! c ; + h = tunto.h ; + lock_N = <> } ; ---- TODO: oma in possessive suffix forms nForms1 : Str -> NForms = \ukko -> diff --git a/lib/src/finnish/ResFin.gf b/lib/src/finnish/ResFin.gf index 3b1c23048..0d79abf04 100644 --- a/lib/src/finnish/ResFin.gf +++ b/lib/src/finnish/ResFin.gf @@ -30,7 +30,13 @@ resource ResFin = ParamX ** open Prelude in { Agr = Ag Number Person | AgPol ; + + +-- Vowel harmony, used for CNs in determining the correct possessive suffix. + Harmony = Back | Front ; + + oper complNumAgr : Agr -> Number = \a -> case a of { Ag n _ => n ; @@ -546,7 +552,7 @@ oper } } ; - CommonNoun = {s : NForm => Str} ; + CommonNoun = {s : NForm => Str ; h : Harmony } ; --IL 11/2012, vowharmony -- To form an adjective, it is usually enough to give a noun declension: the -- adverbial form is regular. @@ -586,7 +592,9 @@ oper vesii = nh.vesii ; vesien = nh.vesien ; vesia = nh.vesia ; - vesiin = nh.vesiin + vesiin = nh.vesiin ; + harmony : Harmony = case a of + {"a" => Back ; _ => Front } in {s = table { NCase Sg Nom => vesi ; @@ -625,9 +633,10 @@ oper NPossTransl Pl => vesii + "kse" ; NPossIllat Sg => Predef.tk 1 veteen ; NPossIllat Pl => Predef.tk 1 vesiin - } + } ; + h = harmony } ; --- Surpraisingly, making the test for the partitive, this not only covers +-- Surprisingly, making the test for the partitive, this not only covers -- "rae", "perhe", "savuke", but also "rengas", "lyhyt" (except $Sg Illat$), etc. sRae : (_,_ : Str) -> NounH = \rae,rakeena -> @@ -713,7 +722,7 @@ oper heavyDet : PDet -> PDet ** {sp : Case => Str} = \d -> d ** {sp = d.s1} ; PDet : Type = { s1 : Case => Str ; - s2 : Str ; + s2 : Harmony => Str ; n : Number ; isNum : Bool ; isPoss : Bool ; @@ -723,7 +732,12 @@ oper heavyQuant : PQuant -> PQuant ** {sp : Number => Case => Str} = \d -> d ** {sp = d.s1} ; - PQuant : Type = - {s1 : Number => Case => Str ; s2 : Str ; isPoss : Bool ; isDef : Bool ; isNeg : Bool} ; + PQuant : Type = { + s1 : Number => Case => Str ; + s2 : Harmony => Str ; + isPoss : Bool ; + isDef : Bool ; + isNeg : Bool + } ; } diff --git a/lib/src/finnish/StructuralFin.gf b/lib/src/finnish/StructuralFin.gf index cb2c1507b..8711bb72b 100644 --- a/lib/src/finnish/StructuralFin.gf +++ b/lib/src/finnish/StructuralFin.gf @@ -62,7 +62,7 @@ concrete StructuralFin of Structural = CatFin ** many_Det = mkDet Sg (mkN "moni" "monia") ; more_CAdv = X.mkCAdv "enemmän" "kuin" ; most_Predet = {s = \\n,c => (nForms2N (dSuurin "useinta")).s ! NCase n (npform2case n c)} ; - much_Det = mkDet Sg {s = \\_ => "paljon"} ; + much_Det = mkDet Sg {s = \\_ => "paljon" ; h = Back} ; --Harmony not relevant, it's just a CommonNoun must_VV = mkVV (caseV genitive (mkV "täytyä")) ; no_Utt = ss "ei" ; on_Prep = casePrep adessive ; @@ -83,12 +83,12 @@ concrete StructuralFin of Structural = CatFin ** } ; someSg_Det = heavyDet { s1 = jokuPron ! Sg ; - s2 = [] ; + s2 = \\_ => [] ; isNum,isPoss = False ; isDef = True ; isNeg = False ; n = Sg } ; somePl_Det = heavyDet { s1 = jokuPron ! Pl ; - s2 = [] ; isNum,isPoss = False ; isNeg = False ; isDef = True ; + s2 = \\_ => [] ; isNum,isPoss = False ; isNeg = False ; isDef = True ; n = Pl ; isNeg = False } ; something_NP = { @@ -106,7 +106,7 @@ concrete StructuralFin of Structural = CatFin ** c => (mkPronoun "nuo" "noiden" "noita" "noina" "noihin" Sg P3).s ! NPCase c } } ; - s2 = [] ; isNum,isPoss = False ; isDef = True ; isNeg = False + s2 = \\_ => [] ; isNum,isPoss = False ; isDef = True ; isNeg = False } ; that_Subj = ss "että" ; there_Adv = ss "siellä" ; --- tuolla @@ -123,7 +123,7 @@ concrete StructuralFin of Structural = CatFin ** c => (mkPronoun "nämä" "näiden" "näitä" "näinä" "näihin" Sg P3).s ! NPCase c } } ; - s2 = [] ; isNum,isPoss = False ; isDef = True ; isNeg = False + s2 = \\_ => [] ; isNum,isPoss = False ; isDef = True ; isNeg = False } ; through_Prep = postGenPrep "kautta" ; too_AdA = ss "liian" ; @@ -284,7 +284,7 @@ lin no_Quant = heavyQuant { s1 = \\n,c => mikaanPron ! n ! c ; -- requires negative or question polarity - s2 = [] ; isNum,isPoss = False ; isDef = True ; isNeg = True + s2 = \\_ => [] ; isNum,isPoss = False ; isDef = True ; isNeg = True } ; if_then_Conj = {s1 = "jos" ; s2 = "niin" ; n = Sg} ;