summaryrefslogtreecommitdiff
path: root/next-lib/src/interlingua/ResIna.gf
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2009-03-13 16:05:13 +0000
committeraarne <aarne@cs.chalmers.se>2009-03-13 16:05:13 +0000
commit9b636333297ef49caece5ddb523e4bef7b8aea83 (patch)
treee06ad1f15622e671b42d86af23224c4465400456 /next-lib/src/interlingua/ResIna.gf
parente66b27aa5b6939694af4a1aa02b1f6e49dc7f636 (diff)
interlingua updated for new resource
Diffstat (limited to 'next-lib/src/interlingua/ResIna.gf')
-rw-r--r--next-lib/src/interlingua/ResIna.gf335
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 ;
+
+}