1
0
forked from GitHub/gf-rgl

Merge pull request #124 from inariksit/arabic

Arabic
This commit is contained in:
Inari Listenmaa
2019-01-04 15:09:25 +02:00
committed by GitHub
7 changed files with 76 additions and 47 deletions

View File

@@ -5,7 +5,7 @@ lincat
[S] = {s1,s2 : Order => Str} ;
[Adv] = {s1,s2 : Str} ;
[NP] = {s1,s2 : Case => Str ; a : Agr ; empty : Str} ;
[NP] = {s1,s2 : Case => Str ; a : Agr ; empty : Str; isHeavy : Bool} ;
[AP] = {s1,s2 : Species => Gender => Number => State => Case => Str} ;
lin
@@ -21,16 +21,19 @@ lin
BaseNP x y = twoTable Case x y ** {
a = conjAgr x.a y.a ;
empty = []
empty = [] ;
isHeavy = True ;
} ;
ConsNP xs x = consrTable Case comma xs x ** {
a = conjAgr xs.a x.a ;
empty = []
empty = [] ;
isHeavy = True ;
} ;
ConjNP conj ss = conjunctDistrTable Case conj ss ** {
a = let gn = pgn2gn ss.a.pgn in
{pgn = Per3 gn.g (conjNumber conj.n gn.n) ; isPron = False} ;
empty = []
empty = [] ;
isHeavy = True ;
} ;
BaseAP = twoTable5 Species Gender Number State Case ;

View File

@@ -15,6 +15,7 @@ concrete ExtendAra of Extend =
ParamX,
ResAra,
Prelude,
RelativeAra,
Coordination
in {
@@ -28,6 +29,9 @@ concrete ExtendAra of Extend =
-- : AP -> IComp ; -- "how old"
ICompAP ap = {s = \\gn => "كَمْ" ++ ap.s ! NoHum ! gn.g ! gn.n ! Indef ! Acc} ;
-- : ClSlash -> RCl -- he lives in
EmptyRelSlash = RelSlash (IdRP ** {s = \\_ => []}) ;
lincat
VPS = {s : PerGenNum => Str} ; -- finite VP's with tense and polarity
[VPS] = {s1,s2 : PerGenNum => Str} ;

View File

@@ -9,10 +9,10 @@ concrete IdiomAra of Idiom = CatAra ** open
lin
-- : VP -> Cl ; -- it is hot
ImpersCl vp =
let it : ResAra.NP = case vp.isPred of {
True => pron2np (gn2pron vp.obj.a.gn) ;
False => gn2pron vp.obj.a.gn } ; -- if no obj, Per3 Masc Sg chosen by default
-- "it is a girl" becomes "she is a girl";
-- "it is twins" becomes "they<dual> are<dual> twins".
ImpersCl vp = -- if no obj, default Per3 Masc Sg
let it : ResAra.NP = gn2pron vp.obj.a.gn ;
in predVP it vp ;
-- : VP -> Cl ; -- one sleeps

View File

@@ -22,7 +22,7 @@ lin
cn.s2 ! number
! (definite ! det.d) -- Indef remains Indef, rest become Def
! c
} in {
} in emptyNP ** {
s = \\c => -- Dat is just a hack for liPrep
let c' = case c of {Dat => Gen ; x => x} in
case cnB4det det of {
@@ -37,13 +37,12 @@ lin
};
a = { pgn = agrP3 cn.h cn.g number;
isPron = False } ;
empty = []
};
isHeavy = cn.isHeavy
} ;
UsePN pn = {
s = pn.s;
a = {pgn = Per3 pn.g Sg ; isPron = False} ;
empty = []
UsePN pn = emptyNP ** {
s = pn.s;
a = {pgn = Per3 pn.g Sg ; isPron = False}
};
UsePron p = p ;
@@ -70,7 +69,8 @@ lin
-}
AdvNP np adv = np ** {
s = \\c => np.s ! c ++ adv.s
s = \\c => np.s ! c ++ adv.s ;
isHeavy = True ;
};
DetQuantOrd quant num ord = quant ** {
@@ -169,10 +169,11 @@ lin
isEmpty = True
} ;
MassNP cn =
{s = \\c => cn2str cn Sg Indef c ;
a = {pgn = Per3 cn.g Sg ; isPron = False} ;
empty = []} ;
MassNP cn = emptyNP ** {
s = \\c => cn2str cn Sg Indef c ;
a = {pgn = Per3 cn.g Sg ; isPron = False} ;
isHeavy = cn.isHeavy ;
} ;
UseN,
UseN2 = useN ;
@@ -190,12 +191,22 @@ lin
};
RelCN cn rs = cn ** {
s2 = \\n,s,c => cn.s2 ! n ! s ! c ++ rs.s ! {pgn=Per3 cn.g n ; isPron=False} ! c};
s2 = \\n,s,c => cn.s2 ! n ! s ! c
++ rs.s ! {pgn=Per3 cn.g n ; isPron=False} ! c ;
isHeavy = True
} ;
RelNP np rs = np ** {s = \\c => np.s ! c ++ rs.s ! np.a ! c} ;
RelNP np rs = np ** {
s = \\c => np.s ! c ++ rs.s ! np.a ! c ;
isHeavy = True
} ;
AdvCN,
SentCN = \cn,ss -> cn ** {s2 = \\n,d,c => cn.s2 ! n ! d ! c ++ ss.s} ;
SentCN = \cn,ss -> cn ** {
s2 = \\n,d,c => cn.s2 ! n ! d ! c ++ ss.s ;
isHeavy = True
} ;
ApposCN cn np = cn ** {
np = \\c => cn.np ! c ++ np.s ! c

View File

@@ -173,7 +173,7 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in {
uttAP : AP -> (Gender => Str) ;
uttAP ap = \\g => ap.s ! NoHum ! g ! Sg ! Const ! Bare ; ----IL
CN : Type = Noun ** {np : Case => Str};
CN : Type = Noun ** {np : Case => Str ; isHeavy : Bool};
-- All fields of NP
cn2str : CN -> Number -> State -> Case -> Str = \cn,n,s,c ->
@@ -181,7 +181,9 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in {
cn.s2 ! n ! s ! c ++
cn.np ! c ;
useN : Noun -> CN = \n -> n ** {np = \\_ => []} ;
useN : Noun -> CN = \n -> n ** {
np = \\_ => [] ;
isHeavy = False } ;
uttCN : CN -> (Gender => Str) ;
uttCN cn = \\_ => cn2str cn Sg Indef Bare ;
@@ -555,7 +557,7 @@ v1geminateForms : Str -> Vowel -> Vowel -> DefForms =
umdad = "ُ" + mkStrong fcal mdd ;
Umdud = (prefixImp ! vowImpf) + mdud;
mamdUd = mkStrong mafcUl mdd
} in toDefForms
} in toDefForms
madd madad mudd mudid -- VPerf
amudd amdud umadd umdad -- VImpf
Umdud mudd' mamdUd ;
@@ -615,7 +617,7 @@ v1defForms_perfA : Root3 -> Vowel -> DefForms = \rmy,vowImpf ->
eirmi = prefixImp ! vowImpf + _rmi;
eirmu = prefixImp ! vowImpf + _rmu;
marmiy = mkStrong mafcil rmy
} in toDefForms
} in toDefForms
rama ramay rumi rumu rumiy -- VPerf
armi armu urma -- VImpf
eirmi eirmu marmiy ;
@@ -683,7 +685,7 @@ v2defective : Root3 -> Verb = \gny ->
ugannu = "ُ" + gannu;
uganna = "ُ" + ganna;
mugannaY = "مُ" + ganna + "ى"
} in verbDef (toDefForms
} in verbDef (toDefForms
ganna gannay gunni gunnu gunniy -- VPerf
uganni ugannu uganna -- VImpf
ganni gannu mugannaY) i ;
@@ -818,7 +820,7 @@ v7geminate : Str -> Verb = \fcl ->
n => "ُنْ" + vforms ! n -- doesn't exist for form 7
}) ;
v8geminate : Str -> Verb =
v8geminate : Str -> Verb =
\rootStr ->
let {
mdd = mkRoot3 rootStr ; --fcc
@@ -838,7 +840,7 @@ v8geminate : Str -> Verb =
umtadad = "ُ" + _mtadad ;
imtadid = "اِ" + _mtadid ;
mumtadd = "مُ" + _mtadd ;
} in verbGeminate (toDefForms
} in verbGeminate (toDefForms
imtadd imtadad umtudd umtudid -- VPerf
amtadd amtadid umtadd umtadad -- VPres
imtadd imtadid mumtadd) ;
@@ -1507,6 +1509,7 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
NP : Type = {
s : Case => Str ;
a : Agr ;
isHeavy : Bool ; -- overrides verbal word order, if the subject is very complicated; e.g. built out of RelNP or similar
empty : Str -- to prevent ambiguities with prodrop
} ;
@@ -1516,15 +1519,14 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
} ;
mkPron : (_,_,_ : Str) -> PerGenNum -> NP = \ana,nI,I,pgn ->
{ s =
emptyNP ** {s =
table {
(Nom|Bare) => ana;
Acc => nI ; -- object suffix
Gen => I ; -- possessive suffix
Dat => I -- will only be used with preposition لِ
};
a = {pgn = pgn; isPron = True };
empty = []
a = {pgn = pgn; isPron = True}
};
proDrop : NP -> NP = \np ->
@@ -1536,6 +1538,7 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
emptyNP : NP = {
s = \\_ => [] ;
a = {pgn = Per3 Masc Sg ; isPron = False} ;
isHeavy = False ;
empty = [] } ;
agrNP : Agr -> NP = \agr -> emptyNP ** {a = agr} ;
@@ -1653,7 +1656,7 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
}
} ;
ip2np : IP -> Bool -> NP = \ip,isPred -> ip ** { s = ip.s ! isPred ! Masc ! Def ; empty = [] } ;
ip2np : IP -> Bool -> NP = \ip,isPred -> emptyNP ** ip ** {s = ip.s ! isPred ! Masc ! Def} ;
np2ip : NP -> IP = \np -> np ** {s = \\_,_,_ => np.s} ;
IDet : Type = {
@@ -1748,7 +1751,7 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
True => np.s ! sc.c
} ;
} in wordOrder o
vp.obj.a.isPron np.a.isPron
vp.obj.a.isPron np.a.isPron np.isHeavy
(vStr vp pgn t p o)
vp.obj.s
(pred vp pgn t p)
@@ -1757,14 +1760,24 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
} ;
-- seems complicated, but this is to share code with VPS and other similar structures
wordOrder : Order -> (objIsPron,subjIsPron : Bool) -> (verb,obj,pred,adv,subj : Str) -> Str =
\o,objIsPron,subjIsPron,verb,obj,pred,adv,subj ->
wordOrder : Order -> (objIsPron,subjIsPron,subjIsHeavy : Bool) -> (verb,obj,pred,adv,subj : Str) -> Str =
\o,objIsPron,subjIsPron,subjIsHeavy,verb,obj,pred,adv,subj ->
let cl = wordOrderNoSubj o objIsPron verb obj pred adv in
case o of {
-- If subject is pronoun, affix it in Subord word order.
Subord =>
let bind = if_then_Str subjIsPron BIND [] -- in subord. clause, subj. pronoun binds to the main verb
let bind = if_then_Str subjIsPron BIND []
in cl.before ++ bind ++ subj ++ cl.after ;
_ => cl.before ++ subj ++ cl.after
-- If subject is "heavy" (e.g. contains a relative clause),
Verbal => -- then override Verbal word order.
case subjIsHeavy of {
True => subj ++ cl.before ++ cl.after ;
False => cl.before ++ subj ++ cl.after
} ;
-- Any other word order, no special checks.
_ => cl.before ++ subj ++ cl.after
} ;
wordOrderNoSubj : Order -> (objIsPron : Bool) -> (verb,obj,pred,adv : Str) -> {before,after : Str} =
@@ -1833,7 +1846,7 @@ patGeminateImp : (_,_ :Str) -> Gender => Number => Str = \facc,facic ->
Subj : Type = {s : Case => Str ; isPron : Bool} ;
np2subj : NP -> Subj = \np -> np ** {isPron = np.a.isPron} ;
subj2np : Subj -> NP = \su -> su ** {a = {pgn = emptyNP.a.pgn ; isPron = su.isPron} ; empty=[]} ;
subj2np : Subj -> NP = \su -> emptyNP ** su ** {a = {pgn = emptyNP.a.pgn ; isPron = su.isPron}} ;
emptyObj : Obj = {a = {gn = {g=Masc ; n=Sg} ; isPron = False}; s = []} ;
insertObj : NP -> VPSlash -> VP = \np,vp -> vp ** {

View File

@@ -78,7 +78,7 @@ concrete StructuralAra of Structural = CatAra **
something_NP = regNP "شَيْء" Sg Indef ;
-- somewhere_Adv = ss "سْموهري" ;
that_Quant = mkQuant3 "ذَلِكَ" "تِلكَ" "أُلٱِكَ" Def;
that_Subj = mkSubj "أنَّ" ;
that_Subj = mkSubj "أَنَّ" ;
----b that_NP = indeclNP "ذَلِكَ" Sg ;
there_Adv = ss "هُناك" ;
-- there7to_Adv = ss "تهري" ;

View File

@@ -14,15 +14,13 @@ lin
-- } ;
--IL TODO: check out some opers regarding state in ResAra. These are just dummy values.
CNSymbNP det cn xs =
let g = cn.g ; n = sizeToNumber det.n in {
let g = cn.g ; n = sizeToNumber det.n in emptyNP ** {
s = \\c => det.s ! NoHum ! g ! c ++ cn2str cn n Def c ++ xs.s; ----IL word order?? Seems to be nontrivial according to ResAra comments.
a = dummyAgrP3 n ;
empty = []
a = dummyAgrP3 n
} ;
CNNumNP cn i = {
CNNumNP cn i = emptyNP ** {
s = \\c => cn2str cn Sg Def c ++ uttNum i ! cn.g ;
a = dummyAgrP3 Sg ;
empty = []
a = dummyAgrP3 Sg
} ;
SymbS sy = {s = \\_ => sy.s} ;