Files
gf-core/lib/src/estonian/MorphoEst.gf

613 lines
16 KiB
Plaintext

--1 A Simple Estonian Resource Morphology
--
-- Inari Listenmaa, Kaarel Kaljurand, based on Aarne Ranta's Finnish grammar
--
-- This resource morphology contains definitions needed in the resource
-- syntax. To build a lexicon, it is better to use $ParadigmsEst$, which
-- gives a higher-level access to this module.
resource MorphoEst = ResEst ** open Prelude, Predef, HjkEst in {
flags optimize=all ; coding=utf8;
oper
----------------------
-- morph. paradigms --
----------------------
--Noun paradigms in HjkEst
--Comparative adjectives
--(could just use hjk_type_IVb_audit "suurem" "a")
-- Comparative adjectives inflect in the same way
-- TODO: confirm this
dSuurempi : Str -> NForms = \suurem ->
let
suurema = suurem + "a" ;
in nForms6
suurem (suurema) (suurema + "t") (suurema + "sse")
(suurema + "te") (suurema + "id") ;
-- Superlatives follow the exact same pattern as comparatives
-- TODO: confirm this
dSuurin : Str -> NForms = \suurim -> dSuurempi suurim ;
--Verb paradigms
-- TS 49
-- d in da, takse, dud ; imperfect 3sg ends in i
cSaama : (_ : Str) -> VForms = \saama ->
let
saa = Predef.tk 2 saama ;
sa = init saa ;
sai = sa + "i" ;
in vForms8
saama
(saa + "da")
(saa + "b")
(saa + "dakse")
(saa + "ge") -- Imper Pl
sai
(saa + "nud")
(saa + "dud") ;
-- TS 49
-- no d/t in da, takse ; imperfect 3sg ends in s
cKaima : (_ : Str) -> VForms = \kaima ->
let
kai = Predef.tk 2 kaima ;
in vForms8
kaima
(kai + "a")
(kai + "b")
(kai + "akse")
(kai + "ge")
(kai + "s")
(kai + "nud")
(kai + "dud") ;
-- TS 49
-- vowel changes in da, takse, no d/t ; imperfect 3sg ends in i
cJooma : (_ : Str) -> VForms = \jooma ->
let
j = Predef.tk 4 jooma ;
joo = Predef.tk 2 jooma;
o = last joo ;
u = case o of {
"o" => "u" ;
"ö" => "ü" ;
_ => o
} ;
q = case o of {
("o"|"ö") => "õ" ;
_ => o
} ;
juua = j + u + u + "a" ;
j6i = j + q + "i" ;
in vForms8
jooma
juua
(joo + "b")
(juua + "kse")
(joo + "ge")
j6i
(joo + "nud")
(joo + "dud") ;
-- TS 50-52 (elama, muutuma, kirjutama), 53 (tegelema) alt forms
-- t in takse, tud; no cons.grad
cElama : (_ : Str) -> VForms = \elama ->
let
ela = Predef.tk 2 elama;
in vForms8
elama
(ela + "da")
(ela + "b")
(ela + "takse")
(ela + "ge") -- Imperative P1 Pl
(ela + "s") -- Imperfect P3 Sg
(ela + "nud")
(ela + "tud") ;
-- TS 53 (tegelema)
-- d in takse, tud; g in ge; consonant stem in takse, tud, nud, ge; no cons.grad
cTegelema : (_ : Str) -> VForms = \tegelema ->
let
tegele = Predef.tk 2 tegelema ;
tegel = init tegele ;
in vForms8
tegelema
(tegel + "da")
(tegele + "b")
(tegel + "dakse")
(tegel + "ge") -- Imperative P1 Pl
(tegele + "s") -- Imperfect P3 Sg
(tegel + "nud")
(tegel + "dud") ;
-- TS 54 (tulema)
-- consonant assimilation (l,r,n) in da, takse
-- d in tud, g in ge
-- imperfect 3sg ends in i
cTulema : (_ : Str) -> VForms = \tulema ->
let
tul = Predef.tk 3 tulema ;
l = last tul ;
tull = tul + l ;
in
vForms8
tulema
(tull + "a")
(tul + "eb")
(tull + "akse")
(tul + "ge")
(tul + "i")
(tul + "nud")
(tul + "dud") ;
-- TS 55-56 (õppima, sündima)
-- t in takse, tud ; consonant gradation on stem
cLeppima : (_ : Str) -> VForms = \leppima ->
let
leppi = Predef.tk 2 leppima ;
i = last leppi ;
lepp = init leppi ;
lepi = (weaker lepp) + i
in vForms8
leppima
(leppi + "da")
(lepi + "b")
(lepi + "takse")
(leppi + "ge") -- Imperative P1 Pl
(leppi + "s") -- Imperfect P3 Sg
(leppi + "nud")
(lepi + "tud") ;
-- TS 57 (lugema)
-- Like 55-56 but irregular gradation patterns, that shouldn't be in HjkEst.weaker
--including also marssima,valssima
cLugema : (_ : Str) -> VForms = \lugema ->
let
luge = Predef.tk 2 lugema ;
lug = init luge ;
l = Predef.tk 3 luge ;
e = last luge ;
loe = case luge of {
_ + ("aju"|"adu"|"agu") => l + "ao" ;
_ + "adi" => l + "ae" ;
"haudu" => "hau" ;
_ + ("idu"|"igu") => l + "eo" ;
_ + "ida" => l + "ea" ;
_ + "udu" => l + "oo" ;
_ + ("uge"|"ude") => l + "oe" ;
_ + #c + "ssi" => (init lug) + e;
_ => (weaker lug) + e
} ;
in vForms8
lugema
(luge + "da")
(loe + "b")
(loe + "takse")
(luge + "ge") -- Imperative P1 Pl
(luge + "s") -- Imperfect P3 Sg
(luge + "nud")
(loe + "tud") ;
-- TS 58 muutma, saatma,
-- like laskma (TS 62, 64), but no reduplication of stem consonant (muutma~muuta, not *muutta)
-- like andma (TS 63) but different takse (muudetakse vs. antakse)
cMuutma : (_ : Str) -> VForms = \muutma ->
let
muut = Predef.tk 2 muutma ;
muud = weaker muut ;
in vForms8
muutma
(muut + "a")
(muud + "ab")
(muud + "etakse") -- always e?
(muut + "ke")
(muut + "is")
(muut + "nud")
(muud + "etud") ; -- always e?
-- TS 59-60 (petma~petetakse, jätma~jäetakse)
-- takse given as second argument
cPetma : (_,_ : Str) -> VForms = \petma,jaetakse ->
let
pet = Predef.tk 2 petma ;
pett = stronger pet ;
jaet = Predef.tk 4 jaetakse ;
jaetud = jaet + "ud"
in vForms8
petma
(pett + "a")
(pet + "ab")
jaetakse
(pet + "ke")
(pett + "is")
(pet + "nud")
jaetud ;
{- -- TS 60 (jatma)
-- weak stem in ma, strong in da ; irregular takse, tud
cJatma : (_ : Str) -> VForms = \jatma ->
let
jat = Predef.tk 2 jatma ;
jatt = stronger jat ;
ko = (weaker (weaker jat))
--weaker jät = jäd ; weaker (weaker jät) = jä
--weaker küt = kö ; weaker (weaker küt) = kö
--HjkEst.weaker takes care of kütma->köetud
in vForms8
jatma
(jatt + "a")
(jat + "ab")
(ko + "etakse") --always e?
(jat + "ke")
(jatt + "is")
(jat + "nud")
(ko + "etud") ;
-}
-- TS 61 (laulma)
--vowel (a/e) given with the second argument
--veenma,naerma
cKuulma : (_,_ : Str) -> VForms = \kuulma,kuuleb ->
let
kuul = Predef.tk 2 kuulma ;
in vForms8
kuulma
(kuul + "da")
kuuleb
(kuul + "dakse")
(kuul + "ge")
(kuul + "is")
(kuul + "nud")
(kuul + "dud") ;
-- TS 62 (tõusma), 64 (mõksma)
-- vowel (a/e) given with the second argument
-- doesn't give alt. forms joosta, joostes
cLaskma : (_,_ : Str) -> VForms = \laskma,laseb ->
let
lask = Predef.tk 2 laskma ;
las = weaker lask ; --no effect on tõusma
in vForms8
laskma
(las + "ta")
laseb
(las + "takse")
(las + "ke")
(lask + "is")
(lask + "nud")
(las + "tud") ;
-- TS 62 alt forms
cJooksma : (_ : Str) -> VForms = \jooksma ->
let
jooks = Predef.tk 2 jooksma ;
joos = (Predef.tk 2 jooks) + "s" ;
in vForms8
jooksma
(joos + "ta")
(jooks + "eb")
(joos + "takse")
(joos + "ke")
(jooks + "is")
(jooks + "nud")
(joos + "tud") ;
-- TS 63 (andma, murdma, hoidma)
-- vowel given in second arg (andma~annab; tundma~tunneb)
cAndma : (_,_ : Str) -> VForms = \andma,annab ->
let
and = Predef.tk 2 andma ; --murd(ma), hoid(ma)
an = init and ; --mur(d), hoi(d)
ann = weaker and ; --murr, hoi
te = case (last ann) of { --to prevent teadma~teaab
"a" => init ann ;
_ => ann
} ;
in vForms8
andma
(and + "a")
annab
(an + "takse")
(and + "ke")
(and + "is")
(and + "nud")
(an + "tud") ;
-- TS 65 (pesema)
-- a consonant stem verb in disguise
cPesema : (_ : Str) -> VForms = \pesema ->
let
pese = Predef.tk 2 pesema ;
pes = init pese ;
in vForms8
pesema
(pes + "ta")
(pese + "b")
(pes + "takse")
(pes + "ke")
(pes + "i")
(pes + "nud")
(pes + "tud") ;
-- TS 66 (nägema)
-- näg, näh and näi stems
cNagema : (_ : Str) -> VForms = \nagema ->
let
nage = Predef.tk 2 nagema ;
nag = init nage ;
na = init nag ;
nah = na + "h" ;
nai = na + "i" ;
in vForms8
nagema
(nah + "a")
(na + "eb")
(nah + "akse")
(nah + "ke")
(nag + "i")
(nai + "nud")
(nah + "tud") ;
-- TS 67-68 (hüppama, tõmbama)
-- strong stem in ma, b, s
-- weak stem in da, takse, ge, nud, tud
-- t in da, takse; k in ge
cHyppama : (_ : Str) -> VForms = \hyppama ->
let
hyppa = Predef.tk 2 hyppama ;
hypp = init hyppa ;
a = last hyppa ;
hypa = (weaker hypp) + a
in vForms8
hyppama
(hypa + "ta")
(hyppa + "b")
(hypa + "takse") -- Passive
(hypa + "ke") -- Imperative P1 Pl
(hyppa + "s") -- Imperfect Sg P3
(hypa + "nud") -- PastPartAct
(hypa + "tud") ; -- PastPartPass
-- TS 69 (õmblema)
cOmblema : (_ : Str) -> VForms = \omblema ->
let
omble = Predef.tk 2 omblema ;
e = last omble ;
l = last (init omble) ;
omb = Predef.tk 2 omble ;
omm = case omb of {
"mõt" => "mõe" ; --some "double weak" patterns; however weaker (weaker omb) makes the coverage worse
_ => weaker omb
} ;
ommel = omm + e + l ;
in vForms8
omblema
(ommel + "da")
(omble + "b")
(ommel + "dakse") -- Passive
(ommel + "ge") -- Imperative P1 Pl
(omble + "s") -- Imperfect Sg P3
(ommel + "nud") -- PastPartAct
(ommel + "dud") ; -- PastPartPass
-- 2-arg paradigm to distinguish between 50-52 and 55-57
cSattumaPettuma : (_,_ : Str) -> VForms = \pettuma,satub ->
let
pettu = Predef.tk 2 pettuma ;
satu = init satub ;
in vForms8
pettuma
(pettu + "da")
(satu + "b")
(satu + "takse") -- Passive
(pettu + "ge") -- Imperative P1 Pl
(pettu + "s") -- Imperfect Sg P3
(pettu + "nud") -- PastPartAct
(satu + "tud") ; -- PastPartPass
-----------------
-- auxiliaries --
-----------------
{- Noun internal opers moved to ResEst
These used to be here:
NForms : Type = Predef.Ints 5 => Str ;
Noun : Type = {s: NForm => Str } ;
nForms6 : (x1,_,_,_,_,x6 : Str) -> NForms ;
n2nforms : Noun -> NForms ;
nForms2N : NForms -> Noun ;
-}
-- Adjective forms
AForms : Type = {
posit : NForms ;
compar : NForms ;
superl : NForms ;
adv_posit, adv_compar, adv_superl : Str ;
} ;
aForms2A : AForms -> Adjective = \afs -> {
s = table {
Posit => table {
AN n => (nForms2N afs.posit).s ! n ;
AAdv => afs.adv_posit
} ;
Compar => table {
AN n => (nForms2N afs.compar).s ! n ;
AAdv => afs.adv_compar
} ;
Superl => table {
AN n => (nForms2N afs.superl).s ! n ;
AAdv => afs.adv_superl
}
} ;
lock_A = <>
} ;
nforms2aforms : NForms -> AForms = \nforms ->
let
suure = init (nforms ! 1) ;
suur = Predef.tk 4 (nforms ! 8) ;
in {
posit = nforms ;
compar = dSuurempi (suure ++ "m") ;
superl = dSuurin (suur ++ "im") ;
adv_posit = suure + "sti" ;
adv_compar = suure + "mmin" ;
adv_superl = suur + "immin" ;
} ;
{- Verb internal opers moved to ResEst
These used to be here:
VForms : Type = Predef.Ints 7 => Str ;
vForms8 : (x1,_,_,_,_,_,_,x8 : Str) -> VForms ;
regVForms : (x1,_,_,x4 : Str) -> VForms ;
vforms2V : VForms -> Verb ;
-}
-----------------------
-- for Structural
-----------------------
caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
\\c => cn.s ! NCase n c ;
mkDet : Number -> CommonNoun -> {
s,sp : Case => Str ; -- minun kolme
n : Number ; -- Pl (agreement feature for verb)
isNum : Bool ; -- True (a numeral is present)
isDef : Bool -- True (verb agrees in Pl, Nom is not Part)
} = \n, noun -> heavyDet {
s = \\c => noun.s ! NCase n c ;
n = n ;
isNum = False ;
isDef = True --- does this hold for all new dets?
} ;
-- Here we define personal and relative pronouns.
-- input forms: Nom, Gen, Part
-- Note that the Fin version required 5 input forms, the
-- Est pronouns thus seem to be much simpler.
-- TODO: remove NPAcc?
-- I: keep NPAcc; see appCompl in ResEst, it takes care of finding a right case for various types of complements; incl. when pronouns get different treatment than nouns (PassVP).
mkPronoun : (_,_,_ : Str) -> Number -> Person ->
{s : NPForm => Str ; a : Agr} =
\mina, minu, mind, n, p ->
let {
minu_short = ie_to_i minu
} in
{s = table {
NPCase Nom => mina ;
NPCase Gen => minu ;
NPCase Part => mind ;
NPCase Transl => minu + "ks" ;
NPCase Ess => minu + "na" ;
NPCase Iness => minu_short + "s" ;
NPCase Elat => minu_short + "st" ;
NPCase Illat => minu_short + "sse" ;
NPCase Adess => minu_short + "l" ;
NPCase Ablat => minu_short + "lt" ;
NPCase Allat => minu_short + "le" ;
NPCase Abess => minu + "ta" ;
NPCase Comit => minu + "ga" ;
NPCase Termin => minu + "ni" ;
NPAcc => mind
} ;
a = Ag n p
} ;
-- meiesse/teiesse -> meisse/teisse
ie_to_i : Str -> Str ;
ie_to_i x =
case x of {
x1 + "ie" + x2 => x1 + "i" + x2 ;
_ => x
} ;
-- TODO: this does not seem to be called from anyway
mkDemPronoun : (_,_,_,_,_ : Str) -> Number ->
{s : NPForm => Str ; a : Agr} =
\tuo, tuon, tuota, tuona, tuohon, n ->
let pro = mkPronoun tuo tuon tuota n P3
in {
s = table {
NPAcc => tuo ;
c => pro.s ! c
} ;
a = pro.a
} ;
-- The relative pronoun, "joka", is inflected in case and number,
-- like common nouns, but it does not take possessive suffixes.
-- The inflextion shows a surprising similarity with "suo".
oper
-- TODO: fix: Nom => kelled
-- TODO: mis
relPron : Number => Case => Str =
let kes = nForms2N (nForms6 "kes" "kelle" "keda" "kellesse" "kelle" "keda") in
\\n,c => kes.s ! NCase n c ;
ProperName = {s : Case => Str} ;
-- TODO: generate using mkPronoun
pronSe : ProperName = {
s = table {
Nom => "see" ;
Gen => "selle" ;
Part => "seda" ;
Transl => "selleks" ;
Ess => "sellena" ;
Iness => "selles" ;
Elat => "sellest" ;
Illat => "sellesse" ;
Adess => "sellel" ;
Ablat => "sellelt" ;
Allat => "sellele" ;
Abess => "selleta" ;
Comit => "sellega" ;
Termin => "selleni"
} ;
} ;
-- TODO: generate using mkPronoun
pronNe : ProperName = {
s = table {
Nom => "need" ;
Gen => "nende" ;
Part => "neid" ;
Transl => "nendeks" ;
Ess => "nendena" ;
Iness => "nendes" ;
Elat => "nendest" ;
Illat => "nendesse" ;
Adess => "nendel" ;
Ablat => "nendelt" ;
Allat => "nendele" ;
Abess => "nendeta" ;
Comit => "nendega" ;
Termin => "nendeni"
} ;
} ;
}