From c7ff8114b4b9d34aa267ac7163585da1fb883568 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 26 May 2010 09:37:17 +0000 Subject: [PATCH] German preposition contractions --- lib/src/german/AdjectiveGer.gf | 7 ++-- lib/src/german/AdverbGer.gf | 2 +- lib/src/german/CatGer.gf | 12 +++--- lib/src/german/ConjunctionGer.gf | 8 ++-- lib/src/german/IdiomGer.gf | 4 +- lib/src/german/MakeStructuralGer.gf | 2 +- lib/src/german/MorphoGer.gf | 10 +++-- lib/src/german/NounGer.gf | 46 +++++++++++++---------- lib/src/german/ParadigmsGer.gf | 35 +++++++++++++----- lib/src/german/PhraseGer.gf | 4 +- lib/src/german/QuestionGer.gf | 6 +-- lib/src/german/RelativeGer.gf | 7 ++-- lib/src/german/ResGer.gf | 54 +++++++++++++++++++++------ lib/src/german/SentenceGer.gf | 6 +-- lib/src/german/StructuralGer.gf | 57 +++++++++++++++-------------- lib/src/german/SymbolGer.gf | 5 ++- lib/src/german/VerbGer.gf | 5 ++- 17 files changed, 166 insertions(+), 104 deletions(-) diff --git a/lib/src/german/AdjectiveGer.gf b/lib/src/german/AdjectiveGer.gf index a0ced749c..ac0ced3f5 100644 --- a/lib/src/german/AdjectiveGer.gf +++ b/lib/src/german/AdjectiveGer.gf @@ -9,11 +9,11 @@ concrete AdjectiveGer of Adjective = CatGer ** open ResGer, Prelude in { isPre = True } ; ComparA a np = { - s = \\af => a.s ! Compar ! af ++ conjThan ++ np.s ! Nom ; + s = \\af => a.s ! Compar ! af ++ conjThan ++ np.s ! NPC Nom ; isPre = True } ; CAdvAP ad ap np = { - s = \\af => ad.s ++ ap.s ! af ++ ad.p ++ np.s ! Nom ; + s = \\af => ad.s ++ ap.s ! af ++ ad.p ++ np.s ! NPC Nom ; isPre = False } ; UseComparA a = { @@ -33,7 +33,8 @@ concrete AdjectiveGer of Adjective = CatGer ** open ResGer, Prelude in { } ; ReflA2 a = { - s = \\af => a.s ! Posit ! APred ++ appPrep a.c2 (reflPron ! agrP3 Sg) ; --- agr + s = \\af => a.s ! Posit ! APred ++ + appPrep a.c2 (\\k => usePrepC k (\c -> reflPron ! agrP3 Sg ! c)) ; --- agr isPre = True } ; diff --git a/lib/src/german/AdverbGer.gf b/lib/src/german/AdverbGer.gf index 82ccd6193..052c43e19 100644 --- a/lib/src/german/AdverbGer.gf +++ b/lib/src/german/AdverbGer.gf @@ -4,7 +4,7 @@ concrete AdverbGer of Adverb = CatGer ** open ResGer, Prelude in { PositAdvAdj a = {s = a.s ! Posit ! APred} ; ComparAdvAdj cadv a np = { - s = cadv.s ++ a.s ! Posit ! APred ++ cadv.p ++ np.s ! Nom + s = cadv.s ++ a.s ! Posit ! APred ++ cadv.p ++ np.s ! NPC Nom } ; ComparAdvAdjS cadv a s = { s = cadv.s ++ a.s ! Posit ! APred ++ cadv.p ++ s.s ! Sub diff --git a/lib/src/german/CatGer.gf b/lib/src/german/CatGer.gf index f3e6f22cd..853f924e3 100644 --- a/lib/src/german/CatGer.gf +++ b/lib/src/german/CatGer.gf @@ -48,16 +48,16 @@ concrete CatGer of Cat = -- Noun CN = {s : Adjf => Number => Case => Str ; g : Gender} ; - NP = {s : Case => Str ; a : Agr} ; + NP = {s : PCase => Str ; a : Agr} ; Pron = {s : NPForm => Str ; a : Agr} ; - Det = {s,sp : Gender => Case => Str ; n : Number ; a : Adjf} ; + Det = {s,sp : Gender => PCase => Str ; n : Number ; a : Adjf} ; Quant = { - s : Bool => Number => Gender => Case => Str ; - sp : Number => Gender => Case => Str ; + s : Bool => Number => Gender => PCase => Str ; + sp : Number => Gender => PCase => Str ; a : Adjf } ; Predet = { - s : Number => Gender => Case => Str ; + s : Number => Gender => PCase => Str ; c : {p : Str ; k : PredetCase} ; a : PredetAgr -- if an agr is forced, e.g. jeder von uns ist ... } ; @@ -74,7 +74,7 @@ concrete CatGer of Cat = Conj = {s1,s2 : Str ; n : Number} ; Subj = {s : Str} ; - Prep = {s : Str ; c : Case} ; + Prep = {s : Str ; c : PCase} ; -- Open lexical classes, e.g. Lexicon diff --git a/lib/src/german/ConjunctionGer.gf b/lib/src/german/ConjunctionGer.gf index fea313414..dd97c7cca 100644 --- a/lib/src/german/ConjunctionGer.gf +++ b/lib/src/german/ConjunctionGer.gf @@ -9,7 +9,7 @@ concrete ConjunctionGer of Conjunction = ConjAdv conj ss = conjunctDistrSS conj ss ; - ConjNP conj ss = conjunctDistrTable Case conj ss ** { + ConjNP conj ss = conjunctDistrTable PCase conj ss ** { a = Ag Fem (conjNumber conj.n (numberAgr ss.a)) (personAgr ss.a) } ; @@ -28,8 +28,8 @@ concrete ConjunctionGer of Conjunction = ConsS = consrTable Order comma ; BaseAdv = twoSS ; ConsAdv = consrSS comma ; - BaseNP x y = twoTable Case x y ** {a = conjAgr x.a y.a} ; - ConsNP xs x = consrTable Case comma xs x ** {a = conjAgr xs.a x.a} ; + BaseNP x y = twoTable PCase x y ** {a = conjAgr x.a y.a} ; + ConsNP xs x = consrTable PCase comma xs x ** {a = conjAgr xs.a x.a} ; BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre} ; ConsAP xs x = consrTable AForm comma xs x ** {isPre = andB xs.isPre x.isPre} ; BaseRS x y = twoTable GenNum x y ** {c = y.c} ; @@ -38,7 +38,7 @@ concrete ConjunctionGer of Conjunction = lincat [S] = {s1,s2 : Order => Str} ; [Adv] = {s1,s2 : Str} ; - [NP] = {s1,s2 : Case => Str ; a : Agr} ; + [NP] = {s1,s2 : PCase => Str ; a : Agr} ; [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; [RS] = {s1,s2 : GenNum => Str ; c : Case} ; diff --git a/lib/src/german/IdiomGer.gf b/lib/src/german/IdiomGer.gf index ab915e19b..fdca7bc27 100644 --- a/lib/src/german/IdiomGer.gf +++ b/lib/src/german/IdiomGer.gf @@ -9,7 +9,7 @@ concrete IdiomGer of Idiom = CatGer ** CleftNP np rs = mkClause "es" (agrP3 Sg) (insertExtrapos (rs.s ! gennum (genderAgr np.a) (numberAgr np.a)) ---- - (insertObj (\\_ => np.s ! rs.c) (predV MorphoGer.sein_V))) ; + (insertObj (\\_ => np.s ! NPC rs.c) (predV MorphoGer.sein_V))) ; CleftAdv ad s = mkClause "es" (agrP3 Sg) (insertExtrapos (conjThat ++ s.s ! Sub) @@ -41,7 +41,7 @@ concrete IdiomGer of Idiom = CatGer ** } ; ImpP3 np vp = { - s = (mkClause (np.s ! Nom) np.a vp).s ! + s = (mkClause (np.s ! NPC Nom) np.a vp).s ! MConjunct ! Pres ! Simul ! Pos ! Inv } ; diff --git a/lib/src/german/MakeStructuralGer.gf b/lib/src/german/MakeStructuralGer.gf index f5ca6e56e..233958010 100644 --- a/lib/src/german/MakeStructuralGer.gf +++ b/lib/src/german/MakeStructuralGer.gf @@ -17,7 +17,7 @@ oper c = noCase ; a = PAgNone } ; - mkPredet : A -> Str -> Case -> Bool -> Number -> Predet = \a,p,c,b,n -> + mkPredet : A -> Str -> PCase -> Bool -> Number -> Predet = \a,p,c,b,n -> lin Predet { s = appAdj a ; c = {p = p ; k = PredCase c} ; diff --git a/lib/src/german/MorphoGer.gf b/lib/src/german/MorphoGer.gf index c4c28fa1e..bd159d482 100644 --- a/lib/src/german/MorphoGer.gf +++ b/lib/src/german/MorphoGer.gf @@ -16,14 +16,16 @@ oper -- For $StructuralGer$. - mkPrep : Str -> Case -> Preposition = \s,c -> + mkPrep : Str -> PCase -> Preposition = \s,c -> {s = s ; c = c} ; - nameNounPhrase : {s : Case => Str} -> {s : Case => Str ; a : Agr} = \name -> - name ** {a = agrP3 Sg} ; + nameNounPhrase : {s : Case => Str} -> {s : PCase => Str ; a : Agr} = \name -> { + s = \\c => usePrepC c (\k -> name.s ! k) ; + a = agrP3 Sg + } ; detLikeAdj : Number -> Str -> - {s,sp : Gender => Case => Str ; n : Number ; a : Adjf} = \n,dies -> + {s,sp : Gender => PCase => Str ; n : Number ; a : Adjf} = \n,dies -> {s,sp = appAdj (regA dies) ! n ; n = n ; a = Weak} ; mkOrd : {s : Degree => AForm => Str} -> {s : AForm => Str} = \a -> diff --git a/lib/src/german/NounGer.gf b/lib/src/german/NounGer.gf index 216949076..52e819f0d 100644 --- a/lib/src/german/NounGer.gf +++ b/lib/src/german/NounGer.gf @@ -4,7 +4,8 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { lin DetCN det cn = { - s = \\c => det.s ! cn.g ! c ++ cn.s ! adjfCase det.a c ! det.n ! c ; + s = \\c => det.s ! cn.g ! c ++ + (let k = (prepC c).c in cn.s ! adjfCase det.a k ! det.n ! k) ; a = agrgP3 cn.g det.n ; isPron = False } ; @@ -15,10 +16,13 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { isPron = False } ; - UsePN pn = pn ** {a = agrP3 Sg} ; + UsePN pn = { + s = \\c => usePrepC c (\k -> pn.s ! k) ; + a = agrP3 Sg + } ; UsePron pron = { - s = \\c => pron.s ! NPCase c ; + s = \\c => usePrepC c (\k -> pron.s ! NPCase k) ; a = pron.a } ; @@ -45,10 +49,10 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { n = num.n ; a = quant.a in { - s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ - num.s!g!c ++ ord.s ! agrAdj g (adjfCase a c) n c ; - sp = \\g,c => quant.sp ! n ! g ! c ++ - num.s!g!c ++ ord.s ! agrAdj g (adjfCase a c) n c ; + s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ (let k = (prepC c).c in + num.s!g!k ++ ord.s ! agrAdj g (adjfCase a k) n k) ; + sp = \\g,c => quant.sp ! n ! g ! c ++ (let k = (prepC c).c in + num.s!g!k ++ ord.s ! agrAdj g (adjfCase a k) n k) ; n = n ; a = a } ; @@ -58,16 +62,18 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { n = num.n ; a = quant.a in { - s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ num.s!g!c ; - sp = \\g,c => quant.sp ! n ! g ! c ++ num.s!g!c ; + s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ (let k = (prepC c).c in + num.s!g!k) ; + sp = \\g,c => quant.sp ! n ! g ! c ++ (let k = (prepC c).c in + num.s!g!k) ; n = n ; a = a } ; PossPron p = { - s = \\_,n,g,c => p.s ! NPPoss (gennum g n) c ; - sp = \\n,g,c => p.s ! NPPoss (gennum g n) c ; + s = \\_,n,g,c => usePrepC c (\k -> p.s ! NPPoss (gennum g n) k) ; + sp = \\n,g,c => usePrepC c (\k -> p.s ! NPPoss (gennum g n) k) ; a = Strong --- need separately weak for Pl ? } ; @@ -87,28 +93,28 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { OrdSuperl a = {s = a.s ! Superl} ; DefArt = { - s = \\_,n,g,c => artDef ! gennum g n ! c ; - sp = \\n,g,c => artDef ! gennum g n ! c ; ---- deren, denem... + s = \\_,n,g,c => artDefContr (gennum g n) c ; + sp = \\n,g,c => artDefContr (gennum g n) c ; ---- deren, denem... a = Weak } ; IndefArt = { s = table { - True => \\_,_,_ => [] ; + True => \\_,_,c => usePrepC c (\k -> []) ; False => table { - Sg => \\g,c => "ein" + pronEnding ! GSg g ! c ; - Pl => \\_,_ => [] + Sg => \\g,c => usePrepC c (\k -> "ein" + pronEnding ! GSg g ! k) ; + Pl => \\_,c => usePrepC c (\k -> []) } } ; sp = table { - Sg => \\g,c => "ein" + pronEnding ! GSg g ! c ; - Pl => \\_ => caselist "einige" "einige" "einigen" "einiger" + Sg => \\g,c => usePrepC c (\k -> "ein" + pronEnding ! GSg g ! k) ; + Pl => \\_,c => usePrepC c (\k -> caselist "einige" "einige" "einigen" "einiger" ! k) } ; a = Strong } ; MassNP cn = { - s = \\c => cn.s ! adjfCase Strong c ! Sg ! c ; + s = \\c => usePrepC c (\k -> cn.s ! adjfCase Strong k ! Sg ! k) ; a = agrP3 Sg ; isPron = False } ; @@ -175,7 +181,7 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { } ; ApposCN cn np = let g = cn.g in { - s = \\a,n,c => cn.s ! a ! n ! c ++ np.s ! c ; + s = \\a,n,c => cn.s ! a ! n ! c ++ np.s ! NPC c ; g = g ; isMod = cn.isMod } ; diff --git a/lib/src/german/ParadigmsGer.gf b/lib/src/german/ParadigmsGer.gf index b2c6840b3..5a50fe363 100644 --- a/lib/src/german/ParadigmsGer.gf +++ b/lib/src/german/ParadigmsGer.gf @@ -47,6 +47,11 @@ oper dative : Case ; genitive : Case ; + anDat_Case : Case ; + inAcc_Case : Case ; + inDat_Case : Case ; + zuDat_Case : Case ; + -- To abstract over number names, we define the following. Number : Type ; @@ -156,7 +161,7 @@ mkN : overload { -- A preposition is formed from a string and a case. - mkPrep : Str -> Case -> Prep ; + mkPrep : Str -> PCase -> Prep ; -- Often just a case with the empty string is enough. @@ -164,10 +169,13 @@ mkN : overload { datPrep : Prep ; genPrep : Prep ; --- A couple of common prepositions (always with the dative). +-- A couple of common prepositions (the first two always with the dative). von_Prep : Prep ; zu_Prep : Prep ; + anDat_Prep : Prep ; + inDat_Prep : Prep ; + inAcc_Prep : Prep ; --2 Verbs @@ -287,15 +295,20 @@ mkV2 : overload { Gender = MorphoGer.Gender ; - Case = MorphoGer.Case ; + Case = MorphoGer.PCase ; Number = MorphoGer.Number ; masculine = Masc ; feminine = Fem ; neuter = Neutr ; - nominative = Nom ; - accusative = Acc ; - dative = Dat ; - genitive = Gen ; + nominative = NPC Nom ; + accusative = NPC Acc ; + dative = NPC Dat ; + genitive = NPC Gen ; + anDat_Case = NPP CAnDat ; + inAcc_Case = NPP CInAcc ; + inDat_Case = NPP CInDat ; + zuDat_Case = NPP CZuDat ; + singular = Sg ; plural = Pl ; @@ -386,7 +399,11 @@ mkV2 : overload { datPrep = mkPrep [] dative ; genPrep = mkPrep [] genitive ; von_Prep = mkPrep "von" dative ; - zu_Prep = mkPrep "zu" dative ; + zu_Prep = mkPrep [] zuDat_Case ; + anDat_Prep = mkPrep [] anDat_Case ; + inDat_Prep = mkPrep [] inDat_Case ; + inAcc_Prep = mkPrep [] inAcc_Case ; + mk6V geben gibt gib gab gaebe gegeben = let @@ -424,7 +441,7 @@ mkV2 : overload { seinV v = {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VSein ; vtype = v.vtype} ; reflV v c = - {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VHaben ; vtype = VRefl c} ; + {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VHaben ; vtype = VRefl (prepC c).c} ; no_geV v = let vs = v.s in { s = table { diff --git a/lib/src/german/PhraseGer.gf b/lib/src/german/PhraseGer.gf index 2b7a67214..8a14fabfd 100644 --- a/lib/src/german/PhraseGer.gf +++ b/lib/src/german/PhraseGer.gf @@ -13,7 +13,7 @@ concrete PhraseGer of Phrase = CatGer ** open Prelude, ResGer in { UttIP ip = {s = ip.s ! Nom} ; --- Acc also UttIAdv iadv = iadv ; - UttNP np = {s = np.s ! Nom} ; + UttNP np = {s = np.s ! NPC Nom} ; UttVP vp = {s = useInfVP True vp} ; -- without zu UttAdv adv = adv ; UttCN n = {s = n.s ! Strong ! Sg ! Nom} ; @@ -24,6 +24,6 @@ concrete PhraseGer of Phrase = CatGer ** open Prelude, ResGer in { PConjConj conj = ss (conj.s2) ; NoVoc = {s = []} ; - VocNP np = {s = "," ++ np.s ! Nom} ; + VocNP np = {s = "," ++ np.s ! NPC Nom} ; } diff --git a/lib/src/german/QuestionGer.gf b/lib/src/german/QuestionGer.gf index 280f8f88a..667362766 100644 --- a/lib/src/german/QuestionGer.gf +++ b/lib/src/german/QuestionGer.gf @@ -28,7 +28,7 @@ concrete QuestionGer of Question = CatGer ** open ResGer in { s = \\m,t,a,p => let cls = slash.s ! m ! t ! a ! p ; - who = appPrep slash.c2 ip.s + who = appPrep slash.c2 (\\k => usePrepC k (\c -> ip.s ! c)) ; in table { QDir => who ++ cls ! Inv ; QIndir => who ++ cls ! Sub @@ -50,7 +50,7 @@ concrete QuestionGer of Question = CatGer ** open ResGer in { s = \\m,t,a,p => let vp = predV sein_V ; - cls = (mkClause (np.s ! Nom) np.a vp).s ! m ! t ! a ! p ; + cls = (mkClause (np.s ! NPC Nom) np.a vp).s ! m ! t ! a ! p ; why = icomp.s ! np.a in table { QDir => why ++ cls ! Inv ; @@ -59,7 +59,7 @@ concrete QuestionGer of Question = CatGer ** open ResGer in { } ; PrepIP p ip = { - s = appPrep p ip.s + s = appPrep p (\\k => usePrepC k (\c -> ip.s ! c)) ; } ; AdvIP ip adv = { diff --git a/lib/src/german/RelativeGer.gf b/lib/src/german/RelativeGer.gf index df065913c..80b473981 100644 --- a/lib/src/german/RelativeGer.gf +++ b/lib/src/german/RelativeGer.gf @@ -24,12 +24,13 @@ concrete RelativeGer of Relative = CatGer ** open ResGer in { RelSlash rp slash = { s = \\m,t,a,p,gn => - appPrep slash.c2 (rp.s ! gn) ++ slash.s ! m ! t ! a ! p ! Sub ; - c = slash.c2.c + appPrep slash.c2 (\\k => usePrepC k (\c -> rp.s ! gn ! c)) ++ + slash.s ! m ! t ! a ! p ! Sub ; + c = (prepC slash.c2.c).c } ; FunRP p np rp = { - s = \\gn,c => np.s ! c ++ appPrep p (rp.s ! gn) ; + s = \\gn,c => np.s ! NPC c ++ appPrep p (\\k => usePrepC k (\c -> rp.s ! gn ! c)) ; a = RAg (numberAgr np.a) (personAgr np.a) } ; diff --git a/lib/src/german/ResGer.gf b/lib/src/german/ResGer.gf index a6573071a..2bb8a1125 100644 --- a/lib/src/german/ResGer.gf +++ b/lib/src/german/ResGer.gf @@ -33,6 +33,24 @@ resource ResGer = ParamX ** open Prelude in { Agr = Ag Gender Number Person ; +-- Case of $NP$ extended to deal with contractions like "zur", "im". + + PCase = NPC Case | NPP CPrep ; + CPrep = CAnDat | CInAcc | CInDat | CZuDat ; + + oper + NPNom : PCase = NPC Nom ; + prepC : PCase -> {s : Str ; c : Case} = \cp -> case cp of { + NPC c => {s = [] ; c = c} ; + NPP CAnDat => {s = "an" ; c = Dat} ; + NPP CInAcc => {s = "an" ; c = Acc} ; + NPP CInDat => {s = "in" ; c = Dat} ; + NPP CZuDat => {s = "zu" ; c = Dat} + } ; + + usePrepC : PCase -> (Case -> Str) -> Str = \c,fs -> + let sc = prepC c in sc.s ++ fs sc.c ; + oper mkAgr : {g : Gender ; n : Number ; p : Person} -> Agr = \r -> Ag r.g r.n r.p ; @@ -50,7 +68,7 @@ resource ResGer = ParamX ** open Prelude in { -- sometimes forced ("jeder von Mwnschen"). param - PredetCase = NoCase | PredCase Case ; + PredetCase = NoCase | PredCase PCase ; PredetAgr = PAg Number | PAgNone ; oper noCase : {p : Str ; k : PredetCase} = {p = [] ; k = NoCase} ; @@ -319,17 +337,17 @@ resource ResGer = ParamX ** open Prelude in { -- Prepositions for complements indicate the complement case. - Preposition : Type = {s : Str ; c : Case} ; + Preposition : Type = {s : Str ; c : PCase} ; -- To apply a preposition to a complement. - appPrep : Preposition -> (Case => Str) -> Str = \prep,arg -> + appPrep : Preposition -> (PCase => Str) -> Str = \prep,arg -> prep.s ++ arg ! prep.c ; -- To build a preposition from just a case. noPreposition : Case -> Preposition = \c -> - {s = [] ; c = c} ; + {s = [] ; c = NPC c} ; -- Pronouns and articles -- Here we define personal and relative pronouns. @@ -349,28 +367,42 @@ resource ResGer = ParamX ** open Prelude in { pronEnding : GenNum => Case => Str = table { GSg Masc => caselist "" "en" "em" "es" ; GSg Fem => caselist "e" "e" "er" "er" ; - GSg Neut => caselist "" "" "em" "es" ; + GSg Neutr => caselist "" "" "em" "es" ; GPl => caselist "e" "e" "en" "er" } ; artDef : GenNum => Case => Str = table { GSg Masc => caselist "der" "den" "dem" "des" ; GSg Fem => caselist "die" "die" "der" "der" ; - GSg Neut => caselist "das" "das" "dem" "des" ; + GSg Neutr => caselist "das" "das" "dem" "des" ; GPl => caselist "die" "die" "den" "der" } ; + artDefContr : GenNum -> PCase -> Str = \gn,np -> case np of { + NPC c => artDef ! gn ! c ; + NPP p => case of { + => "am" ; + => "ins" ; + => "im" ; + => "zum" ; + => "zum" ; + => "zur" ; + _ => let sp = prepC np in sp.s ++ artDef ! gn ! sp.c + } + } ; + + -- This is used when forming determiners that are like adjectives. - appAdj : Adjective -> Number => Gender => Case => Str = \adj -> + appAdj : Adjective -> Number => Gender => PCase => Str = \adj -> let ad : GenNum -> Case -> Str = \gn,c -> adj.s ! Posit ! AMod gn c in - \\n,g,c => case n of { - Sg => ad (GSg g) c ; - _ => ad GPl c - } ; + \\n,g,c => usePrepC c (\k -> case n of { + Sg => ad (GSg g) k ; + _ => ad GPl k + }) ; -- This auxiliary gives the forms in each degree of adjectives. diff --git a/lib/src/german/SentenceGer.gf b/lib/src/german/SentenceGer.gf index d0ae26676..6e13c97d1 100644 --- a/lib/src/german/SentenceGer.gf +++ b/lib/src/german/SentenceGer.gf @@ -4,7 +4,7 @@ concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in { lin - PredVP np vp = mkClause (np.s ! Nom) np.a vp ; + PredVP np vp = mkClause (np.s ! NPC Nom) np.a vp ; PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ; @@ -25,7 +25,7 @@ concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in { SlashVP np vp = mkClause - (np.s ! Nom) np.a + (np.s ! NPC Nom) np.a vp ** {c2 = vp.c2} ; @@ -37,7 +37,7 @@ concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in { SlashPrep cl prep = cl ** {c2 = prep} ; SlashVS np vs slash = - mkClause (np.s ! Nom) np.a + mkClause (np.s ! NPC Nom) np.a (insertExtrapos (conjThat ++ slash.s ! Sub) (predV vs)) ** {c2 = slash.c2} ; diff --git a/lib/src/german/StructuralGer.gf b/lib/src/german/StructuralGer.gf index eb7cd926f..03fea3d69 100644 --- a/lib/src/german/StructuralGer.gf +++ b/lib/src/german/StructuralGer.gf @@ -7,28 +7,28 @@ concrete StructuralGer of Structural = CatGer ** lin - above_Prep = mkPrep "über" Dat ; - after_Prep = mkPrep "nach" Dat ; + above_Prep = mkPrep "über" P.dative ; + after_Prep = mkPrep "nach" P.dative ; all_Predet = {s = appAdj (regA "all") ; c = noCase ; a = PAgNone} ; almost_AdA, almost_AdN = ss "fast" ; although_Subj = ss "obwohl" ; always_AdV = ss "immer" ; and_Conj = {s1 = [] ; s2 = "und" ; n = Pl} ; because_Subj = ss "weil" ; - before_Prep = mkPrep "vor" Dat ; - behind_Prep = mkPrep "hinter" Dat ; - between_Prep = mkPrep "zwischen" Dat ; + before_Prep = mkPrep "vor" P.dative ; + behind_Prep = mkPrep "hinter" P.dative ; + between_Prep = mkPrep "zwischen" P.dative ; both7and_DConj = sd2 "sowohl" ["als auch"] ** {n = Pl} ; but_PConj = ss "aber" ; - by8agent_Prep = mkPrep "durch" Acc ; - by8means_Prep = mkPrep "mit" Dat ; + by8agent_Prep = mkPrep "durch" P.accusative ; + by8means_Prep = mkPrep "mit" P.dative ; can8know_VV, can_VV = auxVV (mkV "können" "kann" "kannst" "kann" "könnt" "könn" "konnte" "konntest" "konnten" "konntet" "könnte" "gekonnt" [] VHaben) ; - during_Prep = mkPrep "während" Gen ; + during_Prep = mkPrep "während" P.genitive ; either7or_DConj = sd2 "entweder" "oder" ** {n = Sg} ; everybody_NP = nameNounPhrase {s = caselist "jeder" "jeden" "jedem" "jedes"} ; every_Det = detLikeAdj Sg "jed" ; @@ -36,19 +36,19 @@ concrete StructuralGer of Structural = CatGer ** everywhere_Adv = ss "überall" ; few_Det = detLikeAdj Pl "wenig" ; ---- first_Ord = {s = (regA "erst").s ! Posit} ; - for_Prep = mkPrep "für" Acc ; - from_Prep = mkPrep "aus" Dat ; + for_Prep = mkPrep "für" P.accusative ; + from_Prep = mkPrep "aus" P.dative ; he_Pron = mkPronPers "er" "ihn" "ihm" "seiner" "sein" Masc Sg P3 ; here7to_Adv = ss ["hierher"] ; here7from_Adv = ss ["hieraus"] ; here_Adv = ss "hier" ; how_IAdv = ss "wie" ; how8much_IAdv = ss "wieviel" ; - how8many_IDet = detLikeAdj Pl "wieviel" ; + how8many_IDet = {s = \\g,c => (detLikeAdj Pl "wieviel").s ! g ! NPC c ; n = Pl} ; if_Subj = ss "wenn" ; - in8front_Prep = mkPrep "vor" Dat ; + in8front_Prep = mkPrep "vor" P.dative ; i_Pron = mkPronPers "ich" "mich" "mir" "meiner" "mein" Masc Sg P1 ; - in_Prep = mkPrep "in" Dat ; + in_Prep = mkPrep [] (NPP CInDat) ; it_Pron = mkPronPers "es" "es" "ihm" "seiner" "sein" Neutr Sg P3 ; less_CAdv = X.mkCAdv "weniger" "als" ; many_Det = detLikeAdj Pl "viel" ; @@ -65,26 +65,27 @@ concrete StructuralGer of Structural = CatGer ** only_Predet = {s = \\_,_,_ => "nur" ; c = noCase ; a = PAgNone} ; no_Utt = ss "nein" ; ---b no_Phr = ss "nein" ; - on_Prep = mkPrep "auf" Dat ; + on_Prep = mkPrep "auf" P.dative ; or_Conj = {s1 = [] ; s2 = "oder" ; n = Sg} ; otherwise_PConj = ss "sonst" ; - part_Prep = mkPrep "von" Dat ; + part_Prep = mkPrep "von" P.dative ; please_Voc = ss "bitte" ; - possess_Prep = mkPrep "von" Dat ; + possess_Prep = mkPrep "von" P.dative ; quite_Adv = ss "ziemlich" ; she_Pron = mkPronPers "sie" "sie" "ihr" "ihrer" "ihr" Fem Sg P3 ; so_AdA = ss "so" ; somebody_NP = nameNounPhrase {s = caselist "jemand" "jemanden" "jemandem" "jemands"} ; somePl_Det = detLikeAdj Pl "einig" ; someSg_Det = { - s,sp = \\g,c => "ein" + pronEnding ! GSg g ! c ; ---- einer,eines + s,sp = \\g,c => + usePrepC c (\k -> "ein" + pronEnding ! GSg g ! k) ; ---- einer,eines n = Sg ; a = Strong } ; something_NP = nameNounPhrase {s = \\_ => "etwas"} ; somewhere_Adv = ss "irgendwo" ; that_Quant = let - jener : Number => Gender => Case => Str = \\n => (detLikeAdj n "jen").s in + jener : Number => Gender => PCase => Str = \\n => (detLikeAdj n "jen").s in {s = \\_ => jener ; sp = jener ; a = Weak} ; ---b that_NP = nameNounPhrase {s = caselist "das" "das" "denem" "dessen"} ; ---- there_Adv = ss "da" ; @@ -94,14 +95,14 @@ concrete StructuralGer of Structural = CatGer ** ---b these_NP = {s = caselist "diese" "diese" "diesen" "dieser" ; a = agrP3 Pl} ; they_Pron = mkPronPers "sie" "sie" "ihnen" "ihrer" "ihr" Fem Pl P3 ; this_Quant = let - dieser : Number => Gender => Case => Str = \\n => (detLikeAdj n "dies").s in + dieser : Number => Gender => PCase => Str = \\n => (detLikeAdj n "dies").s in {s = \\_ => dieser ; sp = dieser ; a = Weak} ; ---b this_NP = nameNounPhrase {s = caselist "dies" "dies" "diesem" "dieses"} ; ---- ---b those_NP = {s = caselist "jene" "jene" "jenen" "jener" ; a = agrP3 Pl} ; - through_Prep = mkPrep "durch" Acc ; + through_Prep = mkPrep "durch" P.accusative ; too_AdA = ss "zu" ; - to_Prep = mkPrep "nach" Dat ; - under_Prep = mkPrep "unter" Dat ; + to_Prep = mkPrep "nach" P.dative ; + under_Prep = mkPrep "unter" P.dative ; very_AdA = ss "sehr" ; want_VV = auxVV (mkV @@ -117,13 +118,13 @@ concrete StructuralGer of Structural = CatGer ** when_IAdv = ss "wann" ; when_Subj = ss "wenn" ; where_IAdv = ss "wo" ; - which_IQuant = {s = \\n => (detLikeAdj n "welch").s} ; + which_IQuant = {s = \\n,g,c => (detLikeAdj n "welch").s ! g ! NPC c} ; whoSg_IP = {s = caselist "wer" "wen" "wem" "wessen" ; n = Sg} ; whoPl_IP = {s = caselist "wer" "wen" "wem" "wessen" ; n = Pl} ; why_IAdv = ss "warum" ; - without_Prep = mkPrep "ohne" Acc ; - with_Prep = mkPrep "mit" Dat ; + without_Prep = mkPrep "ohne" P.accusative ; + with_Prep = mkPrep "mit" P.dative ; youSg_Pron = mkPronPers "du" "dich" "dir" "deiner" "dein" Fem Sg P2 ; youPl_Pron = mkPronPers "ihr" "euch" "euch" "eurer" "euer" Fem Pl P2 ; ---- poss youPol_Pron = mkPronPers "Sie" "Sie" "Ihnen" "Ihrer" "Ihr" Fem Pl P3 ; @@ -131,8 +132,8 @@ concrete StructuralGer of Structural = CatGer ** not_Predet = {s = \\_,_,_ => "nicht" ; c = noCase ; a = PAgNone} ; no_Quant = let - keiner : Number => Gender => Case => Str = table { - Sg => \\g,c => "kein" + pronEnding ! GSg g ! c ; + keiner : Number => Gender => PCase => Str = table { + Sg => \\g,c => usePrepC c (\k -> "kein" + pronEnding ! GSg g ! k) ; Pl => (detLikeAdj Pl "kein").s } in @@ -144,7 +145,7 @@ concrete StructuralGer of Structural = CatGer ** nameNounPhrase {s = \\_ => "nichts"} ; at_least_AdN = ss "wenigstens" ; at_most_AdN = ss "höchstens" ; - except_Prep = mkPrep "außer" Dat ; + except_Prep = mkPrep "außer" P.dative ; as_CAdv = X.mkCAdv "ebenso" "wie" ; have_V2 = P.dirV2 IrregGer.haben_V ; diff --git a/lib/src/german/SymbolGer.gf b/lib/src/german/SymbolGer.gf index 429869ffd..b8653fac6 100644 --- a/lib/src/german/SymbolGer.gf +++ b/lib/src/german/SymbolGer.gf @@ -14,12 +14,13 @@ lin isPron = False } ; CNSymbNP det cn xs = let g = cn.g in { - s = \\c => det.s ! g ! c ++ cn.s ! adjfCase det.a c ! det.n ! c ++ xs.s ; + s = \\c => det.s ! g ! c ++ + (let k = (prepC c).c in cn.s ! adjfCase det.a k ! det.n ! k) ++ xs.s ; a = agrP3 det.n ; isPron = False } ; CNNumNP cn i = { - s = \\c => artDef ! (GSg cn.g) ! c ++ cn.s ! Weak ! Sg ! Nom ++ i.s ! Neutr ! c ; + s = \\c => artDefContr (GSg cn.g) c ++ cn.s ! Weak ! Sg ! Nom ++ i.s ! Neutr ! (prepC c).c ; a = agrP3 Sg ; isPron = False } ; diff --git a/lib/src/german/VerbGer.gf b/lib/src/german/VerbGer.gf index 83b7ae9e5..0542e7cd6 100644 --- a/lib/src/german/VerbGer.gf +++ b/lib/src/german/VerbGer.gf @@ -67,13 +67,14 @@ concrete VerbGer of Verb = CatGer ** open Prelude, ResGer in { -- we want to say "ich liebe sie nicht" but not "ich bin alt nicht" CompAP ap = {s = \\_ => ap.s ! APred} ; - CompNP np = {s = \\_ => np.s ! Nom} ; + CompNP np = {s = \\_ => np.s ! NPC Nom} ; CompAdv a = {s = \\_ => a.s} ; AdvVP vp adv = insertAdv adv.s vp ; AdVVP adv vp = insertAdV adv.s vp ; - ReflVP vp = insertObj (\\a => appPrep vp.c2 (reflPron ! a)) vp ; + ReflVP vp = insertObj (\\a => appPrep vp.c2 + (\\k => usePrepC k (\c -> reflPron ! a ! c))) vp ; PassV2 v = insertInf (v.s ! VPastPart APred) (predV werdenPass) ;