diff --git a/lib/resource/abstract/Clause.gf b/lib/resource/abstract/Clause.gf index 0b1d30a35..32d0c686b 100644 --- a/lib/resource/abstract/Clause.gf +++ b/lib/resource/abstract/Clause.gf @@ -14,7 +14,7 @@ fun SPredV : NP -> V -> Cl ; -- "John walks" SPredPassV : NP -> V -> Cl ; -- "John is seen" SPredV2 : NP -> V2 -> NP -> Cl ; -- "John sees Mary" - SPredV3 : NP -> V2 -> NP -> NP -> Cl ; -- "John tells Mary everything" + SPredV3 : NP -> V3 -> NP -> NP -> Cl ; -- "John tells Mary everything" SPredReflV2 : NP -> V2 -> Cl ; -- "John loves himself" SPredVS : NP -> VS -> S -> Cl ; -- "John says that Mary runs" SPredVV : NP -> VV -> VPI -> Cl ; -- "John must walk" diff --git a/lib/resource/abstract/ClauseI.gf b/lib/resource/abstract/ClauseI.gf index 43266f7fc..77ab0a852 100644 --- a/lib/resource/abstract/ClauseI.gf +++ b/lib/resource/abstract/ClauseI.gf @@ -9,7 +9,7 @@ incomplete concrete ClauseI of Clause = open Rules, Verbphrase in { SPredV np v = PredVP np (UseV v) ; SPredPassV np v = PredVP np (UsePassV v) ; SPredV2 np v x = PredVP np (ComplV2 v x) ; ----- SPredV3 np v x y = PredVP np (ComplV3 v x y) ; + SPredV3 np v x y = PredVP np (ComplV3 v x y) ; SPredReflV2 np v = PredVP np (ComplReflV2 v) ; SPredVS np v x = PredVP np (ComplVS v x) ; SPredVV np v x = PredVP np (ComplVV v x) ; diff --git a/lib/resource/doc/ScanMod.gif b/lib/resource/doc/ScanMod.gif new file mode 100644 index 000000000..279ece665 Binary files /dev/null and b/lib/resource/doc/ScanMod.gif differ diff --git a/lib/resource/english/ClauseEng.gf b/lib/resource/english/ClauseEng.gf index 563c04c53..b7b2701f4 100644 --- a/lib/resource/english/ClauseEng.gf +++ b/lib/resource/english/ClauseEng.gf @@ -11,6 +11,7 @@ concrete ClauseEng of Clause = CategoriesEng ** SPredPassV np v = predBeGroup np (passVerb v) ; SPredV2 np v x = predVerbClause np v (complTransVerb v x) ; SPredReflV2 np v = predVerbClause np v (reflTransVerb v) ; + SPredV3 np v x y = predVerbClause np v (complDitransVerb v x y) ; SPredVS np v x = predVerbClause np v (complSentVerb v x) ; SPredVV np v x = predVerbClause np (aux2verb v) (complVerbVerb v x) ; SPredVQ np v x = predVerbClause np v (complQuestVerb v x) ; diff --git a/lib/resource/english/SyntaxEng.gf b/lib/resource/english/SyntaxEng.gf index 56ad49226..14d7e5082 100644 --- a/lib/resource/english/SyntaxEng.gf +++ b/lib/resource/english/SyntaxEng.gf @@ -557,11 +557,9 @@ oper v ** {s3 = p1 ; s4 = p2} ; complDitransVerb : - DitransVerb -> NounPhrase -> TransVerb = \ge,dig -> - {s = ge.s ; - s1 = ge.s1 ++ ge.s3 ++ dig.s ! AccP ; - s3 = ge.s4 - } ; + DitransVerb -> NounPhrase -> NounPhrase -> Complement = \give,her,beer -> + mkComp give + (\\_ => give.s3 ++ her.s ! AccP ++ give.s4 ++ beer.s ! AccP) ; complDitransAdjVerb : TransVerb -> NounPhrase -> AdjPhrase -> Complement = \gor,dig,sur -> diff --git a/lib/resource/english/VerbphraseEng.gf b/lib/resource/english/VerbphraseEng.gf index 6ab72f5fd..d3847948a 100644 --- a/lib/resource/english/VerbphraseEng.gf +++ b/lib/resource/english/VerbphraseEng.gf @@ -27,6 +27,7 @@ concrete VerbphraseEng of Verbphrase = CategoriesEng ** UsePassV v = predClauseBeGroup (passVerb v) ; ComplV2 v x = predClauseGroup v (complTransVerb v x) ; ComplReflV2 v = predClauseGroup v (reflTransVerb v) ; + ComplV3 v x y = predClauseGroup v (complDitransVerb v x y) ; ComplVS v x = predClauseGroup v (complSentVerb v x) ; ComplVV v x = predClauseGroup (aux2verb v) (complVerbVerb v x) ; ComplVQ v x = predClauseGroup v (complQuestVerb v x) ; diff --git a/lib/resource/french/CountryFre.gf b/lib/resource/french/CountryFre.gf index a716ee88c..e3fea1b03 100644 --- a/lib/resource/french/CountryFre.gf +++ b/lib/resource/french/CountryFre.gf @@ -1,4 +1,4 @@ -concrete CountryFre of Country = open ResourceFre, ParadigmsFre in { +concrete CountryFre of Country = open CategoriesFre, ParadigmsFre in { lincat Country = PN ; diff --git a/lib/resource/french/TimeFre.gf b/lib/resource/french/TimeFre.gf index a8d349bd6..97c195f99 100644 --- a/lib/resource/french/TimeFre.gf +++ b/lib/resource/french/TimeFre.gf @@ -1,5 +1,5 @@ concrete TimeFre of Time = NumeralsFre ** - open Prelude, MorphoFre, ResourceFre, ParadigmsFre in { + open Prelude, MorphoFre, CategoriesFre, ParadigmsFre in { lincat Date = SS ; diff --git a/lib/resource/romance/RulesRomance.gf b/lib/resource/romance/RulesRomance.gf index 08ee06b2f..efbc346ef 100644 --- a/lib/resource/romance/RulesRomance.gf +++ b/lib/resource/romance/RulesRomance.gf @@ -85,7 +85,7 @@ lin -- Adverbs. AdjAdv a = {s = a.s ! AA} ; ----- AdvVP = adVerbPhrase ; + AdvVP = adVerbPhrase ; AdvPP p = p ; PrepNP = prepNounPhrase ; @@ -172,8 +172,8 @@ lin OneNP = nounPhraseOn ; - ExistCN A = existNounPhrase (indefNounPhrase Sg A) ; +----- ExistCN A = existNounPhrase (indefNounPhrase Sg A) ; - ExistNumCN nu A = existNounPhrase (indefNounPhraseNum nu A) ; +----- ExistNumCN nu A = existNounPhrase (indefNounPhraseNum nu A) ; } diff --git a/lib/resource/scandinavian/CategoriesScand.gf b/lib/resource/scandinavian/CategoriesScand.gf index 3e9b6ff36..77f2bebec 100644 --- a/lib/resource/scandinavian/CategoriesScand.gf +++ b/lib/resource/scandinavian/CategoriesScand.gf @@ -34,9 +34,7 @@ lincat V = Verb ; -- = {s : VerbForm => Str ; s1 : Str} ; - VP = {s : SForm => Str ; - s2 : Bool => Str ; -- negation and adverbs like "alltid" - s3 : SForm => Gender => Number => Person => Str} ; + VP = VerbGroup ; VPI = {s : VIForm => Gender => Number => Person => Str} ; V2 = TransVerb ; -- = Verb ** {s2 : Preposition} ; diff --git a/lib/resource/scandinavian/ClauseScand.gf b/lib/resource/scandinavian/ClauseScand.gf index 6000c418f..fad26f724 100644 --- a/lib/resource/scandinavian/ClauseScand.gf +++ b/lib/resource/scandinavian/ClauseScand.gf @@ -10,6 +10,7 @@ incomplete concrete ClauseScand of Clause = CategoriesScand ** SPredPassV np v = predVerbGroupClause np (passVerb v) ; SPredV2 np v x = predVerbGroupClause np (complTransVerb v x) ; SPredReflV2 np v = predVerbGroupClause np (reflTransVerb v) ; + SPredV3 np v x y = predVerbGroupClause np (complDitransVerb v x y) ; SPredVS np v x = predVerbGroupClause np (complSentVerb v x) ; SPredVV np v x = predVerbGroupClause np (complVerbVerb v x) ; SPredVQ np v x = predVerbGroupClause np (complQuestVerb v x) ; diff --git a/lib/resource/scandinavian/SyntaxScand.gf b/lib/resource/scandinavian/SyntaxScand.gf index a090e2759..0dd61e7c8 100644 --- a/lib/resource/scandinavian/SyntaxScand.gf +++ b/lib/resource/scandinavian/SyntaxScand.gf @@ -530,12 +530,8 @@ oper VInfinit Anter => compound [] (auxHa ++ sett vo) } ; - useVerb : Verb -> (Gender => Number => Person => Str) -> VerbGroup = \verb,arg -> - let aer = verbSForm verb Act in { - s = \\sf => (aer sf).fin ; - s2 = negation ; - s3 = \\sf,g,n,p => (aer sf).inf ++ arg ! g ! n ! p - } ; + useVerb : Verb -> (Gender => Number => Person => Str) -> VerbGroup = + mkVerbGroupObject ; -- Verb phrases are discontinuous: the parts of a verb phrase are -- (s) an inflected verb, (s2) verb adverbials (such as negation), and @@ -549,40 +545,119 @@ oper s : VIForm => Gender => Number => Person => Str } ; - VerbGroup : Type = { - s : SForm => Str ; - s2 : Bool => Str ; - s3 : SForm => Gender => Number => Person => Str - } ; +------------------------- - predVerbGroup : Bool -> {s : Str ; a : Anteriority} -> VerbGroup -> VerbPhrase = \b,ant,vg -> + VerbGroup : Type = { +-- s : SForm => Str ; +-- s2 : Bool => Str ; +-- s3 : SForm => Gender => Number => Person => Str + + s1 : SForm => Str ; -- V1 har + s3 : Bool => Str ; -- A1 inte + s4 : SForm => Str ; -- V2 sagt + s5 : Gender => Number => Person => Str ; -- N2 dig + s6 : Str ; -- A2 idag + s7 : Str ; -- S extraposition + e3,e4,e5,e6,e7 : Bool -- indicate if the field exists + } ; + + predVerb : Verb -> VerbGroup = \verb -> + let + harsovit = verbSForm verb Act + in + {s1 = \\sf => (harsovit sf).fin ; + s3 = negation ; + s4 = \\sf => (harsovit sf).inf ++ verb.s1 ; + s5 = \\_,_,_ => [] ; + s6, s7 = [] ; + e3,e4,e5,e6,e7 = False + } ; + + insertObjectVP : VerbGroup -> (Gender => Number => Person => Str) -> VerbGroup = + \sats, obj -> + {s1 = sats.s1 ; + s3 = sats.s3 ; + s4 = sats.s4 ; + s5 = \\g,n,p => sats.s5 ! g ! n ! p ++ obj ! g ! n ! p ; + s6 = sats.s6 ; + s7 = sats.s7 ; + e3 = sats.e3 ; + e4 = sats.e4 ; + e5 = True ; + e6 = sats.e6 ; + e7 = sats.e7 + } ; + + insertAdverbVP : VerbGroup -> Str -> VerbGroup = \sats, adv -> + {s1 = sats.s1 ; + s3 = sats.s3 ; + s4 = sats.s4 ; + s6 = sats.s6 ++ adv ; + s5 = sats.s5 ; + s7 = sats.s7 ; + e3 = sats.e3 ; + e4 = sats.e4 ; + e6 = True ; + e5 = sats.e5 ; + e7 = sats.e7 + } ; + + insertExtraposVP : VerbGroup -> Str -> VerbGroup = \sats, exts -> + {s1 = sats.s1 ; + s3 = sats.s3 ; + s4 = sats.s4 ; + s6 = sats.s6 ; + s5 = sats.s5 ; + s7 = sats.s7 ++ exts ; + e3 = sats.e3 ; + e4 = sats.e4 ; + e7 = True ; + e5 = sats.e5 ; + e6 = sats.e6 + } ; + + mkVerbGroupObject : Verb -> (Gender => Number => Person => Str) -> VerbGroup = + \verb,obj -> + insertObjectVP (predVerb verb) obj ; + + mkVerbGroupCopula : (Gender => Number => Person => Str) -> VerbGroup = + \obj -> + mkVerbGroupObject (verbVara ** {s1 = []}) obj ; + +----------------------- + + + + predVerbGroup : Bool -> {s : Str ; a : Anteriority} -> VerbGroup -> VerbPhrase = + \b,ant,vg -> let - vgs = vg.s ; - vgs3 = vg.s3 ; + vgs = vg.s1 ; + vgs3 : SForm => Gender => Number => Person => Str = \\sf,g,n,p => + vg.s4 ! sf ++ vg.s5 ! g ! n ! p ++ vg.s6 ++ vg.s7 ; a = ant.a ; in {s = table { VIInfinit => \\g,n,p => - vg.s ! VInfinit a ++ ant.s ++ vg.s2 ! b ++ vg.s3 ! VInfinit a ! g ! n ! p ; + vgs ! VInfinit a ++ ant.s ++ vg.s3 ! b ++ vgs3 ! VInfinit a ! g ! n ! p ; VIImperat bo => \\g,n,p => - vg.s ! VImperat ++ ant.s ++ vg.s2 ! bo ++ vg.s3 ! VImperat ! g ! n ! p + vgs ! VImperat ++ ant.s ++ vg.s3 ! bo ++ vgs3 ! VImperat ! g ! n ! p } ---- bo shadows b } ; predVerbGroupI : Bool -> {s : Str ; a : Anteriority} -> VerbGroup -> VerbPhrase = + predVerbGroup ; +{- ---- \b,ant,vg -> let vp = predVerbGroup b ant vg in {s = \\i,g,n,p => vp.s ! i ! g ! n ! p } ; - +-} -- A simple verb can be made into a verb phrase with an empty complement. -- There are two versions, depending on if we want to negate the verb. -- N.B. negation is *not* a function applicable to a verb phrase, since -- double negations with "inte" are not grammatical. - predVerb : Verb -> VerbGroup = \se -> useVerb se (\\_,_,_ => se.s1) ; - negation : Bool => Str = \\b => if_then_Str b [] negInte ; predVerb0 : Verb -> Clause = \regna -> @@ -651,7 +726,7 @@ oper -- The rule for using transitive verbs is the complementization rule: complTransVerb : TransVerb -> NounPhrase -> VerbGroup = \se,dig -> - useVerb se (\\_,_,_ => se.s1 ++ {-strPrep-} se.s2 ++ dig.s ! PAcc) ; + useVerb se (\\_,_,_ => {-strPrep-} se.s2 ++ dig.s ! PAcc) ; -- Transitive verbs with accusative objects can be used passively. -- The function does not check that the verb is transitive. @@ -659,11 +734,16 @@ oper -- The syntax is the same as for active verbs, with the choice of the -- "s" passive form. - passVerb : Verb -> VerbGroup = \se -> - let ses = verbSForm se Pass in { - s = \\sf => (ses sf).fin ; - s2 = negation ; - s3 = \\sf,g,n,_ => (ses sf).inf ++ se.s1 + passVerb : Verb -> VerbGroup = \verb -> + let + harsovit = verbSForm verb Pass + in + {s1 = \\sf => (harsovit sf).fin ; + s3 = negation ; + s4 = \\sf => (harsovit sf).inf ++ verb.s1 ; + s5 = \\_,_,_ => [] ; + s6, s7 = [] ; + e3,e4,e5,e6,e7 = False } ; -- Transitive verbs can be used elliptically as verbs. The semantics @@ -688,15 +768,10 @@ oper v ** {s2 = p1 ; s3 = p2} ; complDitransVerb : - DitransVerb -> NounPhrase -> TransVerb = \ge,dig -> - {s = ge.s ; - s1 = ge.s1 ++ {-strPrep-} ge.s2 ++ dig.s ! PAcc ; - s2 = ge.s3 - } ; - ---- useVerb ---- ge ---- (\\_,_ => ge.s1 ++ ge.s2 ++ dig.s ! PAcc ++ ge.s3 ++ vin.s ! PAcc) ; + DitransVerb -> NounPhrase -> NounPhrase -> VerbGroup = \ge,dig,vin -> + useVerb + ge + (\\_,_,_ => ge.s1 ++ ge.s2 ++ dig.s ! PAcc ++ ge.s3 ++ vin.s ! PAcc) ; -- Adjective-complement ditransitive verbs. @@ -733,12 +808,16 @@ oper advPost : Str -> Adverb = ss ; adVerbPhrase : VerbGroup -> Adverb -> VerbGroup = \spelar, ofta -> + insertAdverbVP spelar ofta.s ; + ----- sentence adv! +{- ----- { --- this unfortunately generates VP#2 ::= VP#2 s = spelar.s ; s2 = \\b => ofta.s ++ spelar.s2 ! b ; ---- the essential use of s2 s3 = \\sf,g,n,p => spelar.s3 ! sf ! g ! n ! p } ; +-} advVerbPhrase : VerbPhrase -> Adverb -> VerbPhrase = \sing, well -> { @@ -813,23 +892,38 @@ oper \np,vp,a -> predVerbGroupClause np (adVerbPhrase vp a) ; predVerbGroupClause : NounPhrase -> VerbGroup -> Clause = - \Jag, serdiginte -> { - s = \\b,c => let { - jag = Jag.s ! (case c of {ClInfinite _ => PAcc ; _ => PNom}) ; - osf = cl2s c ; - t = osf.sf ; - o = osf.o ; - ser = serdiginte.s ! t ; - dig = serdiginte.s3 ! t ! Jag.g ! Jag.n ! Jag.p ; - inte = serdiginte.s2 ! b - } in - case o of { - Main => jag ++ ser ++ inte ++ dig ; - Inv => ser ++ jag ++ inte ++ dig ; - Sub => jag ++ inte ++ ser ++ dig - } + \subj,sats -> {s = \\b,cf => + let + osf = cl2s cf ; + har = sats.s1 ! osf.sf ; + jag = subj.s ! PNom ; + inte = sats.s3 ! b ; + sagt = sats.s4 ! osf.sf ; + dig = sats.s5 ! subj.g ! subj.n ! subj.p ; + idag = sats.s6 ; + exts = sats.s7 + in case osf.o of { + Main => variants { + jag ++ har ++ inte ++ sagt ++ dig ++ idag ++ exts ; + onlyIf (orB sats.e3 (notB b)) + (inte ++ har ++ jag ++ sagt ++ dig ++ idag ++ exts) ; + onlyIf (orB sats.e4 (isCompoundClForm cf)) + (sagt ++ har ++ jag ++ inte ++ dig ++ idag ++ exts) ; + onlyIf sats.e5 + (dig ++ har ++ jag ++ inte ++ sagt ++ idag ++ exts) ; + onlyIf sats.e6 + (idag ++ har ++ jag ++ inte ++ sagt ++ dig ++ exts) ; + onlyIf sats.e7 + (exts ++ har ++ jag ++ inte ++ sagt ++ dig ++ idag) + } ; + Inv => + har ++ jag ++ inte ++ sagt ++ dig ++ idag ++ exts ; + Sub => + jag ++ inte ++ har ++ sagt ++ dig ++ idag ++ exts + } } ; + --3 For $Sats$, the native topological structure. Sats = { @@ -1079,8 +1173,12 @@ oper relVerbPhrase : RelPron -> VerbGroup -> RelClause = \som,sover -> {s = \\b,sf,gn,p => - som.s ! RNom ! gn ++ sover.s2 ! b ++ sover.s ! sf ++ - sover.s3 ! sf ! mkGenderRel som.g (genGN gn) ! numGN gn ! p + som.s ! RNom ! gn ++ + sover.s3 ! b ++ + sover.s1 ! sf ++ + sover.s4 ! sf ++ + sover.s5 ! mkGenderRel som.g (genGN gn) ! numGN gn ! p ++ + sover.s6 ++ sover.s7 } ; relSlash : RelPron -> ClauseSlashNounPhrase -> RelClause = \som,jagTalar -> diff --git a/lib/resource/scandinavian/VerbphraseScand.gf b/lib/resource/scandinavian/VerbphraseScand.gf index c71f6f898..28420fef2 100644 --- a/lib/resource/scandinavian/VerbphraseScand.gf +++ b/lib/resource/scandinavian/VerbphraseScand.gf @@ -26,6 +26,7 @@ incomplete concrete VerbphraseScand of Verbphrase = CategoriesScand ** UseV = predVerb ; UsePassV = passVerb ; ComplV2 = complTransVerb ; + ComplV3 = complDitransVerb ; ComplReflV2 = reflTransVerb ; ComplVS = complSentVerb ; ComplVV = complVerbVerb ; diff --git a/lib/resource/swedish/BasicSwe.gf b/lib/resource/swedish/BasicSwe.gf index d428e4db2..1761e933b 100644 --- a/lib/resource/swedish/BasicSwe.gf +++ b/lib/resource/swedish/BasicSwe.gf @@ -154,7 +154,7 @@ lin sea_N = mkN "sjö" "sjön" "sjöar" "sjöarna" ; seek_V2 = dirV2 (mk2V "söka" "söker") ; see_V2 = dirV2 (mkV "se" "ser" "se" "såg" "sett" "sedd") ; - sell_V3 = dirV3 (irregV "sälja" "sålde" "sålt") "to" ; + sell_V3 = dirV3 (irregV "sälja" "sålde" "sålt") "till" ; send_V3 = dirV3 (regV "skicka") "till" ; sheep_N = mk2N "får" "får" ; ship_N = regN "skepp" neutrum ;