diff --git a/src/arabic/IdiomAra.gf b/src/arabic/IdiomAra.gf index 884763b53..3a2117f1e 100644 --- a/src/arabic/IdiomAra.gf +++ b/src/arabic/IdiomAra.gf @@ -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 = diff --git a/src/arabic/QuestionAra.gf b/src/arabic/QuestionAra.gf index 3a418fa65..73ab0664b 100644 --- a/src/arabic/QuestionAra.gf +++ b/src/arabic/QuestionAra.gf @@ -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 } ; diff --git a/src/arabic/ResAra.gf b/src/arabic/ResAra.gf index 37cad39e9..62164573e 100644 --- a/src/arabic/ResAra.gf +++ b/src/arabic/ResAra.gf @@ -469,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 -> @@ -502,7 +508,7 @@ oper obj = emptyObj ; s2 = []; pred = {s = \\_,_ => []} ; - isPred,isPoss = False + vtype = NotPred }; passPredV : Verb -> VP = \v -> @@ -543,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 ** @@ -584,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 @@ -631,9 +637,9 @@ oper pred : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl -> let gn = pgn2gn pgn - in case of { - => vp.pred.s ! gn ! Nom; --xabar marfooc - _ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob + in case of { + => 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 -> @@ -646,12 +652,12 @@ oper lam = "لَمْ" ; -- neg. past alla = "أَلَّا" ; -- neg. subjunctive lan = "لَنْ" ; -- neg. future - in case of { - => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2 - => yaktubu ; - => la ++ yaktubu ; - => [] ; --no verb "to be" in present - => laysa ! pgn ; -- negative copula + in case of { + => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2 + => [] ; --no verb "to be" in present + => laysa ! pgn ; -- negative copula + <_, Pres, Pos, _> => yaktubu ; + <_, Pres, Neg, _> => la ++ yaktubu ; <_, Past, Pos, _> => kataba ; <_, Past, Neg, _> => lam ++ yaktub ; <_, Cond, Pos, _> => yaktuba ; @@ -682,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, diff --git a/src/arabic/VerbAra.gf b/src/arabic/VerbAra.gf index d170a9a00..e2b198e3c 100644 --- a/src/arabic/VerbAra.gf +++ b/src/arabic/VerbAra.gf @@ -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 ;