mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-05-27 08:58:55 -06:00
@@ -25,7 +25,7 @@ concrete IdiomAra of Idiom = CatAra ** open
|
||||
CleftAdv adv s =
|
||||
let comp : Comp = CompAdv (lin Adv {s = adv.s ++ s.s ! Verbal}) ; -- no idea about word order /IL
|
||||
pass_V = mkV "مضي" va vi ; -- switch to copula or some other verb if better /IL
|
||||
in predVP emptyNP (UseV pass_V ** {isPred=True ; pred=comp}) ; -- very hacky /IL
|
||||
in predVP emptyNP (UseV pass_V ** {vtype=Copula ; pred=comp}) ; -- very hacky /IL
|
||||
|
||||
-- : NP -> Cl ; -- there is a house
|
||||
ExistNP np =
|
||||
|
||||
@@ -47,7 +47,14 @@ lin
|
||||
|
||||
UsePron p = p ;
|
||||
|
||||
DetNP det = emptyNP ** {s = det.s ! NoHum ! Masc} ; ----
|
||||
DetNP det = case det.isEmpty of {
|
||||
True => case <det.d,det.n> of { -- if the s field is empty, make up some other determiner
|
||||
<Def,One> => he_Pron ;
|
||||
<Def,_> => theyMasc_Pron ;
|
||||
<Indef,One> => emptyNP ** {s = someSg_Det.s ! NoHum ! Masc} ;
|
||||
_ => emptyNP ** {s = somePl_Det.s ! NoHum ! Masc}
|
||||
} ;
|
||||
False => emptyNP ** {s = det.s ! NoHum ! Masc} } ;
|
||||
|
||||
PredetNP det np = np ** {
|
||||
s = \\c => case det.isDecl of {
|
||||
@@ -75,7 +82,7 @@ lin
|
||||
|
||||
DetQuantOrd quant num ord = quant ** {
|
||||
s = \\h,g,c => let d = toDef quant.d num.n in
|
||||
quant.s ! Pl ! h ! g ! c
|
||||
quant.s ! Pl ! h ! g ! c -- TODO what is this Pl? Was there when I started /IL
|
||||
++ num.s ! g ! d ! c
|
||||
--FIXME check this:
|
||||
++ ord.s ! g
|
||||
|
||||
@@ -657,32 +657,12 @@ resource ParadigmsAra = open
|
||||
|
||||
|
||||
mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant =
|
||||
\hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det -> lin Quant (baseQuant **
|
||||
{ s = \\n,s,g,c =>
|
||||
case <s,g,c,n> of {
|
||||
<_,Masc,_,Sg> => hava;
|
||||
<_,Fem,_,Sg> => havihi;
|
||||
<_,Masc,Nom,Dl>=> havAn;
|
||||
<_,Masc,_,Dl> => havayn;
|
||||
<_,Fem,Nom,Dl> => hAtAn;
|
||||
<_,Fem,_,Dl> => hAtayn;
|
||||
<Hum,_,_,Pl> => hA'ulA;
|
||||
_ => havihi
|
||||
};
|
||||
d = det
|
||||
});
|
||||
\hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det ->
|
||||
lin Quant (ResAra.mkQuant7 hava havihi havAn havayn hAtAn hAtayn hA'ulA det) ;
|
||||
|
||||
mkQuant3 : (_,_,_ : Str) -> State -> Quant =
|
||||
\dalika,tilka,ula'ika,det -> lin Quant (baseQuant **
|
||||
{ s = \\n,s,g,c =>
|
||||
case <s,g,c,n> of {
|
||||
<_,Masc,_,Sg> => dalika;
|
||||
<_,Fem,_,Sg> => tilka;
|
||||
<Hum,_,_,_> => ula'ika;
|
||||
_ => tilka
|
||||
};
|
||||
d = det
|
||||
});
|
||||
\dalika,tilka,ula'ika,det ->
|
||||
lin Quant (ResAra.mkQuant3 dalika tilka ula'ika det) ;
|
||||
|
||||
brkA : (root,sg,pl : Str) -> Adj -- also broken feminine
|
||||
= brkABool False ;
|
||||
|
||||
@@ -14,7 +14,7 @@ lin
|
||||
|
||||
-- : IP -> VP -> QCl ; -- who walks
|
||||
QuestVP qp vp =
|
||||
let np = ip2np qp vp.isPred ;
|
||||
let np = ip2np qp (case vp.vtype of {Copula=>True ; _=>False}) ;
|
||||
cl = PredVP np vp ;
|
||||
in { s = \\t,p,qf => cl.s ! t ! p ! toOrder qf } ;
|
||||
|
||||
|
||||
@@ -61,6 +61,37 @@ oper
|
||||
is1sg : Agr -> Bool = \a ->
|
||||
case a.pgn of {Per1 Sing => True; _ => False} ;
|
||||
|
||||
someSg_Det = mkDet "أَحَد" Sg Const ;
|
||||
somePl_Det = mkDet "بَعض" Pl Const ;
|
||||
|
||||
mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant =
|
||||
\hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det -> lin Quant (baseQuant **
|
||||
{ s = \\n,s,g,c =>
|
||||
case <s,g,c,n> of {
|
||||
<_,Masc,_,Sg> => hava;
|
||||
<_,Fem,_,Sg> => havihi;
|
||||
<_,Masc,Nom,Dl>=> havAn;
|
||||
<_,Masc,_,Dl> => havayn;
|
||||
<_,Fem,Nom,Dl> => hAtAn;
|
||||
<_,Fem,_,Dl> => hAtayn;
|
||||
<Hum,_,_,Pl> => hA'ulA;
|
||||
_ => havihi
|
||||
};
|
||||
d = det
|
||||
});
|
||||
|
||||
mkQuant3 : (_,_,_ : Str) -> State -> Quant =
|
||||
\dalika,tilka,ula'ika,det -> lin Quant (baseQuant **
|
||||
{ s = \\n,s,g,c =>
|
||||
case <s,g,c,n> of {
|
||||
<_,Masc,_,Sg> => dalika;
|
||||
<_,Fem,_,Sg> => tilka;
|
||||
<Hum,_,_,_> => ula'ika;
|
||||
_ => tilka
|
||||
};
|
||||
d = det
|
||||
});
|
||||
|
||||
mkDet = overload {
|
||||
mkDet : Str -> Number -> State -> Det
|
||||
= mkDetDecl True ;
|
||||
@@ -438,19 +469,25 @@ param
|
||||
| VPImp
|
||||
| VPGer ;
|
||||
|
||||
VType = -- indicates if there is a predicate (xabar):
|
||||
Copula -- 1) disappears in equational sentences
|
||||
-- 2) its argument ('xabar') is in the pred field
|
||||
-- 3) it is negated with laysa
|
||||
| Have -- stays in eq. sentence, argument is in obj field, but is negated with laysa.
|
||||
| NotPred ; -- any other verb but copula and have_V2
|
||||
|
||||
oper
|
||||
|
||||
BaseVP : Type = { -- to minimise duplication of code for VPS
|
||||
sc : Preposition ; -- subject case: e.g. يُمْكِنُ *لِ*Xِ
|
||||
obj : Obj;
|
||||
pred : Comp;
|
||||
isPred : Bool; -- indicates if there is a predicate (xabar)
|
||||
vtype : VType ; -- copula, have_V2 or normal verb
|
||||
s2 : Str
|
||||
} ;
|
||||
|
||||
VP : Type = BaseVP ** {
|
||||
s : PerGenNum => VPForm => Str ;
|
||||
isPoss : Bool; -- special case for have_V2, to get negation right /IL
|
||||
} ;
|
||||
|
||||
uttVP : VPForm -> VP -> (Gender=>Str) = \vpf,vp ->
|
||||
@@ -471,7 +508,7 @@ oper
|
||||
obj = emptyObj ;
|
||||
s2 = [];
|
||||
pred = {s = \\_,_ => []} ;
|
||||
isPred,isPoss = False
|
||||
vtype = NotPred
|
||||
};
|
||||
|
||||
passPredV : Verb -> VP = \v ->
|
||||
@@ -512,18 +549,18 @@ oper
|
||||
|
||||
bindIf : Bool -> Str = \b -> if_then_Str b BIND [] ;
|
||||
|
||||
bindIfPron : NP -> {c2:Preposition; isPred:Bool} -> Str = \np,vp ->
|
||||
bindIfPron : NP -> {c2:Preposition; vtype:VType} -> Str = \np,vp ->
|
||||
let notNom : Case -> Bool = \c -> case c of {Nom => False; _=>True} ;
|
||||
bind = case vp.isPred of {
|
||||
False => bindIf (
|
||||
orB (andB np.a.isPron (notNom vp.c2.c)) --if np is pron, not in nominative
|
||||
vp.c2.binds) ;
|
||||
True => [] }
|
||||
bind = case vp.vtype of {
|
||||
Copula => [] ;
|
||||
_ => bindIf (orB (andB np.a.isPron (notNom vp.c2.c)) --if np is pron, not in nominative
|
||||
vp.c2.binds)
|
||||
}
|
||||
in vp.c2.s ++ bind ++ np.s ! vp.c2.c ;
|
||||
|
||||
insertPred : Comp -> VP -> VP = \p,vp -> vp **
|
||||
{ pred = p;
|
||||
isPred = True
|
||||
vtype = Copula
|
||||
};
|
||||
|
||||
insertStr : Str -> VP -> VP = \str,vp -> vp **
|
||||
@@ -553,9 +590,9 @@ oper
|
||||
_ => vp.sc }
|
||||
} ;
|
||||
subj = np.empty ++ sc.s ++ bindIf sc.binds
|
||||
++ case vp.isPred of {
|
||||
False => (proDrop np).s ! sc.c ; -- prodrop if it's not predicative
|
||||
True => np.s ! sc.c
|
||||
++ case vp.vtype of {
|
||||
Copula => np.s ! sc.c ;
|
||||
_ => (proDrop np).s ! sc.c -- prodrop if it's not predicative
|
||||
} ;
|
||||
in wordOrder o
|
||||
vp.obj.a.isPron np.a.isPron np.isHeavy
|
||||
@@ -600,9 +637,9 @@ oper
|
||||
|
||||
pred : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl ->
|
||||
let gn = pgn2gn pgn
|
||||
in case <vp.isPred,tn,pl> of {
|
||||
<True, Pres, Pos> => vp.pred.s ! gn ! Nom; --xabar marfooc
|
||||
_ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob
|
||||
in case <vp.vtype,tn,pl> of {
|
||||
<Copula, Pres, Pos> => vp.pred.s ! gn ! Nom; --xabar marfooc
|
||||
_ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob
|
||||
} ;
|
||||
|
||||
vStr : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Order -> Str = \vp,pgn,tn,pl,o ->
|
||||
@@ -615,12 +652,12 @@ oper
|
||||
lam = "لَمْ" ; -- neg. past
|
||||
alla = "أَلَّا" ; -- neg. subjunctive
|
||||
lan = "لَنْ" ; -- neg. future
|
||||
in case <vp.isPred,tn,pl,o,vp.isPoss> of {
|
||||
<False, Pres, Neg, _, True> => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2
|
||||
<False, Pres, Pos, _> => yaktubu ;
|
||||
<False, Pres, Neg, _> => la ++ yaktubu ;
|
||||
<True, Pres, Pos, _> => [] ; --no verb "to be" in present
|
||||
<True, Pres, Neg, _> => laysa ! pgn ; -- negative copula
|
||||
in case <vp.vtype,tn,pl,o> of {
|
||||
<Have, Pres, Neg, _,> => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2
|
||||
<Copula, Pres, Pos, _> => [] ; --no verb "to be" in present
|
||||
<Copula, Pres, Neg, _> => laysa ! pgn ; -- negative copula
|
||||
<_, Pres, Pos, _> => yaktubu ;
|
||||
<_, Pres, Neg, _> => la ++ yaktubu ;
|
||||
<_, Past, Pos, _> => kataba ;
|
||||
<_, Past, Neg, _> => lam ++ yaktub ;
|
||||
<_, Cond, Pos, _> => yaktuba ;
|
||||
@@ -651,9 +688,9 @@ oper
|
||||
slashV2 : Verb2 -> VPSlash = \v ->
|
||||
predV v ** {
|
||||
c2 = v.c2 ; agrObj = \\_ => [] ;
|
||||
isPoss = case v.c2.c of {
|
||||
Nom => True ; -- for have_V2
|
||||
_ => False } ;
|
||||
vtype = case v.c2.c of {
|
||||
Nom => Have ; -- for have_V2
|
||||
_ => NotPred } ;
|
||||
} ;
|
||||
|
||||
-- Add subject string, fix agreement to the subject,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
concrete StructuralAra of Structural = CatAra **
|
||||
open MorphoAra, ResAra, ParadigmsAra, Prelude in {
|
||||
open MorphoAra, ResAra, ParadigmsAra, (N=NounAra), Prelude in {
|
||||
|
||||
flags optimize=all ; coding=utf8 ;
|
||||
|
||||
@@ -47,10 +47,11 @@ concrete StructuralAra of Structural = CatAra **
|
||||
} ; -- IL
|
||||
how8much_IAdv = ss "كَمْ" ;
|
||||
if_Subj = mkSubj "إِذَا" Verbal ;
|
||||
--whether_Subj = mkSubj "مَا إِذَا" Verbal ;
|
||||
in8front_Prep = mkPrep "مُقَابِلَ" ;
|
||||
i_Pron = ResAra.i_Pron ;
|
||||
in_Prep = mkPrep "فِي" ;
|
||||
it_Pron = emptyNP ** {s = \\_ => "هَذَا"} ; -- was: it_Pron = mkPron "ِت" "ِت" "ِتس" (Per3 Masc Sg);
|
||||
it_Pron = N.DetNP (N.DetQuant this_Quant N.NumSg) ; -- was: it_Pron = mkPron "ِت" "ِت" "ِتس" (Per3 Masc Sg);
|
||||
-- less_CAdv = ss "لسّ" ;
|
||||
many_Det = mkDet "جَمِيع" Pl Const ;
|
||||
-- more_CAdv = ss "مْري" ;
|
||||
@@ -74,8 +75,8 @@ concrete StructuralAra of Structural = CatAra **
|
||||
she_Pron = ResAra.she_Pron ;
|
||||
so_AdA = very_AdA ;
|
||||
somebody_NP = regNP "أَحَد" Sg Indef ;
|
||||
someSg_Det = mkDet "أَحَد" Sg Const ;
|
||||
somePl_Det = mkDet "بَعض" Pl Const ;
|
||||
someSg_Det = ResAra.someSg_Det ;
|
||||
somePl_Det = ResAra.somePl_Det ;
|
||||
something_NP = regNP "شَيْء" Sg Indef ;
|
||||
-- somewhere_Adv = ss "سْموهري" ;
|
||||
that_Quant = mkQuant3 "ذَلِكَ" "تِلكَ" "أُلٱِكَ" Def;
|
||||
@@ -87,7 +88,7 @@ concrete StructuralAra of Structural = CatAra **
|
||||
-- therefore_PConj = ss "تهرفْري" ;
|
||||
----b these_NP = indeclNP "هَؤُلَاء" Pl ;
|
||||
they_Pron = theyMasc_Pron ;
|
||||
this_Quant = mkQuant7 "هَذا" "هَذِهِ" "هَذَان" "هَذَيْن" "هَاتَان" "هَاتَيْن" "هَؤُلَاء" Def;
|
||||
this_Quant = mkQuant7 "هَذَا" "هَذِهِ" "هَذَان" "هَذَيْن" "هَاتَان" "هَاتَيْن" "هَؤُلَاء" Def ;
|
||||
----b this_NP = indeclNP "هَذا" Sg ;
|
||||
----b those_NP = indeclNP "هَؤُلَاءكَ" Pl ;
|
||||
through_Prep = mkPrep "عَبْرَ" ;
|
||||
|
||||
@@ -16,7 +16,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
++ vp.s ! pgn ! VPImpf Cnj -- this will agree with the object added by ComplSlash
|
||||
++ vp.obj.s ;
|
||||
obj = emptyObj ;
|
||||
isPred = False ;
|
||||
vtype = NotPred ;
|
||||
c2 = v2v.c2 ; -- preposition for the direct object
|
||||
sc = v2v.sc
|
||||
} ;
|
||||
@@ -30,7 +30,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
++ vps.s ! np.a.pgn ! VPImpf Cnj -- verb from old VP agrees with object
|
||||
++ vps.obj.s ; -- otherwise obj appears in a weird place /IL
|
||||
obj = emptyObj ;
|
||||
isPred = False ;
|
||||
vtype = NotPred ;
|
||||
-- preposition for the direct object comes from VP
|
||||
sc = v2v.sc
|
||||
} ;
|
||||
@@ -68,7 +68,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
s = \\pgn,vpf => vvVP.s ! pgn ! vpf
|
||||
++ vv.s2 -- أَنْ
|
||||
++ vp.s ! pgn ! VPImpf Cnj ;
|
||||
isPred = False ;
|
||||
vtype = NotPred ;
|
||||
sc = vv.sc
|
||||
} ;
|
||||
|
||||
@@ -92,7 +92,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
UseComp xabar =
|
||||
case xabar.isNP of {
|
||||
False => kaan xabar ;
|
||||
True => predV copula ** {obj = xabar.obj ; isPred=True}
|
||||
True => predV copula ** {obj = xabar.obj ; vtype=Copula}
|
||||
} ;
|
||||
|
||||
UseCopula = predV copula ;
|
||||
@@ -100,7 +100,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
-- : VP -> Prep -> VPSlash ; -- live in (it)
|
||||
VPSlashPrep vp prep = vp ** {
|
||||
c2 = prep ;
|
||||
agrObj = \\_ => []
|
||||
agrObj = \\_ => [] -- to make it into VPSlash, VP didn't have that field before
|
||||
} ;
|
||||
|
||||
AdvVP vp adv = insertStr adv.s vp ;
|
||||
@@ -111,9 +111,11 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
|
||||
-- : VPSlash -> VP ; -- love himself
|
||||
ReflVP vps = vps ** {
|
||||
s = \\pgn,vf => vps.s ! pgn ! vf
|
||||
++ vps.obj.s -- only relevant if the VPSlash has been through VPSlashPrep
|
||||
++ vps.c2.s ++ bindIf vps.c2.binds
|
||||
++ reflPron vps.c2.c pgn ;
|
||||
c2 = noPrep
|
||||
c2 = accPrep ;
|
||||
obj = emptyObj ; -- because old obj was moved in s
|
||||
} ;
|
||||
|
||||
PassV2 = passPredV ;
|
||||
|
||||
Reference in New Issue
Block a user