mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
Finnish vowel harmony
Changed the structure of N,CN,Det,Quant, and functions that build and use them.
This commit is contained in:
@@ -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} ;
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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 <det.isDef, det.isNum> of {
|
||||
<False,True> => 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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -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} ;
|
||||
|
||||
Reference in New Issue
Block a user