1
0
forked from GitHub/gf-core
Files
gf-core/lib/src/interlingua/ResIna.gf
2009-06-22 15:39:08 +00:00

356 lines
9.8 KiB
Plaintext

--# -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"; --# notpresent
VFut => crear + "a"; --# notpresent
VCond => crear + "ea"; --# notpresent
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 : Bool => Verb = \\use_irreg =>
let reg = mkVerb "esser"
in {isRefl = False;
s = case use_irreg of {
True => table {
VPres => "es";
VFut => "sera"; --# notpresent
VCond => "serea"; --# notpresent
VPast => "era"; --# notpresent
form => reg.s!form
};
False => reg.s
}
};
haberV : Bool => Verb = \\use_irreg =>
let reg = mkVerb "haber"
in {isRefl = False;
s = case use_irreg of {
True => table {
VPres => "ha";
form => reg.s!form
};
False => reg.s
}
};
vaderV : Bool => Verb = \\use_irreg =>
let reg = mkVerb "vader"
in {isRefl = False;
s = case use_irreg of {
True => table {
VPres => "va";
form => reg.s!form
};
False => reg.s
}
};
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 => Bool => {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_ : (Bool => Verb) -> VP = \verb -> {
clitics = \\_ => [];
rest = \\_ => [];
s = table
{Simul => \\t,use_irreg => {fin = (verb!use_irreg).s ! (tenseToVFrom!t); inf = []}
; --# notpresent
Anter => \\t,use_irreg => {fin = (haberV!use_irreg).s ! (tenseToVFrom!t); inf = (verb!use_irreg).s!VPPart} --# notpresent
};
prp = (verb!False).s ! VPresPart;
inf = (verb!False).s ! VInf;
};
predV : Verb -> VP = \verb -> predV_ (\\_ => verb) ;
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 : Bool => Tense => Anteriority => Polarity => Order => Str} ;
mkClause : Str -> Agr -> VP -> Clause =
\subj,agr,vp ->
{
s = \\use_irreg,t,anter,b =>
let v = vp.s!anter!t!use_irreg
in case use_irreg of {
True => table {
ODir => subj ++ posneg b ++ v.fin ++ v.inf ++ vp.clitics!agr ++ vp.rest!agr;
OQuest => posneg b ++ v.fin ++ subj ++ v.inf ++ vp.clitics!agr ++ vp.rest!agr
} ;
False => table {
ODir => subj ++ posneg b ++ vp.clitics!agr ++ v.fin ++ v.inf ++ vp.rest!agr;
OQuest => posneg b ++ vp.clitics!agr ++ v.fin ++ subj ++ v.inf ++ vp.rest!agr
}
}
};
mkQuestion :
{s : Str} -> Clause -> Clause = \qu,cl ->
{s=\\use_irreg,t,a,p,o => qu.s ++ cl.s ! use_irreg ! 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 ;
}