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 {
+