From 403bec9f16e527aec86e239d91c5742400c53a07 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 16 Dec 2009 15:45:29 +0000 Subject: [PATCH] replaced German Agr record by an algebraic type --- lib/src/german/ConjunctionGer.gf | 2 +- lib/src/german/IdiomGer.gf | 4 +- lib/src/german/NounGer.gf | 5 ++- lib/src/german/RelativeGer.gf | 4 +- lib/src/german/ResGer.gf | 68 ++++++++++++++++++++------------ lib/src/german/SentenceGer.gf | 2 +- 6 files changed, 51 insertions(+), 34 deletions(-) diff --git a/lib/src/german/ConjunctionGer.gf b/lib/src/german/ConjunctionGer.gf index 3aea69d1d..fea313414 100644 --- a/lib/src/german/ConjunctionGer.gf +++ b/lib/src/german/ConjunctionGer.gf @@ -10,7 +10,7 @@ concrete ConjunctionGer of Conjunction = ConjAdv conj ss = conjunctDistrSS conj ss ; ConjNP conj ss = conjunctDistrTable Case conj ss ** { - a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} + a = Ag Fem (conjNumber conj.n (numberAgr ss.a)) (personAgr ss.a) } ; ConjAP conj ss = conjunctDistrTable AForm conj ss ** { diff --git a/lib/src/german/IdiomGer.gf b/lib/src/german/IdiomGer.gf index 874eaa626..ab915e19b 100644 --- a/lib/src/german/IdiomGer.gf +++ b/lib/src/german/IdiomGer.gf @@ -8,7 +8,7 @@ concrete IdiomGer of Idiom = CatGer ** GenericCl vp = mkClause "man" (agrP3 Sg) vp ; CleftNP np rs = mkClause "es" (agrP3 Sg) - (insertExtrapos (rs.s ! gennum np.a.g np.a.n) ---- + (insertExtrapos (rs.s ! gennum (genderAgr np.a) (numberAgr np.a)) ---- (insertObj (\\_ => np.s ! rs.c) (predV MorphoGer.sein_V))) ; CleftAdv ad s = mkClause "es" (agrP3 Sg) @@ -36,7 +36,7 @@ concrete IdiomGer of Idiom = CatGer ** ProgrVP = insertAdv "eben" ; ---- ImpPl1 vp = {s = - (mkClause "wir" {g = Fem ; n = Pl ; p = P1} vp).s ! + (mkClause "wir" (Ag Fem Pl P1) vp).s ! MConjunct ! Pres ! Simul ! Pos ! Inv } ; diff --git a/lib/src/german/NounGer.gf b/lib/src/german/NounGer.gf index a25167d72..a34a95a5e 100644 --- a/lib/src/german/NounGer.gf +++ b/lib/src/german/NounGer.gf @@ -25,7 +25,7 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { PredetNP pred np = { s = \\c0 => let c = case pred.c of {NoCase => c0 ; PredCase k => k} in - pred.s ! np.a.n ! Masc ! c0 ++ np.s ! c ; ---- g + pred.s ! numberAgr np.a ! Masc ! c0 ++ np.s ! c ; ---- g a = np.a } ; @@ -157,7 +157,8 @@ concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { } ; RelNP np rs = { - s = \\c => np.s ! c ++ "," ++ rs.s ! gennum np.a.g np.a.n ; + s = \\c => np.s ! c ++ "," ++ + rs.s ! gennum (genderAgr np.a) (numberAgr np.a) ; a = np.a ; isPron = False } ; diff --git a/lib/src/german/RelativeGer.gf b/lib/src/german/RelativeGer.gf index 2605ed3a4..df065913c 100644 --- a/lib/src/german/RelativeGer.gf +++ b/lib/src/german/RelativeGer.gf @@ -14,7 +14,7 @@ concrete RelativeGer of Relative = CatGer ** open ResGer in { let agr = case rp.a of { RNoAg => agrP3 (numGenNum gn) ; - RAg a => a ** {g = Neutr} + RAg n p => Ag Neutr n p } ; cl = mkClause (rp.s ! gn ! Nom) agr vp in @@ -30,7 +30,7 @@ concrete RelativeGer of Relative = CatGer ** open ResGer in { FunRP p np rp = { s = \\gn,c => np.s ! c ++ appPrep p (rp.s ! gn) ; - a = RAg {n = np.a.n ; p = np.a.p} + a = RAg (numberAgr np.a) (personAgr np.a) } ; IdRP = {s = relPron ; a = RNoAg} ; diff --git a/lib/src/german/ResGer.gf b/lib/src/german/ResGer.gf index ea87cabbd..39f242750 100644 --- a/lib/src/german/ResGer.gf +++ b/lib/src/german/ResGer.gf @@ -29,9 +29,16 @@ resource ResGer = ParamX ** open Prelude in { GenNum = GSg Gender | GPl ; --- Agreement of $NP$ is a record. +-- Agreement of $NP$ has three parts. - oper Agr = {g : Gender ; n : Number ; p : Person} ; + Agr = Ag Gender Number Person ; + + oper + mkAgr : {g : Gender ; n : Number ; p : Person} -> Agr = \r -> + Ag r.g r.n r.p ; + genderAgr : Agr -> Gender = \r -> case r of {Ag g _ _ => g} ; + numberAgr : Agr -> Number = \r -> case r of {Ag _ n _ => n} ; + personAgr : Agr -> Person = \r -> case r of {Ag _ _ p => p} ; -- Pronouns are the worst-case noun phrases, which have both case -- and possessive forms. @@ -87,7 +94,7 @@ resource ResGer = ParamX ** open Prelude in { --2 For $Relative$ - RAgr = RNoAg | RAg {n : Number ; p : Person} ; + RAgr = RNoAg | RAg Number Person ; --2 For $Numeral$ @@ -100,7 +107,7 @@ resource ResGer = ParamX ** open Prelude in { agrP3 : Number -> Agr = agrgP3 Neutr ; agrgP3 : Gender -> Number -> Agr = \g,n -> - {g = g ; n = n ; p = P3} ; + Ag g n P3 ; gennum : Gender -> Number -> GenNum = \g,n -> case n of { @@ -142,19 +149,23 @@ resource ResGer = ParamX ** open Prelude in { } ; vFin : Bool -> Mood -> Tense -> Agr -> VForm = \b,m,t,a -> + let + an = numberAgr a ; + ap = personAgr a ; + in case of { - => VFin b (VPresInd a.n a.p) ; - => VFin b (VPresSubj a.n a.p) + => VFin b (VPresInd an ap) ; + => VFin b (VPresSubj an ap) ; --# notpresent - => VFin b (VImpfInd a.n a.p) ; --# notpresent - => VFin b (VImpfSubj a.n a.p) ; --# notpresent + => VFin b (VImpfInd an ap) ; --# notpresent + => VFin b (VImpfSubj an ap) ; --# notpresent _ => VInf False --# notpresent } ; - conjAgr : Agr -> Agr -> Agr = \a,b -> { + conjAgr : Agr -> Agr -> Agr = \a,b -> mkAgr { g = Neutr ; ---- - n = conjNumber a.n b.n ; - p = conjPerson a.p b.p + n = conjNumber (numberAgr a) (numberAgr b) ; + p = conjPerson (personAgr a) (personAgr b) } ; -- For $Lex$. @@ -326,7 +337,7 @@ resource ResGer = ParamX ** open Prelude in { NPCase c => caselist ich mich mir meiner ! c ; NPPoss gn c => mein + pronEnding ! gn ! c } ; - a = {g = g ; n = n ; p = p} + a = Ag g n p } ; pronEnding : GenNum => Case => Str = table { @@ -405,12 +416,17 @@ resource ResGer = ParamX ** open Prelude in { vHaben ! vFin False m t a ; haben : Str = vHaben ! VInf False ; - wird : Mood -> Agr -> Str = \m,a -> case m of { - MIndic => werden_V.s ! VFin False (VPresInd a.n a.p) ; - MConjunct => werden_V.s ! VFin False (VPresSubj a.n a.p) + wird : Mood -> Agr -> Str = \m,a -> + let + an = numberAgr a ; + ap = personAgr a ; + in + case m of { + MIndic => werden_V.s ! VFin False (VPresInd an ap) ; + MConjunct => werden_V.s ! VFin False (VPresSubj an ap) } ; - wuerde : Agr -> Str = \a -> --# notpresent - werden_V.s ! VFin False (VImpfSubj a.n a.p) ; --# notpresent + wuerde : Agr -> Str = \a -> --# notpresent + werden_V.s ! VFin False (VImpfSubj (numberAgr a) (personAgr a)) ; --# notpresent auf = verb.prefix ; @@ -433,7 +449,7 @@ resource ResGer = ParamX ** open Prelude in { Fut => vf True (wird m a) (vpart ++ haben) ; --# notpresent Cond => vf True (wuerde a) (vpart ++ haben) --# notpresent } ; --# notpresent - VPImperat False => vf False (verb.s ! VImper a.n) [] ; + VPImperat False => vf False (verb.s ! VImper (numberAgr a)) [] ; VPImperat True => vf False (verb.s ! VFin False (VPresSubj Pl P3)) [] ; VPInfinit Anter => vf True [] (vpart ++ haben) ; --# notpresent VPInfinit Simul => vf True [] (verb.s ! VInf b) @@ -617,14 +633,14 @@ resource ResGer = ParamX ** open Prelude in { -- be needed. reflPron : Agr => Case => Str = table { - {n = Sg ; p = P1} => caselist "ich" "mich" "mir" "meiner" ; - {n = Sg ; p = P2} => caselist "du" "dich" "dir" "deiner" ; - {g = Masc ; n = Sg ; p = P3} => caselist "er" "sich" "sich" "seiner" ; - {g = Fem ; n = Sg ; p = P3} => caselist "sie" "sich" "sich" "ihrer" ; - {g = Neutr ; n = Sg ; p = P3} => caselist "es" "sich" "sich" "seiner" ; - {n = Pl ; p = P1} => caselist "wir" "uns" "uns" "unser" ; - {n = Pl ; p = P2} => caselist "ihr" "euch" "euch" "euer" ; - {n = Pl ; p = P3} => caselist "sie" "sich" "sich" "ihrer" + Ag _ Sg P1 => caselist "ich" "mich" "mir" "meiner" ; + Ag _ Sg P2 => caselist "du" "dich" "dir" "deiner" ; + Ag Masc Sg P3 => caselist "er" "sich" "sich" "seiner" ; + Ag Fem Sg P3 => caselist "sie" "sich" "sich" "ihrer" ; + Ag Neutr Sg P3 => caselist "es" "sich" "sich" "seiner" ; + Ag _ Pl P1 => caselist "wir" "uns" "uns" "unser" ; + Ag _ Pl P2 => caselist "ihr" "euch" "euch" "euer" ; + Ag _ Pl P3 => caselist "sie" "sich" "sich" "ihrer" } ; conjThat : Str = "daß" ; diff --git a/lib/src/german/SentenceGer.gf b/lib/src/german/SentenceGer.gf index b79938b1c..6b88a1b3f 100644 --- a/lib/src/german/SentenceGer.gf +++ b/lib/src/german/SentenceGer.gf @@ -15,7 +15,7 @@ concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in { ImpF _ True => ; -- setzen Sie sich _ => } ; - agr = {g = Fem ; n = numImp n ; p = ps.p1} ; --- g does not matter + agr = Ag Fem (numImp n) ps.p1 ; --- g does not matter verb = vps.s ! False ! agr ! VPImperat ps.p3 ; inf = vp.inf ++ verb.inf ; in