Merge pull request #153 from inariksit/arabic

Arabic
This commit is contained in:
Inari Listenmaa
2019-01-29 20:30:25 +01:00
committed by GitHub
7 changed files with 91 additions and 64 deletions

View File

@@ -25,7 +25,7 @@ concrete IdiomAra of Idiom = CatAra ** open
CleftAdv adv s = CleftAdv adv s =
let comp : Comp = CompAdv (lin Adv {s = adv.s ++ s.s ! Verbal}) ; -- no idea about word order /IL 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 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 -- : NP -> Cl ; -- there is a house
ExistNP np = ExistNP np =

View File

@@ -47,7 +47,14 @@ lin
UsePron p = p ; 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 ** { PredetNP det np = np ** {
s = \\c => case det.isDecl of { s = \\c => case det.isDecl of {
@@ -75,7 +82,7 @@ lin
DetQuantOrd quant num ord = quant ** { DetQuantOrd quant num ord = quant ** {
s = \\h,g,c => let d = toDef quant.d num.n in 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 ++ num.s ! g ! d ! c
--FIXME check this: --FIXME check this:
++ ord.s ! g ++ ord.s ! g

View File

@@ -657,32 +657,12 @@ resource ParadigmsAra = open
mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant = mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant =
\hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det -> lin Quant (baseQuant ** \hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det ->
{ s = \\n,s,g,c => lin Quant (ResAra.mkQuant7 hava havihi havAn havayn hAtAn hAtayn hA'ulA det) ;
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 = mkQuant3 : (_,_,_ : Str) -> State -> Quant =
\dalika,tilka,ula'ika,det -> lin Quant (baseQuant ** \dalika,tilka,ula'ika,det ->
{ s = \\n,s,g,c => lin Quant (ResAra.mkQuant3 dalika tilka ula'ika det) ;
case <s,g,c,n> of {
<_,Masc,_,Sg> => dalika;
<_,Fem,_,Sg> => tilka;
<Hum,_,_,_> => ula'ika;
_ => tilka
};
d = det
});
brkA : (root,sg,pl : Str) -> Adj -- also broken feminine brkA : (root,sg,pl : Str) -> Adj -- also broken feminine
= brkABool False ; = brkABool False ;

View File

@@ -14,7 +14,7 @@ lin
-- : IP -> VP -> QCl ; -- who walks -- : IP -> VP -> QCl ; -- who walks
QuestVP qp vp = QuestVP qp vp =
let np = ip2np qp vp.isPred ; let np = ip2np qp (case vp.vtype of {Copula=>True ; _=>False}) ;
cl = PredVP np vp ; cl = PredVP np vp ;
in { s = \\t,p,qf => cl.s ! t ! p ! toOrder qf } ; in { s = \\t,p,qf => cl.s ! t ! p ! toOrder qf } ;

View File

@@ -61,6 +61,37 @@ oper
is1sg : Agr -> Bool = \a -> is1sg : Agr -> Bool = \a ->
case a.pgn of {Per1 Sing => True; _ => False} ; 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 = overload {
mkDet : Str -> Number -> State -> Det mkDet : Str -> Number -> State -> Det
= mkDetDecl True ; = mkDetDecl True ;
@@ -438,19 +469,25 @@ param
| VPImp | VPImp
| VPGer ; | 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 oper
BaseVP : Type = { -- to minimise duplication of code for VPS BaseVP : Type = { -- to minimise duplication of code for VPS
sc : Preposition ; -- subject case: e.g. يُمْكِنُ *لِ*Xِ sc : Preposition ; -- subject case: e.g. يُمْكِنُ *لِ*Xِ
obj : Obj; obj : Obj;
pred : Comp; pred : Comp;
isPred : Bool; -- indicates if there is a predicate (xabar) vtype : VType ; -- copula, have_V2 or normal verb
s2 : Str s2 : Str
} ; } ;
VP : Type = BaseVP ** { VP : Type = BaseVP ** {
s : PerGenNum => VPForm => Str ; s : PerGenNum => VPForm => Str ;
isPoss : Bool; -- special case for have_V2, to get negation right /IL
} ; } ;
uttVP : VPForm -> VP -> (Gender=>Str) = \vpf,vp -> uttVP : VPForm -> VP -> (Gender=>Str) = \vpf,vp ->
@@ -471,7 +508,7 @@ oper
obj = emptyObj ; obj = emptyObj ;
s2 = []; s2 = [];
pred = {s = \\_,_ => []} ; pred = {s = \\_,_ => []} ;
isPred,isPoss = False vtype = NotPred
}; };
passPredV : Verb -> VP = \v -> passPredV : Verb -> VP = \v ->
@@ -512,18 +549,18 @@ oper
bindIf : Bool -> Str = \b -> if_then_Str b BIND [] ; 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} ; let notNom : Case -> Bool = \c -> case c of {Nom => False; _=>True} ;
bind = case vp.isPred of { bind = case vp.vtype of {
False => bindIf ( Copula => [] ;
orB (andB np.a.isPron (notNom vp.c2.c)) --if np is pron, not in nominative _ => bindIf (orB (andB np.a.isPron (notNom vp.c2.c)) --if np is pron, not in nominative
vp.c2.binds) ; vp.c2.binds)
True => [] } }
in vp.c2.s ++ bind ++ np.s ! vp.c2.c ; in vp.c2.s ++ bind ++ np.s ! vp.c2.c ;
insertPred : Comp -> VP -> VP = \p,vp -> vp ** insertPred : Comp -> VP -> VP = \p,vp -> vp **
{ pred = p; { pred = p;
isPred = True vtype = Copula
}; };
insertStr : Str -> VP -> VP = \str,vp -> vp ** insertStr : Str -> VP -> VP = \str,vp -> vp **
@@ -553,9 +590,9 @@ oper
_ => vp.sc } _ => vp.sc }
} ; } ;
subj = np.empty ++ sc.s ++ bindIf sc.binds subj = np.empty ++ sc.s ++ bindIf sc.binds
++ case vp.isPred of { ++ case vp.vtype of {
False => (proDrop np).s ! sc.c ; -- prodrop if it's not predicative Copula => np.s ! sc.c ;
True => np.s ! sc.c _ => (proDrop np).s ! sc.c -- prodrop if it's not predicative
} ; } ;
in wordOrder o in wordOrder o
vp.obj.a.isPron np.a.isPron np.isHeavy vp.obj.a.isPron np.a.isPron np.isHeavy
@@ -600,8 +637,8 @@ oper
pred : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl -> pred : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl ->
let gn = pgn2gn pgn let gn = pgn2gn pgn
in case <vp.isPred,tn,pl> of { in case <vp.vtype,tn,pl> of {
<True, Pres, Pos> => vp.pred.s ! gn ! Nom; --xabar marfooc <Copula, Pres, Pos> => vp.pred.s ! gn ! Nom; --xabar marfooc
_ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob _ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob
} ; } ;
@@ -615,12 +652,12 @@ oper
lam = "لَمْ" ; -- neg. past lam = "لَمْ" ; -- neg. past
alla = "أَلَّا" ; -- neg. subjunctive alla = "أَلَّا" ; -- neg. subjunctive
lan = "لَنْ" ; -- neg. future lan = "لَنْ" ; -- neg. future
in case <vp.isPred,tn,pl,o,vp.isPoss> of { in case <vp.vtype,tn,pl,o> of {
<False, Pres, Neg, _, True> => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2 <Have, Pres, Neg, _,> => laysa ! Per3 Masc Sg ++ yaktubu ; -- special case for have_V2
<False, Pres, Pos, _> => yaktubu ; <Copula, Pres, Pos, _> => [] ; --no verb "to be" in present
<False, Pres, Neg, _> => la ++ yaktubu ; <Copula, Pres, Neg, _> => laysa ! pgn ; -- negative copula
<True, Pres, Pos, _> => [] ; --no verb "to be" in present <_, Pres, Pos, _> => yaktubu ;
<True, Pres, Neg, _> => laysa ! pgn ; -- negative copula <_, Pres, Neg, _> => la ++ yaktubu ;
<_, Past, Pos, _> => kataba ; <_, Past, Pos, _> => kataba ;
<_, Past, Neg, _> => lam ++ yaktub ; <_, Past, Neg, _> => lam ++ yaktub ;
<_, Cond, Pos, _> => yaktuba ; <_, Cond, Pos, _> => yaktuba ;
@@ -651,9 +688,9 @@ oper
slashV2 : Verb2 -> VPSlash = \v -> slashV2 : Verb2 -> VPSlash = \v ->
predV v ** { predV v ** {
c2 = v.c2 ; agrObj = \\_ => [] ; c2 = v.c2 ; agrObj = \\_ => [] ;
isPoss = case v.c2.c of { vtype = case v.c2.c of {
Nom => True ; -- for have_V2 Nom => Have ; -- for have_V2
_ => False } ; _ => NotPred } ;
} ; } ;
-- Add subject string, fix agreement to the subject, -- Add subject string, fix agreement to the subject,

View File

@@ -1,5 +1,5 @@
concrete StructuralAra of Structural = CatAra ** concrete StructuralAra of Structural = CatAra **
open MorphoAra, ResAra, ParadigmsAra, Prelude in { open MorphoAra, ResAra, ParadigmsAra, (N=NounAra), Prelude in {
flags optimize=all ; coding=utf8 ; flags optimize=all ; coding=utf8 ;
@@ -47,10 +47,11 @@ concrete StructuralAra of Structural = CatAra **
} ; -- IL } ; -- IL
how8much_IAdv = ss "كَمْ" ; how8much_IAdv = ss "كَمْ" ;
if_Subj = mkSubj "إِذَا" Verbal ; if_Subj = mkSubj "إِذَا" Verbal ;
--whether_Subj = mkSubj "مَا إِذَا" Verbal ;
in8front_Prep = mkPrep "مُقَابِلَ" ; in8front_Prep = mkPrep "مُقَابِلَ" ;
i_Pron = ResAra.i_Pron ; i_Pron = ResAra.i_Pron ;
in_Prep = mkPrep "فِي" ; 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 "لسّ" ; -- less_CAdv = ss "لسّ" ;
many_Det = mkDet "جَمِيع" Pl Const ; many_Det = mkDet "جَمِيع" Pl Const ;
-- more_CAdv = ss "مْري" ; -- more_CAdv = ss "مْري" ;
@@ -74,8 +75,8 @@ concrete StructuralAra of Structural = CatAra **
she_Pron = ResAra.she_Pron ; she_Pron = ResAra.she_Pron ;
so_AdA = very_AdA ; so_AdA = very_AdA ;
somebody_NP = regNP "أَحَد" Sg Indef ; somebody_NP = regNP "أَحَد" Sg Indef ;
someSg_Det = mkDet "أَحَد" Sg Const ; someSg_Det = ResAra.someSg_Det ;
somePl_Det = mkDet "بَعض" Pl Const ; somePl_Det = ResAra.somePl_Det ;
something_NP = regNP "شَيْء" Sg Indef ; something_NP = regNP "شَيْء" Sg Indef ;
-- somewhere_Adv = ss "سْموهري" ; -- somewhere_Adv = ss "سْموهري" ;
that_Quant = mkQuant3 "ذَلِكَ" "تِلكَ" "أُلٱِكَ" Def; that_Quant = mkQuant3 "ذَلِكَ" "تِلكَ" "أُلٱِكَ" Def;
@@ -87,7 +88,7 @@ concrete StructuralAra of Structural = CatAra **
-- therefore_PConj = ss "تهرفْري" ; -- therefore_PConj = ss "تهرفْري" ;
----b these_NP = indeclNP "هَؤُلَاء" Pl ; ----b these_NP = indeclNP "هَؤُلَاء" Pl ;
they_Pron = theyMasc_Pron ; they_Pron = theyMasc_Pron ;
this_Quant = mkQuant7 "هَذا" "هَذِهِ" "هَذَان" "هَذَيْن" "هَاتَان" "هَاتَيْن" "هَؤُلَاء" Def; this_Quant = mkQuant7 "هَذَا" "هَذِهِ" "هَذَان" "هَذَيْن" "هَاتَان" "هَاتَيْن" "هَؤُلَاء" Def ;
----b this_NP = indeclNP "هَذا" Sg ; ----b this_NP = indeclNP "هَذا" Sg ;
----b those_NP = indeclNP "هَؤُلَاءكَ" Pl ; ----b those_NP = indeclNP "هَؤُلَاءكَ" Pl ;
through_Prep = mkPrep "عَبْرَ" ; through_Prep = mkPrep "عَبْرَ" ;

View File

@@ -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.s ! pgn ! VPImpf Cnj -- this will agree with the object added by ComplSlash
++ vp.obj.s ; ++ vp.obj.s ;
obj = emptyObj ; obj = emptyObj ;
isPred = False ; vtype = NotPred ;
c2 = v2v.c2 ; -- preposition for the direct object c2 = v2v.c2 ; -- preposition for the direct object
sc = v2v.sc 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.s ! np.a.pgn ! VPImpf Cnj -- verb from old VP agrees with object
++ vps.obj.s ; -- otherwise obj appears in a weird place /IL ++ vps.obj.s ; -- otherwise obj appears in a weird place /IL
obj = emptyObj ; obj = emptyObj ;
isPred = False ; vtype = NotPred ;
-- preposition for the direct object comes from VP -- preposition for the direct object comes from VP
sc = v2v.sc sc = v2v.sc
} ; } ;
@@ -68,7 +68,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
s = \\pgn,vpf => vvVP.s ! pgn ! vpf s = \\pgn,vpf => vvVP.s ! pgn ! vpf
++ vv.s2 -- أَنْ ++ vv.s2 -- أَنْ
++ vp.s ! pgn ! VPImpf Cnj ; ++ vp.s ! pgn ! VPImpf Cnj ;
isPred = False ; vtype = NotPred ;
sc = vv.sc sc = vv.sc
} ; } ;
@@ -92,7 +92,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
UseComp xabar = UseComp xabar =
case xabar.isNP of { case xabar.isNP of {
False => kaan xabar ; False => kaan xabar ;
True => predV copula ** {obj = xabar.obj ; isPred=True} True => predV copula ** {obj = xabar.obj ; vtype=Copula}
} ; } ;
UseCopula = predV copula ; UseCopula = predV copula ;
@@ -100,7 +100,7 @@ concrete VerbAra of Verb = CatAra ** open Prelude, ResAra, ParamX in {
-- : VP -> Prep -> VPSlash ; -- live in (it) -- : VP -> Prep -> VPSlash ; -- live in (it)
VPSlashPrep vp prep = vp ** { VPSlashPrep vp prep = vp ** {
c2 = prep ; c2 = prep ;
agrObj = \\_ => [] agrObj = \\_ => [] -- to make it into VPSlash, VP didn't have that field before
} ; } ;
AdvVP vp adv = insertStr adv.s vp ; 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 -- : VPSlash -> VP ; -- love himself
ReflVP vps = vps ** { ReflVP vps = vps ** {
s = \\pgn,vf => vps.s ! pgn ! vf 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 ++ vps.c2.s ++ bindIf vps.c2.binds
++ reflPron vps.c2.c pgn ; ++ reflPron vps.c2.c pgn ;
c2 = noPrep c2 = accPrep ;
obj = emptyObj ; -- because old obj was moved in s
} ; } ;
PassV2 = passPredV ; PassV2 = passPredV ;