mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-06-14 09:30:13 -06:00
426 lines
16 KiB
Plaintext
426 lines
16 KiB
Plaintext
--# -path=.:../abstract:../common:../prelude
|
||
|
||
-- Mongolian 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 ResMon = ParamX ** open Prelude in {
|
||
|
||
flags optimize=all ; coding=utf8 ;
|
||
|
||
param
|
||
VowelType = MascA | MascO | FemOE | FemE ;
|
||
|
||
-- Suffixes:
|
||
|
||
-- Some suffixes have variants with different vowels; in adding the suffix
|
||
-- to a stem, the variant that fits to the vowel type of the stem is used.
|
||
|
||
oper
|
||
Suffix = (VowelType => Str) ;
|
||
|
||
-- Some of the suffixes with variants, used in noun and verb inflection, are:
|
||
|
||
a4 = table { MascA => "а" ; MascO => "о" ; FemE => "э" ; FemOE => "ө" } ;
|
||
a3 = table { MascA => "а" ; MascO => "о" ; FemE | FemOE => "э" } ;
|
||
a2 = table { MascA | MascO => "а" ; FemE | FemOE => "э" } ;
|
||
i2 = table { MascA | MascO => "ы" ; FemE | FemOE => "ий" } ;
|
||
u2 = table { MascA | MascO => "у" ; FemE | FemOE => "ү" } ;
|
||
|
||
aa4 : Suffix = \\vt => a4!vt + a4!vt ;
|
||
uu2 : Suffix = \\vt => u2!vt + u2!vt ;
|
||
ai3 : Suffix = \\vt => a3!vt + "й" ;
|
||
|
||
-- Pluralsuffixes
|
||
uud2 : Suffix = \\vt => uu2!vt + "д" ;
|
||
iud2 : Suffix = \\vt => "и" + u2!vt + "д" ;
|
||
nuud2 : Suffix = \\vt => "н" + uu2!vt + "д" ;
|
||
guud2 : Suffix = \\vt => "г" + uu2!vt + "д" ;
|
||
|
||
-- Declinationsuffixes
|
||
iin2 : Suffix = \\vt => i2!vt + "н" ;
|
||
nii2 : Suffix = \\vt => "н" + i2!vt ;
|
||
ii2 : Suffix = \\vt => i2!vt ;
|
||
ad4 : Suffix = \\vt => a4!vt + "д" ;
|
||
and4 : Suffix = \\vt => a4!vt + "нд" ;
|
||
iig2 : Suffix = \\vt => i2!vt + "г" ;
|
||
aas4 : Suffix = \\vt => aa4!vt + "с" ;
|
||
ias3 : Suffix = \\vt => "и" + a3!vt + "с" ;
|
||
as4 : Suffix = \\vt => a4!vt + "с" ;
|
||
naas4 : Suffix = \\vt => "н" + aa4!vt + "с" ;
|
||
gaas4 : Suffix = \\vt => "г" + aa4!vt + "с" ;
|
||
aar4 : Suffix = \\vt => aa4!vt + "р" ;
|
||
iar3 : Suffix = \\vt => "и" + a3!vt + "р" ;
|
||
ar4 : Suffix = \\vt => a4!vt + "р" ;
|
||
gaar4 : Suffix = \\vt => "г" + aa4!vt + "р" ;
|
||
tai3 : Suffix = \\vt => "т" + a3!vt + "й" ;
|
||
ruu2 : Suffix = \\vt => "р" + uu2!vt ;
|
||
luu2 : Suffix = \\vt => "л" + uu2!vt ;
|
||
gaa4 : Suffix = \\vt => "г" + aa4!vt ;
|
||
|
||
-- Conjugationsuffixes
|
||
uul2 : Suffix = \\vt => uu2!vt + "л" ;
|
||
ul2 : Suffix = \\vt => u2!vt + "л" ;
|
||
ga4 : Suffix = \\vt => "г" + a4!vt ;
|
||
lga4 : Suffix = \\vt => "лг" + a4!vt ;
|
||
tsgaa4 : Suffix = \\vt => "цг" + aa4!vt ;
|
||
na4 : Suffix = \\vt => "н" + a4!vt ;
|
||
dag4 : Suffix = \\vt => "д" + a4!vt + "г" ;
|
||
laa4 : Suffix = \\vt => "л" + aa4!vt ;
|
||
san4 : Suffix = \\vt => "с" + a4!vt + "н" ;
|
||
ya3 : Suffix = table { MascA => "я" ; MascO => "ё" ; FemE | FemOE => "е" } ;
|
||
sugai2 : Suffix = table { MascA | MascO => "сугай" ; FemE | FemOE => "сүгэй" } ;
|
||
aach4 : Suffix = \\vt => aa4!vt + "ч" ;
|
||
aarai4 : Suffix = \\vt => aa4!vt + "р" + ai3!vt ;
|
||
uuzai2 : Suffix = table { MascA | MascO => "уузай" ; FemE | FemOE => "үүзэй" } ;
|
||
gtun2 : Suffix = \\vt => "гт" + u2!vt + "н" ;
|
||
saar4 : Suffix = \\vt => "с" + aa4!vt + "р" ;
|
||
aasai4 : Suffix = \\vt => aa4!vt + "с" + ai3!vt ;
|
||
tugai2 : Suffix = table {MascA | MascO => "тугай" ; FemE | FemOE => "түгэй"} ;
|
||
bal4 : Suffix = \\vt => "б" + a4!vt + "л" ;
|
||
wal4 : Suffix = \\vt => "в" + a4!vt + "л" ;
|
||
magts4 : Suffix = \\vt => "м" + a4!vt + "гц" ;
|
||
hlaar4 : Suffix = \\vt => "хл" + aa4!vt + "р" ;
|
||
haar4 : Suffix = \\vt => "х" + aa4!vt + "р" ;
|
||
tal4 : Suffix = \\vt => "т" + a4!vt + "л" ;
|
||
nguut2 : Suffix = table {MascA | MascO => "нгуут" ; FemE | FemOE => "нгүүт"} ;
|
||
ngaa4 : Suffix = \\vt => "нг" + aa4!vt ;
|
||
aad4 : Suffix = \\vt => aa4!vt + "д" ;
|
||
dugaar2 : Suffix = \\vt => "д" + u2!vt + "г" + a2!vt + a2!vt + "р" ;
|
||
|
||
-- Word endings added in Mongolian inflection (of nouns, verbs, adjectives) depend on
|
||
-- the vowel type of the stem.
|
||
|
||
vowelType : Str -> VowelType = \stem -> case stem of {
|
||
(_ + ("а"|"я"|"у") + ?)|(_ + ? + ("а"|"я"|"у")) => MascA ;
|
||
(_ + ("ё"|"о") + ?)|(_ + ? + ("ё"|"о")) => MascO ;
|
||
(_ + "ө" + ?)|(_ + ? + "ө") => FemOE ;
|
||
(_ + ("э"|"ү"|"е"|"и") + ?)|(_ + ? + ("э"|"ү"|"е")) => FemE ;
|
||
(("А"|"Я"|"У"|"Ю")+_)|(_+("а"|"я"|"у"|"ю")+_) => MascA ;
|
||
(("Ё"|"О")+_)|(_+("ё"|"о")+_) => MascO ;
|
||
("Ө"+_)|(_+"ө"+_) => FemOE ;
|
||
(("Э"|"Ү"|"Е"|"И")+_)|(_+("э"|"ү"|"е"|"и")+_) => FemE ;
|
||
_ => Predef.error (["vowelType does not apply to: "] ++ stem)
|
||
} ;
|
||
|
||
-- For $Noun$
|
||
|
||
-- Mongolian nouns do not have an inherent Gender parameter. Number is used
|
||
-- rarely. Nouns decline according to number and case.
|
||
-- $Number$ is inherited from $ParamX$.
|
||
-- This is the $Case$ (8 cases in Mongolian) as needed for nouns and $NP$s.
|
||
|
||
param
|
||
RCase = Nom | Gen | Dat | Acc | Abl | Inst | Com | Dir ;
|
||
NCase = NNom | NGen | NDat | NAcc Def | NAbl | NInst | NCom | NDir ;
|
||
Def = Definite | Indefinite ;
|
||
Poss = Possess| NonPoss ;
|
||
|
||
-- For the sake of shorter description number and case are
|
||
-- combined in the type SubstForm.
|
||
|
||
SubstForm = SF Number NCase ;
|
||
|
||
oper
|
||
Noun : Type = {s : SubstForm => Str} ;
|
||
NounPhrase : Type = {s : RCase => Str; n : Number ; p : Person ; isPron : Bool ; isDef : Bool} ;
|
||
|
||
param
|
||
PronForm = PronCase RCase | PronPoss RCase ;
|
||
|
||
oper
|
||
Pron = {s : PronForm => Str ; n : Number ; p : Person } ;
|
||
mkCbP : Number -> Person -> Str = \n,p -> case <n,p> of {
|
||
<Sg,P1> => "минь" ; <Pl,P1> => "маань" ;
|
||
<Sg,P2> => "чинь" ; <Pl,P2> => "тань" ;
|
||
<_,P3> => "нь"
|
||
} ;
|
||
|
||
reflPron : Number => RCase => Str = table {
|
||
Sg => table RCase ["өөрөө";"өөрийнхөө";"өөртөө";"өөрийгөө";"өөрөөсөө";"өөрөөрөө";"өөртэйгээ";"өөр лүүгээ"] ;
|
||
Pl => table RCase ["өөрсдөө";"өөрсдийнхөө";"өөрсөддөө";"өөрсдийгээ";
|
||
"өөрсдөөсөө";"өөрсдөөрөө";"өөрсөдтэйгээ";"өөрсөд рүүгээ"]
|
||
} ;
|
||
|
||
-- For $Numeral$
|
||
|
||
param
|
||
CardOrd = NCard | NOrd ;
|
||
DForm = Unit | Teen | Ten | Hundred ;
|
||
Place = Indep | Attr ;
|
||
|
||
-- For $Verb$
|
||
|
||
-- The verb mood can be indicative (Tense-bound terminating suffixes (TTS)) and
|
||
-- imperative (Person-bound terminating suffixes (PTS)).
|
||
-- Indicative have tenses; but there are no person and (almost) no number suffixes.
|
||
-- Special forms are used for building coordination (Coordinating verb determining
|
||
-- suffixes (CVDS)) and subordination (Subordinating verb determining suffixes (SVDS))
|
||
-- of sentences. Participles (Noun determining suffixes (NDS)) should be part of
|
||
-- the adjectives.
|
||
|
||
Voice = Act | Caus | Pass | Comm | Advs ;
|
||
Aspect = Simpl | Quick | Coll | Compl ;
|
||
VTense = VPresPerf | VPastComp | VPastIndef | VFut ;
|
||
|
||
-- special parameter used for imperative
|
||
|
||
Directness = Direct | Indirect ;
|
||
Imperative = Int | Dec | Command | Req | Demand
|
||
| Admon | Appeal | Perm | Hope | Bless ;
|
||
|
||
-- Different verb forms are needed in subordinating clauses:
|
||
|
||
Subordination = Condl | Conc | ISucc | LSucc | Intend | Limit | Progr | Succ ;
|
||
VoiceSub = ActSub | CausSub | PassSub ;
|
||
Participle = PPresIndef | PPresProgr | PPast | PFut | PDoer ;
|
||
|
||
-- Tense in ParamX does not fit well to Mongolian; therefore:
|
||
|
||
Pastform = Perf | PresPerf | IndefPast ; -- в Perfect, лаа4 Presens Perfect, жээ Indefinite Past
|
||
ClTense = ClPres | ClPast Pastform | ClFut ;
|
||
|
||
-- The VFORM verb forms, which we build on morphological level
|
||
-- combine voice, aspect and mood (TTS), where mood contains indicative tensed forms.
|
||
-- Subordinate forms can be combined with some values of Voice and Aspect, while
|
||
-- participles, imperative and coordinating forms do not depend on Voice and Aspect:
|
||
|
||
VerbForm = VFORM Voice Aspect VTense
|
||
| VIMP Directness Imperative
|
||
| SVDS VoiceSub Subordination
|
||
| CVDS Anteriority
|
||
| VPART Participle RCase
|
||
;
|
||
|
||
VType = VAct | VRefl ;
|
||
Passform = Passive | Causative ;
|
||
|
||
VVVerbForm = VVTense VTense
|
||
| VVImp Directness Imperative
|
||
| VVSubordination Subordination
|
||
| VVCoordination Anteriority
|
||
| VVParticiple Participle RCase
|
||
;
|
||
|
||
SType = Main | Sub Subordination | Coord | Quest Style | Part SubType ;
|
||
SubType = Subject | Object | Adverbiale | Rel | emptySubject ;
|
||
ComplType = ComplSubj | ComplObj | ComplAdv | Attributive | NoSubj ;
|
||
Style = wQuest | yesNoQuest ;
|
||
|
||
VPForm = VPFin ClTense Anteriority Polarity
|
||
| VPImper Polarity Bool
|
||
| VPPass Passform ClTense
|
||
| VPPart ClTense Polarity RCase
|
||
| VPSub Polarity Subordination
|
||
| VPCoord Anteriority
|
||
;
|
||
oper
|
||
Verb : Type = {
|
||
s : VerbForm => Str ;
|
||
vtype : VType ;
|
||
vt : VowelType
|
||
} ;
|
||
|
||
Aux : Type = {
|
||
s : VVVerbForm => Str ;
|
||
vt : VowelType
|
||
} ;
|
||
|
||
VerbPhrase : Type = {
|
||
s : VPForm => {fin,aux : Str} ;
|
||
compl : RCase => Str ;
|
||
adv : Str ; -- optional group of adverbial modifiers
|
||
embedCompl : RCase => Str ; -- object sentence of the verb phrase
|
||
vt : VowelType
|
||
} ;
|
||
|
||
vFin : ClTense -> VTense = \t -> case t of {
|
||
ClPast pf => case pf of {
|
||
Perf => VPastComp ;
|
||
PresPerf => VPresPerf ;
|
||
IndefPast => VPastIndef
|
||
} ;
|
||
ClPres | ClFut => VFut
|
||
} ;
|
||
|
||
vSub : Subordination -> VerbForm = \sub -> SVDS ActSub sub ;
|
||
|
||
vCoord : Anteriority -> VerbForm = \ant -> CVDS ant ;
|
||
|
||
vPart : ClTense -> RCase -> VerbForm = \t,rc -> case t of {
|
||
ClPres => VPART PPresIndef rc;
|
||
ClPast _ => VPART PPast rc;
|
||
ClFut => VPART PFut rc
|
||
} ;
|
||
|
||
predV : Verb -> VerbPhrase = \verb ->
|
||
let
|
||
vfin : ClTense -> Str = \t -> verb.s ! VFORM Act Simpl (vFin t) ;
|
||
vaux : ClTense -> Str = \t -> case t of {
|
||
ClPast pf => case pf of {
|
||
Perf => "байв" ;
|
||
PresPerf => "байлаа" ;
|
||
IndefPast => "байжээ" } ;
|
||
ClPres | ClFut => "байна" } ;
|
||
vsub : Subordination -> Str = \sub -> verb.s ! vSub sub ;
|
||
vcoord : Anteriority -> Str = \ant -> verb.s ! vCoord ant ;
|
||
vpart : ClTense -> RCase -> Str = \t,rc -> verb.s ! vPart t rc ;
|
||
vpast = verb.s ! VPART PPast Nom ;
|
||
ppart = ((verb.s! VPART PPresProgr Nom) ++ BIND ++ "гүй") ;
|
||
vf : Str -> Str -> {fin,aux : Str} = \x,y -> {fin = x ; aux = y} ;
|
||
in {
|
||
s = table {
|
||
VPFin t Simul Pos => vf (vfin t) [] ;
|
||
VPFin t Simul Neg => vf ((vpart t Nom) ++ BIND ++ "гүй") [] ;
|
||
VPFin t Anter Pos => vf vpast (vaux t) ;
|
||
VPFin t Anter Neg => vf ppart (vaux t) ;
|
||
VPImper _ False => vf (verb.s ! VIMP Direct Command) [] ;
|
||
VPImper pol True => case pol of {
|
||
Neg => vf (verb.s ! VIMP Direct Demand) [] ;
|
||
Pos => let
|
||
w = (verb.s ! VFORM Act Simpl VFut) ;
|
||
vvt = verb.vt
|
||
in
|
||
vf (w ++ uu2!vvt) [] } ;
|
||
VPPass passform t => case passform of {
|
||
Passive => vf (verb.s ! VFORM Pass Simpl (vFin t)) [] ;
|
||
Causative => vf (verb.s ! VFORM Caus Simpl (vFin t)) []
|
||
} ;
|
||
VPPart t pol rc => case pol of {
|
||
Pos => vf (vpart t rc) [] ;
|
||
Neg => vf ((vpart t Nom) ++ BIND ++ "гүй") []} ;
|
||
VPSub pol sub => case pol of {
|
||
Pos => vf (vsub sub) [] ;
|
||
Neg => vf ppart "байвал" } ;
|
||
VPCoord ant => vf (vcoord ant) [] } ;
|
||
compl = \\_ => [] ;
|
||
adv = [] ;
|
||
embedCompl = \\_ => [] ;
|
||
vt = verb.vt
|
||
} ;
|
||
|
||
Clause : Type = {s : ClTense => Anteriority => Polarity => SType => Str} ;
|
||
|
||
mkClause : (RCase => Str) -> Number -> VowelType -> RCase -> VerbPhrase -> Clause = \subj,n,vt,rc,vp -> {
|
||
s = \\t,ant,pol,stype =>
|
||
let
|
||
verb = (vp.s ! VPFin t ant pol) ;
|
||
verbCoord = (vp.s ! VPCoord ant) ;
|
||
verbQuest = (vp.s ! VPPart t pol Nom) ;
|
||
verbPart = (vp.s ! VPPart t pol rc) ;
|
||
compl = vp.compl ! rc ++ vp.adv
|
||
in
|
||
case stype of {
|
||
Main => subj ! Nom ++ vp.compl ! rc ++ vp.embedCompl ! rc ++ vp.adv ++ verb.fin ++ verb.aux ;
|
||
Sub sub => subj ! Acc ++ compl ++ (vp.s ! VPSub pol sub).fin ;
|
||
Coord => subj ! Nom ++ vp.compl ! rc ++ vp.embedCompl ! rc ++ vp.adv ++ verbCoord.fin ;
|
||
Quest style => case style of {
|
||
wQuest => subj ! Nom ++ vp.compl ! rc ++ vp.embedCompl ! rc ++ vp.adv ++ verbQuest.fin ++ (wQuestPart (VPPart t pol Nom)) ;
|
||
yesNoQuest => subj ! Nom ++ vp.compl ! rc ++ vp.embedCompl ! rc ++ vp.adv ++ verbQuest.fin ++ (yesNoQuestPart vp.vt) } ;
|
||
Part subtype => case subtype of {
|
||
Subject => subj ! Gen ++ compl ++ verbQuest.fin ++ "нь";
|
||
Object => subj ! Gen ++ compl ++ verbPart.fin ;
|
||
Adverbiale => subj ! Acc ++ compl ++ verbPart.fin ;
|
||
Rel => subj ! Gen ++ compl ++ verbPart.fin ;
|
||
emptySubject => "" ++ compl ++ verbPart.fin
|
||
}
|
||
} } ;
|
||
|
||
wQuestPart : VPForm -> Str = \vpf -> case vpf of {
|
||
VPPart t pol _ => case t of {
|
||
ClPast _ => "бэ" ;
|
||
_ => "вэ"} ;
|
||
_ => "" } ;
|
||
|
||
yesNoQuestPart : VowelType -> Str = \vt -> case vt of {
|
||
(MascA|MascO) => "уу" ;
|
||
_ => "үү" } ;
|
||
|
||
-- Kullmann 371: the subject linked to the predicate.
|
||
-- Coord: A combined sentence always consists of two or more predicates. The last predicate takes a verb with a TS; the other verbs ned a CVDS.
|
||
-- The tense is expressed with the last predicate only.
|
||
-- Sub: dominated by the main clause, has the function of one part of the main sentence, is placed before the main sentence
|
||
-- Main: can exist independently of other clause, verbal predicate always takes a TS.
|
||
|
||
insertObj : (RCase => Str) -> VerbPhrase -> VerbPhrase = \obj,vp -> {
|
||
s = vp.s ;
|
||
compl = \\rc => obj ! rc ++ vp.compl ! rc ;
|
||
adv = vp.adv ;
|
||
embedCompl = \\rc => vp.embedCompl ! rc ;
|
||
vt = vp.vt
|
||
} ;
|
||
|
||
insertObjPost : (RCase => Str) -> VerbPhrase -> VerbPhrase = \obj,vp -> {
|
||
s = vp.s ;
|
||
compl = \\rc => vp.compl ! rc ++ obj ! rc ;
|
||
adv = vp.adv ;
|
||
embedCompl = \\rc => vp.embedCompl ! rc ;
|
||
vt = vp.vt
|
||
} ;
|
||
|
||
insertAdv : Str -> VerbPhrase -> VerbPhrase = \adv,vp -> {
|
||
s = vp.s ;
|
||
compl = vp.compl ;
|
||
adv = vp.adv ++ adv ;
|
||
embedCompl = \\_ => vp.embedCompl ! Dat ;
|
||
vt = vp.vt
|
||
} ;
|
||
|
||
insertEmbedCompl : Str -> VerbPhrase -> VerbPhrase = \ext,vp -> {
|
||
s = vp.s ;
|
||
compl = vp.compl ;
|
||
adv = vp.adv ;
|
||
embedCompl = \\rc => vp.embedCompl ! rc ++ ext ;
|
||
vt = vp.vt
|
||
} ;
|
||
|
||
infVP : VerbPhrase -> RCase -> Str = \vp,rc ->
|
||
let
|
||
obj = vp.compl ! rc ;
|
||
verb = vp.s ! VPPart ClFut Pos Nom
|
||
in
|
||
obj ++ vp.adv ++ verb.fin ;
|
||
|
||
-- For $Adjective$
|
||
|
||
-- Mongolian adjectives have not comparative forms, only AP's have.
|
||
|
||
Adjective : Type = {s : Str} ;
|
||
|
||
Complement = {s : Str ; rc : RCase} ;
|
||
|
||
appCompl : Complement -> (RCase => Str) -> Str = \compl,arg ->
|
||
compl.s ++ arg ! compl.rc ;
|
||
|
||
toNCase : RCase -> Def -> NCase = \rc,d -> case rc of {
|
||
Nom => NNom ;
|
||
Gen => NGen ;
|
||
Dat => NDat ;
|
||
Acc => (NAcc d) ;
|
||
Abl => NAbl ;
|
||
Inst => NInst ;
|
||
Com => NCom ;
|
||
Dir => NDir } ;
|
||
|
||
toRCase : NCase -> Def -> RCase = \nc,d -> case nc of {
|
||
NNom => Nom ;
|
||
NGen => Gen ;
|
||
NDat => Dat ;
|
||
NAcc d => Acc ;
|
||
NAbl => Abl ;
|
||
NInst => Inst ;
|
||
NCom => Com ;
|
||
NDir => Dir } ;
|
||
|
||
-- Transformations between parameter types
|
||
|
||
numSF: SubstForm -> Number = \sf -> case sf of { SF n _ => n } ;
|
||
|
||
caseSF: SubstForm -> NCase = \sf -> case sf of { SF _ nc => nc } ;
|
||
|
||
}
|
||
|