mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-16 08:19:31 -06:00
718 lines
22 KiB
Plaintext
718 lines
22 KiB
Plaintext
--1 Estonian auxiliary operations.
|
|
|
|
-- This module contains operations that are needed to make the
|
|
-- resource syntax work. To define everything that is needed to
|
|
-- implement $Test$, it moreover contains regular lexical
|
|
-- patterns needed for $Lex$.
|
|
|
|
resource ResEst = ParamX ** open Prelude in {
|
|
|
|
flags optimize=all ; coding=utf8;
|
|
|
|
|
|
--2 Parameters for $Noun$
|
|
|
|
-- This is the $Case$ as needed for both nouns and $NP$s.
|
|
|
|
param
|
|
Case = Nom | Gen | Part
|
|
| Illat | Iness | Elat | Allat | Adess | Ablat
|
|
| Transl | Ess | Termin | Abess | Comit;
|
|
|
|
NForm = NCase Number Case ;
|
|
|
|
|
|
-- Agreement of $NP$ has number*person and the polite second ("te olette valmis").
|
|
|
|
|
|
Agr = Ag Number Person | AgPol ;
|
|
|
|
oper
|
|
complNumAgr : Agr -> Number = \a -> case a of {
|
|
Ag n _ => n ;
|
|
AgPol => Sg
|
|
} ;
|
|
verbAgr : Agr -> {n : Number ; p : Person} = \a -> case a of {
|
|
Ag n p => {n = n ; p = p} ;
|
|
AgPol => {n = Pl ; p = P2}
|
|
} ;
|
|
|
|
oper
|
|
NP = {s : NPForm => Str ; a : Agr ; isPron : Bool} ;
|
|
|
|
--
|
|
--2 Adjectives
|
|
--
|
|
-- The major division is between the comparison degrees. A degree fixed,
|
|
-- an adjective is like common nouns, except for the adverbial form.
|
|
|
|
param
|
|
AForm = AN NForm | AAdv ;
|
|
|
|
Infl = Regular | Participle | Invariable ;
|
|
|
|
oper
|
|
Adjective : Type = {s : Degree => AForm => Str; lock_A : {}} ;
|
|
|
|
--2 Noun phrases
|
|
--
|
|
-- Two forms of *virtual accusative* are needed for nouns in singular,
|
|
-- the nominative and the genitive one ("loen raamatu"/"loe raamat").
|
|
-- For nouns in plural, only a nominative accusative exists in positive clauses.
|
|
-- Pronouns use the partitive as their accusative form ("mind", "sind"), in both
|
|
-- positive and negative, indicative and imperative clauses.
|
|
|
|
param
|
|
NPForm = NPCase Case | NPAcc ;
|
|
|
|
oper
|
|
npform2case : Number -> NPForm -> Case = \n,f ->
|
|
|
|
-- type signature: workaround for gfc bug 9/11/2007
|
|
case <<f,n> : NPForm * Number> of {
|
|
<NPCase c,_> => c ;
|
|
<NPAcc,Sg> => Gen ;-- appCompl does the job
|
|
<NPAcc,Pl> => Nom
|
|
} ;
|
|
|
|
--2 For $Verb$
|
|
|
|
-- A special form is needed for the negated plural imperative.
|
|
|
|
param
|
|
VForm =
|
|
Inf InfForm
|
|
| Presn Number Person
|
|
| Impf Number Person
|
|
| Condit Number Person
|
|
| ConditPass --loetagu
|
|
| Imper Number
|
|
| ImperP3
|
|
| ImperP1Pl
|
|
| ImperPass
|
|
| PassPresn Bool
|
|
| PassImpf Bool
|
|
| Quotative Voice
|
|
| PresPart Voice
|
|
| PastPart Voice
|
|
;
|
|
|
|
Voice = Act | Pass ;
|
|
|
|
InfForm =
|
|
InfDa -- lugeda
|
|
| InfDes -- lugedes
|
|
| InfMa -- lugema
|
|
| InfMas -- lugemas
|
|
| InfMast -- lugemast
|
|
| InfMata -- lugemata
|
|
| InfMaks -- lugemaks
|
|
;
|
|
|
|
SType = SDecl | SQuest | SInv ;
|
|
|
|
--2 For $Relative$
|
|
|
|
RAgr = RNoAg | RAg Agr ;
|
|
|
|
--2 For $Numeral$
|
|
|
|
CardOrd = NCard NForm | NOrd NForm ;
|
|
|
|
--2 Transformations between parameter types
|
|
|
|
oper
|
|
agrP3 : Number -> Agr = \n ->
|
|
Ag n P3 ;
|
|
|
|
conjAgr : Agr -> Agr -> Agr = \a,b -> case <a,b> of {
|
|
<Ag n p, Ag m q> => Ag (conjNumber n m) (conjPerson p q) ;
|
|
<Ag n p, AgPol> => Ag Pl (conjPerson p P2) ;
|
|
<AgPol, Ag n p> => Ag Pl (conjPerson p P2) ;
|
|
_ => b
|
|
} ;
|
|
|
|
---
|
|
|
|
Compl : Type = {s : Str ; c : NPForm ; isPre : Bool} ;
|
|
|
|
appCompl : Bool -> Polarity -> Compl -> NP -> Str = \isFin,b,co,np ->
|
|
let
|
|
c = case co.c of {
|
|
NPAcc => case b of {
|
|
Neg => NPCase Part ; -- ma ei näe raamatut/sind
|
|
Pos => case isFin of {
|
|
True => NPAcc ; -- ma näen raamatu/sind
|
|
_ => case np.isPron of {
|
|
False => NPCase Nom ; --tuleb see raamat lugeda
|
|
_ => NPAcc --tuleb sind näha --TODO I: is this correct?
|
|
}
|
|
}
|
|
} ;
|
|
_ => co.c
|
|
} ;
|
|
{-
|
|
c = case <isFin, b, co.c, np.isPron> of {
|
|
<_, Neg, NPAcc,_> => NPCase Part ; -- en näe taloa/sinua
|
|
<_, Pos, NPAcc,True> => NPAcc ; -- näen/täytyy sinut
|
|
<False,Pos, NPAcc,False> => NPCase Nom ; -- täytyy nähdä talo
|
|
<_,_,coc,_> => coc
|
|
} ;
|
|
-}
|
|
nps = np.s ! c
|
|
in
|
|
preOrPost co.isPre co.s nps ;
|
|
|
|
-- For $Verb$.
|
|
|
|
Verb : Type = {
|
|
s : VForm => Str ;
|
|
p : Str -- particle verbs
|
|
} ;
|
|
|
|
param
|
|
VIForm =
|
|
VIFin Tense
|
|
| VIInf InfForm
|
|
| VIPass Tense
|
|
| VIImper
|
|
;
|
|
|
|
oper
|
|
VP : Type = {
|
|
s : VIForm => Anteriority => Polarity => Agr => {fin, inf : Str} ;
|
|
s2 : Bool => Polarity => Agr => Str ; -- raamat/raamatu/raamatut
|
|
adv : Str ;
|
|
p : Str ; --uninflecting component in multi-word verbs
|
|
ext : Str ;
|
|
sc : NPForm ;
|
|
} ;
|
|
|
|
predV : (Verb ** {sc : NPForm}) -> VP = \verb -> {
|
|
s = \\vi,ant,b,agr0 =>
|
|
let
|
|
agr = verbAgr agr0 ;
|
|
verbs = verb.s ;
|
|
part : Str = case vi of {
|
|
VIPass _ => verbs ! (PastPart Pass) ;
|
|
_ => verbs ! (PastPart Act)
|
|
} ;
|
|
|
|
einegole : Str * Str * Str = case <vi,agr.n> of {
|
|
<VIFin Pres, _> => <"ei", verbs ! Imper Sg, "ole"> ;
|
|
<VIFin Fut, _> => <"ei", verbs ! Imper Sg, "ole"> ;
|
|
<VIFin Cond, _> => <"ei", verbs ! Condit Sg P3, "oleks"> ;
|
|
<VIFin Past, _> => <"ei", part, "olnud"> ;
|
|
<VIImper, Sg> => <"ära", verbs ! Imper Sg, "ole"> ;
|
|
<VIImper, Pl> => <"ärge", verbs ! Imper Pl, "olge"> ;
|
|
<VIPass Pres, _> => <"ei", verbs ! PassPresn False, "ole"> ;
|
|
<VIPass Fut, _> => <"ei", verbs ! PassPresn False, "ole"> ; --# notpresent
|
|
<VIPass Cond, _> => <"ei", verbs ! ConditPass, "oleks"> ; --# notpresent
|
|
<VIPass Past, _> => <"ei", verbs ! PassImpf False, "olnud"> ; --# notpresent
|
|
<VIInf i, _> => <"ei", verbs ! Inf i, "olla">
|
|
} ;
|
|
|
|
ei : Str = einegole.p1 ;
|
|
neg : Str = einegole.p2 ;
|
|
ole : Str = einegole.p3 ;
|
|
|
|
olema : VForm => Str = verbOlema.s ;
|
|
|
|
vf : Str -> Str -> {fin, inf : Str} = \x,y -> {fin = x ; inf = y} ;
|
|
|
|
mkvf : VForm -> {fin, inf : Str} = \p -> case <ant,b> of {
|
|
<Simul,Pos> => vf (verbs ! p) [] ;
|
|
<Anter,Pos> => vf (olema ! p) part ;
|
|
<Simul,Neg> => vf (ei ++ neg) [] ;
|
|
<Anter,Neg> => vf (ei ++ ole) part
|
|
} ;
|
|
|
|
passPol = case b of {Pos => True ; Neg => False} ;
|
|
|
|
in case vi of {
|
|
VIFin Past => mkvf (Impf agr.n agr.p) ; --# notpresent
|
|
VIFin Cond => mkvf (Condit agr.n agr.p) ; --# notpresent
|
|
VIFin Fut => mkvf (Presn agr.n agr.p) ; --# notpresent
|
|
VIFin Pres => mkvf (Presn agr.n agr.p) ;
|
|
VIImper => mkvf (Imper agr.n) ;
|
|
VIPass Pres => mkvf (PassPresn passPol) ;
|
|
VIPass Past => mkvf (PassImpf passPol) ; --# notpresent
|
|
VIPass Cond => mkvf (ConditPass) ; --# notpresent
|
|
VIPass Fut => mkvf (PassPresn passPol) ; --# notpresent
|
|
VIInf i => mkvf (Inf i)
|
|
} ;
|
|
|
|
s2 = \\_,_,_ => [] ;
|
|
adv = [] ;
|
|
ext = [] ; --relative clause
|
|
p = verb.p ; --particle verbs
|
|
sc = verb.sc
|
|
} ;
|
|
|
|
insertObj : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> {
|
|
s = vp.s ;
|
|
s2 = \\fin,b,a => vp.s2 ! fin ! b ! a ++ obj ! fin ! b ! a ;
|
|
adv = vp.adv ;
|
|
p = vp.p ;
|
|
ext = vp.ext ;
|
|
sc = vp.sc ;
|
|
} ;
|
|
|
|
insertObjPre : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> {
|
|
s = vp.s ;
|
|
s2 = \\fin,b,a => obj ! fin ! b ! a ++ vp.s2 ! fin ! b ! a ;
|
|
adv = vp.adv ;
|
|
p = vp.p ;
|
|
ext = vp.ext ;
|
|
sc = vp.sc ;
|
|
} ;
|
|
|
|
insertAdv : Str -> VP -> VP = \adv,vp -> {
|
|
s = vp.s ;
|
|
s2 = vp.s2 ;
|
|
p = vp.p ;
|
|
ext = vp.ext ;
|
|
adv = vp.adv ++ adv ;
|
|
sc = vp.sc ;
|
|
} ;
|
|
|
|
insertExtrapos : Str -> VP -> VP = \obj,vp -> {
|
|
s = vp.s ;
|
|
s2 = vp.s2 ;
|
|
p = vp.p ;
|
|
ext = vp.ext ++ obj ;
|
|
adv = vp.adv ;
|
|
sc = vp.sc ;
|
|
} ;
|
|
|
|
-- For $Sentence$.
|
|
|
|
Clause : Type = {
|
|
s : Tense => Anteriority => Polarity => SType => Str
|
|
} ;
|
|
|
|
ClausePlus : Type = {
|
|
s : Tense => Anteriority => Polarity => {subj,fin,inf,compl,adv,p,ext : Str}
|
|
} ;
|
|
|
|
-- The Finnish version of SQuest featured a word order change and
|
|
-- the question particle "ko". The Estonian version just prefixes the
|
|
-- declarative sentence with the yes/no-queryword "kas".
|
|
-- SQuest: "kas" + SDecl
|
|
-- It would be also correct to use the Finnish structure, just without the ko-particle.
|
|
-- Inari: added a third SType, SInv.
|
|
-- Not sure if SInv is needed, but keeping it for possible future use.
|
|
-- There's need for an inverted word order with auxiliary verbs; infVP handles that. ComplVV calls infVP, which inverts the word order for the complement VP, and puts it into the resulting VP's `compl' field.
|
|
-- SInv made by mkClause would be for cases where you just need to construct an inverted word order, and then call it from some other place; application grammar (TODO: api oper for SType) or ExtraEst.
|
|
mkClause : (Polarity -> Str) -> Agr -> VP -> Clause =
|
|
\sub,agr,vp -> {
|
|
s = \\t,a,b =>
|
|
let
|
|
c = (mkClausePlus sub agr vp).s ! t ! a ! b ;
|
|
-- saan sinust aru 0
|
|
-- ma olen täna sinust aru saanud
|
|
declCl = c.subj ++ c.fin ++ c.adv ++ c.compl ++ c.p ++ c.inf ++ c.ext ;
|
|
-- [sind näha] 0 tahtnud
|
|
-- täna olen ma sinust aru saanud
|
|
invCl = c.adv ++ c.fin ++ c.subj ++ c.compl ++ c.p ++ c.inf ++ c.ext
|
|
in
|
|
table {
|
|
SDecl => declCl ;
|
|
SQuest => "kas" ++ declCl ;
|
|
SInv => invCl
|
|
}
|
|
} ;
|
|
|
|
mkClausePlus : (Polarity -> Str) -> Agr -> VP -> ClausePlus =
|
|
\sub,agr,vp -> {
|
|
s = \\t,a,b =>
|
|
let
|
|
agrfin = case vp.sc of {
|
|
NPCase Nom => <agr,True> ;
|
|
_ => <agrP3 Sg,False> -- minun täytyy, minulla on
|
|
} ;
|
|
verb = vp.s ! VIFin t ! a ! b ! agrfin.p1 ;
|
|
in {subj = sub b ;
|
|
fin = verb.fin ;
|
|
inf = verb.inf ;
|
|
compl = vp.s2 ! agrfin.p2 ! b ! agr ;
|
|
p = vp.p ;
|
|
adv = vp.adv ;
|
|
ext = vp.ext ;
|
|
}
|
|
} ;
|
|
|
|
insertKinClausePlus : Predef.Ints 1 -> ClausePlus -> ClausePlus = \p,cl -> {
|
|
s = \\t,a,b =>
|
|
let
|
|
c = cl.s ! t ! a ! b
|
|
in
|
|
case p of {
|
|
0 => {subj = c.subj ++ gi ; fin = c.fin ; inf = c.inf ; -- Jussikin nukkuu
|
|
compl = c.compl ; p = c.p ; adv = c.adv ; ext = c.ext ; h = c.h} ;
|
|
1 => {subj = c.subj ; fin = c.fin ++ gi ; inf = c.inf ; -- Jussi nukkuukin
|
|
compl = c.compl ; p = c.p ; adv = c.adv ; ext = c.ext ; h = c.h}
|
|
}
|
|
} ;
|
|
|
|
insertObjClausePlus : Predef.Ints 1 -> Bool -> (Polarity => Str) -> ClausePlus -> ClausePlus =
|
|
\p,ifKin,obj,cl -> {
|
|
s = \\t,a,b =>
|
|
let
|
|
c = cl.s ! t ! a ! b ;
|
|
co = obj ! b ++ if_then_Str ifKin (kin b) [] ;
|
|
in case p of {
|
|
0 => {subj = c.subj ; fin = c.fin ; inf = c.inf ;
|
|
compl = co ; p = c.p ; adv = c.compl ++ c.adv ; ext = c.ext ; h = c.h} ; -- Jussi juo maitoakin
|
|
1 => {subj = c.subj ; fin = c.fin ; inf = c.inf ;
|
|
compl = c.compl ; p = c.p ; adv = co ; ext = c.adv ++ c.ext ; h = c.h} -- Jussi nukkuu nytkin
|
|
}
|
|
} ;
|
|
|
|
kin : Polarity -> Str =
|
|
\p -> case p of {Pos => "gi" ; Neg => "gi"} ;
|
|
|
|
--allomorph "ki", depends only on phonetic rules "üks+ki", "ühe+gi"
|
|
--waiting for post construction in GF :P
|
|
gi : Str = "gi" ;
|
|
|
|
glueTok : Str -> Str = \s -> "&+" ++ s ;
|
|
|
|
|
|
-- This is used for subjects of passives: therefore isFin in False.
|
|
|
|
subjForm : NP -> NPForm -> Polarity -> Str = \np,sc,b ->
|
|
appCompl False b {s = [] ; c = sc ; isPre = True} np ;
|
|
|
|
infVP : NPForm -> Polarity -> Agr -> VP -> InfForm -> Str =
|
|
\sc,pol,agr,vp,vi ->
|
|
let
|
|
fin = case sc of { -- subject case
|
|
NPCase Nom => True ; -- mina tahan joosta
|
|
_ => False -- minul peab auto olema
|
|
} ;
|
|
verb = vp.s ! VIInf vi ! Simul ! Pos ! agr ; -- no "ei"
|
|
compl = vp.s2 ! fin ! pol ! agr ; -- but compl. case propagated
|
|
adv = vp.adv
|
|
in
|
|
-- inverted word order; e.g.
|
|
--sinust kunagi aru saada tahtnud rel. clause
|
|
compl ++ adv ++ vp.p ++ verb.inf ++ verb.fin ++ vp.ext ;
|
|
--TODO adv placement?
|
|
--TODO inf ++ fin or fin ++ inf? does it ever become a case here?
|
|
|
|
-- The definitions below were moved here from $MorphoEst$ so that
|
|
-- auxiliary of predication can be defined.
|
|
|
|
verbOlema : Verb =
|
|
let olema = mkVerb
|
|
"olema" "olla" "olen" "ollakse"
|
|
"olge" "oli" "olnud" "oldud"
|
|
in {s = table {
|
|
Presn _ P3 => "on" ;
|
|
v => olema.s ! v
|
|
} ;
|
|
p = []
|
|
} ;
|
|
|
|
verbMinema : Verb =
|
|
let minema = mkVerb
|
|
"minema" "minna" "läheb" "minnakse"
|
|
"minge" "läks" "läinud" "mindud"
|
|
in {s = table {
|
|
Impf Sg P1 => "läksin" ;
|
|
Impf Sg P2 => "läksid" ;
|
|
Impf Pl P1 => "läksime" ;
|
|
Impf Pl P2 => "läksite" ;
|
|
Impf Pl P3 => "läksid" ;
|
|
Imper Sg => "mine" ;
|
|
v => minema.s ! v
|
|
} ;
|
|
p = []
|
|
} ;
|
|
|
|
|
|
--3 Verbs
|
|
|
|
--Auxiliary for internal use
|
|
mkVerb : (x1,_,_,_,_,_,_,x8 : Str) -> Verb =
|
|
\tulema,tulla,tuleb,tullakse,tulge,tuli,tulnud,tuldud ->
|
|
vforms2V (vForms8
|
|
tulema tulla tuleb tullakse tulge tuli tulnud tuldud
|
|
) ;
|
|
|
|
--below moved here from MorphoEst
|
|
VForms : Type = Predef.Ints 7 => Str ;
|
|
|
|
vForms8 : (x1,_,_,_,_,_,_,x8 : Str) -> VForms =
|
|
\tulema,tulla,tuleb,tullakse,tulge,tuli,tulnud,tuldud ->
|
|
table {
|
|
0 => tulema ;
|
|
1 => tulla ;
|
|
2 => tuleb ;
|
|
3 => tullakse ;
|
|
4 => tulge ;
|
|
5 => tuli ;
|
|
6 => tulnud ;
|
|
7 => tuldud
|
|
} ;
|
|
|
|
vforms2V : VForms -> Verb = \vh ->
|
|
let
|
|
tulema = vh ! 0 ;
|
|
tulla = vh ! 1 ;
|
|
tuleb = vh ! 2 ;
|
|
tullakse = vh ! 3 ; --juuakse; loetakse
|
|
tulge = vh ! 4 ; --necessary for tulla, surra (otherwise *tulege, *surege)
|
|
tuli = vh ! 5 ; --necessary for jooma-juua-jõi
|
|
tulnud = vh ! 6 ;
|
|
tuldud = vh ! 7 ; --necessary for t/d in tuldi; loeti
|
|
|
|
tull_ = init tulla ; --juu(a); saad(a); tull(a);
|
|
tulles = tull_ + "es" ; --juues; saades; tulles;
|
|
|
|
tule_ = init tuleb ;
|
|
|
|
lask_ = Predef.tk 2 tulema ;
|
|
laulev = case (last lask_) of { --sooma~soov ; laulma~laulev
|
|
("a"|"e"|"i"|"o"|"u"|"õ"|"ä"|"ö"|"ü") => lask_ + "v" ;
|
|
_ => lask_ + "ev" } ; --consonant stem in -ma, add e
|
|
|
|
--imperfect stem
|
|
kaisi_ = case (Predef.dp 3 tuli) of {
|
|
"sis" => lask_ + "i" ; --tõusin, tõusis
|
|
_ + "i" => tuli ; --jõin, jõi
|
|
_ => lask_ + "si" --käisin, käis; muutsin, muutis
|
|
};
|
|
|
|
tuld_ = Predef.tk 2 tuldud ; --d/t choice for tuldi etc.
|
|
tulgu = (init tulge) + "u" ;
|
|
in
|
|
{s = table {
|
|
Inf InfDa => tulla ;
|
|
Inf InfDes => tulles ;
|
|
Presn Sg P1 => tule_ + "n" ;
|
|
Presn Sg P2 => tule_ + "d" ;
|
|
Presn Sg P3 => tuleb ;
|
|
Presn Pl P1 => tule_ + "me" ;
|
|
Presn Pl P2 => tule_ + "te" ;
|
|
Presn Pl P3 => tule_ + "vad" ;
|
|
Impf Sg P1 => kaisi_ + "n" ; --# notpresent
|
|
Impf Sg P2 => kaisi_ + "d" ; --# notpresent
|
|
Impf Sg P3 => tuli ; --# notpresent
|
|
Impf Pl P1 => kaisi_ + "me" ; --# notpresent
|
|
Impf Pl P2 => kaisi_ + "te" ; --# notpresent
|
|
Impf Pl P3 => kaisi_ + "d" ; --# notpresent
|
|
Condit Sg P1 => tule_ + "ksin" ; --# notpresent
|
|
Condit Sg P2 => tule_ + "ksid" ; --# notpresent
|
|
Condit Sg P3 => tule_ + "ks"; --# notpresent
|
|
Condit Pl P1 => tule_ + "ksime" ; --# notpresent
|
|
Condit Pl P2 => tule_ + "ksite" ; --# notpresent
|
|
Condit Pl P3 => tule_ + "ksid" ; --# notpresent
|
|
ConditPass => tuld_ + "aks" ; --# notpresent
|
|
Imper Sg => tule_ ; -- tule / ära tule
|
|
Imper Pl => tulge ; -- tulge / ärge tulge
|
|
ImperP3 => tulgu ; -- tulgu (ta/nad)
|
|
ImperP1Pl => tulge + "m" ; -- tulgem
|
|
ImperPass => tuld_ + "agu" ; --tuldagu
|
|
PassPresn True => tullakse ;
|
|
PassPresn False => tuld_ + "a" ; --da or ta
|
|
PassImpf True => tuld_ + "i" ; --di or ti
|
|
PassImpf False => tuldud ;
|
|
Quotative Act => lask_ + "vat" ;
|
|
Quotative Pass => tuld_ + "avat" ; --d or t
|
|
PresPart Act => laulev ;
|
|
PresPart Pass => tuld_ + "av" ; --d or t
|
|
PastPart Act => tulnud ;
|
|
PastPart Pass => tuldud ;
|
|
Inf InfMa => tulema ;
|
|
Inf InfMas => tulema + "s" ;
|
|
Inf InfMast => tulema + "st" ;
|
|
Inf InfMata => tulema + "ta" ;
|
|
Inf InfMaks => tulema + "ks"
|
|
} ;
|
|
sc = NPCase Nom ;
|
|
p = [] ;
|
|
lock_V = <>
|
|
} ;
|
|
|
|
-- For regular verbs, paradigm from 4 base forms
|
|
-- Analoogiaseosed pöördsõna paradigmas
|
|
-- http://www.eki.ee/books/ekk09/index.php?p=3&p1=5&id=227
|
|
regVForms : (x1,_,_,x4 : Str) -> VForms = \vestlema,vestelda,vestleb,vesteldakse ->
|
|
let
|
|
vestle_ = Predef.tk 2 vestlema ;
|
|
vesteld_ = init vestelda ;
|
|
vestel_ = init vesteld_ ;
|
|
lase_ = init vestleb ;
|
|
jaet_ = Predef.tk 4 vesteldakse ;
|
|
g = case (last vesteld_) of { --doesn't work for anda~andke
|
|
"t" => "k" ;
|
|
_ => "g"
|
|
} ;
|
|
toit_ = case (last vestle_) of {
|
|
("t"|"d") => vesteld_ ; --toit(ma) -> toitke;
|
|
_ => vestel_ --vestle(ma) -> vestelge
|
|
} ;
|
|
laski_ = case (last vestle_) of {
|
|
("a"|"e"|"i"|"o"|"u"|"õ"|"ä"|"ö"|"ü")
|
|
=> vestle_ ; --vestle(ma) -> vestles
|
|
_ => vestle_ + "i" --lask(ma) -> laskis
|
|
} ;
|
|
in
|
|
vForms8
|
|
vestlema
|
|
vestelda
|
|
vestleb
|
|
vesteldakse
|
|
(toit_ + g + "e") --da: käskiva kõneviisi ainsuse 3. pööre ja mitmus;
|
|
(laski_ + "s") --ma: kindla kõneviisi lihtmineviku pöörded;
|
|
(toit_ + "nud") --da: isikulise tegumoe mineviku kesksõna
|
|
(jaet_ + "ud"); --takse: ülejäänud umbisikulise tgm vormid
|
|
|
|
|
|
regVerb : (_,_,_,_ : Str) -> Verb = \kinkima,kinkida,kingib,kingitakse ->
|
|
vforms2V (regVForms kinkima kinkida kingib kingitakse) ;
|
|
|
|
|
|
noun2adj : CommonNoun -> Adj = noun2adjComp True ;
|
|
-- noun2adj : Noun -> Adj = noun2adjComp True ;
|
|
|
|
-- TODO: remove the unused arguments and clean up the code
|
|
-- TODO: AAdv is current just Sg Ablat, which seems OK in most cases, although
|
|
-- ilus -> ilusti | ilusalt?
|
|
-- hea -> hästi
|
|
-- parem -> paremini
|
|
-- parim -> kõige paremini | parimalt?
|
|
noun2adjComp : Bool -> CommonNoun -> Adj = \isPos,tuore ->
|
|
-- noun2adjComp : Bool -> Noun -> Adj = \isPos,tuore ->
|
|
let
|
|
tuoreesti = Predef.tk 1 (tuore.s ! NCase Sg Gen) + "sti" ;
|
|
tuoreemmin = Predef.tk 2 (tuore.s ! NCase Sg Gen) + "in"
|
|
in {s = table {
|
|
AN f => tuore.s ! f ;
|
|
-- AAdv => if_then_Str isPos tuoreesti tuoreemmin
|
|
AAdv => tuore.s ! NCase Sg Ablat
|
|
} ;
|
|
} ;
|
|
|
|
CommonNoun = {s : NForm => Str} ;
|
|
|
|
-- To form an adjective, it is usually enough to give a noun declension: the
|
|
-- adverbial form is regular.
|
|
|
|
Adj : Type = {s : AForm => Str} ;
|
|
|
|
|
|
-- Reflexive pronoun.
|
|
--- Possessive could be shared with the more general $NounFin.DetCN$.
|
|
|
|
--oper
|
|
--Estonian version started
|
|
reflPron : Agr -> NP = \agr ->
|
|
let
|
|
ise = nForms2N (nForms6 "ise" "enda" "ennast" "endasse" "IGNORE" "IGNORE")
|
|
in {
|
|
s = table {
|
|
NPAcc => "ennast" ;
|
|
NPCase c => ise.s ! NCase Sg c
|
|
} ;
|
|
a = agr ;
|
|
isPron = False -- no special acc form
|
|
} ;
|
|
|
|
|
|
|
|
Noun = CommonNoun ** {lock_N : {}} ;
|
|
NForms : Type = Predef.Ints 5 => Str ;
|
|
|
|
nForms6 : (x1,_,_,_,_,x6 : Str) -> NForms =
|
|
\jogi,joe,joge,joesse, -- sg nom, gen, part, ill
|
|
jogede,jogesid -> table { -- pl gen, part,
|
|
0 => jogi ;
|
|
1 => joe ;
|
|
2 => joge ;
|
|
3 => joesse ;
|
|
4 => jogede ;
|
|
5 => jogesid
|
|
} ;
|
|
|
|
n2nforms : CommonNoun -> NForms = \ukko -> table {
|
|
0 => ukko.s ! NCase Sg Nom ;
|
|
1 => ukko.s ! NCase Sg Gen ;
|
|
2 => ukko.s ! NCase Sg Part ;
|
|
3 => ukko.s ! NCase Sg Illat ;
|
|
4 => ukko.s ! NCase Pl Gen ;
|
|
5 => ukko.s ! NCase Pl Part
|
|
} ;
|
|
|
|
-- Converts 6 given strings (Nom, Gen, Part, Illat, Gen, Part) into Noun
|
|
-- http://www.eki.ee/books/ekk09/index.php?p=3&p1=5&id=226
|
|
nForms2N : NForms -> CommonNoun = \f ->
|
|
let
|
|
jogi = f ! 0 ;
|
|
joe = f ! 1 ;
|
|
joge = f ! 2 ;
|
|
joesse = f ! 3 ;
|
|
jogede = f ! 4 ;
|
|
jogesid = f ! 5 ;
|
|
in
|
|
{s = table {
|
|
NCase Sg Nom => jogi ;
|
|
NCase Sg Gen => joe ;
|
|
NCase Sg Part => joge ;
|
|
NCase Sg Transl => joe + "ks" ;
|
|
NCase Sg Ess => joe + "na" ;
|
|
NCase Sg Iness => joe + "s" ;
|
|
NCase Sg Elat => joe + "st" ;
|
|
NCase Sg Illat => joesse ;
|
|
NCase Sg Adess => joe + "l" ;
|
|
NCase Sg Ablat => joe + "lt" ;
|
|
NCase Sg Allat => joe + "le" ;
|
|
NCase Sg Abess => joe + "ta" ;
|
|
NCase Sg Comit => joe + "ga" ;
|
|
NCase Sg Termin => joe + "ni" ;
|
|
|
|
NCase Pl Nom => joe + "d" ;
|
|
NCase Pl Gen => jogede ;
|
|
NCase Pl Part => jogesid ;
|
|
NCase Pl Transl => jogede + "ks" ;
|
|
NCase Pl Ess => jogede + "na" ;
|
|
NCase Pl Iness => jogede + "s" ;
|
|
NCase Pl Elat => jogede + "st" ;
|
|
NCase Pl Illat => jogede + "sse" ;
|
|
NCase Pl Adess => jogede + "l" ;
|
|
NCase Pl Ablat => jogede + "lt" ;
|
|
NCase Pl Allat => jogede + "le" ;
|
|
NCase Pl Abess => jogede + "ta" ;
|
|
NCase Pl Comit => jogede + "ga" ;
|
|
NCase Pl Termin => jogede + "ni"
|
|
|
|
} --;
|
|
-- lock_N = <>
|
|
} ;
|
|
|
|
oper
|
|
rp2np : Number -> {s : Number => NPForm => Str ; a : RAgr} -> NP = \n,rp -> {
|
|
s = rp.s ! n ;
|
|
a = agrP3 Sg ; -- does not matter (--- at least in Slash)
|
|
isPron = False -- has no special accusative
|
|
} ;
|
|
|
|
etta_Conj : Str = "et" ;
|
|
|
|
heavyDet : PDet -> PDet ** {sp : Case => Str} = \d -> d ** {sp = d.s} ;
|
|
PDet : Type = {
|
|
s : Case => Str ;
|
|
n : Number ;
|
|
isNum : Bool ;
|
|
isDef : Bool
|
|
} ;
|
|
|
|
heavyQuant : PQuant -> PQuant ** {sp : Number => Case => Str} = \d ->
|
|
d ** {sp = d.s} ;
|
|
PQuant : Type =
|
|
{s : Number => Case => Str ; isDef : Bool} ;
|
|
|
|
}
|