diff options
| author | aarne <aarne@cs.chalmers.se> | 2009-03-13 16:05:13 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2009-03-13 16:05:13 +0000 |
| commit | 9b636333297ef49caece5ddb523e4bef7b8aea83 (patch) | |
| tree | e06ad1f15622e671b42d86af23224c4465400456 /next-lib/src/interlingua/ResIna.gf | |
| parent | e66b27aa5b6939694af4a1aa02b1f6e49dc7f636 (diff) | |
interlingua updated for new resource
Diffstat (limited to 'next-lib/src/interlingua/ResIna.gf')
| -rw-r--r-- | next-lib/src/interlingua/ResIna.gf | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/next-lib/src/interlingua/ResIna.gf b/next-lib/src/interlingua/ResIna.gf new file mode 100644 index 000000000..c81324f0d --- /dev/null +++ b/next-lib/src/interlingua/ResIna.gf @@ -0,0 +1,335 @@ +--# -path=.:../abstract:../common:../../prelude + +--1 Interlingua 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 ResIna = ParamX ** open Prelude in { + + flags optimize=all ; + + + -- Some parameters, such as $Number$, are inherited from $ParamX$. + + --2 For $Noun$ + + -- This is the worst-case $Case$ needed for pronouns. + + param + Case = Nom | Acc | Gen | Dat | Abl ; + -- Why do we need so many cases? + -- Interlingua has (optional) contractions: + -- "a le" -> "al" + -- "de le" -> "del" + -- so, we can't get away with mere prepositions "a" and "de" + -- but use Dative and Ablative to represent those. + -- Pronouns have different forms in Nominative and Accusative. + -- Genitive is used for possesives (which can also be pronominalized) + + oper + casePrep : Str -> Case -> Str = \prep,cas -> case cas of { + Dat => "a"; + Gen | Abl => "de"; + _ => prep + }; + + + --2 For $Verb$ + + -- These 7 forms are more than we need. (esser is irregular + -- only in pres, past, fut, cond so we could do with 5, but it makes + -- easy to reason about what happens.) + + param + VForm + = VInf + | VPres + | VPPart + | VPresPart + | VPast --# notpresent + | VFut --# notpresent + | VCond --# notpresent + ; + + param + VVariant + = VMono -- "creava" + | VSplit -- "ha create" -- !!! This is not implemented. One reason is that the split forms overlap with aux verb + participle as ajective. (Anterior form) + ; + + -- The order of sentence is needed already in $VP$. + Order = ODir | OQuest ; + + --2 For $Adjective$ + + AForm = AAdj Degree | AAdv ; + + --2 For $Relative$ + + -- RAgr = RNoAg | RAg {n : Number ; p : Person} ; + -- RCase = RPrep | RC Case ; + + --2 For $Numeral$ + + CardOrd = NCard | NOrd ; + DForm = unit | ten ; + + --2 Transformations between parameter types + + oper + Agr = {n : Number ; p : Person} ; + -- This is the agreement record for verb phrases, which is needed only for reflexive verbs. + + agrP3 : Number -> Agr = \n -> + {n = n ; p = P3} ; + + conjAgr : Agr -> Agr -> Agr = \a,b -> { + n = conjNumber a.n b.n ; + p = conjPerson a.p b.p + } ; + + + -- For each lexical category, here are the worst-case constructors. + mkAdjective : (_,_,_ : Str) -> {s : AForm => Str} = + \bon,melior,optime -> + let mente = case last bon of + {"c" => "amente"; + _ => "mente" + } + in { + s = table { + AAdj Posit => bon ; + AAdj Compar => melior ; + AAdj Superl => optime ; + AAdv => bon + mente + } + } ; + + + mkVerb : Str -> Verb = \crear-> + let crea = init crear + in {isRefl = False; + s = table { + VInf => crear; + VPres => crea; + VPast => crea + "va"; + VFut => crear + "a"; + VCond => crear + "ea"; + VPPart => case crear of { + rid + "er" => rid + "ite"; + _ => crea + "te" + }; + VPresPart => case crear of { + aud + "ir" => aud + "iente"; + _ => crea + "nte" + }}}; + + -- + The 3 (optionally) irregular verbs. (we only need haberV in this module) + esserV : Verb = + let reg = mkVerb "esser" + in {isRefl = False; + s = \\form=> case form of { + VPres => variants {"es"; "esse"}; + VFut => variants {"sera"; "essera"}; + VCond => variants {"serea"; "esserea"}; + VPast => variants {"era"; "esseva"}; + _ => reg.s!form}}; + + haberV : Verb = + let reg = mkVerb "haber" + in {isRefl = False; + s = \\form=> case form of { + VPres => variants {"ha"; "habe"}; + _ => reg.s!form}}; + + vaderV : Verb = + let reg = mkVerb "vader" + in {isRefl = False; + s = \\form=> case form of { + VPres => variants {"va"; "vade"}; + _ => reg.s!form}}; + + + mkIP : Str -> Number -> {s : Case => Str ; n : Number} = \qui,n -> {s = \\c=>casePrep [] c ++ qui; n = n}; + + mkPron : (io,me,mi : Str) -> Agr -> NP ** {possForm : Str} = + \io,me,mi,a -> + let mie = case last mi of { + "e" => mi; + _ => mi + "e" + } in + { + a = a; + s = table { + Nom => io ; + Gen => mie ; + _ => me + } ; + possForm = mi; + isPronoun = True + } ; + + + Sp1 : Agr = {n = Sg ; p = P1}; + Sp2 : Agr = {n = Sg ; p = P2}; + Sp3 : Agr = {n = Sg ; p = P3}; + Pp1 : Agr = {n = Pl ; p = P1}; + Pp2 : Agr = {n = Pl ; p = P2}; + Pp3 : Agr = {n = Pl ; p = P3}; + + -- make an invariant NP (not inflected) + mkInvarNP : Str -> NP = \str -> {a = Sp3; isPronoun = False; s = \\_=> str}; + + regNP : Str -> NP = mkInvarNP; + + artIndef = "un"; + artDef = "le" ; + + -- For $Verb$. + Verb : Type = { + s : VForm => Str ; + isRefl : Bool + } ; + + -- Dependency on Agr is there only because of reflexive pronouns! + VP : Type = { + s : Anteriority => Tense => {fin, inf : Str} ; + rest : Agr => Str; -- comes after the infinite part + clitics : Agr => Str; -- can be placed just before the finite or right after the infinite + prp : Str ; -- present participle (unused at the moment ???) + inf : Str ; -- the infinitive form ; VerbForms would be the logical place + } ; + NP : Type = { + isPronoun : Bool; + s : Case => Str; + a : Agr; + }; + -- Noun phrase that can be declined in person and number. (for reflexive pronouns) + NP' : Type = { + isPronoun : Bool; + s : Agr => Case => Str; + }; + + predV : Verb -> VP = \verb -> { + clitics = \\_ => []; + rest = \\_ => []; + s = table + {Simul => \\t=> {fin = verb.s ! (tenseToVFrom!t); inf = []}; + Anter => \\t=> {fin = haberV.s ! (tenseToVFrom!t); inf = verb.s!VPPart} + }; + prp = verb.s ! VPresPart; + inf = verb.s ! VInf; + }; + + tenseToVFrom = table { + Pres => VPres + ;Past => VPast; --# notpresent + Fut => VFut; --# notpresent + Cond => VCond --# notpresent + }; + + insertInvarObj : Str -> VP -> VP = \obj -> insertObj "" Acc (mkInvarNP obj); + + insertObj : Str -> Case -> NP -> VP -> VP + = \prep,c,obj,vp -> insertReflObj prep c {isPronoun = obj.isPronoun; s = \\agr => obj.s} vp; + + insertReflObj : Str -> Case -> NP' -> VP -> VP = \prep,c,obj,vp -> case obj.isPronoun of + { + -- !!! if the preposition is not empty, or + -- if the case is not [Dat, Acc] + -- then the pronoun cannot be inserted as a clitic. + True => { + inf = vp.inf; + prp = vp.prp; + s = vp.s; + clitics = \\agr => obj.s!agr!c ++ vp.clitics!agr; -- clitics are inserted in reverse order. + rest = vp.rest}; + False => { + inf = vp.inf; + prp = vp.prp; + s = vp.s; + clitics = vp.clitics; + rest = \\agr => vp.rest!agr ++ prep ++ obj.s!agr!c; + } }; + + infVP : VP -> Str = \vp -> variants { + vp.clitics ! Sp3 ++ vp.inf ++ vp.rest ! Sp3 ; + vp.inf ++ vp.clitics ! Sp3 ++ vp.rest ! Sp3 ; + }; + + posneg : Polarity -> Str = \b -> case b of { + Pos => [] ; + Neg => "non" + } ; + + + reflPron : Agr => Str = table { + {n = Sg ; p = P1} => "me" ; + {n = Sg ; p = P2} => "te" ; + {n = Sg ; p = P3} => "se" ; + {n = Pl ; p = P1} => "nos" ; + {n = Pl ; p = P2} => "vos" ; + {n = Pl ; p = P3} => "se" + } ; + + ---- For $Sentence$. + -- + Clause = {s : Tense => Anteriority => Polarity => Order => Str} ; + + mkClause : Str -> Agr -> VP -> Clause = + \subj,agr,vp -> + { + s = \\t,anter,b =>let v = vp.s!anter!t + in table { + ODir => variants { + subj ++ posneg b ++ v.fin ++ v.inf ++ vp.clitics!agr ++ vp.rest!agr; + subj ++ posneg b ++ vp.clitics!agr ++ v.fin ++ v.inf ++ vp.rest!agr + }; + OQuest => variants { + posneg b ++ v.fin ++ subj ++ v.inf ++ vp.clitics!agr ++ vp.rest!agr; + posneg b ++ vp.clitics!agr ++ v.fin ++ subj ++ v.inf ++ vp.rest!agr; + } + } + }; + + + mkQuestion : + {s : Str} -> Clause -> Clause = \qu,cl -> + {s=\\t,a,p,o => qu.s ++ cl.s ! t ! a ! p ! o}; + + + + -- For $Numeral$. + + oper mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} = + \duo,vinti,secunde,vintesime-> + {s = table { unit => table { + NCard => duo ; + NOrd => secunde}; + ten => table { + NCard => vinti; + NOrd => vintesime}}} ; + + oper regNum : Str -> Str -> {s : DForm => CardOrd => Str} = + \cinque,quinte -> + let cinqu : Str = case cinque of { + nov + "em"=> nov; + cinq_ + "e" => cinq_; + cinq_ + "o" => cinq_; + sex => sex} + in mkNum cinque quinte (cinqu + "anta") (cinqu + "esime"); + + regOrd : Str -> Str = \cent -> case cent of { + mill + "e" => mill + "esime"; + _ => cent + "esime"}; + + regCardOrd : Str -> {s : CardOrd => Str} = \ten -> + {s = table {NCard => ten ; NOrd => regOrd ten}} ; + + mkCard : CardOrd -> Str -> Str = \c,ten -> + (regCardOrd ten).s ! c ; + +} |
