diff --git a/lib/resource/exper/mini/latin.gf b/lib/resource/exper/mini/latin.gf new file mode 100644 index 000000000..be1a2507f --- /dev/null +++ b/lib/resource/exper/mini/latin.gf @@ -0,0 +1,166 @@ +cat + S ; Cl ; NP ; VP ; CN ; AP ; Det ; N ; A ; V ; V2 ; T ; + +fun + UseCl : T -> Cl -> S ; + PredVP : NP -> VP -> Cl ; + DetCN : Det -> CN -> NP ; + ModCN : CN -> AP -> CN ; + ComplV2 : V2 -> NP -> VP ; + ComplAP : AP -> VP ; + + UseV : V -> VP ; + UseA : A -> AP ; + UseN : N -> CN ; + + Pres, Past : T ; + +param + Number = Sg | Pl ; + Gender = Masc | Fem ; + Case = Nom | Acc | Dat ; + Tense = TPres | TPast ; +oper + Agr = {g : Gender ; n : Number} ; + +lincat + S = {s : Str} ; + Cl = {s : Tense => Str} ; + VP = {s : Agr => {verb : Tense => Str ; compl : Str}} ; + NP = {s : Case => Str ; a : Agr} ; + CN, N = {s : Number => Case => Str ; g : Gender} ; + AP, A = {s : Gender => Number => Case => Str} ; + Det = {s : Gender => Case => Str ; n : Number} ; + V = {s : Tense => Number => Str} ; + V2 = {s : Tense => Number => Str ; c : Case} ; + T = {s : Str ; t : Tense} ; + +lin + UseCl t cl = {s = cl.s ! t.t} ; + PredVP np vp = + let vps = vp.s ! np.a + in + {s = \\t => np.s ! Nom ++ vps.compl ++ vps.verb ! t} ; + + DetCN det cn = { + s = \\c => det.s ! cn.g ! c ++ cn.s ! det.n ! c ; + a = {g = cn.g ; n = det.n} + } ; + + ModCN cn ap = { + s = \\n,c => cn.s ! n ! c ++ ap.s ! cn.g ! n ! c ; + g = cn.g + } ; + + ComplAP ap = { + s = \\a => { + verb = \\t => copula.s ! t ! a.n ; + compl = ap.s ! a.g ! a.n ! Nom + } + } ; + + ComplV2 v np = { + s = \\a => { + verb = \\t => v.s ! t ! a.n ; + compl = np.s ! v.c + } + } ; + + UseA a = a ; + UseN n = n ; + + UseV v = { + s = \\a => { + verb = \\t => v.s ! t ! a.n ; + compl = [] + } + } ; + + Pres = {s = [] ; t = TPres} ; + Past = {s = [] ; t = TPast} ; + +oper + copula : {s : Tense => Number => Str} = + mkV "est" "sunt" "fuit" "fuerunt" ; + + mkV : (est,sunt,fuit,fuerunt : Str) -> {s : Tense => Number => Str} = + \est,sunt,fuit,fuerunt -> { + s = \\t,n => case of { + => est ; + => sunt ; + => fuit ; + => fuerunt + } + } ; + +----------- Lexical functions + +oper + Noun : Type = {s : Number => Case => Str ; g : Gender} ; + Adjective : Type = {s : Gender => Number => Case => Str} ; + Verb : Type = {s : Tense => Number => Str} ; + + mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> Noun = + \romus,romum,romo,romi,romos,romis,g -> { + s = table { + Sg => table { + Nom => romus ; + Acc => romum ; + Dat => romo + } ; + Pl => table { + Nom => romi ; + Acc => romos ; + Dat => romis + } + } ; + g = g + } ; + + regN : Str -> Noun = \romus -> case romus of { + rom + "us" => mkN + romus (rom + "um") (rom + "o") (rom + "i") (rom + "os") (rom + "is") Masc ; + aula@(aul + "a") => mkN + aula (aula + "m") (aula + "e") (aula + "e") (aula + "s") (aul + "is") Fem + } ; + + mkA : (_,_ : Noun) -> Adjective = \bonus,bona -> { + s = table { + Masc => bonus.s ; + Fem => bona.s + } + } ; + + regA : Str -> Adjective = \bonus -> case bonus of { + bon + "us" => mkA (regN bonus) (regN (bon + "a")) + } ; + + regV : Str -> Verb = \amare -> case amare of { + ama + "re" => mkV (ama + "t") (ama + "nt") (ama + "vi") (ama + "verunt") + } ; + +------------ Lexicon + +fun + Cantare : V ; + Amare, Placere : V2 ; + Servus, Puella : N ; + Albus : A ; + + Hic, Hi : Det ; + +lin + Cantare = regV "cantare" ; + Amare = regV "amare" ** {c = Acc} ; + Placere = regV "placere" ** {c = Dat} ; + Servus = regN "servus" ; + Puella = regN "puella" ; + Albus = regA "albus" ; + + Hic = {s = \\g,c => hic.s ! g ! Sg ! c ; n = Sg} ; + Hi = {s = \\g,c => hic.s ! g ! Pl ! c ; n = Pl} ; + +oper + hic : Adjective = mkA + (mkN "hic" "hunc" "huic" "hi" "hos" "his" Masc) + (mkN "haec" "hanc" "huic" "hae" "has" "his" Fem) ;