diff --git a/lib/resource/abstract/Rules.gf b/lib/resource/abstract/Rules.gf index 4da817725..25a71230f 100644 --- a/lib/resource/abstract/Rules.gf +++ b/lib/resource/abstract/Rules.gf @@ -50,7 +50,7 @@ fun PositADeg : ADeg -> AP ; -- "old" ComparADeg : ADeg -> NP -> AP ; -- "older than John" - SuperlADeg : ADeg -> AP ; -- "the oldest" + SuperlNP : ADeg -> CN -> NP ; -- "the oldest man" --! --3 Verbs and verb phrases @@ -69,8 +69,9 @@ fun PredVV : VV -> VG -> VG ; -- "can run", "can't run", "tries to run" PredNP : NP -> VG ; -- "is John", "is not John" - PredAdv : Adv -> VG ; -- "is everywhere", "is not in France" + PredPP : PP -> VG ; -- "is in France", "is not in France" PredAP : AP -> VG ; -- "is old", "isn't old" + PredSuperl : ADeg -> VG ; -- "is the oldest" PredCN : CN -> VG ; -- "is a man", "isn't a man" VTrans : V2 -> V ; -- "loves" diff --git a/lib/resource/french/MorphoFre.gf b/lib/resource/french/MorphoFre.gf index 0b0735347..ee4203136 100644 --- a/lib/resource/french/MorphoFre.gf +++ b/lib/resource/french/MorphoFre.gf @@ -302,7 +302,8 @@ oper -- -- The verb "être" is often used in syntax. - verbEtre = verbPres (conjÊtre "être") ; + verbEtre = verbPres (conjÊtre "être") AHabere ; + verbAvoir = verbPres (conjAvoir "avoir") AHabere ; -- We very often form the verb stem by dropping out the infinitive ending. diff --git a/lib/resource/french/StructuralFre.gf b/lib/resource/french/StructuralFre.gf index 8736b768e..7e2226dec 100644 --- a/lib/resource/french/StructuralFre.gf +++ b/lib/resource/french/StructuralFre.gf @@ -76,10 +76,10 @@ lin SomethingNP = mkNameNounPhrase ["quelque chose"] Masc ; NothingNP = mkNameNounPhrase ["rien"] Masc ; --- ne - CanVV = mkVerbVerbDir (verbPres (conj3pouvoir "pouvoir")) ; - CanKnowVV = mkVerbVerbDir (verbPres (conj3savoir "savoir")) ; - MustVV = mkVerbVerbDir (verbPres (conj3devoir "devoir")) ; - WantVV = mkVerbVerbDir (verbPres (conj3vouloir "vouloir")) ; + CanVV = mkVerbVerbDir (verbPres (conj3pouvoir "pouvoir") AHabere) ; + CanKnowVV = mkVerbVerbDir (verbPres (conj3savoir "savoir") AHabere) ; + MustVV = mkVerbVerbDir (verbPres (conj3devoir "devoir") AHabere) ; + WantVV = mkVerbVerbDir (verbPres (conj3vouloir "vouloir") AHabere) ; EverywhereNP = ss "partout" ; SomewhereNP = ss ["quelque part"] ; --- ne - pas diff --git a/lib/resource/french/SyntaxFre.gf b/lib/resource/french/SyntaxFre.gf index 85f468b89..9ce126880 100644 --- a/lib/resource/french/SyntaxFre.gf +++ b/lib/resource/french/SyntaxFre.gf @@ -88,7 +88,8 @@ oper negVerb = \va -> elisNe ++ va ++ "pas" ; - copula = \b -> (etreNetre b).s ; + copula = \b,w -> let etre = (predVerb verbEtre).s in + etre ! b ! Masc ! w ; isTransVerbClit = \v -> case v.c of { Acc => True ; @@ -96,6 +97,11 @@ oper _ => False } ; + auxVerb ve = case ve.aux of { + AHabere => verbAvoir ; + AEsse => verbEtre + } ; + -- The "ne - pas" negation. posNeg = \b,v,c -> @@ -106,7 +112,7 @@ oper -- Exampe: 'to be or not to be'. etreNetre : Bool -> Verb = \b -> - {s = \\w => posNeg b (verbEtre.s ! w) []} ; ---- v reveals a BUG in refresh + {s = \\w => posNeg b (verbEtre.s ! w) [] ; aux = AHabere} ; ---- v reveals a BUG in refresh embedConj = elisQue ; @@ -172,11 +178,12 @@ oper ++ duvin.s ! stressed accusative --- il y en a ; have to define "y" } ; - intVerbPhrase = \qui, dort -> + intVerbPhrase = \qui, dormir -> + let dort = dormir.s ! qui.g ! VPF Simul (VFin presInd qui.n P3) + in {s = table { - DirQ => qui.s ! Nom ++ optStr (estCeQue Nom) ++ - dort.s ! qui.g ! VFin presInd qui.n P3 ; - IndirQ => "ce" ++ qui.s ! Nom ++ dort.s ! qui.g ! VFin presInd qui.n P3 + DirQ => qui.s ! Nom ++ optStr (estCeQue Nom) ++ dort ; + IndirQ => "ce" ++ qui.s ! Nom ++ dort } } ; diff --git a/lib/resource/french/TestResourceFre.gf b/lib/resource/french/TestResourceFre.gf index 042162d44..dc6641793 100644 --- a/lib/resource/french/TestResourceFre.gf +++ b/lib/resource/french/TestResourceFre.gf @@ -22,18 +22,18 @@ lin Light = mkCNomReg "lumière" Fem ; House = mkCNomReg "maison" Fem ; Bottle = mkCNomReg "bouteille" Fem ; - Walk = verbPres (conj1aimer "marcher") ; - Run = verbPres (conj3courir "courir") ; - Send = mkTransVerbDir (verbPres (conj1envoyer "envoyer")) ; - Love = mkTransVerbDir (verbPres (conj1aimer "aimer")) ; - Drink = mkTransVerbDir (verbPres (conj3boire "boire")) ; - Wait = mkTransVerbDir (verbPres (conj3rendre "attendre")) ; - Give = mkDitransVerb (verbPres (conj1aimer "donner")) [] dative [] accusative ; - Prefer = mkDitransVerb (verbPres (conj1aimer "preférer")) [] accusative [] dative ; - Say = verbSent (verbPres (conj3dire "dire")) Ind Ind ; - Prove = verbSent (verbPres (conj1aimer "démontrer")) Ind Ind ; - SwitchOn = mkTransVerbDir (verbPres (conj1aimer "allumer")) ; - SwitchOff = mkTransVerbDir (verbPres (conj3peindre "éteindre")) ; + Walk = verbPres (conj1aimer "marcher") AHabere ; + Run = verbPres (conj3courir "courir") AHabere ; + Send = mkTransVerbDir (verbPres (conj1envoyer "envoyer") AHabere) ; + Love = mkTransVerbDir (verbPres (conj1aimer "aimer") AHabere) ; + Drink = mkTransVerbDir (verbPres (conj3boire "boire") AHabere) ; + Wait = mkTransVerbDir (verbPres (conj3rendre "attendre") AHabere) ; + Give = mkDitransVerb (verbPres (conj1aimer "donner") AHabere) [] dative [] accusative ; + Prefer = mkDitransVerb (verbPres (conj1aimer "preférer") AHabere) [] accusative [] dative ; + Say = verbSent (verbPres (conj3dire "dire") AHabere) Ind Ind ; + Prove = verbSent (verbPres (conj1aimer "démontrer") AHabere) Ind Ind ; + SwitchOn = mkTransVerbDir (verbPres (conj1aimer "allumer") AHabere) ; + SwitchOff = mkTransVerbDir (verbPres (conj3peindre "éteindre") AHabere) ; Mother = funDe (mkCNomReg "mère" Fem) ; Uncle = funDe (mkCNomReg "oncle" Masc) ; Connection = mkCNomReg "connection" Fem ** diff --git a/lib/resource/romance/CategoriesRomance.gf b/lib/resource/romance/CategoriesRomance.gf index 6f08b0ba8..563ae2000 100644 --- a/lib/resource/romance/CategoriesRomance.gf +++ b/lib/resource/romance/CategoriesRomance.gf @@ -48,8 +48,8 @@ lincat V = Verb ; -- = {s : VF => Str} ; - VG = {s : Bool => Gender => VF => Str} ; - VP = {s : Gender => VF => Str} ; + VG = {s : Bool => Gender => VPForm => Str} ; + VP = {s : Gender => VPForm => Str} ; V2 = TransVerb ; -- = Verb ** {s2 : Preposition ; c : CaseA} ; V3 = TransVerb ** {s3 : Preposition ; c3 : CaseA} ; @@ -61,6 +61,8 @@ lincat S = Sentence ; -- = {s : Mode => Str} ; Slash = Sentence ** {s2 : Preposition ; c : CaseA} ; + Cl = Clause ; + -- = {s : Bool => ClForm => Str} ; RP = {s : RelForm => Str ; g : RelGen} ; RC = {s : Mode => Gender => Number => Str} ; diff --git a/lib/resource/romance/RulesRomance.gf b/lib/resource/romance/RulesRomance.gf index 2ec5611bc..3d8a25e6e 100644 --- a/lib/resource/romance/RulesRomance.gf +++ b/lib/resource/romance/RulesRomance.gf @@ -16,7 +16,7 @@ lin ComplA2 = complAdj ; PositADeg = positAdjPhrase ; ComparADeg = comparAdjPhrase ; - SuperlADeg = superlAdjDegr ; + SuperlNP = superlNounPhrase ; DetNP = detNounPhrase ; IndefOneNP = indefNounPhrase singular ; @@ -38,13 +38,16 @@ lin PosVG = predVerbGroup True ; NegVG = predVerbGroup False ; + PredVG = predVerbGroupClause ; + PredV = predVerb ; PredAP = predAdjective ; + PredSuperl a = predAdjective (superlAdjDegr a) ; PredCN = predCommNoun ; PredV2 = complTransVerb ; PredV3 = complDitransVerb ; PredNP = predNounPhrase ; - PredAdv = predAdverb ; + PredPP = predAdverb ; PredVS = complSentVerb ; PredVV = complVerbVerb ; PredPassV = predPassVerb ; diff --git a/lib/resource/romance/SyntaxRomance.gf b/lib/resource/romance/SyntaxRomance.gf index e8c60966a..c98f5a6b0 100644 --- a/lib/resource/romance/SyntaxRomance.gf +++ b/lib/resource/romance/SyntaxRomance.gf @@ -390,7 +390,7 @@ oper -- morphology has complete conjugations. param - VPForm = VPF Anteriority VForm ; + VPForm = VPF Anteriority VF ; Anteriority = Simul | Anter ; oper @@ -401,8 +401,11 @@ oper s = vg.s ! b } ; - auxVerb : Verb -> Verb ; -- gives the copula + auxVerb : Verb -> Verb ; -- gives the auxiliary + nombreVerbPhrase : VPForm -> Number = \v -> case v of { + VPF _ f => nombreVerb f + } ; -- Predication is language-dependent in the negative case. @@ -416,45 +419,49 @@ oper AHabere => VPart Masc Sg } ; allee = aller.s ! part ; - est = (auxVerb aller.aux).s ! v + est = (auxVerb aller).s ! v in if_then_Str b est (negVerb est) ++ allee } } ; + formVerb : Verb -> Bool -> Gender -> VPForm -> Str = \aller,b,g,vf -> + let va = (predVerb aller).s in va ! b ! g ! vf ; + negVerb : Str -> Str ; -- Verb phrases can also be formed from adjectives ("est bon"), -- common nouns ("est un homme"), and noun phrases ("est Jean"). -- We need a copula, which is of course language-dependent. - copula : Bool -> VF => Str ; + copula : Bool -> VPForm -> Str ; -- The third rule is overgenerating: "est chaque homme" has to be ruled out -- on semantic grounds. predAdjective : AdjPhrase -> VerbGroup = \bon -> - {s = \\b,g,v => copula b ! v ++ bon.s ! AF g (nombreVerb v)} ; + {s = \\b,g,v => copula b v ++ bon.s ! AF g (nombreVerbPhrase v)} ; predCommNoun : CommNounPhrase -> VerbGroup = \homme -> - {s = \\b,g,v => copula b ! v ++ indefNoun (nombreVerb v) homme} ; + {s = \\b,g,v => copula b v ++ indefNoun (nombreVerbPhrase v) homme} ; predNounPhrase : NounPhrase -> VerbGroup = \jean -> - {s = \\b,g,v => copula b ! v ++ jean.s ! stressed nominative} ; + {s = \\b,g,v => copula b v ++ jean.s ! stressed nominative} ; predAdverb : Adverb -> VerbGroup = \dehors -> - {s = \\b,g,v => copula b ! v ++ dehors.s} ; + {s = \\b,g,v => copula b v ++ dehors.s} ; -- Passivization is like adjectival predication. predPassVerb : Verb -> VerbGroup = \aimer -> - {s = \\b,g,v => copula b ! v ++ aimer.s ! VPart g (nombreVerb v)} ; + {s = \\b,g,v => copula b v ++ aimer.s ! VPart g (nombreVerbPhrase v)} ; -- complement a verb with noun phrase and optional preposition TransVerb : Type = Verb ** Complement ; - verbOfTransVerb : TransVerb -> Verb = \v -> {s = v.s} ; + verbOfTransVerb : TransVerb -> Verb = \v -> + {s = v.s ; aux = v.aux} ; complementOfTransVerb : TransVerb -> Complement = \v -> {s2 = v.s2 ; c = v.c} ; isNounPhraseClit : NounPhrase -> Bool = \n -> case n.c of { @@ -483,10 +490,13 @@ oper complTransVerb : TransVerb -> NounPhrase -> VerbGroup = \aime,jean -> {s = \\b,g,w => ---- BUG: v gives stack overflow - let {Jean = jean.s ! (case2pformClit aime.c) ; Aime = aime.s ! w} in + let + Jean = jean.s ! (case2pformClit aime.c) ; + Aime = formVerb aime b g w + in if_then_Str (andB (isNounPhraseClit jean) (isTransVerbClit aime)) - (posNeg b (Jean ++ Aime) []) - (posNeg b Aime Jean) + (Jean ++ Aime) ---- (posNeg b (Jean ++ Aime) []) + (Aime ++ Jean) ---- (posNeg b Aime Jean) } ; mkTransVerb : Verb -> Preposition -> CaseA -> TransVerb = \v,p,c -> @@ -526,7 +536,7 @@ oper DitransVerb -> NounPhrase -> NounPhrase -> VerbGroup = \donner,jean,vin -> {s = \\b,g,w => let - donne = donner.s ! w ; + donne = formVerb donner b g w ; cJean = isNounPhraseClit jean ; cVin = isNounPhraseClit vin ; Jean = jean.s ! (case2pformClit donner.c) ; @@ -536,7 +546,8 @@ oper lui = if_then_Str cJean Jean [] ; te = if_then_Str cVin Vin [] in - posNeg b (te ++ lui ++ donne) (aJean ++ duVin) + te ++ lui ++ donne ++ aJean ++ duVin + ---- posNeg b (te ++ lui ++ donne) (aJean ++ duVin) } ; -- The following macro builds the "ne - pas" or "non" negation. The second @@ -600,9 +611,37 @@ oper predVerbPhrase : NounPhrase -> VerbPhrase -> Sentence = \jean,dort -> {s = \\m => jean.s ! unstressed nominative ++ - dort.s ! pgen2gen jean.g ! VFin (VPres m) jean.n jean.p + dort.s ! pgen2gen jean.g ! VPF Simul (VFin (VPres m) jean.n jean.p) } ; +param + ClForm = + ClPres Anteriority Mode + | ClImperf Anteriority Mode + | ClPasse Anteriority + | ClFut Anteriority + | ClCondit Anteriority +---- | ClInfinit Anteriority -- "naked infinitive" clauses + ; + +oper + cl2vp : ClForm -> Number -> Person -> VPForm = \c,n,p -> case c of { + ClPres a m => VPF a (VFin (VPres m) n p) ; + ClImperf a m => VPF a (VFin (VImperf m) n p) ; + ClPasse a => VPF a (VFin VPasse n p) ; + ClFut a => VPF a (VFin VFut n p) ; + ClCondit a => VPF a (VFin VCondit n p) + } ; + + Clause = {s : Bool => ClForm => Str} ; + + predVerbGroupClause : NounPhrase -> VerbGroup -> Clause = \jean,dort -> + {s = \\b,c => + jean.s ! unstressed nominative ++ + dort.s ! b ! pgen2gen jean.g ! cl2vp c jean.n jean.p + } ; + + --3 Sentence-complement verbs -- @@ -634,8 +673,8 @@ oper VerbVerb : Type = Verb ** {c : CaseA} ; complVerbVerb : VerbVerb -> VerbGroup -> VerbGroup = \devoir, nager -> - {s = \\b,g,v => if_then_Str b (devoir.s ! v) (negVerb (devoir.s ! v)) ++ - prepCase devoir.c ++ nager.s ! True ! g ! VInfin + {s = \\b,g,v => formVerb devoir b g v ++ + prepCase devoir.c ++ nager.s ! True ! g ! VPF Simul VInfin ---- anter } ; mkVerbVerbDir : Verb -> VerbVerb = \v -> v ** {c = accusative} ; @@ -699,7 +738,7 @@ oper relVerbPhrase : RelPron -> VerbPhrase -> RelClause = \qui,dort -> {s = \\m,g,n => - allRelForms qui g n nominative ++ dort.s ! g ! VFin (VPres m) n P3 + allRelForms qui g n nominative ++ dort.s ! g ! VPF Simul (VFin (VPres m) n P3) } ; relSlash : RelPron -> SentenceSlashNounPhrase -> RelClause = \dont,jeparle -> @@ -844,7 +883,7 @@ oper Imperative = {s : Gender => Number => Str} ; imperVerbPhrase : VerbPhrase -> Imperative = \dormir -> - {s = \\g,n => dormir.s ! g ! vImper n P2 + {s = \\g,n => dormir.s ! g ! VPF Simul (vImper n P2) } ; imperUtterance : Number -> Imperative -> Utterance = \n,I -> diff --git a/lib/resource/swedish/RulesSwe.gf b/lib/resource/swedish/RulesSwe.gf index 6ae59e9be..987464b1f 100644 --- a/lib/resource/swedish/RulesSwe.gf +++ b/lib/resource/swedish/RulesSwe.gf @@ -13,7 +13,7 @@ lin ComplA2 = complAdj ; PositADeg = positAdjPhrase ; ComparADeg = comparAdjPhrase ; - SuperlADeg = superlAdjPhrase ; + SuperlNP = superlNounPhrase ; DetNP = detNounPhrase ; IndefOneNP = indefNounPhrase singular ; @@ -43,12 +43,13 @@ lin PredV = predVerb ; PredAP = predAdjective ; + PredSuperl a = predAdjective (superlAdjPhrase a) ; PredCN = predCommNoun ; PredV2 = complTransVerb ; PredV3 = complDitransVerb ; PredPassV = passVerb ; PredNP = predNounPhrase ; - PredAdv = predAdverb ; + PredPP = predAdverb ; PredVS = complSentVerb ; PredVV = complVerbVerb ; VTrans = transAsVerb ;