From ae8e7d798a776a611ad8c83759cc8d35647d7a35 Mon Sep 17 00:00:00 2001 From: Aarne Ranta Date: Sun, 20 Aug 2017 14:48:48 +0300 Subject: [PATCH 1/4] started Extend module to combine the functions of Extra and Extensions in a more disciplined way; design far from final yet --- src/abstract/Extend.gf | 170 +++++++++++++++++ src/common/ExtendFunctor.gf | 82 ++++++++ src/english/ExtendEng.gf | 282 ++++++++++++++++++++++++++++ src/experimental/PredInstanceEng.gf | 6 +- 4 files changed, 537 insertions(+), 3 deletions(-) create mode 100644 src/abstract/Extend.gf create mode 100644 src/common/ExtendFunctor.gf create mode 100644 src/english/ExtendEng.gf diff --git a/src/abstract/Extend.gf b/src/abstract/Extend.gf new file mode 100644 index 000000000..e35629296 --- /dev/null +++ b/src/abstract/Extend.gf @@ -0,0 +1,170 @@ +--1 Extensions of core RGL syntax (the Grammar module) + +-- This module defines syntax rules that are not yet implemented in all +-- languages, and perhaps never implementable either. But all rules are given +-- a default implementation in common/ExtendFunctor.gf so that they can be included +-- in the library API. The default implementations are meant to be overridden in each +-- xxxxx/ExtendXxx.gf when the work proceeds. +-- +-- This module is aimed to replace the original Extra.gf, which is kept alive just +-- for backwardcommon compatibility. It will also replace translator/Extensions.gf +-- and thus eliminate the often duplicated work in those two modules. +-- +-- (c) Aarne Ranta 2017-08-20 under LGPL and BSD + + +abstract Extend = Cat ** { + + fun + GenNP : NP -> Quant ; -- this man's + GenIP : IP -> IQuant ; -- whose + GenRP : Num -> CN -> RP ; -- whose car + +-- In case the first two are not available, the following applications should in any case be. + + GenModNP : Num -> NP -> CN -> NP ; -- this man's car(s) + GenModIP : Num -> IP -> CN -> IP ; -- whose car(s) + + CompBareCN : CN -> Comp ; -- (est) professeur + + StrandQuestSlash : IP -> ClSlash -> QCl ; -- whom does John live with + StrandRelSlash : RP -> ClSlash -> RCl ; -- that he lives in + EmptyRelSlash : ClSlash -> RCl ; -- he lives in + + +-- $VP$ conjunction, covering both finite and infinitive forms (formerly VPI and VPS). + + cat + VPS ; + [VPS] {2} ; + + fun + MkVPS : Temp -> Pol -> VP -> VPS ; -- to sleep / hasn't slept + ConjVPS : Conj -> [VPS] -> VPS ; -- has walked and won't sleep + PredVPS : NP -> VPS -> S ; -- she [has walked and won't sleep] + ComplVPSVV : VV -> VPS -> VP ; -- want to sleep and to walk + +-- in case ComplVPSVV is not available: + + PredVPSVV : NP -> VV -> VPS -> VP ; -- she wants to sleep and to walk + + + fun + ProDrop : Pron -> Pron ; -- unstressed subject pronoun becomes []: "(io) sono stanco" + + ICompAP : AP -> IComp ; -- "how old" + IAdvAdv : Adv -> IAdv ; -- "how often" + + CompIQuant : IQuant -> IComp ; -- which (is it) [agreement to NP] + + PrepCN : Prep -> CN -> Adv ; -- by accident [Prep + CN without article] + + -- fronted/focal constructions, only for main clauses + + fun + FocusObj : NP -> SSlash -> Utt ; -- her I love + FocusAdv : Adv -> S -> Utt ; -- today I will sleep + FocusAdV : AdV -> S -> Utt ; -- never will I sleep + FocusAP : AP -> NP -> Utt ; -- green was the tree + + fun + ParticipleAP : VP -> AP ; -- (the man) looking at Mary + EmbedPresPart : VP -> SC ; -- looking at Mary (is fun) + +-- this is a generalization of Verb.PassV2 and should replace it in the future. + + PassVPSlash : VPSlash -> VP ; -- be forced to sleep + +-- the form with an agent may result in a different linearization +-- from an adverbial modification by an agent phrase. + + PassAgentVPSlash : VPSlash -> NP -> VP ; -- be begged by her to go + +-- In many languages, the passives use past participles. + + PastPartAP : VPSlash -> AP ; -- lost (opportunity) ; (opportunity) lost in space + PastPartAgentAP : VPSlash -> NP -> AP ; -- (opportunity) lost by the company + +-- publishing of the document + + NominalizeVPSlashNP : VPSlash -> NP -> NP ; + +-- existential for mathematics + + ExistsNP : NP -> Cl ; -- there exists a number / there exist numbers + +-- infinitive for purpose AR 21/8/2013 + + PurposeVP : VP -> Adv ; -- to become happy + +-- object S without "that" + + ComplBareVS : VS -> S -> VP ; -- say she runs + SlashBareV2S : V2S -> S -> VPSlash ; -- answer (to him) it is good + +-- front the extraposed part + + FrontExtPredVP : NP -> VP -> Cl ; -- I am here, she said + InvFrontExtPredVP : NP -> VP -> Cl ; -- I am here, said she + +-- to use an AP as CN or NP without CN + + AdjAsCN : AP -> CN ; -- a green one ; en grön (Swe) + AdjAsNP : AP -> NP ; -- green (is good) + +-- reflexive noun phrases: a generalization of Verb.ReflVP, which covers just reflexive pronouns +-- This is necessary in languages like Swedish, which have special reflexive possessives. +-- However, it is also needed in application grammars that want to treat "brush one's teeth" as a one-place predicate. + + cat + RNP ; -- reflexive noun phrase, e.g. "my family and myself" + RNPList ; -- list of reflexives to be coordinated, e.g. "my family, myself, everyone" + +-- Notice that it is enough for one NP in RNPList to be RNP. + + fun + ReflRNP : VPSlash -> RNP -> VP ; -- love my family and myself + + ReflPron : RNP ; -- myself + ReflPoss : Num -> CN -> RNP ; -- my car(s) + + PredetRNP : Predet -> RNP -> RNP ; -- all my brothers + + ConjRNP : Conj -> RNPList -> RNP ; -- my family, John and myself + + Base_rr_RNP : RNP -> RNP -> RNPList ; -- my family, myself + Base_nr_RNP : NP -> RNP -> RNPList ; -- John, myself + Base_rn_RNP : RNP -> NP -> RNPList ; -- myself, John + Cons_rr_RNP : RNP -> RNPList -> RNPList ; -- my family, myself, John + Cons_nr_RNP : NP -> RNPList -> RNPList ; -- John, my family, myself +---- Cons_rn_RNP : RNP -> ListNP -> RNPList ; -- myself, John, Mary + + +--- from Extensions + + ComplVV : VV -> Ant -> Pol -> VP -> VP ; -- want not to have slept + SlashV2V : V2V -> Ant -> Pol -> VPS -> VPSlash ; -- force (her) not to have slept + + CompoundN : N -> N -> N ; -- control system / controls system / control-system + CompoundAP : N -> A -> AP ; -- language independent / language-independent + + GerundCN : VP -> CN ; -- publishing of the document (can get a determiner) + GerundNP : VP -> NP ; -- publishing the document (by nature definite) + GerundAdv : VP -> Adv ; -- publishing the document (prepositionless adverb) + + WithoutVP : VP -> Adv ; -- without publishing the document + ByVP : VP -> Adv ; -- by publishing the document + InOrderToVP : VP -> Adv ; -- (in order) to publish the document + + ApposNP : NP -> NP -> NP ; -- Mr Macron, the president of France, + + AdAdV : AdA -> AdV -> AdV ; -- almost always + UttAdV : AdV -> Utt ; -- always(!) + PositAdVAdj : A -> AdV ; -- (that she) positively (sleeps) + + CompS : S -> Comp ; -- (the fact is) that she sleeps + CompQS : QS -> Comp ; -- (the question is) who sleeps + CompVP : Ant -> Pol -> VP -> Comp ; -- (she is) to go + + +} diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf new file mode 100644 index 000000000..9ca194aa7 --- /dev/null +++ b/src/common/ExtendFunctor.gf @@ -0,0 +1,82 @@ +incomplete concrete ExtendFunctor of Extend = open Grammar in { + +lincat + VPS = Grammar.VP ; + [VPS] = Grammar.VP ; + + RNP = Grammar.NP ; + RNPList = Grammar.ListNP ; + +lin + BaseVPS = variants {} ; + ConsVPS = variants {} ; + + +lin + GenNP = variants {} ; -- NP -> Quant ; -- this man's + GenIP = variants {} ; -- IP -> IQuant ; -- whose + GenRP = variants {} ; -- Num -> CN -> RP ; -- whose car + GenModNP = variants {} ; -- Num -> NP -> CN -> NP ; -- this man's car(s) + GenModIP = variants {} ; -- Num -> IP -> CN -> IP ; -- whose car(s) + CompBareCN = variants {} ; -- CN -> Comp ; -- (est) professeur + StrandQuestSlash = variants {} ; -- IP -> ClSlash -> QCl ; -- whom does John live with + StrandRelSlash = variants {} ; -- RP -> ClSlash -> RCl ; -- that he lives in + EmptyRelSlash = variants {} ; -- ClSlash -> RCl ; -- he lives in + MkVPS = variants {} ; -- Temp -> Pol -> VP -> VPS ; -- to sleep / hasn't slept + ConjVPS = variants {} ; -- Conj -> [VPS] -> VPS ; -- has walked and won't sleep + PredVPS = variants {} ; -- NP -> VPS -> S ; -- she [has walked and won't sleep] + ComplVPSVV = variants {} ; -- VV -> VPS -> VP ; -- want to sleep and to walk + PredVPSVV = variants {} ; -- NP -> VV -> VPS -> VP ; -- she wants to sleep and to walk + ProDrop = variants {} ; -- Pron -> Pron ; -- unstressed subject pronoun becomes []: "(io) sono stanco" + ICompAP = variants {} ; -- AP -> IComp ; -- "how old" + IAdvAdv = variants {} ; -- Adv -> IAdv ; -- "how often" + CompIQuant = variants {} ; -- IQuant -> IComp ; -- which (is it) [agreement to NP] + PrepCN = variants {} ; -- Prep -> CN -> Adv ; -- by accident [Prep + CN without article] + FocusObj = variants {} ; -- NP -> SSlash -> Utt ; -- her I love + FocusAdv = variants {} ; -- Adv -> S -> Utt ; -- today I will sleep + FocusAdV = variants {} ; -- AdV -> S -> Utt ; -- never will I sleep + FocusAP = variants {} ; -- AP -> NP -> Utt ; -- green was the tree + ParticipleAP = variants {} ; -- VP -> AP ; -- (the man) looking at Mary + EmbedPresPart = variants {} ; -- VP -> SC ; -- looking at Mary (is fun) + PassVPSlash = variants {} ; -- VPSlash -> VP ; -- be forced to sleep + PassAgentVPSlash = variants {} ; -- VPSlash -> NP -> VP ; -- be begged by her to go + PastPartAP = variants {} ; -- VPSlash -> AP ; -- lost (opportunity) ; (opportunity) lost in space + PastPartAgentAP = variants {} ; -- VPSlash -> NP -> AP ; -- (opportunity) lost by the company + NominalizeVPSlashNP = variants {} ; -- VPSlash -> NP -> NP ; + ExistsNP = variants {} ; -- NP -> Cl ; -- there exists a number / there exist numbers + PurposeVP = variants {} ; -- VP -> Adv ; -- to become happy + ComplBareVS = variants {} ; -- VS -> S -> VP ; -- say she runs + SlashBareV2S = variants {} ; -- V2S -> S -> VPSlash ; -- answer (to him) it is good + FrontExtPredVP = variants {} ; -- NP -> VP -> Cl ; -- I am here, she said + InvFrontExtPredVP = variants {} ; -- NP -> VP -> Cl ; -- I am here, said she + AdjAsCN = variants {} ; -- AP -> CN ; -- a green one ; en grön (Swe) + AdjAsNP = variants {} ; -- AP -> NP ; -- green (is good) + ReflRNP = variants {} ; -- VPSlash -> RNP -> VP ; -- love my family and myself + ReflPron = variants {} ; -- RNP ; -- myself + ReflPoss = variants {} ; -- Num -> CN -> RNP ; -- my car(s) + PredetRNP = variants {} ; -- Predet -> RNP -> RNP ; -- all my brothers + ConjRNP = variants {} ; -- Conj -> RNPList -> RNP ; -- my family, John and myself + Base_rr_RNP = variants {} ; -- RNP -> RNP -> RNPList ; -- my family, myself + Base_nr_RNP = variants {} ; -- NP -> RNP -> RNPList ; -- John, myself + Base_rn_RNP = variants {} ; -- RNP -> NP -> RNPList ; -- myself, John + Cons_rr_RNP = variants {} ; -- RNP -> RNPList -> RNPList ; -- my family, myself, John + Cons_nr_RNP = variants {} ; -- NP -> RNPList -> RNPList ; -- John, my family, myself + ComplVV = variants {} ; -- VV -> Ant -> Pol -> VP -> VP ; -- want not to have slept + SlashV2V = variants {} ; -- V2V -> Ant -> Pol -> VPS -> VPSlash ; -- force (her) not to have slept + CompoundN = variants {} ; -- N -> N -> N ; -- control system / controls system / control-system + CompoundAP = variants {} ; -- N -> A -> AP ; -- language independent / language-independent + GerundCN = variants {} ; -- VP -> CN ; -- publishing of the document (can get a determiner) + GerundNP = variants {} ; -- VP -> NP ; -- publishing the document (by nature definite) + GerundAdv = variants {} ; -- VP -> Adv ; -- publishing the document (prepositionless adverb) + WithoutVP = variants {} ; -- VP -> Adv ; -- without publishing the document + ByVP = variants {} ; -- VP -> Adv ; -- by publishing the document + InOrderToVP = variants {} ; -- VP -> Adv ; -- (in order) to publish the document + ApposNP = variants {} ; -- NP -> NP -> NP ; -- Mr Macron, the president of France, + AdAdV = variants {} ; -- AdA -> AdV -> AdV ; -- almost always + UttAdV = variants {} ; -- AdV -> Utt ; -- always(!) + PositAdVAdj = variants {} ; -- A -> AdV ; -- (that she) positively (sleeps) + CompS = variants {} ; -- S -> Comp ; -- (the fact is) that she sleeps + CompQS = variants {} ; -- QS -> Comp ; -- (the question is) who sleeps + CompVP = variants {} ; -- Ant -> Pol -> VP -> Comp ; -- (she is) to go + +} \ No newline at end of file diff --git a/src/english/ExtendEng.gf b/src/english/ExtendEng.gf new file mode 100644 index 000000000..b757f3b61 --- /dev/null +++ b/src/english/ExtendEng.gf @@ -0,0 +1,282 @@ +--# -path=.:../common:../abstract + +concrete ExtendEng of Extend = + CatEng ** ExtendFunctor [ProDrop] + with + (Grammar = GrammarEng) ** + + open + ResEng, + Coordination, + Prelude, + MorphoEng, + ParadigmsEng in { + + lin + GenNP np = {s = \\_,_ => np.s ! npGen ; sp = \\_,_,_ => np.s ! npGen} ; + GenIP ip = {s = \\_ => ip.s ! NCase Gen} ; + GenRP nu cn = { + s = \\c => "whose" ++ nu.s ! Nom ++ + case c of { + RC _ (NCase Gen) => cn.s ! nu.n ! Gen ; + _ => cn.s ! nu.n ! Nom + } ; + a = RAg (agrP3 nu.n) + } ; + + StrandQuestSlash ip slash = + {s = \\t,a,b,q => + (mkQuestion (ss (ip.s ! NPAcc)) slash).s ! t ! a ! b ! q ++ slash.c2 + }; + StrandRelSlash rp slash = { + s = \\t,a,p,ag => + rp.s ! RC (fromAgr ag).g NPAcc ++ slash.s ! t ! a ! p ! oDir ++ slash.c2 ; + c = NPAcc + } ; + EmptyRelSlash slash = { + s = \\t,a,p,_ => slash.s ! t ! a ! p ! oDir ++ slash.c2 ; + c = NPAcc + } ; + +{- ----- + lincat + VPI = {s : VVType => Agr => Str} ; + [VPI] = {s1,s2 : VVType => Agr => Str} ; + + lin + BaseVPI = twoTable2 VVType Agr ; + ConsVPI = consrTable2 VVType Agr comma ; + + MkVPI vp = { + s = table { + VVAux => \\a => vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a; + VVInf => \\a => "to" ++ vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a; + VVPresPart => \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a + } + } ; + ConjVPI = conjunctDistrTable2 VVType Agr ; + ComplVPIVV vv vpi = + insertObj (\\a => vpi.s ! vv.typ ! a) (predVV vv) ; +----} + + + lincat + VPS = {s : Agr => Str} ; + [VPS] = {s1,s2 : Agr => Str} ; + + lin + BaseVPS = twoTable Agr ; + ConsVPS = consrTable Agr comma ; + + PredVPS np vpi = {s = np.s ! npNom ++ vpi.s ! np.a} ; + + MkVPS t p vp = { + s = \\a => + let + verb = vp.s ! t.t ! t.a ! p.p ! oDir ! a ; + verbf = verb.aux ++ verb.adv ++ verb.fin ++ verb.inf ; + in t.s ++ p.s ++ vp.ad ! a ++ verbf ++ vp.p ++ vp.s2 ! a ++ vp.ext + } ; + + ConjVPS = conjunctDistrTable Agr ; + + ICompAP ap = {s = "how" ++ ap.s ! agrP3 Sg} ; ---- IComp should have agr! + + IAdvAdv adv = {s = "how" ++ adv.s} ; + + PartVP vp = { + s = \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a ++ vp.ext ; + isPre = vp.isSimple -- depends on whether there are complements + } ; + + EmbedPresPart vp = {s = infVP VVPresPart vp Simul CPos (agrP3 Sg)} ; --- agr + + UttVPShort vp = {s = infVP VVAux vp Simul CPos (agrP3 Sg)} ; + + do_VV = { + s = table { + VVF VInf => ["do"] ; + VVF VPres => "does" ; + VVF VPPart => ["done"] ; ---- + VVF VPresPart => ["doing"] ; + VVF VPast => ["did"] ; --# notpresent + VVPastNeg => ["didn't"] ; --# notpresent + VVPresNeg => "doesn't" + } ; + p = [] ; + typ = VVAux + } ; + + may_VV = lin VV { + s = table { + VVF VInf => ["be allowed to"] ; + VVF VPres => "may" ; + VVF VPPart => ["been allowed to"] ; + VVF VPresPart => ["being allowed to"] ; + VVF VPast => "might" ; --# notpresent + VVPastNeg => "mightn't" ; --# notpresent + VVPresNeg => "may not" + } ; + p = [] ; + typ = VVAux + } ; + + shall_VV = lin VV { + s = table { + VVF VInf => ["be obliged to"] ; --- + VVF VPres => "shall" ; + VVF VPPart => ["been obliged to"] ; + VVF VPresPart => ["being obliged to"] ; + VVF VPast => "should" ; --# notpresent + VVPastNeg => "shouldn't" ; --# notpresent + VVPresNeg => "shan't" + } ; + p = [] ; + typ = VVAux + } ; + + ought_VV = lin VV { + s = table { + VVF VInf => ["be obliged to"] ; --- + VVF VPres => "ought to" ; + VVF VPPart => ["been obliged to"] ; + VVF VPresPart => ["being obliged to"] ; + VVF VPast => "ought to" ; --# notpresent + VVPastNeg => "oughtn't to" ; --# notpresent + VVPresNeg => "oughtn't to" --- shan't + } ; + p = [] ; + typ = VVAux + } ; + + used_VV = lin VV { + s = table { + VVF VInf => Predef.nonExist ; --- + VVF VPres => Predef.nonExist ; + VVF VPPart => ["used to"] ; + VVF VPresPart => ["being used to"] ; + VVF VPast => "used to" ; --# notpresent + VVPastNeg => "used not to" ; --# notpresent + VVPresNeg => Predef.nonExist + } ; + p = [] ; + typ = VVAux + } ; + + + NominalizeVPSlashNP vpslash np = + let vp : ResEng.VP = insertObjPre (\\_ => vpslash.c2 ++ np.s ! NPAcc) vpslash ; + a = AgP3Sg Neutr + in + lin NP {s = \\_ => vp.ad ! a ++ vp.prp ++ vp.s2 ! a ; a = a} ; + +lin + UncNeg = {s = [] ; p = CNeg False} ; + + oper passVPSlash : VPSlash -> Str -> ResEng.VP = + \vps,ag -> + let + be = predAux auxBe ; + ppt = vps.ptp + in { + s = be.s ; + p = [] ; + prp = be.prp ; + ptp = be.ptp ; + inf = be.inf ; + ad = \\_ => [] ; + s2 = \\a => vps.ad ! a ++ ppt ++ vps.p ++ ag ++ vps.s2 ! a ++ vps.c2 ; ---- place of agent + isSimple = False ; + ext = vps.ext + } ; + + lin + PassVPSlash vps = passVPSlash vps [] ; + PassAgentVPSlash vps np = passVPSlash vps ("by" ++ np.s ! NPAcc) ; + + --- AR 7/3/2013 + ComplSlashPartLast vps np = case vps.gapInMiddle of { + _ => insertObjPartLast (\\_ => vps.c2 ++ np.s ! NPAcc) vps --- + } ; + + --- AR 22/5/2013 + ExistsNP np = + mkClause "there" (agrP3 (fromAgr np.a).n) + (insertObj (\\_ => np.s ! NPAcc) (predV (regV "exist"))) ; + + PurposeVP vp = {s = infVP VVInf vp Simul CPos (agrP3 Sg)} ; --- agr + + + ComplBareVS v s = insertExtra s.s (predV v) ; + SlashBareV2S v s = insertExtrac s.s (predVc v) ; + + ContractedUseCl t p cl = { + s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! ODir True + } ; + + + + CompoundCN a b = {s = \\n,c => a.s ! Sg ! Nom ++ b.s ! n ! c ; g = b.g} ; + + FrontExtPredVP np vp = { + s = \\t,a,b,o => + let + subj = np.s ! npNom ; + agr = np.a ; + verb = vp.s ! t ! a ! b ! o ! agr ; + compl = vp.s2 ! agr + in + case o of { + ODir _ => vp.ext ++ frontComma ++ subj ++ verb.aux ++ verb.adv ++ vp.ad ! agr ++ verb.fin ++ verb.inf ++ vp.p ++ compl ; + OQuest => verb.aux ++ subj ++ verb.adv ++ vp.ad ! agr ++ verb.fin ++ verb.inf ++ vp.p ++ compl ++ vp.ext + } + } ; + + InvFrontExtPredVP np vp = { + s = \\t,a,b,o => + let + subj = np.s ! npNom ; + agr = np.a ; + verb = vp.s ! t ! a ! b ! o ! agr ; + compl = vp.s2 ! agr + in + case o of { + ODir _ => vp.ext ++ verb.aux ++ verb.adv ++ vp.ad ! agr ++ verb.fin ++ subj ++ verb.inf ++ vp.p ++ compl ; + OQuest => verb.aux ++ subj ++ verb.adv ++ vp.ad ! agr ++ verb.fin ++ verb.inf ++ vp.p ++ compl ++ vp.ext + } + } ; + + + + lin + AdjAsCN ap = let cn = mkNoun "one" "one's" "ones" "ones'" ** {g = Neutr} + in { + s = \\n,c => preOrPost ap.isPre (ap.s ! agrgP3 n cn.g) (cn.s ! n ! c) ; + g = cn.g + } ; + + lincat + RNP = {s : Agr => Str} ; + RNPList = {s1,s2 : Agr => Str} ; + + lin + ReflRNP vps rnp = insertObjPre (\\a => vps.c2 ++ rnp.s ! a) vps ; + ReflPron = {s = reflPron} ; + ReflPoss num cn = {s = \\a => possPron ! a ++ num.s ! Nom ++ cn.s ! num.n ! Nom} ; + PredetRNP predet rnp = {s = \\a => predet.s ++ rnp.s ! a} ; + + ConjRNP conj rpns = conjunctDistrTable Agr conj rpns ; + + Base_rr_RNP x y = twoTable Agr x y ; + Base_nr_RNP x y = twoTable Agr {s = \\a => x.s ! NPAcc} y ; + Base_rn_RNP x y = twoTable Agr x {s = \\a => y.s ! NPAcc} ; + Cons_rr_RNP x xs = consrTable Agr comma x xs ; + Cons_nr_RNP x xs = consrTable Agr comma {s = \\a => x.s ! NPAcc} xs ; + + +---- TODO: RNPList construction + + + + +} \ No newline at end of file diff --git a/src/experimental/PredInstanceEng.gf b/src/experimental/PredInstanceEng.gf index 8454bd3e5..cd4d90b5c 100644 --- a/src/experimental/PredInstanceEng.gf +++ b/src/experimental/PredInstanceEng.gf @@ -115,7 +115,7 @@ oper AgP1 n => n ; AgP2 n => n ; AgP3Sg _ => Sg ; - AgP3Pl => Pl + AgP3Pl _ => Pl } ; agr2icagr : Agr -> ICAgr = \a -> UUnit ; @@ -123,7 +123,7 @@ oper -- restoring full Agr ipagr2agr : IPAgr -> Agr = \n -> case n of { Sg => AgP3Sg Neutr ; ---- gender - Pl => AgP3Pl + Pl => AgP3Pl Neutr } ; ipagr2vagr : IPAgr -> VAgr = \n -> case n of { @@ -140,7 +140,7 @@ oper vagr2agr : VAgr -> Agr = \a -> case a of { VASgP1 => AgP1 Sg ; VASgP3 => AgP3Sg Neutr ; - VAPl => AgP3Pl + VAPl => AgP3Pl Neutr } ; vPastPart : PrVerb -> AAgr -> Str = \v,_ -> v.s ! VVF VPPart ; From 6afcf80c04af8169b4ba8220c34b4b494f435d2b Mon Sep 17 00:00:00 2001 From: Aarne Ranta Date: Sun, 20 Aug 2017 18:56:05 +0300 Subject: [PATCH 2/4] most of ExtendEng in place --- src/abstract/Extend.gf | 24 ++--- src/common/ExtendFunctor.gf | 23 +++-- src/english/ExtendEng.gf | 169 +++++++++++++++++------------------- 3 files changed, 106 insertions(+), 110 deletions(-) diff --git a/src/abstract/Extend.gf b/src/abstract/Extend.gf index e35629296..4d55816dd 100644 --- a/src/abstract/Extend.gf +++ b/src/abstract/Extend.gf @@ -67,10 +67,13 @@ abstract Extend = Cat ** { FocusAdV : AdV -> S -> Utt ; -- never will I sleep FocusAP : AP -> NP -> Utt ; -- green was the tree - fun - ParticipleAP : VP -> AP ; -- (the man) looking at Mary + -- participle constructions + PresPartAP : VP -> AP ; -- (the man) looking at Mary EmbedPresPart : VP -> SC ; -- looking at Mary (is fun) - + + PastPartAP : VPSlash -> AP ; -- lost (opportunity) ; (opportunity) lost in space + PastPartAgentAP : VPSlash -> NP -> AP ; -- (opportunity) lost by the company + -- this is a generalization of Verb.PassV2 and should replace it in the future. PassVPSlash : VPSlash -> VP ; -- be forced to sleep @@ -80,11 +83,6 @@ abstract Extend = Cat ** { PassAgentVPSlash : VPSlash -> NP -> VP ; -- be begged by her to go --- In many languages, the passives use past participles. - - PastPartAP : VPSlash -> AP ; -- lost (opportunity) ; (opportunity) lost in space - PastPartAgentAP : VPSlash -> NP -> AP ; -- (opportunity) lost by the company - -- publishing of the document NominalizeVPSlashNP : VPSlash -> NP -> NP ; @@ -142,8 +140,8 @@ abstract Extend = Cat ** { --- from Extensions - ComplVV : VV -> Ant -> Pol -> VP -> VP ; -- want not to have slept - SlashV2V : V2V -> Ant -> Pol -> VPS -> VPSlash ; -- force (her) not to have slept + ComplGenVV : VV -> Ant -> Pol -> VP -> VP ; -- want not to have slept + SlashV2V : V2V -> Ant -> Pol -> VPS -> VPSlash ; -- force (her) not to have slept CompoundN : N -> N -> N ; -- control system / controls system / control-system CompoundAP : N -> A -> AP ; -- language independent / language-independent @@ -166,5 +164,11 @@ abstract Extend = Cat ** { CompQS : QS -> Comp ; -- (the question is) who sleeps CompVP : Ant -> Pol -> VP -> Comp ; -- (she is) to go +-- very language-specific things + +--Eng + UncontractedNeg : Pol ; -- do not, etc, as opposed to don't + UttVPShort : VP -> Utt ; -- have fun, as opposed to "to have fun" + ComplSlashPartLast : VPSlash -> NP -> VP ; } diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf index 9ca194aa7..406573757 100644 --- a/src/common/ExtendFunctor.gf +++ b/src/common/ExtendFunctor.gf @@ -1,9 +1,6 @@ -incomplete concrete ExtendFunctor of Extend = open Grammar in { +incomplete concrete ExtendFunctor of Extend = Cat ** open Grammar in { lincat - VPS = Grammar.VP ; - [VPS] = Grammar.VP ; - RNP = Grammar.NP ; RNPList = Grammar.ListNP ; @@ -16,22 +13,22 @@ lin GenNP = variants {} ; -- NP -> Quant ; -- this man's GenIP = variants {} ; -- IP -> IQuant ; -- whose GenRP = variants {} ; -- Num -> CN -> RP ; -- whose car - GenModNP = variants {} ; -- Num -> NP -> CN -> NP ; -- this man's car(s) + GenModNP num np cn = DetCN (DetQuant DefArt num) (AdvCN cn (PrepNP possess_Prep np)) ; -- this man's car(s) ; DEFAULT the car of this man GenModIP = variants {} ; -- Num -> IP -> CN -> IP ; -- whose car(s) - CompBareCN = variants {} ; -- CN -> Comp ; -- (est) professeur - StrandQuestSlash = variants {} ; -- IP -> ClSlash -> QCl ; -- whom does John live with - StrandRelSlash = variants {} ; -- RP -> ClSlash -> RCl ; -- that he lives in - EmptyRelSlash = variants {} ; -- ClSlash -> RCl ; -- he lives in - MkVPS = variants {} ; -- Temp -> Pol -> VP -> VPS ; -- to sleep / hasn't slept + CompBareCN cn = CompNP (CompCN cn) ; -- (est) professeur ; DEFAULT is a teacher + StrandQuestSlash = QuestSlash ; -- whom does John live with ; DEFAULT with whom does John live + StrandRelSlash = RelSlash ; -- that he lives in ; DEFAULT in which he lives + EmptyRelSlash = RelSlash IdRP ; -- he lives in ; DEFAULT in which he lives + MkVPS vp = variants {} ; -- Temp -> Pol -> VP -> VPS ; -- to sleep / hasn't slept ConjVPS = variants {} ; -- Conj -> [VPS] -> VPS ; -- has walked and won't sleep PredVPS = variants {} ; -- NP -> VPS -> S ; -- she [has walked and won't sleep] ComplVPSVV = variants {} ; -- VV -> VPS -> VP ; -- want to sleep and to walk PredVPSVV = variants {} ; -- NP -> VV -> VPS -> VP ; -- she wants to sleep and to walk - ProDrop = variants {} ; -- Pron -> Pron ; -- unstressed subject pronoun becomes []: "(io) sono stanco" + ProDrop pro = pro ; -- am tired ; DEFAULT I am tired ICompAP = variants {} ; -- AP -> IComp ; -- "how old" IAdvAdv = variants {} ; -- Adv -> IAdv ; -- "how often" - CompIQuant = variants {} ; -- IQuant -> IComp ; -- which (is it) [agreement to NP] - PrepCN = variants {} ; -- Prep -> CN -> Adv ; -- by accident [Prep + CN without article] + CompIQuant iquant = CompIP (IdetIP (IdetQuant iquant NumSg)) ; -- which (is it) [agreement to NP] ; DEFAULT which [no agreement] + PrepCN prep cn = PrepNP prep (MassNP cn) ; -- Prep -> CN -> Adv ; -- by accident [Prep + CN without article] ; DEFAULT CN as mass term FocusObj = variants {} ; -- NP -> SSlash -> Utt ; -- her I love FocusAdv = variants {} ; -- Adv -> S -> Utt ; -- today I will sleep FocusAdV = variants {} ; -- AdV -> S -> Utt ; -- never will I sleep diff --git a/src/english/ExtendEng.gf b/src/english/ExtendEng.gf index b757f3b61..dbf2582c5 100644 --- a/src/english/ExtendEng.gf +++ b/src/english/ExtendEng.gf @@ -6,6 +6,7 @@ concrete ExtendEng of Extend = (Grammar = GrammarEng) ** open + GrammarEng, ResEng, Coordination, Prelude, @@ -23,6 +24,9 @@ concrete ExtendEng of Extend = } ; a = RAg (agrP3 nu.n) } ; + + GenModNP num np cn = DetCN (DetQuant (GenNP (lin NP np)) num) cn ; + GenModIP num ip cn = IdetCN (IdetQuant (GenIP (lin IP ip)) num) cn ; StrandQuestSlash ip slash = {s = \\t,a,b,q => @@ -61,107 +65,86 @@ concrete ExtendEng of Extend = lincat - VPS = {s : Agr => Str} ; - [VPS] = {s1,s2 : Agr => Str} ; + VPS = {s : {s : Agr => Str} ; i : {s : VVType => Agr => Str}} ; --- finite and infinite forms separately + [VPS] = {s : {s1,s2 : Agr => Str} ; i : {s1,s2 : VVType => Agr => Str}} ; lin - BaseVPS = twoTable Agr ; - ConsVPS = consrTable Agr comma ; + BaseVPS x y = {s = twoTable Agr x.s y.s ; i = twoTable2 VVType Agr x.i y.i} ; + ConsVPS x xs = {s = consrTable Agr comma x.s xs.s ; i = consrTable2 VVType Agr comma x.i xs.i} ; - PredVPS np vpi = {s = np.s ! npNom ++ vpi.s ! np.a} ; + PredVPS np vps = {s = np.s ! npNom ++ vps.s.s ! np.a} ; MkVPS t p vp = { - s = \\a => + s = {s = \\a => let verb = vp.s ! t.t ! t.a ! p.p ! oDir ! a ; verbf = verb.aux ++ verb.adv ++ verb.fin ++ verb.inf ; in t.s ++ p.s ++ vp.ad ! a ++ verbf ++ vp.p ++ vp.s2 ! a ++ vp.ext + } ; + i = {s = table { + VVAux => \\a => vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a; + VVInf => \\a => "to" ++ vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a; + VVPresPart => \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a + } + } } ; - ConjVPS = conjunctDistrTable Agr ; + ConjVPS c xs = {s = conjunctDistrTable Agr c xs.s ; i = conjunctDistrTable2 VVType Agr c xs.i} ; + + ComplVPIVV vv vpi = + insertObj (\\a => vpi.i.s ! vv.typ ! a) (predVV vv) ; + +----- ICompAP ap = {s = "how" ++ ap.s ! agrP3 Sg} ; ---- IComp should have agr! IAdvAdv adv = {s = "how" ++ adv.s} ; - PartVP vp = { + PresPartAP vp = { s = \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a ++ vp.ext ; isPre = vp.isSimple -- depends on whether there are complements } ; EmbedPresPart vp = {s = infVP VVPresPart vp Simul CPos (agrP3 Sg)} ; --- agr - UttVPShort vp = {s = infVP VVAux vp Simul CPos (agrP3 Sg)} ; - - do_VV = { - s = table { - VVF VInf => ["do"] ; - VVF VPres => "does" ; - VVF VPPart => ["done"] ; ---- - VVF VPresPart => ["doing"] ; - VVF VPast => ["did"] ; --# notpresent - VVPastNeg => ["didn't"] ; --# notpresent - VVPresNeg => "doesn't" + PastPartAP vp = { + s = \\a => vp.ad ! a ++ vp.ptp ++ vp.p ++ vp.c2 ++ vp.s2 ! a ++ vp.ext ; + isPre = vp.isSimple -- depends on whether there are complements } ; - p = [] ; - typ = VVAux - } ; - - may_VV = lin VV { - s = table { - VVF VInf => ["be allowed to"] ; - VVF VPres => "may" ; - VVF VPPart => ["been allowed to"] ; - VVF VPresPart => ["being allowed to"] ; - VVF VPast => "might" ; --# notpresent - VVPastNeg => "mightn't" ; --# notpresent - VVPresNeg => "may not" + PastPartAgentAP vp np = { + s = \\a => vp.ad ! a ++ vp.ptp ++ vp.p ++ vp.c2 ++ vp.s2 ! a ++ "by" ++ np.s ! NPAcc ++ vp.ext ; + isPre = False } ; - p = [] ; - typ = VVAux - } ; - shall_VV = lin VV { - s = table { - VVF VInf => ["be obliged to"] ; --- - VVF VPres => "shall" ; - VVF VPPart => ["been obliged to"] ; - VVF VPresPart => ["being obliged to"] ; - VVF VPast => "should" ; --# notpresent - VVPastNeg => "shouldn't" ; --# notpresent - VVPresNeg => "shan't" - } ; - p = [] ; - typ = VVAux - } ; + GerundCN vp = { + s = \\n,c => vp.ad ! AgP3Sg Neutr ++ vp.prp ++ + case of { + => "" ; + => Predef.BIND ++ "'s" ; + => Predef.BIND ++ "s" ; + => Predef.BIND ++ "s'" + } ++ + vp.p ++ vp.s2 ! AgP3Sg Neutr ++ vp.ext ; + g = Neutr + } ; - ought_VV = lin VV { - s = table { - VVF VInf => ["be obliged to"] ; --- - VVF VPres => "ought to" ; - VVF VPPart => ["been obliged to"] ; - VVF VPresPart => ["being obliged to"] ; - VVF VPast => "ought to" ; --# notpresent - VVPastNeg => "oughtn't to" ; --# notpresent - VVPresNeg => "oughtn't to" --- shan't - } ; - p = [] ; - typ = VVAux - } ; + GerundNP vp = + let a = AgP3Sg Neutr ---- agr + in + {s = \\_ => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a ++ vp.ext ; a = a} ; - used_VV = lin VV { - s = table { - VVF VInf => Predef.nonExist ; --- - VVF VPres => Predef.nonExist ; - VVF VPPart => ["used to"] ; - VVF VPresPart => ["being used to"] ; - VVF VPast => "used to" ; --# notpresent - VVPastNeg => "used not to" ; --# notpresent - VVPresNeg => Predef.nonExist - } ; - p = [] ; - typ = VVAux - } ; + GerundAdv vp = + let a = AgP3Sg Neutr + in + {s = vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a ++ vp.ext} ; + + WithoutVP vp = {s = "without" ++ (GerundAdv (lin VP vp)).s} ; + + InOrderToVP vp = {s = ("in order" | []) ++ infVP VVInf vp Simul CPos (AgP3Sg Neutr)} ; + + PurposeVP vp = {s = infVP VVInf vp Simul CPos (agrP3 Sg)} ; --- agr + + ByVP vp = {s = "by" ++ (GerundAdv (lin VP vp)).s} ; NominalizeVPSlashNP vpslash np = @@ -170,8 +153,6 @@ concrete ExtendEng of Extend = in lin NP {s = \\_ => vp.ad ! a ++ vp.prp ++ vp.s2 ! a ; a = a} ; -lin - UncNeg = {s = [] ; p = CNeg False} ; oper passVPSlash : VPSlash -> Str -> ResEng.VP = \vps,ag -> @@ -191,8 +172,8 @@ lin } ; lin - PassVPSlash vps = passVPSlash vps [] ; - PassAgentVPSlash vps np = passVPSlash vps ("by" ++ np.s ! NPAcc) ; + PassVPSlash vps = passVPSlash (lin VPS vps) [] ; + PassAgentVPSlash vps np = passVPSlash (lin VPS vps) ("by" ++ np.s ! NPAcc) ; --- AR 7/3/2013 ComplSlashPartLast vps np = case vps.gapInMiddle of { @@ -204,19 +185,19 @@ lin mkClause "there" (agrP3 (fromAgr np.a).n) (insertObj (\\_ => np.s ! NPAcc) (predV (regV "exist"))) ; - PurposeVP vp = {s = infVP VVInf vp Simul CPos (agrP3 Sg)} ; --- agr - ComplBareVS v s = insertExtra s.s (predV v) ; SlashBareV2S v s = insertExtrac s.s (predVc v) ; - ContractedUseCl t p cl = { - s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! ODir True - } ; - - - - CompoundCN a b = {s = \\n,c => a.s ! Sg ! Nom ++ b.s ! n ! c ; g = b.g} ; + CompoundN noun cn = { + s = (\\n,c => noun.s ! Sg ! Nom ++ cn.s ! n ! c) ; + g = cn.g + } ; + + CompoundAP noun adj = { + s = (\\_ => noun.s ! Sg ! Nom ++ adj.s ! AAdj Posit Nom) ; + isPre = True + } ; FrontExtPredVP np vp = { s = \\t,a,b,o => @@ -254,6 +235,10 @@ lin s = \\n,c => preOrPost ap.isPre (ap.s ! agrgP3 n cn.g) (cn.s ! n ! c) ; g = cn.g } ; + AdjAsNP ap = { + s = \\c => ap.s ! agrgP3 Sg nonhuman ; ---- genitive case? + a = agrgP3 Sg nonhuman + } ; lincat RNP = {s : Agr => Str} ; @@ -276,7 +261,17 @@ lin ---- TODO: RNPList construction + ComplGenVV v a p vp = insertObj (\\agr => a.s ++ p.s ++ + infVP v.typ vp a.a p.p agr) + (predVV v) ; + CompS s = {s = \\_ => "that" ++ s.s} ; + CompQS qs = {s = \\_ => qs.s ! QIndir} ; + CompVP ant p vp = {s = \\a => ant.s ++ p.s ++ + infVP VVInf vp ant.a p.p a} ; +-- quite specific for English anyway + UncontractedNeg = {s = [] ; p = CNeg False} ; + UttVPShort vp = {s = infVP VVAux vp Simul CPos (agrP3 Sg)} ; } \ No newline at end of file From c14b35d7144e463b2fbb83bf2b66602f33e469f4 Mon Sep 17 00:00:00 2001 From: Aarne Ranta Date: Sun, 20 Aug 2017 19:25:24 +0300 Subject: [PATCH 3/4] as a template for future Extend modules, added Dut and Spa --- src/common/ExtendFunctor.gf | 2 +- src/dutch/ExtendDut.gf | 16 ++++++++++++++++ src/spanish/ExtendSpa.gf | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/dutch/ExtendDut.gf create mode 100644 src/spanish/ExtendSpa.gf diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf index 406573757..4c37dd2cb 100644 --- a/src/common/ExtendFunctor.gf +++ b/src/common/ExtendFunctor.gf @@ -15,7 +15,7 @@ lin GenRP = variants {} ; -- Num -> CN -> RP ; -- whose car GenModNP num np cn = DetCN (DetQuant DefArt num) (AdvCN cn (PrepNP possess_Prep np)) ; -- this man's car(s) ; DEFAULT the car of this man GenModIP = variants {} ; -- Num -> IP -> CN -> IP ; -- whose car(s) - CompBareCN cn = CompNP (CompCN cn) ; -- (est) professeur ; DEFAULT is a teacher + CompBareCN cn = CompCN cn ; -- (est) professeur ; DEFAULT is a teacher StrandQuestSlash = QuestSlash ; -- whom does John live with ; DEFAULT with whom does John live StrandRelSlash = RelSlash ; -- that he lives in ; DEFAULT in which he lives EmptyRelSlash = RelSlash IdRP ; -- he lives in ; DEFAULT in which he lives diff --git a/src/dutch/ExtendDut.gf b/src/dutch/ExtendDut.gf new file mode 100644 index 000000000..74e2e6aa0 --- /dev/null +++ b/src/dutch/ExtendDut.gf @@ -0,0 +1,16 @@ +--# -path=alltenses:../common:../abstract + +concrete ExtendDut of Extend = + CatDut ** ExtendFunctor +-- - [] -- put the names of your own definitions here + with + (Grammar = GrammarDut) ** + open + GrammarDut, + ResDut, + Coordination, + Prelude, + ParadigmsDut in { + -- put your own definitions here + + } \ No newline at end of file diff --git a/src/spanish/ExtendSpa.gf b/src/spanish/ExtendSpa.gf new file mode 100644 index 000000000..e29fc8807 --- /dev/null +++ b/src/spanish/ExtendSpa.gf @@ -0,0 +1,16 @@ +--# -path=alltenses:../common:../abstract + +concrete ExtendSpa of Extend = + CatSpa ** ExtendFunctor +-- - [] -- put the names of your own definitions here + with + (Grammar = GrammarSpa) ** + open + GrammarSpa, + ResSpa, + Coordination, + Prelude, + ParadigmsSpa in { + -- put your own definitions here + + } \ No newline at end of file From d365aedb359f4d9f6c531c3923352d4d260b3a03 Mon Sep 17 00:00:00 2001 From: Aarne Ranta Date: Sun, 20 Aug 2017 23:05:33 +0300 Subject: [PATCH 4/4] additions to Extend from Romance and Ger extras --- src/abstract/Extend.gf | 18 +++++++++++++++++- src/common/ExtendFunctor.gf | 14 ++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/abstract/Extend.gf b/src/abstract/Extend.gf index 4d55816dd..9327743fa 100644 --- a/src/abstract/Extend.gf +++ b/src/abstract/Extend.gf @@ -166,9 +166,25 @@ abstract Extend = Cat ** { -- very language-specific things ---Eng +-- Eng UncontractedNeg : Pol ; -- do not, etc, as opposed to don't UttVPShort : VP -> Utt ; -- have fun, as opposed to "to have fun" ComplSlashPartLast : VPSlash -> NP -> VP ; +-- Romance + DetNPFem : Det -> NP ; + + iFem_Pron : Pron ; -- je (suis vieille) + youFem_Pron : Pron ; -- tu (es vieille) + weFem_Pron : Pron ; -- nous (sommes vieilles) + youPlFem_Pron : Pron ; -- vous (êtes vieilles) + theyFem_Pron : Pron ; -- elles (sont vieilles) + youPolFem_Pron : Pron ; -- vous (êtes vieille) + +-- German + UttAccNP : NP -> Utt ; -- mich + UttDatNP : NP -> Utt ; -- mir + UttAccIP : NP -> Utt ; -- wen + UttDatIP : NP -> Utt ; -- wem + } diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf index 4c37dd2cb..a054c9270 100644 --- a/src/common/ExtendFunctor.gf +++ b/src/common/ExtendFunctor.gf @@ -76,4 +76,18 @@ lin CompQS = variants {} ; -- QS -> Comp ; -- (the question is) who sleeps CompVP = variants {} ; -- Ant -> Pol -> VP -> Comp ; -- (she is) to go + + DetNPFem = DetNP ; + + iFem_Pron = i_Pron ; + youFem_Pron = youSg_Pron ; + weFem_Pron = we_Pron ; + youPlFem_Pron = youPl_Pron ; + theyFem_Pron = they_Pron ; + youPolFem_Pron = youPol_Pron ; + UttAccNP = UttNP ; + UttDatNP = UttNP ; + UttAccIP = UttIP ; + UttDatIP = UttIP ; + } \ No newline at end of file