diff --git a/src/english/CatEng.gf b/src/english/CatEng.gf index 52894a7b7..5806c7ea9 100644 --- a/src/english/CatEng.gf +++ b/src/english/CatEng.gf @@ -111,7 +111,7 @@ concrete CatEng of Cat = CommonX - [Pol] ** open ResEng, Prelude in { ClSlash = \s -> {s = \\t,a,p,o => s; c2 = ""} ; VP = \s -> predV {s = \\_ => s; p = ""; isRefl = False} ; - VPSlash = \s -> predV {s = \\_ => s; p = ""; isRefl = False} ** {c2 = ""; gapInMiddle = False} ; + VPSlash = \s -> predV {s = \\_ => s; p = ""; isRefl = False} ** {c2 = ""; gapInMiddle = False; missingAdv = False } ; V, VS, VQ, VA = \s -> {s = \\_ => s; p = ""; isRefl = False} ; V2, V2A, V2Q, V2S = \s -> {s = \\_ => s; p = ""; isRefl = False; c2=""} ; diff --git a/src/english/ResEng.gf b/src/english/ResEng.gf index 3409a9af0..14c7e2b85 100644 --- a/src/english/ResEng.gf +++ b/src/english/ResEng.gf @@ -242,10 +242,13 @@ param } ; - SlashVP = VP ** {c2 : Str ; gapInMiddle : Bool} ; + SlashVP = VP ** {c2 : Str ; + gapInMiddle : Bool; + missingAdv : Bool -- The sentence has been through VPSlashPrep, and the only missing thing is just an adverbial and shouldn't affect the agreement. +} ; predVc : (Verb ** {c2 : Str}) -> SlashVP = \verb -> - predV verb ** {c2 = verb.c2 ; gapInMiddle = True} ; + predV verb ** {c2 = verb.c2 ; gapInMiddle = True; missingAdv = False} ; cBind : Str -> Str = \s -> Predef.BIND ++ ("'" + s) ; @@ -369,6 +372,16 @@ param False => {aux = x ; adv = "not" ; fin = [] ; inf = z} } ; +{- IL 24/04/2018 To fix scope of reflexives: + a) ComplSlash ( … ReflVP … ) X: reflexive should agree with X + LangEng> l PredVP (UsePron i_Pron) (ComplSlash (SlashV2V beg_V2V (ReflVP (SlashV2a like_V2))) (UsePron he_Pron)) + I beg him to like /himself/ + b) ReflVP ... ( … ComplSlash … X): reflexive should agree with subject + LangEng> l PredVP (UsePron i_Pron) (SelfAdVVP (ComplSlash (SlashV2VNP beg_V2V (UsePron he_Pron) (SlashV2a like_V2)) (UsePron he_Pron))) + I /myself/ beg him to like him -} + objAgr : { a : Agr } -> VP -> VP = \obj,vp -> vp ** { + s2 = \\a => vp.s2 ! obj.a } ; + insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> vp ** { s2 = \\a => vp.s2 ! a ++ obj ! a ; isSimple = False ; @@ -380,9 +393,9 @@ param } ; insertObjc : (Agr => Str) -> SlashVP -> SlashVP = \obj,vp -> - insertObj obj vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; + insertObj obj vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle ; missingAdv = vp.missingAdv } ; insertExtrac : Str -> SlashVP -> SlashVP = \obj,vp -> - insertExtra obj vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; + insertExtra obj vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle ; missingAdv = vp.missingAdv } ; --- AR 7/3/2013 move the particle after the object insertObjPartLast : (Agr => Str) -> VP -> VP = \obj,vp -> { diff --git a/src/english/VerbEng.gf b/src/english/VerbEng.gf index 397a21b55..1538bf593 100644 --- a/src/english/VerbEng.gf +++ b/src/english/VerbEng.gf @@ -5,9 +5,9 @@ concrete VerbEng of Verb = CatEng ** open ResEng, Prelude in { lin UseV = predV ; - SlashV2a v = predV v ** {c2 = v.c2 ; gapInMiddle = False} ; + SlashV2a v = predVc v ** {c2 = v.c2 ; gapInMiddle = False} ; Slash2V3 v np = - insertObjc (\\_ => v.c2 ++ np.s ! NPAcc) (predV v ** {c2 = v.c3 ; gapInMiddle = False}) ; + insertObjc (\\_ => v.c2 ++ np.s ! NPAcc) (predVc v ** {c2 = v.c3 ; gapInMiddle = False}) ; Slash3V3 v np = insertObjc (\\_ => v.c3 ++ np.s ! NPAcc) (predVc v) ; ---- @@ -23,18 +23,26 @@ concrete VerbEng of Verb = CatEng ** open ResEng, Prelude in { SlashV2Q v q = insertExtrac (q.s ! QIndir) (predVc v) ; SlashV2A v ap = insertObjc (\\a => ap.s ! a) (predVc v) ; ---- - ComplSlash vp np = case vp.gapInMiddle of { - True => insertObjPre (\\_ => vp.c2 ++ np.s ! NPAcc) vp ; - False => insertObj (\\_ => vp.c2 ++ np.s ! NPAcc) vp - } ; + ComplSlash vp np = + let vp' = case vp.gapInMiddle of { + True => insertObjPre (\\_ => vp.c2 ++ np.s ! NPAcc) vp ; + False => insertObj (\\_ => vp.c2 ++ np.s ! NPAcc) vp } ; - SlashVV vv vp = - insertObj (\\a => infVP vv.typ vp Simul CPos a) (predVV vv) ** - {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; - SlashV2VNP vv np vp = + -- IL 24/04/2018 + -- If the missing argument is not an adverbial, make previous object + -- agree with the argument of ComplSlash. + -- Example: "you help /me/ like /myself/", not "*you help me like yourself". + -- Different order of ReflVP and ComplSlash produces "you /yourself/ help me like me". + f = case vp.missingAdv of { + True => id VP ; + False => objAgr np } ; + in f vp' ; + + SlashVV vv vp = vp ** + insertObj (\\a => infVP vv.typ vp Simul CPos a) (predVV vv) ; + SlashV2VNP vv np vp = vp ** insertObjPre (\\_ => vv.c2 ++ np.s ! NPAcc) - (insertObjc (\\a => vv.c3 ++ infVP vv.typ vp Simul CPos a) (predVc vv)) ** - {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; + (insertObjc (\\a => vv.c3 ++ infVP vv.typ vp Simul CPos a) (predVc vv)) ; UseComp comp = insertObj comp.s (predAux auxBe) ; @@ -42,8 +50,8 @@ concrete VerbEng of Verb = CatEng ** open ResEng, Prelude in { ExtAdvVP vp adv = insertObj (\\_ => frontComma ++ adv.s ++ finalComma) vp ; AdVVP adv vp = insertAdV adv.s vp ; - AdvVPSlash vp adv = insertObj (\\_ => adv.s) vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; - AdVVPSlash adv vp = insertAdV adv.s vp ** {c2 = vp.c2 ; gapInMiddle = vp.gapInMiddle} ; + AdvVPSlash vp adv = vp ** insertObj (\\_ => adv.s) vp ; + AdVVPSlash adv vp = vp ** insertAdV adv.s vp ; ReflVP v = insertObjPre (\\a => v.c2 ++ reflPron ! a) v ; @@ -62,6 +70,6 @@ concrete VerbEng of Verb = CatEng ** open ResEng, Prelude in { UseCopula = predAux auxBe ; - VPSlashPrep vp p = vp ** {c2 = p.s ; gapInMiddle = False} ; + VPSlashPrep vp p = vp ** {c2 = p.s ; gapInMiddle = False; missingAdv = True } ; }