replaced German Agr record by an algebraic type

This commit is contained in:
aarne
2009-12-16 15:45:29 +00:00
parent 4f749d8bae
commit 403bec9f16
6 changed files with 51 additions and 34 deletions

View File

@@ -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 ** {

View File

@@ -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
} ;

View File

@@ -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
} ;

View File

@@ -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} ;

View File

@@ -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 <t,m> of {
<Pres,MIndic> => VFin b (VPresInd a.n a.p) ;
<Pres,MConjunct> => VFin b (VPresSubj a.n a.p)
<Pres,MIndic> => VFin b (VPresInd an ap) ;
<Pres,MConjunct> => VFin b (VPresSubj an ap)
; --# notpresent
<Past,MIndic> => VFin b (VImpfInd a.n a.p) ; --# notpresent
<Past,MConjunct> => VFin b (VImpfSubj a.n a.p) ; --# notpresent
<Past,MIndic> => VFin b (VImpfInd an ap) ; --# notpresent
<Past,MConjunct> => 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ß" ;

View File

@@ -15,7 +15,7 @@ concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in {
ImpF _ True => <P3,"Sie",True> ; -- setzen Sie sich
_ => <P2,[],False>
} ;
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