summaryrefslogtreecommitdiff
path: root/next-lib/src/latin/ResLat.gf
diff options
context:
space:
mode:
Diffstat (limited to 'next-lib/src/latin/ResLat.gf')
-rw-r--r--next-lib/src/latin/ResLat.gf570
1 files changed, 570 insertions, 0 deletions
diff --git a/next-lib/src/latin/ResLat.gf b/next-lib/src/latin/ResLat.gf
new file mode 100644
index 000000000..6c4144180
--- /dev/null
+++ b/next-lib/src/latin/ResLat.gf
@@ -0,0 +1,570 @@
+--# -path=.:../abstract:../common:../../prelude
+
+--1 Latlish auxiliary operations.
+
+resource ResLat = ParamX ** open Prelude in {
+
+param
+ Gender = Masc | Fem | Neutr ;
+ Case = Nom | Acc | Gen | Dat | Abl | Voc ;
+-- Degree = DPos | DComp | DSup ;
+
+oper
+ Noun : Type = {s : Number => Case => Str ; g : Gender} ;
+ Adjective : Type = {s : Gender => Number => Case => Str} ;
+
+ -- worst case
+
+ mkNoun : (n1,_,_,_,_,_,_,_,_,n10 : Str) -> Gender -> Noun =
+ \sn,sa,sg,sd,sab,sv,pn,pa,pg,pd, g -> {
+ s = table {
+ Sg => table {
+ Nom => sn ;
+ Acc => sa ;
+ Gen => sg ;
+ Dat => sd ;
+ Abl => sab ;
+ Voc => sv
+ } ;
+ Pl => table {
+ Nom | Voc => pn ;
+ Acc => pa ;
+ Gen => pg ;
+ Dat | Abl => pd
+ }
+ } ;
+ g = g
+ } ;
+
+ -- declensions
+
+ noun1 : Str -> Noun = \mensa ->
+ let
+ mensae = mensa + "a" ;
+ mensis = init mensa + "is" ;
+ in
+ mkNoun
+ mensa (mensa +"m") mensae mensae mensa mensa
+ mensae (mensa + "s") (mensa + "rum") mensis
+ Fem ;
+
+ noun2us : Str -> Noun = \servus ->
+ let
+ serv = Predef.tk 2 servus ;
+ servum = serv + "um" ;
+ servi = serv + "i" ;
+ servo = serv + "o" ;
+ in
+ mkNoun
+ servus servum servi servo servo (serv + "e")
+ servi (serv + "os") (serv + "orum") (serv + "is")
+ Masc ;
+
+ noun2er : Str -> Noun = \puer ->
+ let
+ puerum = puer + "um" ;
+ pueri = puer + "i" ;
+ puero = puer + "o" ;
+ in
+ mkNoun
+ puer puerum pueri puero puero (puer + "e")
+ pueri (puer + "os") (puer + "orum") (puer + "is")
+ Masc ;
+
+ noun2um : Str -> Noun = \bellum ->
+ let
+ bell = Predef.tk 2 bellum ;
+ belli = bell + "i" ;
+ bello = bell + "o" ;
+ bella = bell + "a" ;
+ in
+ mkNoun
+ bellum bellum belli bello bello (bell + "e")
+ bella bella (bell + "orum") (bell + "is")
+ Neutr ;
+
+-- smart paradigm for declensions 1&2
+
+ noun12 : Str -> Noun = \verbum ->
+ case verbum of {
+ _ + "a" => noun1 verbum ;
+ _ + "us" => noun2us verbum ;
+ _ + "um" => noun2um verbum ;
+ _ + "er" => noun2er verbum ;
+ _ => Predef.error ("noun12 does not apply to" ++ verbum)
+ } ;
+
+ noun3c : Str -> Str -> Gender -> Noun = \rex,regis,g ->
+ let
+ reg = Predef.tk 2 regis ;
+ rege : Str = case rex of {
+ _ + "e" => reg + "i" ;
+ _ + ("al" | "ar") => rex + "i" ;
+ _ => reg + "e"
+ } ;
+ regemes : Str * Str = case g of {
+ Neutr => <rex,reg + "a"> ;
+ _ => <reg + "em", reg + "es">
+ } ;
+ in
+ mkNoun
+ rex regemes.p1 (reg + "is") (reg + "i") rege rex
+ regemes.p2 regemes.p2 (reg + "um") (reg + "ibus")
+ g ;
+
+
+ noun3 : Str -> Noun = \labor ->
+ case labor of {
+ _ + "r" => noun3c labor (labor + "is") Masc ;
+ fl + "os" => noun3c labor (fl + "oris") Masc ;
+ lim + "es" => noun3c labor (lim + "itis") Masc ;
+ cod + "ex" => noun3c labor (cod + "icis") Masc ;
+ poem + "a" => noun3c labor (poem + "atis") Neutr ;
+ calc + "ar" => noun3c labor (calc + "aris") Neutr ;
+ mar + "e" => noun3c labor (mar + "is") Neutr ;
+ car + "men" => noun3c labor (car + "minis") Neutr ;
+ rob + "ur" => noun3c labor (rob + "oris") Neutr ;
+ temp + "us" => noun3c labor (temp + "oris") Neutr ;
+ vers + "io" => noun3c labor (vers + "ionis") Fem ;
+ imag + "o" => noun3c labor (imag + "inis") Fem ;
+ ae + "tas" => noun3c labor (ae + "tatis") Fem ;
+ vo + "x" => noun3c labor (vo + "cis") Fem ;
+ pa + "rs" => noun3c labor (pa + "rtis") Fem ;
+ cut + "is" => noun3c labor (cut + "is") Fem ;
+ urb + "s" => noun3c labor (urb + "is") Fem ;
+ _ => Predef.error ("noun3 does not apply to" ++ labor)
+ } ;
+
+ noun4us : Str -> Noun = \fructus ->
+ let
+ fructu = init fructus ;
+ fruct = init fructu
+ in
+ mkNoun
+ fructus (fructu + "m") fructus (fructu + "i") fructu fructus
+ fructus fructus (fructu + "um") (fruct + "ibus")
+ Masc ;
+
+ noun4u : Str -> Noun = \cornu ->
+ let
+ corn = init cornu ;
+ cornua = cornu + "a"
+ in
+ mkNoun
+ cornu cornu (cornu + "s") (cornu + "i") cornu cornu
+ cornua cornua (cornu + "um") (corn + "ibus")
+ Neutr ;
+
+ noun5 : Str -> Noun = \res ->
+ let
+ re = init res ;
+ rei = re + "i"
+ in
+ mkNoun
+ res (re+ "m") rei rei re res
+ res res (re + "rum") (re + "bus")
+ Fem ;
+
+-- to change the default gender
+
+ nounWithGen : Gender -> Noun -> Noun = \g,n ->
+ {s = n.s ; g = g} ;
+
+-- smart paradigms
+
+ noun_ngg : Str -> Str -> Gender -> Noun = \verbum,verbi,g ->
+ let s : Noun = case <verbum,verbi> of {
+ <_ + "a", _ + "ae"> => noun1 verbum ;
+ <_ + "us", _ + "i"> => noun2us verbum ;
+ <_ + "um", _ + "i"> => noun2um verbum ;
+ <_ + "er", _ + "i"> => noun2er verbum ;
+ <_ + "us", _ + "us"> => noun4us verbum ;
+ <_ + "u", _ + "us"> => noun4u verbum ;
+ <_ + "es", _ + "ei"> => noun5 verbum ;
+ _ => noun3c verbum verbi g
+ }
+ in
+ nounWithGen g s ;
+
+ noun : Str -> Noun = \verbum ->
+ case verbum of {
+ _ + "a" => noun1 verbum ;
+ _ + "us" => noun2us verbum ;
+ _ + "um" => noun2um verbum ;
+ _ + "er" => noun2er verbum ;
+ _ + "u" => noun4u verbum ;
+ _ + "es" => noun5 verbum ;
+ _ => noun3 verbum
+ } ;
+
+
+
+-- adjectives
+
+ mkAdjective : (_,_,_ : Noun) -> Adjective = \bonus,bona,bonum -> {
+ s = table {
+ Masc => bonus.s ;
+ Fem => bona.s ;
+ Neutr => bonum.s
+ }
+ } ;
+
+ adj12 : Str -> Adjective = \bonus ->
+ let
+ bon : Str = case bonus of {
+ pulch + "er" => pulch + "r" ;
+ bon + "us" => bon ;
+ _ => Predef.error ("adj12 does not apply to" ++ bonus)
+ }
+ in
+ mkAdjective (noun12 bonus) (noun1 (bon + "a")) (noun2um (bon + "um")) ;
+
+ adj3x : (_,_ : Str) -> Adjective = \acer,acris ->
+ let
+ ac = Predef.tk 2 acer ;
+ acrise : Str * Str = case acer of {
+ _ + "er" => <ac + "ris", ac + "re"> ;
+ _ + "is" => <acer , ac + "e"> ;
+ _ => <acer , acer>
+ }
+ in
+ mkAdjective
+ (noun3adj acer acris Masc)
+ (noun3adj acrise.p1 acris Fem)
+ (noun3adj acrise.p2 acris Neutr) ;
+
+ noun3adj : Str -> Str -> Gender -> Noun = \audax,audacis,g ->
+ let
+ audac = Predef.tk 2 audacis ;
+ audacem = case g of {Neutr => audax ; _ => audac + "em"} ;
+ audaces = case g of {Neutr => audac +"ia" ; _ => audac + "es"} ;
+ audaci = audac + "i" ;
+ in
+ mkNoun
+ audax audacem (audac + "is") audaci audaci audax
+ audaces audaces (audac + "ium") (audac + "ibus")
+ g ;
+
+
+-- smart paradigm
+
+ adj123 : Str -> Str -> Adjective = \bonus,boni ->
+ case <bonus,boni> of {
+ <_ + ("us" | "er"), _ + "i"> => adj12 bonus ;
+ <_ + ("us" | "er"), _ + "is"> => adj3x bonus boni ;
+ <_ , _ + "is"> => adj3x bonus boni ;
+ _ => Predef.error ("adj123: not applicable to" ++ bonus ++ boni)
+ } ;
+
+ adj : Str -> Adjective = \bonus ->
+ case bonus of {
+ _ + ("us" | "er") => adj12 bonus ;
+ facil + "is" => adj3x bonus bonus ;
+ feli + "x" => adj3x bonus (feli + "cis") ;
+ _ => adj3x bonus (bonus + "is") ---- any example?
+ } ;
+
+
+-- verbs
+
+ param
+ VActForm = VAct VAnter VTense Number Person ;
+ VPassForm = VPass VTense Number Person ;
+ VInfForm = VInfActPres | VInfActPerf ;
+ VImpForm = VImpPres Number | VImpFut2 Number | VImpFut3 Number ;
+ VGerund = VGenAcc | VGenGen |VGenDat | VGenAbl ;
+ VSupine = VSupAcc | VSupAbl ;
+
+ VAnter = VSim | VAnt ;
+ VTense = VPres VMood | VImpf VMood | VFut ;
+ VMood = VInd | VConj ;
+
+ oper
+ Verb : Type = {
+ act : VActForm => Str ;
+-- pass : VPassForm => Str ;
+ inf : VAnter => Str ;
+-- imp : VImpForm => Str ;
+-- ger : VGerund => Str ;
+-- sup : VSupine => Str ;
+-- partActPres : Adjective ;
+-- partActFut : Adjective ;
+-- partPassPerf : Adjective ;
+-- partPassFut : Adjective ;
+ } ;
+
+ mkVerb :
+ (cela,cele,celab,celo,celant,celare,celavi,celatus,celabo,celabunt,celabi : Str)
+ -> Verb =
+ \cela,cele,celab,celo,celant,celare,celavi,celatus,celabo,celabunt,celabi ->
+ let
+ celav = init celavi
+ in {
+ act = table {
+ VAct VSim (VPres VInd) Sg P1 => celo ;
+ VAct VSim (VPres VInd) Pl P3 => celant ;
+ VAct VSim (VPres VInd) n p => cela + actPresEnding n p ;
+ VAct VSim (VPres VConj) n p => cele + actPresEnding n p ;
+ VAct VSim (VImpf VInd) n p => celab + "ba" + actPresEnding n p ;
+ VAct VSim (VImpf VConj) n p => celare + actPresEnding n p ;
+ VAct VSim VFut Sg P1 => celabo ;
+ VAct VSim VFut Pl P3 => celabunt ;
+ VAct VSim VFut n p => celabi + actPresEnding n p ;
+ VAct VAnt (VPres VInd) Pl P3 => celav + "erunt" ;
+ VAct VAnt (VPres VInd) n p => celavi + actPerfEnding n p ;
+ VAct VAnt (VPres VConj) n p => celav + "eri" + actPresEnding n p ;
+ VAct VAnt (VImpf VInd) n p => celav + "era" + actPresEnding n p ;
+ VAct VAnt (VImpf VConj) n p => celav + "isse" + actPresEnding n p ;
+ VAct VAnt VFut Sg P1 => celav + "ero" ;
+ VAct VAnt VFut n p => celav + "eri" + actPresEnding n p
+ } ;
+ inf = table {
+ VSim => celare ;
+ VAnt => celav + "isse"
+ }
+ } ;
+
+ actPresEnding : Number -> Person -> Str =
+ useEndingTable <"m", "s", "t", "mus", "tis", "nt"> ;
+
+ actPerfEnding : Number -> Person -> Str =
+ useEndingTable <"", "sti", "t", "mus", "stis", "erunt"> ;
+
+ useEndingTable : (Str*Str*Str*Str*Str*Str) -> Number -> Person -> Str =
+ \es,n,p -> case n of {
+ Sg => case p of {
+ P1 => es.p1 ;
+ P2 => es.p2 ;
+ P3 => es.p3
+ } ;
+ Pl => case p of {
+ P1 => es.p4 ;
+ P2 => es.p5 ;
+ P3 => es.p6
+ }
+ } ;
+
+ esse_V : Verb =
+ let
+ esse = mkVerb "es" "si" "era" "sum" "sunt" "esse" "fui" "*futus"
+ "ero" "erunt" "eri" ;
+ in {
+ act = table {
+ VAct VSim (VPres VInd) Sg P2 => "es" ;
+ VAct VSim (VPres VInd) Pl P1 => "sumus" ;
+ v => esse.act ! v
+ } ;
+ inf = esse.inf
+ } ;
+
+ verb1 : Str -> Verb = \celare ->
+ let
+ cela = Predef.tk 2 celare ;
+ cel = init cela ;
+ celo = cel + "o" ;
+ cele = cel + "e" ;
+ celavi = cela + "vi" ;
+ celatus = cela + "tus" ;
+ in mkVerb cela cele cela celo (cela + "nt") celare celavi celatus
+ (cela + "bo") (cela + "bunt") (cela + "bi") ;
+
+ verb2 : Str -> Verb = \habere ->
+ let
+ habe = Predef.tk 2 habere ;
+ hab = init habe ;
+ habeo = habe + "o" ;
+ habea = habe + "a" ;
+ habui = hab + "ui" ;
+ habitus = hab + "itus" ;
+ in mkVerb habe habea habe habeo (habe + "nt") habere habui habitus
+ (habe + "bo") (habe + "bunt") (habe + "bi") ;
+
+ verb3 : (_,_,_ : Str) -> Verb = \gerere,gessi,gestus ->
+ let
+ gere = Predef.tk 2 gerere ;
+ ger = init gere ;
+ gero = ger + "o" ;
+ geri = ger + "i" ;
+ gera = ger + "a" ;
+ in mkVerb geri gera gere gero (ger + "unt") gerere gessi gestus
+ (ger + "am") (ger + "ent") gere ;
+
+ verb3i : (_,_,_ : Str) -> Verb = \iacere,ieci,iactus ->
+ let
+ iac = Predef.tk 3 iacere ;
+ iaco = iac + "io" ;
+ iaci = iac + "i" ;
+ iacie = iac + "ie" ;
+ iacia = iac + "ia" ;
+ in mkVerb iaci iacia iacie iaco (iaci + "unt") iacere ieci iactus
+ (iac + "iam") (iac + "ient") iacie ;
+
+ verb4 : (_,_,_ : Str) -> Verb = \sentire,sensi,sensus ->
+ let
+ senti = Predef.tk 2 sentire ;
+ sentio = senti + "o" ;
+ sentia = senti + "a" ;
+ sentie = senti + "e" ;
+ in mkVerb senti sentia sentie sentio (senti + "unt") sentire sensi sensus
+ (senti + "am") (senti + "ent") sentie ;
+
+
+-- smart paradigms
+
+ verb_pppi : (iacio,ieci,iactus,iacere : Str) -> Verb =
+ \iacio,ieci,iactus,iacere ->
+ case iacere of {
+ _ + "are" => verb1 iacere ;
+ _ + "ire" => verb4 iacere ieci iactus ;
+ _ + "ere" => case iacio of {
+ _ + "eo" => verb2 iacere ;
+ _ + "io" => verb3i iacere ieci iactus ;
+ _ => verb3 iacere ieci iactus
+ } ;
+ _ => Predef.error ("verb_pppi: illegal infinitive form" ++ iacere)
+ } ;
+
+ verb : (iacere : Str) -> Verb =
+ \iacere ->
+ case iacere of {
+ _ + "are" => verb1 iacere ;
+ _ + "ire" => let iaci = Predef.tk 2 iacere
+ in verb4 iacere (iaci + "vi") (iaci + "tus") ;
+ _ + "ere" => verb2 iacere ;
+ _ => Predef.error ("verb: illegal infinitive form" ++ iacere)
+ } ;
+
+-- pronouns
+
+ Pronoun : Type = {
+ s : Case => Str ;
+ g : Gender ;
+ n : Number ;
+ p : Person ;
+ } ;
+
+ mkPronoun : (_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pronoun =
+ \ego,me,mei,mihi,mee,g,n,p -> {
+ s = pronForms ego me mei mihi mee ;
+ g = g ;
+ n = n ;
+ p = p
+ } ;
+
+ pronForms : (_,_,_,_,_ : Str) -> Case => Str =
+ \ego,me,mei,mihi,mee -> table Case [ego ; me ; mei ; mihi ; mee ; ego] ;
+
+ personalPronoun : Gender -> Number -> Person -> Pronoun = \g,n,p -> {
+ s = case <g,n,p> of {
+ <_,Sg,P1> => pronForms "ego" "me" "mei" "mihi" "me" ;
+ <_,Sg,P2> => pronForms "tu" "te" "tui" "tibi" "te" ;
+ <_,Pl,P1> => pronForms "nos" "nos" "nostri" "nobis" "nobis" ; --- nostrum
+ <_,Pl,P2> => pronForms "vos" "vos" "vestri" "vobis" "vobis" ; --- vestrum
+ <Masc, Sg,P3> => pronForms "is" "eum" "eius" "ei" "eo" ;
+ <Fem, Sg,P3> => pronForms "ea" "eam" "eius" "ei" "ea" ;
+ <Neutr,Sg,P3> => pronForms "id" "id" "eius" "ei" "eo" ;
+ <Masc, Pl,P3> => pronForms "ii" "eos" "eorum" "iis" "iis" ;
+ <Fem, Pl,P3> => pronForms "ii" "eas" "earum" "iis" "iis" ;
+ <Neutr,Pl,P3> => pronForms "ea" "ea" "eorum" "iis" "iis"
+ } ;
+ g = g ;
+ n = n ;
+ p = p
+ } ;
+
+ Preposition : Type = {s : Str ; c : Case} ;
+
+ VP : Type = {
+ fin : VActForm => Str ;
+ inf : VAnter => Str ;
+ obj : Str ;
+ adj : Gender => Number => Str
+ } ;
+
+ VPSlash = VP ** {c2 : Preposition} ;
+
+ predV : Verb -> VP = \v -> {
+ fin = v.act ;
+ inf = v.inf ;
+ obj = [] ;
+ adj = \\_,_ => []
+ } ;
+
+ predV2 : (Verb ** {c : Preposition}) -> VPSlash = \v -> predV v ** {c2 = v.c} ;
+
+ appPrep : Preposition -> (Case => Str) -> Str = \c,s -> c.s ++ s ! c.c ;
+
+ insertObj : Str -> VP -> VP = \obj,vp -> {
+ fin = vp.fin ;
+ inf = vp.inf ;
+ obj = obj ++ vp.obj ;
+ adj = vp.adj
+ } ;
+
+ insertAdj : (Gender => Number => Case => Str) -> VP -> VP = \adj,vp -> {
+ fin = vp.fin ;
+ inf = vp.inf ;
+ obj = vp.obj ;
+ adj = \\g,n => adj ! g ! n ! Nom ++ vp.adj ! g ! n
+ } ;
+
+ Clause = {s : VAnter => VTense => Polarity => Str} ;
+
+ mkClause : Pronoun -> VP -> Clause = \np,vp -> {
+ s = \\a,t,p => np.s ! Nom ++ vp.obj ++ vp.adj ! np.g ! np.n ++ negation p ++
+ vp.fin ! VAct a t np.n np.p
+ } ;
+
+ negation : Polarity -> Str = \p -> case p of {
+ Pos => [] ;
+ Neg => "non"
+ } ;
+
+-- determiners
+
+ Determiner : Type = {
+ s,sp : Gender => Case => Str ;
+ n : Number
+ } ;
+
+ Quantifier : Type = {
+ s,sp : Number => Gender => Case => Str ;
+ } ;
+
+ mkQuantifG : (_,_,_,_,_ : Str) -> (_,_,_,_ : Str) -> (_,_,_ : Str) ->
+ Gender => Case => Str =
+ \mn,ma,mg,md,mab, fno,fa,fg,fab, nn,ng,nab -> table {
+ Masc => pronForms mn ma mg md mab ;
+ Fem => pronForms fno fa fg md fab ;
+ Neutr => pronForms nn nn ng md nab
+ } ;
+
+ mkQuantifier : (sg,pl : Gender => Case => Str) -> Quantifier = \sg,pl ->
+ let ssp = table {Sg => sg ; Pl => pl}
+ in {
+ s = ssp ;
+ sp = ssp
+ } ;
+
+ hic_Quantifier = mkQuantifier
+ (mkQuantifG
+ "hic" "hunc" "huius" "huic" "hoc" "haec" "hanc" "huius" "hac" "hoc" "huius" "hoc")
+ (mkQuantifG
+ "hi" "hos" "horum" "his" "his" "hae" "has" "harum" "his" "haec" "horum" "his")
+ ;
+
+ ille_Quantifier = mkQuantifier
+ (mkQuantifG
+ "ille" "illum" "illius" "illi" "illo"
+ "illa" "illam" "illius" "illa"
+ "illud" "illius" "illo")
+ (mkQuantifG
+ "illi" "illos" "illorum" "illis" "illis"
+ "illae" "illas" "illarum" "illis"
+ "illa" "illorum" "illis")
+ ;
+
+ mkPrep : Str -> Case -> {s : Str ; c : Case} = \s,c -> {s = s ; c = c} ;
+
+}
+