resource lib name changed

This commit is contained in:
aarne
2007-12-12 20:30:11 +00:00
parent f472bf266c
commit 4ea58bce2c
741 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
concrete AdjectiveGer of Adjective = CatGer ** open ResGer, Prelude in {
flags optimize=all_subs ;
lin
PositA a = {
s = a.s ! Posit ;
isPre = True
} ;
ComparA a np = {
s = \\af => a.s ! Compar ! af ++ conjThan ++ np.s ! Nom ;
isPre = True
} ;
-- $SuperlA$ belongs to determiner syntax in $Noun$.
ComplA2 a np = {
s = \\af => a.s ! Posit ! af ++ appPrep a.c2 np.s ;
isPre = True
} ;
ReflA2 a = {
s = \\af => a.s ! Posit ! APred ++ appPrep a.c2 (reflPron ! agrP3 Sg) ; --- agr
isPre = True
} ;
SentAP ap sc = {
s = \\a => ap.s ! a ++ sc.s ;
isPre = False
} ;
AdAP ada ap = {
s = \\a => ada.s ++ ap.s ! a ;
isPre = ap.isPre
} ;
UseA2 a = a ;
}

View File

@@ -0,0 +1,22 @@
concrete AdverbGer of Adverb = CatGer ** open ResGer, Prelude in {
lin
PositAdvAdj a = {s = a.s ! Posit ! APred} ;
ComparAdvAdj cadv a np = {
s = cadv.s ++ a.s ! Posit ! APred ++ conjThan ++ np.s ! Nom
} ;
ComparAdvAdjS cadv a s = {
s = cadv.s ++ a.s ! Posit ! APred ++ conjThan ++ s.s ! Sub
} ;
PrepNP prep np = {s = appPrep prep np.s} ;
AdAdv = cc2 ;
SubjS subj s = {s = subj.s ++ s.s ! Sub} ;
AdvSC s = s ;
AdnCAdv cadv = {s = cadv.s ++ conjThan} ;
}

View File

@@ -0,0 +1,91 @@
concrete CatGer of Cat =
CommonX - [Tense,TPres,TPast,TFut,TCond] **
open ResGer, Prelude in {
flags optimize=all_subs ;
lincat
-- Tensed/Untensed
S = {s : Order => Str} ;
QS = {s : QForm => Str} ;
RS = {s : GenNum => Str ; c : Case} ;
SlashS = {s : Order => Str} ** {c2 : Preposition} ;
-- Sentence
Cl = {s : Mood => ResGer.Tense => Anteriority => Polarity => Order => Str} ;
Slash = {s : Mood => ResGer.Tense => Anteriority => Polarity => Order => Str} **
{c2 : Preposition} ;
Imp = {s : Polarity => ImpForm => Str} ;
-- Question
QCl = {s : Mood => ResGer.Tense => Anteriority => Polarity => QForm => Str} ;
IP = {s : Case => Str ; n : Number} ;
IComp = {s : Agr => Str} ;
IDet = {s : Gender => Case => Str ; n : Number} ;
-- Relative
RCl = {s : Mood => ResGer.Tense => Anteriority => Polarity => GenNum => Str ; c : Case} ;
RP = {s : GenNum => Case => Str ; a : RAgr} ;
-- Verb
VP = ResGer.VP ;
Comp = {s : Agr => Str} ;
-- Adjective
AP = {s : AForm => Str ; isPre : Bool} ;
-- Noun
CN = {s : Adjf => Number => Case => Str ; g : Gender} ;
NP = {s : Case => Str ; a : Agr} ;
Pron = {s : NPForm => Str ; a : Agr} ;
Det = {s : Gender => Case => Str ; n : Number ; a : Adjf} ;
QuantSg, QuantPl = {s : Gender => Case => Str ; a : Adjf} ;
Quant = {s : Number => Gender => Case => Str ; a : Adjf} ;
Predet = {s : Number => Gender => Case => Str} ;
Num = {s : Str; n : Number } ;
Ord = {s : AForm => Str} ;
-- Numeral
Numeral = {s : CardOrd => Str; n : Number } ;
-- Structural
Conj = {s : Str ; n : Number} ;
DConj = {s1,s2 : Str ; n : Number} ;
Subj = {s : Str} ;
Prep = {s : Str ; c : Case} ;
-- Open lexical classes, e.g. Lexicon
V, VS, VQ, VA = ResGer.Verb ; -- = {s : VForm => Str} ;
VV = Verb ** {isAux : Bool} ;
V2, V2A = Verb ** {c2 : Preposition} ;
V3 = Verb ** {c2, c3 : Preposition} ;
A = {s : Degree => AForm => Str} ;
A2 = {s : Degree => AForm => Str ; c2 : Preposition} ;
N = {s : Number => Case => Str ; g : Gender} ;
N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Preposition} ;
N3 = {s : Number => Case => Str ; g : Gender} ** {c2,c3 : Preposition} ;
PN = {s : Case => Str} ;
-- tense with possibility to choose conjunctive forms
Tense = {s : Str ; t : ResGer.Tense ; m : Mood} ;
lin
TPres = {s = [] ; t = Pres ; m = MIndic} ;
TPast = {s = [] ; t = Past ; m = MIndic} ; --# notpresent
TFut = {s = [] ; t = Fut ; m = MIndic} ; --# notpresent
TCond = {s = [] ; t = Cond ; m = MIndic} ; --# notpresent
}

View File

@@ -0,0 +1,45 @@
concrete ConjunctionGer of Conjunction =
CatGer ** open ResGer, Coordination, Prelude in {
flags optimize=all_subs ;
lin
ConjS conj ss = conjunctTable Order conj ss ;
DConjS conj ss = conjunctDistrTable Order conj ss ;
ConjAdv conj ss = conjunctSS conj ss ;
DConjAdv conj ss = conjunctDistrSS conj ss ;
ConjNP conj ss = conjunctTable Case conj ss ** {
a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p}
} ;
DConjNP conj ss = conjunctDistrTable Case conj ss ** {
a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p}
} ;
ConjAP conj ss = conjunctTable AForm conj ss ** {
isPre = ss.isPre
} ;
DConjAP conj ss = conjunctDistrTable AForm conj ss ** {
isPre = ss.isPre
} ;
-- These fun's are generated from the list cat's.
BaseS = twoTable Order ;
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} ;
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} ;
lincat
[S] = {s1,s2 : Order => Str} ;
[Adv] = {s1,s2 : Str} ;
[NP] = {s1,s2 : Case => Str ; a : Agr} ;
[AP] = {s1,s2 : AForm => Str ; isPre : Bool} ;
}

View File

@@ -0,0 +1,26 @@
--concrete ExtGer of ExtGerAbs = CatGer ** open ResGer in {
--
-- lincat
--
-- Aux = {s : Polarity => Str} ;
--
-- lin
--
-- PredAux np aux vp = mkClause (np.s ! Nom) np.a {
-- s = \\t,ant,b,ord,agr =>
-- let
-- fin = aux.s ! b ;
-- vf : Str -> Str -> {fin, inf : Str} = \x,y ->
-- {fin = x ; inf = y} ;
-- in
-- case ant of {
-- Simul => vf fin [] ;
-- Anter => vf fin "have"
-- } ;
-- s2 = \\agr => infVP vp agr
-- } ;
--
-- can_Aux = {s = \\p => posneg p "can"} ; ---- cannt
-- must_Aux = {s = \\p => posneg p "must"} ;
--
--}

View File

@@ -0,0 +1,34 @@
concrete ExtraGer of ExtraGerAbs = CatGer **
open ResGer, Coordination, Prelude, IrregGer in {
lincat
VPI = {s : Bool => Str} ;
[VPI] = {s1,s2 : Bool => Str} ;
lin
BaseVPI = twoTable Bool ;
ConsVPI = consrTable Bool comma ;
MkVPI vp = {s = \\b => useInfVP b vp} ;
ConjVPI = conjunctTable Bool ;
ComplVPIVV v vpi =
insertInf (vpi.s ! v.isAux) (
predVGen v.isAux v) ; ----
{-
insertExtrapos vpi.p3 (
insertInf vpi.p2 (
insertObj vpi.p1 (
predVGen v.isAux v))) ;
-}
PPzuAdv cn = {s = case cn.g of {
Masc | Neutr => "zum" ;
Fem => "zur"
} ++ cn.s ! adjfCase Weak Dat ! Sg ! Dat
} ;
TImpfSubj = {s = [] ; t = Past ; m = MConjunct} ; --# notpresent
moegen_VV = auxVV mögen_V ;
}

View File

@@ -0,0 +1,11 @@
abstract ExtraGerAbs = Extra [
VPI,ListVPI,BaseVPI,ConsVPI,MkVPI,ComplVPIVV,ConjVPI,
VV,VP,Conj] ** {
fun
PPzuAdv : CN -> Adv ; -- zum Lied, zur Flasche
TImpfSubj : Tense ; -- ich möchte... --# notpresent
moegen_VV : VV ; -- ich mag/möchte singen
}

View File

@@ -0,0 +1,7 @@
--# -path=.:../abstract:../common:prelude
concrete German of GermanAbs =
LangGer,
IrregGer,
ExtraGer
** {} ;

View File

@@ -0,0 +1,7 @@
--# -path=.:../abstract:../common:prelude
abstract GermanAbs =
Lang,
IrregGerAbs,
ExtraGerAbs
** {} ;

View File

@@ -0,0 +1,21 @@
--# -path=.:../abstract:../common:prelude
concrete GrammarGer of Grammar =
NounGer,
VerbGer,
AdjectiveGer,
AdverbGer,
NumeralGer,
SentenceGer,
QuestionGer,
RelativeGer,
ConjunctionGer,
PhraseGer,
TextX - [Tense,TPres,TPast,TFut,TCond],
IdiomGer,
StructuralGer
** {
flags startcat = Phr ; unlexer = text ; lexer = text ;
} ;

View File

@@ -0,0 +1,46 @@
concrete IdiomGer of Idiom = CatGer **
open MorphoGer, ParadigmsGer, Prelude in {
flags optimize=all_subs ;
lin
ImpersCl vp = mkClause "es" (agrP3 Sg) vp ;
GenericCl vp = mkClause "man" (agrP3 Sg) vp ;
CleftNP np rs = mkClause "es" (agrP3 Sg)
(insertExtrapos (rs.s ! gennum np.a.g np.a.n) ----
(insertObj (\\_ => np.s ! rs.c) (predV MorphoGer.sein_V))) ;
CleftAdv ad s = mkClause "es" (agrP3 Sg)
(insertExtrapos (conjThat ++ s.s ! Sub)
(insertObj (\\_ => ad.s) (predV MorphoGer.sein_V))) ;
ExistNP np =
mkClause "es" (agrP3 Sg)
(insertObj (\\_ => appPrep geben.c2 np.s)
(predV geben)) ;
ExistIP ip = {
s = \\m,t,a,p =>
let
cls =
(mkClause "es" (agrP3 Sg) (predV geben)).s ! m ! t ! a ! p ;
who = ip.s ! Acc
in table {
QDir => who ++ cls ! Inv ;
QIndir => who ++ cls ! Sub
}
} ;
ProgrVP = insertAdv "eben" ; ----
ImpPl1 vp = {s =
(mkClause "wir" {g = Fem ; n = Pl ; p = P1} vp).s !
MConjunct ! Pres ! Simul ! Pos ! Inv
} ;
oper
geben = dirV2 (mk6V "geben" "gibt" "gib" "gab" "gäbe" "gegeben") ;
}

View File

@@ -0,0 +1,228 @@
--# -path=.:prelude:../abstract:../common
-- adapted from verb list in
-- http://www.iee.et.tu-dresden.de/~wernerr/grammar/verben_dt.html
concrete IrregGer of IrregGerAbs = CatGer ** open
ParadigmsGer,
(M = MorphoGer)
in {
flags optimize=values ;
lin backen_V = irregV "backen" "bäckt" (variants {"backt" ; "buk"}) (variants {"backt" ; "buke"}) "gebacken" ;
lin befehlen_V = irregV "befehlen" "befiehlt" "befahl" "beföhle" "befähle)" ;
lin beginnen_V = irregV "beginnen" "beginnt" "begann" "begönne" "begänne)" ;
lin beißen_V = irregV "beißen" "beißt" "biß" "biße" "gebissen" ;
lin bergen_V = irregV "bergen" "birgt" "barg" "bärge" "geborgen" ;
lin bersten_V = irregV "bersten" "birst" "barst" "bärste" "geborsten" ;
lin bewegen_V = irregV "bewegen" "bewegt" "bewog" "bewöge" "bewogen" ;
lin biegen_V = irregV "biegen" "biegt" "bog" "böge" "gebogen" ;
lin bieten_V = irregV "bieten" "bietet" "bot" "böte" "geboten" ;
lin binden_V = irregV "binden" "bindt" "band" "bände" "gebunden" ;
lin bitten_V = irregV "bitten" "bittet" "bat" "bäte" "gebeten" ;
lin blasen_V = irregV "blasen" "bläst" "blies" "bliese" "geblasen" ;
lin bleiben_V = irregV "bleiben" "bleibt" "blieb" "bliebe" "geblieben" ;
lin braten_V = irregV "braten" "brät" "briet" "briete" "gebraten" ;
lin brechen_V = irregV "brechen" "bricht" "brach" "bräche" "gebrochen" ;
lin brennen_V = irregV "brennen" "brennt" "brannte" "brennte" "gebrannt" ;
lin bringen_V = irregV "bringen" "bringt" "brachte" "brachte" "gebracht" ;
lin denken_V = irregV "denken" "denkt" "dachte" "dachte" "gedacht" ;
lin dingen_V = irregV "dingen" "dingt" "dingte" "dang" "gedungen" ;
lin dreschen_V = irregV "dreschen" "drischt" "drosch" "drösche" "gedroschen" ;
lin dringen_V = irregV "dringen" "dringt" "drang" "dränge" "gedrungen" ;
lin dürfen_V = M.mkV
"dürfen" "darf" "darfst" "darf" "dürft" "dürf"
"durfte" "durftest" "durften" "durftet"
"dürfte" "gedurft" []
M.VHaben ** {lock_V = <>} ;
lin empfehlen_V = irregV "empfehlen" "empfiehlt" "empfahl"
(variants {"empföhle" ; "empfähle"}) "empfohlen" ;
lin erlöschen_V = irregV "erlöschen" "erlischt" "erlosch" "erlösche" "erloschen" ;
lin erkennen_V = irregV "erkennen" "erkennt" "erkannte" "erkannte" "erkannt" ;
lin erschrecken_V = irregV "erschrecken" "erschrickt" "erschrak" "erschräke" "erschrocken" ;
lin essen_V = irregV "essen" "ißt" "aß" "äße" "gegessen" ;
lin fahren_V = irregV "fahren" "fährt" "fuhr" "führe" "gefahren" ;
lin fallen_V = irregV "fallen" "fällt" "fiel" "fiele" "gefallen" ;
lin fangen_V = irregV "fangen" "fängt" "fing" "finge" "gefangen" ;
lin fechten_V = irregV "fechten" "fechtet" "focht" "föchte" "gefochten" ;
lin finden_V = irregV "finden" "findt" "fand" "fände" "gefunden" ;
lin flechten_V = irregV "flechten" "flicht" "flocht" "flöchte" "geflochten" ;
lin fliegen_V = irregV "fliegen" "fliegt" "flog" "flöge" "geflogen" ;
lin fliehen_V = irregV "fliehen" "flieht" "floh" "flöhe" "geflohen" ;
lin fließen_V = irregV "fließen" "fließt" "floß" "flösse" "geflossen" ;
lin fressen_V = irregV "fressen" "frißt" "fraß" "fräße" "gefressen" ;
lin frieren_V = irregV "frieren" "friert" "fror" "fröre" "gefroren" ;
lin gären_V = irregV "gären" "gärt" (variants {"gor" ; "gärte"}) "göre" "gegoren" ;
lin gebären_V = irregV "gebären" "gebiert" "gebar" "gebäre" "geboren" ;
lin geben_V = irregV "geben" "gibt" "gab" "gäbe" "gegeben" ;
lin gedeihen_V = irregV "gedeihen" "gedeiht" "gedieh" "gediehe" "gediehen" ;
lin gehen_V = irregV "gehen" "geht" "ging" "ginge" "gegangen" ;
lin gelingen_V = irregV "gelingen" "gelingt" "gelang" "gelange" "gelungen" ;
lin gelten_V = irregV "gelten" "gilt" "galt" (variants {"galte" ; "golte"}) "gegolten" ;
lin genesen_V = irregV "genesen" "genest" "genas" "genäse" "genesen" ;
lin genießen_V = irregV "genießen" "genießt" "genoß" "genösse" "genossen" ;
lin geschehen_V = irregV "geschehen" "geschieht" "geschah" "geschehen" "geschähe" ;
lin gewinnen_V = irregV "gewinnen" "gewinnt" "gewann" (variants {"gewönne" ; "gewänne"}) "gewonnen" ;
lin gießen_V = irregV "gießen" "gießt" "goß" "gösse" "gegossen" ;
lin gleichen_V = irregV "gleichen" "gleicht" "glich" "gliche" "geglichen" ;
lin gleiten_V = irregV "gleiten" "gleitet" "glitt" "glitte" "geglitten" ;
lin glimmen_V = irregV "glimmen" "glimmt" "glomm" "glimmte" "glömme" ;
lin graben_V = irregV "graben" "gräbt" "grub" "grübe" "gegraben" ;
lin greifen_V = irregV "greifen" "greift" "griff" "griffe" "gegriffen" ;
lin haben_V = irregV "haben" "hat" "hatte" "hatte" "gehabt" ;
lin halten_V = irregV "halten" "hält" "hielt" "hielte" "gehalten" ;
lin hängen_V = irregV "hängen" "hängt" "hing" "hinge" "gehangen" ;
lin hauen_V = irregV "hauen" "haut" (variants {"haute" ; "hieb"}) (variants {"haute" ; "hiebe"}) "gehauen" ;
lin heben_V = irregV "heben" "hebt" "hob" "höbe" "gehoben" ;
lin heißen_V = irregV "heißen" "heißt" "hieß" "hieße" "geheißen" ;
lin helfen_V = irregV "helfen" "hilft" "half" "hülfe" "geholfen" ;
lin kennen_V = irregV "kennen" "kennt" "kannte" "kennte" "gekannt" ;
lin klimmen_V = irregV "klimmen" "klimmt" "klomm" "klömme" "geklommen" ;
lin klingen_V = irregV "klingen" "klingt" "klang" "klänge" "geklungen" ;
lin kneifen_V = irregV "kneifen" "kneift" "kniff" "kniffe" "gekniffen" ;
lin kommen_V = irregV "kommen" "kommt" "kam" "käme" "gekommen" ;
lin können_V = M.mkV
"können" "kann" "kannst" "kann" "könnt" "könn"
"konnte" "konntest" "konnten" "konntet"
"könnte" "gekonnt" []
M.VHaben ** {lock_V = <>} ;
lin kriechen_V = irregV "kriechen" "kriecht" "kroch" "kröche" "gekrochen" ;
lin küren_V = irregV "küren" "kürt" "kürte" "kor" "gekürt" ;
lin laden_V = irregV "laden" "lädt" "lud" "lüde" "geladen" ;
lin lassen_V = irregV "lassen" "läßt" "ließ" "ließe" "gelassen" ;
lin laufen_V = irregV "laufen" "läuft" "lief" "liefe" "gelaufen" ;
lin leiden_V = irregV "leiden" "leidt" "litt" "litte" "gelitten" ;
lin leihen_V = irregV "leihen" "leiht" "lieh" "liehe" "geliehen" ;
lin lesen_V = irregV "lesen" "liest" "las" "läse" "gelesen" ;
lin liegen_V = irregV "liegen" "liegt" "lag" "läge" "gelegen" ;
lin lügen_V = irregV "lügen" "lügt" "log" "löge" "gelogen" ;
lin mahlen_V = irregV "mahlen" "mahlt" "mahlte" "mahlte" "gemahlen" ;
lin meiden_V = irregV "meiden" "meidt" "mied" "miede" "gemieden" ;
lin melken_V = irregV "melken" (variants {"melkt" ; "milkt"}) (variants {"melkte" ; "molk"}) "gemolken" "gemelkt" ;
lin messen_V = irregV "messen" "mißt" "maß" "mäße" "gemessen" ;
lin mißlingen_V = irregV "mißlingen" "mißlingt" "mißlang" "mißlungen" "mißlänge" ;
lin mögen_V = M.mkV
"mögen" "mag" "magst" "mag" "mögt" "mög"
"mochte" "mochtest" "mochten" "mochtet"
"möchte" "gemocht" []
M.VHaben ** {lock_V = <>} ;
lin müssen_V = M.mkV
"müssen" "muß" "mußt" "muß" "müßt" "müß"
"mußte" "mußtest" "mußten" "mußtet"
"müßte" "gemußt" []
M.VHaben ** {lock_V = <>} ;
lin nehmen_V = mk6V "nehmen" "nimmt" "nimm" "nahm" "nähme" "genommen" ;
lin nennen_V = irregV "nennen" "nennt" "nannte" "nennte" "genannt" ;
lin pfeifen_V = irregV "pfeifen" "pfeift" "pfiff" "pfiffe" "gepfiffen" ;
lin preisen_V = irregV "preisen" "preist" "pries" "priese" "gepriesen" ;
lin quellen_V = irregV "quellen" "quillt" "quoll" "quölle" "gequollen" ;
lin raten_V = irregV "raten" "rät" "riet" "riete" "geraten" ;
lin reiben_V = irregV "reiben" "reibt" "rieb" "riebe" "gerieben" ;
lin reißen_V = irregV "reißen" "reißt" "riß" "riße" "gerissen" ;
lin reiten_V = irregV "reiten" "reitet" "ritt" "ritte" "geritten" ;
lin rennen_V = irregV "rennen" "rennt" "rannte" "rennte" "gerannt" ;
lin riechen_V = irregV "riechen" "riecht" "roch" "röche" "gerochen" ;
lin ringen_V = irregV "ringen" "ringt" "rang" "ränge" "gerungen" ;
lin rinnen_V = irregV "rinnen" "rinnt" "rann" "ränne" "geronnen" ;
lin rufen_V = irregV "rufen" "ruft" "rief" "riefe" "gerufen" ;
lin salzen_V = irregV "salzen" "salzt" "salzte" "salzte" "gesalzen" ;
lin saufen_V = irregV "saufen" "säuft" "soff" "söffe" "gesoffen" ;
lin saugen_V = irregV "saugen" "saugt" (variants {"saugte" ; "sog"}) (variants {"saugte" ; "soge"}) (variants {"gesaugt" ; "gesogen"}) ;
lin schaffen_V = irregV "schaffen" "schafft" "schuf" "schüfe" "geschaffen" ;
lin scheiden_V = irregV "scheiden" "scheidt" "schied" "schiede" "geschieden" ;
lin scheinen_V = irregV "scheinen" "scheint" "schien" "schiene" "geschienen" ;
lin scheißen_V = irregV "scheißen" "scheißt" "schiß" "schiße" "geschissen" ;
lin schelten_V = irregV "schelten" "schilt" "schalt" "schölte" "gescholten" ;
lin scheren_V = irregV "scheren" "schert" "schor" "schöre" "geschoren" ;
lin schieben_V = irregV "schieben" "schiebt" "schob" "schöbe" "geschoben" ;
lin schießen_V = irregV "schießen" "schießt" "schoß" "schösse" "geschossen" ;
lin schinden_V = irregV "schinden" "schindt" "schund" "schunde" "geschunden" ;
lin schlafen_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ;
lin schlagen_V = irregV "schlagen" "schlägt" "schlug" "schlüge" "geschlagen" ;
lin schleichen_V = irregV "schleichen" "schleicht" "schlich" "schliche" "geschlichen" ;
lin schleifen_V = irregV "schleifen" "schleift" "schliff" "schliffe" "geschliffen" ;
lin schleißen_V = irregV "schleißen" "schleißt" (variants {"schliß" ; "schleißte"}) (variants {"schliß" ; "schleißte"}) (variants {"geschlissen" ; "geschleißt"}) ;
lin schließen_V = irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen" ;
lin schlingen_V = irregV "schlingen" "schlingt" "schlang" "schlünge" "geschlungen" ;
lin schmeißen_V = irregV "schmeißen" "schmeißt" "schmiß" "schmiße" "geschmissen" ;
lin schmelzen_V = irregV "schmelzen" "schmilzt" "schmolz" "schmölze" "geschmolzen" ;
lin schneiden_V = irregV "schneiden" "schneidt" "schnitt" "schnitte" "geschnitten" ;
lin schreiben_V = irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben" ;
lin schreien_V = irregV "schreien" "schreit" "schrie" "schrie" "geschrien" ;
lin schreiten_V = irregV "schreiten" "schreitet" "schritt" "schritte" "geschritten" ;
lin schweigen_V = irregV "schweigen" "schweigt" "schwieg" "schwiege" "geschwiegen" ;
lin schwellen_V = irregV "schwellen" "schwillt" "schwoll" "schwölle" "geschwollen" ;
lin schwimmen_V = irregV "schwimmen" "schwimmt" "schwamm" (variants {"schwömme" ; "schwämme"}) "geschwommen" ;
lin schwinden_V = irregV "schwinden" "schwindt" "schwand" "schwände" "geschwunden" ;
lin schwingen_V = irregV "schwingen" "schwingt" "schwang" "schwänge" "geschwungen" ;
lin schwören_V = irregV "schwören" "schwört" "schwor" "schwüre" "geschworen" ;
lin sehen_V = irregV "sehen" "sieht" "sah" "sähe" "gesehen" ;
lin sein_V = irregV "sein" "ist" "war" "wäre" "gewesen" ;
lin senden_V = irregV "senden" "sendt" (variants {"sandte" ; "sendete"}) (variants {"sandte" ; "sendete"}) (variants {"gesandt" ; "gesendet"}) ;
lin sieden_V = irregV "sieden" "siedt" (variants {"siedete" ; "sott"}) (variants {"siedete" ; "sotte"}) (variants {"gesotten" ; "gesiedet"}) ;
lin singen_V = irregV "singen" "singt" "sang" "sänge" "gesungen" ;
lin sinken_V = irregV "sinken" "sinkt" "sank" "sänke" "gesunken" ;
lin sinnen_V = irregV "sinnen" "sinnt" "sann" "sänne" "gesonnen" ;
lin sitzen_V = irregV "sitzen" "sitzt" "saß" "säße" "gesessen" ;
lin sollen_V = M.mkV
"sollen" "soll" "sollst" "soll" "sollt" "soll"
"sollte" "solltest" "sollten" "solltet"
"sollte" "gesollt" []
M.VHaben ** {lock_V = <>} ;
lin speien_V = irregV "speien" "speit" "spie" "spie" "gespien" ;
lin spinnen_V = irregV "spinnen" "spinnt" "spann" (variants {"spönne" ; "spänne"}) "gesponnen" ;
lin spleißen_V = irregV "spleißen" "spleißt" "spliß" "spliße" "gesplissen" ;
lin sprechen_V = irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen" ;
lin sprießen_V = irregV "sprießen" "sprießt" "sproß" "sprösse" "gesprossen" ;
lin springen_V = irregV "springen" "springt" "sprang" "spränge" "gesprungen" ;
lin stechen_V = irregV "stechen" "sticht" "stach" "stäche" "gestochen" ;
lin stehen_V = irregV "stehen" "steht" "stand" (variants {"stünde" ; "stände"}) "gestanden" ;
lin stehlen_V = irregV "stehlen" "stiehlt" "stahl" "stähle" "gestohlen" ;
lin steigen_V = irregV "steigen" "steigt" "stieg" "stiege" "gestiegen" ;
lin sterben_V = irregV "sterben" "stirbt" "starb" "stürbe" "gestorben" ;
lin stieben_V = irregV "stieben" "stiebt" "stob" "stöbe" "gestoben" ;
lin stinken_V = irregV "stinken" "stinkt" "stank" "stänke" "gestunken" ;
lin stoßen_V = irregV "stoßen" "stößt" "stieß" "stieße" "gestoßen" ;
lin streichen_V = irregV "streichen" "streicht" "strich" "striche" "gestrichen" ;
lin streiten_V = irregV "streiten" "streitet" "stritt" "stritte" "gestritten" ;
lin tragen_V = irregV "tragen" "trägt" "trug" "trüge" "getragen" ;
lin treffen_V = irregV "treffen" "trifft" "traf" "träfe" "getroffen" ;
lin treiben_V = irregV "treiben" "treibt" "trieb" "triebe" "getrieben" ;
lin treten_V = irregV "treten" "tritt" "trat" "träte" "getreten" ;
lin trinken_V = irregV "trinken" "trinkt" "trank" "tränke" "getrunken" ;
lin trügen_V = irregV "trügen" "trügt" "trog" "tröge" "getrogen" ;
lin tun_V = irregV "tun" "tut" "tat" "täte" "getan" ;
lin verderben_V = irregV "verderben" "verdirbt" "verdarb" "verdarbe" "verdorben" ;
lin verlieren_V = irregV "verlieren" "verliert" "verlor" "verlöre" "verloren" ;
lin wachsen_V = irregV "wachsen" "wächst" "wuchs" "wüchse" "gewachsen" ;
lin wägen_V = irregV "wägen" "wägt" "wog" "woge" "gewogen" ;
lin waschen_V = irregV "waschen" "wäscht" "wusch" "wüsche" "gewaschen" ;
lin weben_V = irregV "weben" "webt" (variants {"wob" ; "webte"}) "wöbe" (variants {"gewoben" ; "gewebt"}) ;
lin weichen_V = irregV "weichen" "weicht" "wich" "wiche" "gewichen" ;
lin weisen_V = irregV "weisen" "weist" "wies" "wiese" "gewiesen" ;
lin wenden_V = irregV "wenden" "wendt" (variants {"wandte" ; "wendete"}) (variants {"wandte" ; "wendete"}) (variants {"gewandt" ; "gewendet"}) ;
lin werben_V = irregV "werben" "wirbt" "warb" "würbe" "geworben" ;
lin werden_V = M.mkV
"werden" "werde" "wirst" "wird" "werdet" "werd"
"wurde" "wurdest" "wurden" "wurdet"
"würde" "geworden" []
M.VHaben ** {lock_V = <>} ;
lin werfen_V = irregV "werfen" "wirft" "warf" "würfe" "geworfen" ;
lin wiegen_V = irregV "wiegen" "wiegt" "wog" "wöge" "gewogen" ;
lin winden_V = irregV "winden" "windt" "wand" "wände" "gewunden" ;
lin wissen_V = irregV "wissen" "weiß" "wußte" "wüßte" "gewußt" ;
lin wollen_V = M.mkV
"wollen" "will" "willst" "will" "wollt" "woll"
"wollte" "wolltest" "wollten" "wolltet"
"wollte" "gewollt" []
M.VHaben ** {lock_V = <>} ;
lin wringen_V = irregV "wringen" "wringt" "wrang" "wränge" "gewrungen" ;
lin zeihen_V = irregV "zeihen" "zeiht" "zieh" "ziehe" "geziehen" ;
lin ziehen_V = irregV "ziehen" "zieht" "zog" "zöge" "gezogen" ;
lin zwingen_V = irregV "zwingen" "zwingt" "zwang" "zwänge" "gezwungen" ;
}

View File

@@ -0,0 +1,185 @@
abstract IrregGerAbs = Cat ** {
fun backen_V : V ;
fun befehlen_V : V ;
fun beginnen_V : V ;
fun beißen_V : V ;
fun bergen_V : V ;
fun bersten_V : V ;
fun bewegen_V : V ;
fun biegen_V : V ;
fun bieten_V : V ;
fun binden_V : V ;
fun bitten_V : V ;
fun blasen_V : V ;
fun bleiben_V : V ;
fun braten_V : V ;
fun brechen_V : V ;
fun brennen_V : V ;
fun bringen_V : V ;
fun denken_V : V ;
fun dingen_V : V ;
fun dreschen_V : V ;
fun dringen_V : V ;
fun dürfen_V : V ;
fun empfehlen_V : V ;
fun erlöschen_V : V ;
fun erkennen_V : V ;
fun erschrecken_V : V ;
fun essen_V : V ;
fun fahren_V : V ;
fun fallen_V : V ;
fun fangen_V : V ;
fun fechten_V : V ;
fun finden_V : V ;
fun flechten_V : V ;
fun fliegen_V : V ;
fun fliehen_V : V ;
fun fließen_V : V ;
fun fressen_V : V ;
fun frieren_V : V ;
fun gären_V : V ;
fun gebären_V : V ;
fun geben_V : V ;
fun gedeihen_V : V ;
fun gehen_V : V ;
fun gelingen_V : V ;
fun gelten_V : V ;
fun genesen_V : V ;
fun genießen_V : V ;
fun geschehen_V : V ;
fun gewinnen_V : V ;
fun gießen_V : V ;
fun gleichen_V : V ;
fun gleiten_V : V ;
fun glimmen_V : V ;
fun graben_V : V ;
fun greifen_V : V ;
fun haben_V : V ;
fun halten_V : V ;
fun hängen_V : V ;
fun hauen_V : V ;
fun heben_V : V ;
fun heißen_V : V ;
fun helfen_V : V ;
fun kennen_V : V ;
fun klimmen_V : V ;
fun klingen_V : V ;
fun kneifen_V : V ;
fun kommen_V : V ;
fun können_V : V ;
fun kriechen_V : V ;
fun küren_V : V ;
fun laden_V : V ;
fun lassen_V : V ;
fun laufen_V : V ;
fun leiden_V : V ;
fun leihen_V : V ;
fun lesen_V : V ;
fun liegen_V : V ;
fun lügen_V : V ;
fun mahlen_V : V ;
fun meiden_V : V ;
fun melken_V : V ;
fun messen_V : V ;
fun mißlingen_V : V ;
fun mögen_V : V ;
fun müssen_V : V ;
fun nehmen_V : V ;
fun nennen_V : V ;
fun pfeifen_V : V ;
fun preisen_V : V ;
fun quellen_V : V ;
fun raten_V : V ;
fun reiben_V : V ;
fun reißen_V : V ;
fun reiten_V : V ;
fun rennen_V : V ;
fun riechen_V : V ;
fun ringen_V : V ;
fun rinnen_V : V ;
fun rufen_V : V ;
fun salzen_V : V ;
fun saufen_V : V ;
fun saugen_V : V ;
fun schaffen_V : V ;
fun scheiden_V : V ;
fun scheinen_V : V ;
fun scheißen_V : V ;
fun schelten_V : V ;
fun scheren_V : V ;
fun schieben_V : V ;
fun schießen_V : V ;
fun schinden_V : V ;
fun schlafen_V : V ;
fun schlagen_V : V ;
fun schleichen_V : V ;
fun schleifen_V : V ;
fun schleißen_V : V ;
fun schließen_V : V ;
fun schlingen_V : V ;
fun schmeißen_V : V ;
fun schmelzen_V : V ;
fun schneiden_V : V ;
fun schreiben_V : V ;
fun schreien_V : V ;
fun schreiten_V : V ;
fun schweigen_V : V ;
fun schwellen_V : V ;
fun schwimmen_V : V ;
fun schwinden_V : V ;
fun schwingen_V : V ;
fun schwören_V : V ;
fun sehen_V : V ;
fun sein_V : V ;
fun senden_V : V ;
fun sieden_V : V ;
fun singen_V : V ;
fun sinken_V : V ;
fun sinnen_V : V ;
fun sitzen_V : V ;
fun sollen_V : V ;
fun speien_V : V ;
fun spinnen_V : V ;
fun spleißen_V : V ;
fun sprechen_V : V ;
fun sprießen_V : V ;
fun springen_V : V ;
fun stechen_V : V ;
fun stehen_V : V ;
fun stehlen_V : V ;
fun steigen_V : V ;
fun sterben_V : V ;
fun stieben_V : V ;
fun stinken_V : V ;
fun stoßen_V : V ;
fun streichen_V : V ;
fun streiten_V : V ;
fun tragen_V : V ;
fun treffen_V : V ;
fun treiben_V : V ;
fun treten_V : V ;
fun trinken_V : V ;
fun trügen_V : V ;
fun tun_V : V ;
fun verderben_V : V ;
fun verlieren_V : V ;
fun wachsen_V : V ;
fun wägen_V : V ;
fun waschen_V : V ;
fun weben_V : V ;
fun weichen_V : V ;
fun weisen_V : V ;
fun wenden_V : V ;
fun werben_V : V ;
fun werden_V : V ;
fun werfen_V : V ;
fun wiegen_V : V ;
fun winden_V : V ;
fun wissen_V : V ;
fun wollen_V : V ;
fun wringen_V : V ;
fun zeihen_V : V ;
fun ziehen_V : V ;
fun zwingen_V : V ;
}

View File

@@ -0,0 +1,10 @@
--# -path=.:../abstract:../common:prelude
concrete LangGer of Lang =
GrammarGer,
LexiconGer
** {
flags startcat = Phr ; unlexer = text ; lexer = text ;
} ;

View File

@@ -0,0 +1,366 @@
--# -path=.:../common:../abstract:../../prelude
-- work by Aarne Ranta, Andreas Priesnitz, and Henning Thielemann.
concrete LexiconGer of Lexicon = CatGer **
open Prelude, ParadigmsGer, (Mo = MorphoGer), IrregGer in {
flags
optimize=all_subs ;
lin
add_V3 = dirV3 (prefixV "hinzu" (regV "fügen")) zu_Prep ;
airplane_N = regN "Flugzeug" ;
already_Adv = mkAdv "schon" ;
answer_V2S = mkV2S (regV "antworten") datPrep ;
apartment_N = regN "Wohnung" ;
apple_N = reg2N "Apfel" "Äpfel" masculine ;
art_N = reg2N "Kunst" "Künste" feminine ;
ask_V2Q = mkV2Q (regV "fragen") accPrep ;
baby_N = reg2N "Baby" "Babies" neuter ; ----
bad_A = regA "schlecht" ;
bank_N = reg2N "Bank" "Banken" feminine ;
beautiful_A = regA "schön" ;
become_VA = mkVA IrregGer.werden_V ;
beer_N = reg2N "Bier" "Biere" neuter ;
beg_V2V = mkV2V (mk6V "bitten" "bittet" "bitte" "bat" "bäte" "gebeten") accPrep ;
big_A = mk3A "groß" "größer" "größte" ;
bike_N = reg2N "Fahrrad" "Fahrräder" neuter ;
bird_N = reg2N "Vogel" "Vögel" masculine ;
black_A = regA "schwarz" ;
blue_A = regA "blau";
boat_N = reg2N "Boot" "Boote" neuter ;
book_N = reg2N "Buch" "Bücher" neuter ;
boot_N = reg2N "Stiefel" "Stiefel" masculine ;
boss_N = reg2N "Chef" "Chefs" masculine ; ----
boy_N = reg2N "Junge" "Jungen" masculine ;
bread_N = reg2N "Brot" "Brote" neuter ;
break_V2 = dirV2
(irregV "zerschlagen" "zerschlägt" "zerschlug" "zerschlüge" "zerschlagen") ;
broad_A = regA "breit" ;
brother_N2 = mkN2 (reg2N "Bruder" "Brüder" masculine) von_Prep ;
brown_A = regA "braun" ;
butter_N = reg2N "Butter" "Butter" feminine ; ---- infl
buy_V2 = dirV2 (regV "kaufen") ;
camera_N = reg2N "Kamera" "Kameras" feminine ;
cap_N = regN "Mütze" ;
car_N = regN "Wagen" ;
carpet_N = regN "Teppich" ;
cat_N = regN "Katze" ;
ceiling_N = reg2N "Dach" "Dächer" neuter ;
chair_N = reg2N "Stuhl" "Stühle" masculine ;
cheese_N = regN "Käse" ;
child_N = reg2N "Kind" "Kinder" neuter ;
church_N = regN "Kirche" ;
city_N = reg2N "Stadt" "Städte" feminine ;
clean_A = regA "rein" ;
clever_A = mk3A "klug" "klüger" "klügste" ;
close_V2 = dirV2 (irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen") ;
coat_N = regN "Jacke" ;
cold_A = regA "kalt" ;
come_V = seinV (mk6V "kommen" "kommt" "komm" "kam" "käme" "gekommen") ;
computer_N = reg2N "Rechner" "Rechner" masculine ;
country_N = reg2N "Land" "Länder" neuter ;
cousin_N = reg2N "Vetter" "Vetter" masculine ; --- Kusine
cow_N = reg2N "Kuh" "Kühe" feminine ;
die_V = seinV (irregV "sterben" "stirbt" "starb" "stürbe" "gestorben") ;
distance_N3 = mkN3 (regN "Entfernung") von_Prep zu_Prep ;
dirty_A = regA "schmutzig" ;
do_V2 = dirV2 (irregV "tun" "tut" "tat" "täte" "getan") ;
doctor_N = reg2N "Arzt" "Ärzte" masculine ;
dog_N = regN "Hund" ;
door_N = reg2N "Tür" "Türen" feminine ;
drink_V2 = dirV2 (irregV "trinken" "trinkt" "trank" "tränke" "getrunken") ;
easy_A2V = mkA2V (regA "leicht") (mkPrep "für" accusative) ;
eat_V2 = dirV2 (irregV "essen" "ißt" "aß" "äße" "gegessen") ;
empty_A = regA "leer" ; ---- check infl
enemy_N = regN "Feind" ;
factory_N = regN "Fabrik" ;
father_N2 = mkN2 (reg2N "Vater" "Väter" masculine) von_Prep ;
fear_VS = mkVS (regV "fürchten") ;
find_V2 = dirV2 (irregV "finden" "findet" "fand" "fände" "gefunden") ;
fish_N = regN "Fisch" ;
floor_N = reg2N "Fußboden" "Fußböden" masculine ;
forget_V2 = dirV2 (irregV "vergessen" "vergißt" "vergaß" "vergäße" "vergessen") ;
fridge_N = reg2N "Kühlschrank" "Kühlschränke" masculine ;
friend_N = regN "Freund" ;
fruit_N = reg2N "Frucht" "Früchte" feminine ;
fun_AV = mkAV (regA "toll") ;
garden_N = reg2N "Garten" "Gärten" masculine ;
girl_N = reg2N "Mädchen" "Mädchen" neuter ;
glove_N = regN "Handschuh" ;
gold_N = reg2N "Gold" "Golde" neuter ; ---- infl
good_A = mk3A "gut" "besser" "beste" ;
go_V = seinV (irregV "gehen" "geht" "ging" "ginge" "gegangen") ;
green_A = regA "grün" ;
harbour_N = reg2N "Hafen" "Häfen" masculine ;
hate_V2 = dirV2 (regV "hassen") ;
hat_N = reg2N "Hut" "Hüte" masculine ;
have_V2 = dirV2 IrregGer.haben_V ;
hear_V2 = dirV2 (regV "hören") ;
hill_N = regN "Hügel" ;
hope_VS = mkVS (regV "hoffen") ;
horse_N = reg2N "Pferd" "Pferde" neuter ;
hot_A = regA "heiß" ;
house_N = reg2N "Haus" "Häuser" neuter ;
important_A = regA "wichtig" ;
industry_N = regN "Industrie" ;
iron_N = reg2N "Eisen" "Eisen" neuter ;
jump_V = seinV (irregV "springen" "springt" "sprang" "spränge" "gesprungen") ;
king_N = regN "König" ;
know_V2 = dirV2 (irregV "wissen" "weiß" "wußte" "wüßte" "gewußt") ; ---- infl
lake_N = reg2N "See" "Seen" masculine ; --- infl
lamp_N = regN "Lampe";
learn_V2 = dirV2 (regV "lernen") ;
leather_N = reg2N "Leder" "Leder" neuter ;
leave_V2 = dirV2 (irregV "verlassen" "verläßt" "verließ" "verließe" "verlassen") ;
like_V2 = dirV2 (irregV "mögen" "mag" "mochte" "möchte" "gemocht") ;
listen_V2 = prepV2 (prefixV "zu" (regV "hören")) datPrep ; ---- dat
live_V = regV "leben" ;
long_A = mk3A "lang" "länger" "längste" ;
lose_V2 = dirV2 (irregV "verlieren" "verliert" "verlor" "verlöre" "verloren") ;
love_N = regN "Liebe" ;
love_V2 = dirV2 (regV "lieben") ;
man_N = reg2N "Mann" "Männer" masculine ;
married_A2 = mkA2 (regA "verheiratet") (mkPrep "mit" dative) ;
meat_N = reg2N "Fleisch" "Fleische" neuter ; ---- infl
milk_N = reg2N "Milch" "Milche" feminine ; ---- infl
moon_N = regN "Mond" ;
mother_N2 = mkN2 (reg2N "Mutter" "Mütter" feminine) von_Prep ;
mountain_N = regN "Berg" ;
music_N = reg2N "Musik" "Musiken" feminine ;
narrow_A = regA "schmal" ;
new_A = regA "neu" ;
newspaper_N = regN "Zeitung" ;
now_Adv = mkAdv "jetzt" ;
number_N = reg2N "Zahl" "Zahlen" feminine ;
oil_N = reg2N "Öl" "Öle" neuter ;
old_A = mk3A "alt" "älter" "älteste" ;
open_V2 = dirV2 (regV "öffnen") ;
paint_V2A = mkV2A (regV "malen") accPrep ;
paper_N = reg2N "Papier" "Papiere" neuter ;
paris_PN = mkPN "Paris" "Paris" ;
peace_N = mk6N "Friede" "Frieden" "Frieden" "Friedens" "Frieden" "Frieden" masculine ;
pen_N = regN "Bleistift" ; ----
planet_N = reg2N "Planet" "Planeten" masculine ;
plastic_N = reg2N "Plastik" "Plastiken" feminine ; ----
play_V2 = dirV2 (regV "spielen") ;
policeman_N = reg2N "Polizist" "Polizisten" masculine ;
priest_N = regN "Priester" ;
probable_AS = mkAS (regA "wahrscheinlich") ;
put_V2 = dirV2 (regV "setzen") ;
queen_N = reg2N "Königin" "Königinnen" feminine ;
radio_N = reg2N "Radio" "Radios" neuter ; ----
rain_V0 = mkV0 (regV "regnen") ;
read_V2 = dirV2 (irregV "lesen" "liest" "las" "läse" "gelesen") ;
red_A = regA "rot" ;
religion_N = regN "Religion" ;
restaurant_N = reg2N "Restaurant" "Restaurants" neuter ;
river_N = reg2N "Fluß" "Flüsse" masculine ;
rock_N = regN "Stein" ;
roof_N = reg2N "Dach" "Dächer" neuter ;
rubber_N = reg2N "Gummi" "Gummis" neuter ;
run_V = seinV (irregV "laufen" "läuft" "lief" "liefe" "gelaufen") ;
say_VS = mkVS (regV "sagen") ;
school_N = regN "Schule";
science_N = reg2N "Wissenschaft" "Wissenschaften" feminine ;
sea_N = reg2N "Meer" "Meere" neuter ;
seek_V2 = dirV2 (regV "suchen") ;
see_V2 = dirV2 (irregV "sehen" "sieht" "sah" "sähe" "gesehen") ;
sell_V3 = accdatV3 (no_geV (regV "verkaufen")) ;
send_V3 = accdatV3 (regV "schicken") ;
sheep_N = reg2N "Schaf" "Schafe" neuter ;
ship_N = reg2N "Schiff" "Schiffe" neuter ;
shirt_N = reg2N "Hemd" "Hemden" neuter ; ---- infl
shoe_N = regN "Schuh" ;
shop_N = reg2N "Laden" "Läden" masculine ;
short_A = mk3A "kurz" "kürzer" "kürzeste" ;
silver_N = reg2N "Silber" "Silber" neuter ; ---- infl
sister_N = reg2N "Schwester" "Schwestern" feminine ;
sleep_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ;
small_A = regA "klein" ;
snake_N = regN "Schlange" ;
sock_N = reg2N "Strumpf" "Strümpfe" masculine ;
song_N = reg2N "Lied" "Lieder" neuter ;
speak_V2 = dirV2 (irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen") ;
star_N = regN "Sterne" ;
steel_N = regN "Stahl" ;
stone_N = regN "Stein" ;
stop_V = seinV (irregV "halten" "hält" "hielt" "hielte" "gehalten") ;
stove_N = regN "Herd" ;
student_N = reg2N "Student" "Studenten" masculine ;
stupid_A = mk3A "dumm" "dümmer" "dümmste" ; ----
sun_N = regN "Sonne" ;
switch8off_V2 = dirV2 (prefixV "aus" (regV "schalten")) ;
switch8on_V2 = dirV2 (prefixV "ein" (regV "schalten")) ;
table_N = regN "Tisch" ;
talk_V3 = mkV3 (regV "reden") datPrep von_Prep ;
teacher_N = reg2N "Lehrer" "Lehrer" masculine ;
teach_V2 = dirV2 (no_geV (regV "unterrichten")) ;
television_N = reg2N "Fernsehen" "Fernsehen" neuter;
thick_A = regA "dick" ;
thin_A = regA "dünn" ;
train_N = reg2N "Zug" "Züge" masculine ;
travel_V = regV "reisen" ;
tree_N = reg2N "Baum" "Bäume" masculine ;
---- trousers_N = regN "trousers" ; ---- pl t !
ugly_A = regA "häßlich" ;
understand_V2 =
dirV2 (irregV "verstehen" "versteht" "verstand" "verstände" "verstanden") ;
university_N = reg2N "Universität" "Universitäten" feminine ;
village_N = reg2N "Dorf" "Dörfer" neuter ;
wait_V2 = prepV2 (regV "warten") (mkPrep "auf" accusative) ;
walk_V = seinV (irregV "gehen" "geht" "ging" "ginge" "gegangen") ;
warm_A = mk3A "warm" "wärmer" "wärmste" ;
war_N = regN "Krieg" ;
watch_V2 = prepV2 (regV "schauen") (mkPrep "an" accusative) ;
water_N = reg2N "Wasser" "Wasser" neuter ;
white_A = regA "weiß" ;
window_N = reg2N "Fenster" "Fenster" neuter ;
wine_N = regN "Wein" ;
win_V2 = dirV2 (irregV "gewinnen" "gewinnt" "gewann" "gewänne" "gewonnen") ;
woman_N = reg2N "Frau" "Frauen" feminine ;
wonder_VQ = mkVQ (reflV (regV "wundern") accusative) ;
wood_N = reg2N "Holz" "Hölzer" neuter ;
write_V2 = dirV2 (irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben") ;
yellow_A = regA "gelb" ;
young_A = mk3A "jung" "jünger" "jüngste" ;
left_Ord = Mo.mkOrd (regA "link") ;
right_Ord = Mo.mkOrd (regA "recht") ;
far_Adv = mkAdv "weit" ;
correct_A = regA "richtig" ;
dry_A = regA "trocken" ;
dull_A = regA "stumpf" ;
full_A = regA "voll" ;
heavy_A = regA "schwer" ;
near_A = mk3A "nahe" "näher" "nächste" ;
rotten_A = regA "verdorben" ;
round_A = regA "rund" ;
sharp_A = mk3A "scharf" "schärfer" "schärfste" ;
smooth_A = regA "glatt" ;
straight_A = regA "gerade" ;
wet_A = regA "naß" ;
wide_A = regA "breit" ;
animal_N = reg2N "Tier" "Tiere" neuter ;
ashes_N = regN "Asche" ;
back_N = reg2N "Rücken" "Rücken" masculine ;
bark_N = regN "Rinde" ;
belly_N = reg2N "Bauch" "Bäuche" masculine ;
blood_N = regN "Blut" ;
bone_N = reg2N "Knochen" "Knochen" masculine ;
breast_N = reg2N "Brust" "Brüste" feminine ;
cloud_N = regN "Wolke" ;
day_N = regN "Tag" ;
dust_N = reg2N "Staub" "Stäube" masculine ;
ear_N = regN "Ohr" ;
earth_N = regN "Erde" ;
egg_N = regN "Ei" ;
eye_N = regN "Auge" ;
fat_N = regN "Fett" ;
feather_N = regN "feather" ;
fingernail_N = reg2N "Fingernagel" "Fingernägel" masculine ;
fire_N = regN "Feuer" ;
flower_N = regN "Blume" ;
fog_N = regN "Nebel" ;
foot_N = reg2N "Fuß" "Füße" masculine ;
forest_N = reg2N "Wald" "Wälder" masculine ;
grass_N = regN "Gras" ;
guts_N = regN "Eingeweide" ;
hair_N = regN "Haar" ;
hand_N = regN "Hand" ;
head_N = regN "Kopf" ;
heart_N = regN "Herz" ;
horn_N = regN "Horn" ;
husband_N = regN "Ehemann" ;
ice_N = regN "Eis" ;
knee_N = regN "Knie" ;
leaf_N = reg2N "Blatt" "Blätter" neuter ;
leg_N = regN "Bein" ;
liver_N = regN "Leber" ;
louse_N = reg2N "Laus" "Läuse" feminine ;
mouth_N = regN "Mund" ;
name_N = regN "Name" ;
neck_N = regN "Nacken" ;
night_N = reg2N "Nacht" "Nächte" feminine ;
nose_N = regN "Nase" ;
person_N = regN "Person" ;
rain_N = regN "Regen" ;
road_N = regN "Straße" ;
root_N = regN "Wurzel" ;
rope_N = regN "Seil" ;
salt_N = regN "Salz" ;
sand_N = regN "Sand" ;
seed_N = regN "Same" ;
skin_N = regN "Haut" ;
sky_N = regN "Himmel" ;
smoke_N = regN "Rauch" ;
snow_N = regN "Schnee" ;
stick_N = regN "Stock" ;
tail_N = regN "Schwanz" ;
tongue_N = regN "Zunge" ;
tooth_N = regN "Zahn" ;
wife_N = regN "Ehefrau" ;
wind_N = regN "Wind" ;
wing_N = reg2N "Flügel" "Flügel" masculine ;
worm_N = regN "Wurm" ;
year_N = regN "Jahr" ;
blow_V = regV "blasen" ;
breathe_V = regV "atmen" ;
burn_V = regV "brennen" ;
dig_V = regV "graben" ;
fall_V = regV "fallen" ;
float_V = regV "treiben" ;
flow_V = regV "fließen" ;
fly_V = regV "fliegen" ;
freeze_V = regV "frieren" ;
give_V3 = accdatV3 (irregV "geben" "gibt" "gab" "gäbe" "gegeben") ;
laugh_V = regV "lachen" ;
lie_V = regV "lügen" ;
play_V = regV "spielen" ;
sew_V = regV "nähen" ;
sing_V = regV "singen" ;
sit_V = irregV "sitzen" "sitzt" "saß" "säße" "gesessen" ;
smell_V = regV "riechen" ;
spit_V = regV "spucken" ;
stand_V = regV "stehen" ;
swell_V = prefixV "an" (regV "schwellen") ;
swim_V = regV "schwimmen" ;
think_V = regV "denken" ;
turn_V = regV "drehen" ;
vomit_V = regV "kotzen" ;
bite_V2 = dirV2 (irregV "beißen" "beißt" "biss" "bisse" "gebissen") ;
count_V2 = dirV2 (regV "zählen") ;
cut_V2 = dirV2 (irregV "schneiden" "schneidet" "schnitt" "schnitte" "geschnitten") ;
fear_V2 = dirV2 (regV "fürchten") ;
fight_V2 = dirV2 (regV "bekämpfen") ;
hit_V2 = dirV2 (irregV "schlagen" "schlägt" "schlug" "schlüge" "geschlagen") ;
hold_V2 = dirV2 (irregV "halten" "hält" "hielt" "hielte" "gehalten") ;
hunt_V2 = dirV2 (regV "jagen") ;
kill_V2 = dirV2 (regV "töten") ;
pull_V2 = dirV2 (irregV "ziehen" "zieht" "zog" "zöge" "gezogen") ;
push_V2 = dirV2 (irregV "schieben" "schiebt" "schub" "schübe" "geschoben") ;
rub_V2 = dirV2 (irregV "reiben" "reibt" "rieb" "riebe" "gerieben") ;
scratch_V2 = dirV2 (regV "kratzen") ;
split_V2 = dirV2 (prefixV "auf" (regV "teilen")) ;
squeeze_V2 = dirV2 (regV "pressen") ;
stab_V2 = dirV2 (irregV "stechen" "sticht" "stach" "stäche" "gestochen") ;
suck_V2 = dirV2 (regV "saugen") ;
throw_V2 = dirV2 (irregV "werfen" "wirft" "warf" "würfe" "geworfen") ;
tie_V2 = dirV2 (irregV "binden" "bindet" "band" "bände" "gebunden") ;
wash_V2 = dirV2 (irregV "waschen" "wäscht" "wusch" "wüsche" "gewaschen") ;
wipe_V2 = dirV2 (regV "wischen") ;
grammar_N = reg2N "Grammatik" "Grammatiken" feminine ;
language_N = regN "Sprache" ;
rule_N = reg2N "Regel" "Regeln" feminine ;
john_PN = regPN "Johann" ;
question_N = regN "Frage" ;
ready_A = regA "fertig" ;
reason_N = reg2N "Grund" "Gründe" masculine ;
today_Adv = mkAdv "heute" ;
uncertain_A = regA "unsicher" ;
} ;

View File

@@ -0,0 +1,41 @@
import Data.List
-- To massage the verb list in
-- http://www.iee.et.tu-dresden.de/~wernerr/grammar/verben_dt.html
-- Some manual clean-up needed.
mk file = do
s <- readFile file
mapM_ putStrLn $ map mkV $ lines s
mkV l = case words l of
tun:tut:tat:tate:getan:_ -> fun tun ++ "\n" ++ lin tun tut tat tate getan
tun:tut:tat:getan:_ -> fun tun ++ "\n" ++ lin tun tut tat (tat++"e") getan
_ -> ""
fun tun = " fun " ++ tun ++ "_V : V ;"
lin tun tut tat tate getan =
" lin " ++ tun ++ "_V = irregV " ++
quote [tun,sg3 tun tut,tat,tate,getan] ++ " ;"
quote = unwords . map qu where
qu s = case s of
'(':w -> vars (init w)
_ -> vars s
sg3 tun tut = case tut of
"*" -> case reverse tun of
'n':'e':'t':_ -> init tun ++ "t"
'n':'e':_ -> init (init tun) ++ "t"
_ -> init tun ++ "t"
_ -> words tut' !! 2
where
tut' = map (\c -> if c==',' then ' ' else c) tut
vars w = case words (map (\c -> if c=='/' then ' ' else c) w) of
[s] -> quo s
ws -> "(variants {" ++ unwords (intersperse ";" (map quo ws)) ++ "})"
quo s = "\"" ++ s ++ "\""

View File

@@ -0,0 +1,96 @@
--# -path=.:../common:../../prelude
--
----1 A Simple German Resource Morphology
----
---- Aarne Ranta & Harald Hammarström 2002 -- 2006
----
---- This resource morphology contains definitions needed in the resource
---- syntax. To build a lexicon, it is better to use $ParadigmsGer$, which
---- gives a higher-level access to this module.
--
resource MorphoGer = ResGer ** open Prelude, (Predef=Predef) in {
flags optimize=all ;
oper
-- For $StructuralGer$.
mkPrep : Str -> Case -> Preposition = \s,c ->
{s = s ; c = c} ;
nameNounPhrase : {s : Case => Str} -> {s : Case => Str ; a : Agr} = \name ->
name ** {a = agrP3 Sg} ;
detLikeAdj : Number -> Str ->
{s : Gender => Case => Str ; n : Number ; a : Adjf} = \n,dies ->
{s = appAdj (regA dies) ! n ; n = n ; a = Weak} ;
mkOrd : {s : Degree => AForm => Str} -> {s : AForm => Str} = \a ->
{s = a.s ! Posit} ;
-- For $ParadigmsGer$.
genitS : Str -> Str = \hund -> case hund of {
_ + ("el" | "en" | "er") => hund + "s" ;
_ + ("s" | "ß" | "sch" | "st" | "x" | "z") => hund + "es" ;
_ => hund + variants {"s" ; "es"}
} ;
pluralN : Str -> Str = \hund -> case hund of {
_ + ("el" | "er" | "e") => hund + "n" ;
_ + "en" => hund ;
_ => hund + "en"
} ;
dativE : Str -> Str = \hund -> case hund of {
_ + ("el" | "en" | "er" | "e") => hund ;
_ => variants {hund ; hund + "e"}
} ;
-- Duden, p. 119
verbT : Str -> Str = \v -> case v of {
_ + ("t" | "d") => v + "et" ; -- gründen, reden, betten
_ + ("ch" | "k" | "p" | "t" | "g" | "b" | "d" | "f" | "s") +
("m" | "n") => v + "et" ; -- atmen, widmen, öffnen, rechnen
_ => v + "t" -- lernen, lärmen, qualmen etc
} ;
verbST : Str -> Str = \v -> case v of {
_ + ("s" | "ss" | "ß" | "sch" | "x" | "z") => v + "t" ;
_ => v + "st"
} ;
stemVerb : Str -> Str = \v -> case v of {
_ + ("rn" | "ln") => init v ;
_ => Predef.tk 2 v
} ;
-- For $Numeral$.
LinDigit = {s : DForm => CardOrd => Str} ;
cardOrd : Str -> Str -> CardOrd => Str = \drei,dritte ->
table {
NCard => drei ;
NOrd a => (regA (init dritte)).s ! Posit ! a
} ;
cardReg : Str -> CardOrd => Str = \zehn ->
cardOrd zehn (zehn + "te") ;
mkDigit : (x1,_,_,x4 : Str) -> LinDigit =
\drei,dreizehn,dreissig,dritte ->
{s = table {
DUnit => cardOrd drei dritte ;
DTeen => cardReg dreizehn ;
DTen => cardOrd dreissig (dreissig + "ste")
}
} ;
regDigit : Str -> LinDigit = \vier ->
mkDigit vier (vier + "zehn") (vier + "zig") (vier + "te") ;
invNum : CardOrd = NCard ;
} ;

View File

@@ -0,0 +1,152 @@
concrete NounGer of Noun = CatGer ** open ResGer, Prelude in {
flags optimize=all_subs ;
lin
DetCN det cn = {
s = \\c => det.s ! cn.g ! c ++ cn.s ! adjfCase det.a c ! det.n ! c ;
a = agrP3 det.n ;
isPron = False
} ;
UsePN pn = pn ** {a = agrP3 Sg} ;
UsePron pron = {
s = \\c => pron.s ! NPCase c ;
a = pron.a
} ;
PredetNP pred np = {
s = \\c => pred.s ! np.a.n ! Masc ! c ++ np.s ! c ; ---- g
a = np.a
} ;
PPartNP np v2 = {
s = \\c => np.s ! c ++ v2.s ! VPastPart APred ; --- invar part
a = np.a
} ;
AdvNP np adv = {
s = \\c => np.s ! c ++ adv.s ;
a = np.a
} ;
DetSg quant ord =
let
n = Sg ;
a = quant.a
in {
s = \\g,c => quant.s ! g ! c ++
ord.s ! agrAdj g (adjfCase a c) n c ;
n = n ;
a = a
} ;
DetPl quant num ord =
let
n = num.n ;
a = quant.a
in {
s = \\g,c => quant.s ! g ! c ++
num.s ++ ord.s ! agrAdj g (adjfCase a c) n c ;
n = n ;
a = a
} ;
SgQuant q = {
s = q.s ! Sg ;
a = q.a
} ;
PlQuant q = {
s = q.s ! Pl ;
a = q.a
} ;
PossPron p = {
s = \\n,g,c => p.s ! NPPoss (gennum g n) c ;
a = Strong --- need separately weak for Pl ?
} ;
NoNum = {s = []; n = Pl } ;
NoOrd = {s = \\_ => []} ;
NumInt n = {s = n.s; n = table (Predef.Ints 1 * Predef.Ints 9) {
<0,1> => Sg ;
_ => Pl
} ! <1,2> ---- parser bug (AR 2/6/2007) <n.size,n.last>
} ;
OrdInt n = {s = \\_ => n.s ++ "."} ;
NumNumeral numeral = {s = numeral.s ! NCard; n = numeral.n } ;
OrdNumeral numeral = {s = \\af => numeral.s ! NOrd af} ;
AdNum adn num = {s = adn.s ++ num.s; n = num.n } ;
OrdSuperl a = {s = a.s ! Superl} ;
DefArt = {
s = \\n,g,c => artDef ! gennum g n ! c ;
a = Weak
} ;
IndefArt = {
s = table {
Sg => \\g,c => "ein" + pronEnding ! GSg g ! c ;
Pl => \\_,_ => []
} ;
a = Strong
} ;
MassDet = {
s = \\g,c => [] ;
n = Sg ;
a = Strong
} ;
UseN, UseN2, UseN3 = \n -> {
s = \\_ => n.s ;
g = n.g
} ;
ComplN2 f x = {
s = \\_,n,c => f.s ! n ! c ++ appPrep f.c2 x.s ;
g = f.g
} ;
ComplN3 f x = {
s = \\n,c => f.s ! n ! c ++ appPrep f.c2 x.s ;
g = f.g ;
c2 = f.c3
} ;
AdjCN ap cn =
let
g = cn.g
in {
s = \\a,n,c =>
preOrPost ap.isPre
(ap.s ! agrAdj g a n c)
(cn.s ! a ! n ! c) ;
g = g
} ;
RelCN cn rs = {
s = \\a,n,c => cn.s ! a ! n ! c ++ rs.s ! gennum cn.g n ;
g = cn.g
} ;
SentCN cn s = {
s = \\a,n,c => cn.s ! a ! n ! c ++ s.s ;
g = cn.g
} ;
AdvCN cn s = {
s = \\a,n,c => cn.s ! a ! n ! c ++ s.s ;
g = cn.g
} ;
ApposCN cn np = let g = cn.g in {
s = \\a,n,c => cn.s ! a ! n ! c ++ np.s ! c ;
g = g ;
isMod = cn.isMod
} ;
}

View File

@@ -0,0 +1,48 @@
concrete NumeralGer of Numeral = CatGer ** open MorphoGer in {
flags optimize = all_subs ;
lincat
Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100, Sub1000, Sub1000000 =
{s : CardOrd => Str ; n : Number} ;
lin
num x = x ;
n2 = mkDigit "zwei" "zwölf" "zwanzig" "zweite" ;
n3 = mkDigit "drei" "dreizehn" "dreissig" "dritte" ;
n4 = regDigit "vier" ;
n5 = regDigit "fünf" ;
n6 = regDigit "sechs" ;
n7 = mkDigit "sieben" "siebzehn" "siebzig" "siebte" ;
n8 = mkDigit "acht" "achzehn" "achzig" "achte" ;
n9 = regDigit "neun" ;
pot01 = {
s = \\f => table {
NCard => "ein" ; ----
NOrd af => (regA "erst").s ! Posit ! af
} ;
n = Sg
} ;
pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ;
pot110 = {s = cardReg "zehn"; n = Pl} ;
pot111 = {s = cardReg "elf"; n = Pl} ;
pot1to19 d = {s = d.s ! DTeen; n = Pl} ;
pot0as1 n = {s = n.s ! DUnit; n = n.n } ;
pot1 d = {s = d.s ! DTen; n = Pl} ;
pot1plus d e = {s = \\g => e.s ! DUnit ! invNum ++ "und" ++ d.s ! DTen ! g; n = Pl} ;
pot1as2 n = n ;
pot2 d =
{s = \\g => d.s ! DUnit ! invNum ++ cardOrd "hundert" "hunderte" ! g ; n = Pl} ;
pot2plus d e =
{s = \\g => d.s ! DUnit ! invNum ++ "hundert" ++ e.s ! g ; n = Pl} ;
pot2as3 n = n ;
pot3 n =
{s = \\g => n.s ! invNum ++ cardOrd "tausend" "tausendte" ! g ; n = Pl} ; ----
pot3plus n m =
{s = \\g => n.s ! invNum ++ "tausend" ++ m.s ! g ; n = Pl} ;
}

View File

@@ -0,0 +1,508 @@
--# -path=.:../common:../abstract:../../prelude
--1 German Lexical Paradigms
--
-- Aarne Ranta, Harald Hammarström and Björn Bringert2003--2007
--
-- This is an API for the user of the resource grammar
-- for adding lexical items. It gives functions for forming
-- expressions of open categories: nouns, adjectives, verbs.
--
-- Closed categories (determiners, pronouns, conjunctions) are
-- accessed through the resource syntax API, $Structural.gf$.
--
-- The structure of functions for each word class $C$ is the following:
-- first we give a handful of patterns that aim to cover all
-- cases, from the most regular (with just one argument) to the worst.
-- The name of this function is $mkC$.
--
-- There is also a module [``IrregGer`` ../../german/IrregGer.gf]
-- which covers irregular verbs.
resource ParadigmsGer = open
(Predef=Predef),
Prelude,
MorphoGer,
CatGer
in {
--2 Parameters
-- To abstract over gender names, we define the following identifiers.
oper
Gender : Type ;
masculine : Gender ;
feminine : Gender ;
neuter : Gender ;
-- To abstract over case names, we define the following.
Case : Type ;
nominative : Case ;
accusative : Case ;
dative : Case ;
genitive : Case ;
-- To abstract over number names, we define the following.
Number : Type ;
singular : Number ;
plural : Number ;
--2 Nouns
mkN : overload {
-- The regular heuristics recognizes some suffixes, from which it
-- guesses the gender and the declension: "e, ung, ion" give the
-- feminine with plural ending "-n, -en", and the rest are masculines
-- with the plural "-e" (without Umlaut).
mkN : (Stufe : Str) -> N ;
-- The 'almost regular' case is much like the information given in an ordinary
-- dictionary. It takes the singular and plural nominative and the
-- gender, and infers the other forms from these.
mkN : (Bild,Bilder : Str) -> Gender -> N ;
-- Worst case: give all four singular forms, two plural forms (others + dative),
-- and the gender.
mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> N
-- mann, mann, manne, mannes, männer, männern
};
-- Relational nouns need a preposition. The most common is "von" with
-- the dative, and there is a special case for regular nouns.
mkN2 : overload {
mkN2 : Str -> N2 ;
mkN2 : N -> N2 ;
mkN2 : N -> Prep -> N2
} ;
-- Use the function $mkPrep$ or see the section on prepositions below to
-- form other prepositions.
-- Some prepositions are moreover constructed in [StructuralGer StructuralGer.html].
--
-- Three-place relational nouns ("die Verbindung von x nach y") need two prepositions.
mkN3 : N -> Prep -> Prep -> N3 ;
--3 Proper names and noun phrases
--
-- Proper names, with an "s" genitive and other cases like the
-- nominative, are formed from a string. Final "s" ("Johannes-Johannes") is
-- taken into account.
mkPN : overload {
mkPN : Str -> PN ;
-- If only the genitive differs, two strings are needed.
mkPN : (nom,gen : Str) -> PN ;
-- In the worst case, all four forms are needed.
mkPN : (nom,acc,dat,gen : Str) -> PN
} ;
--2 Adjectives
mkA : overload {
-- The regular adjective formation works for most cases, and includes
-- variations such as "teuer - teurer", "böse - böser".
mkA : Str -> A ;
-- In the worst case, adjectives need three forms - one for each degree.
mkA : (gut,besser,beste : Str) -> A -- gut,besser,beste
};
-- Invariable adjective are a special case.
invarA : Str -> A ; -- prima
-- Two-place adjectives are formed by adding a preposition to an adjective.
mkA2 : A -> Prep -> A2 ;
--2 Adverbs
-- Adverbs are formed from strings.
mkAdv : Str -> Adv ;
--2 Prepositions
-- A preposition is formed from a string and a case.
mkPrep : Str -> Case -> Prep ;
-- Often just a case with the empty string is enough.
accPrep : Prep ;
datPrep : Prep ;
genPrep : Prep ;
-- A couple of common prepositions (always with the dative).
von_Prep : Prep ;
zu_Prep : Prep ;
--2 Verbs
mkV : overload {
-- Regular verbs ("weak verbs") need just the infinitive form.
mkV : (führen : Str) -> V ;
-- Irregular verbs use Ablaut and, in the worst cases, also Umlaut.
mkV : (sehen,sieht,sah,sähe,gesehen : Str) -> V ;
-- The worst-case constructor needs six forms:
-- - Infinitive,
-- - 3p sg pres. indicative,
-- - 2p sg imperative,
-- - 1/3p sg imperfect indicative,
-- - 1/3p sg imperfect subjunctive (because this uncommon form can have umlaut)
-- - the perfect participle
--
--
mkV : (geben, gibt, gib, gab, gäbe, gegeben : Str) -> V ;
-- To add a movable suffix e.g. "auf(fassen)".
mkV : Str -> V -> V
};
-- To remove the past participle prefix "ge", e.g. for the verbs
-- prefixed by "be-, ver-".
no_geV : V -> V ;
-- To change the auxiliary from "haben" (default) to "sein" and
-- vice-versa.
seinV : V -> V ;
habenV : V -> V ;
-- Reflexive verbs can take reflexive pronouns of different cases.
reflV : V -> Case -> V ;
--3 Two-place verbs
mkV2 : overload {
-- Two-place verbs with a preposition.
mkV2 : V -> Prep -> V2 ;
-- Two-place verbs with direct object (accusative, transitive verbs).
mkV2 : V -> V2 ;
-- Two-place verbs with object in the given case.
mkV2 : V -> Case -> V2
};
--3 Three-place verbs
--
-- Three-place (ditransitive) verbs need two prepositions, of which
-- the first one or both can be absent.
mkV3 : V -> Prep -> Prep -> V3 ; -- sprechen, mit, über
dirV3 : V -> Prep -> V3 ; -- senden,(accusative),nach
accdatV3 : V -> V3 ; -- give,accusative,dative
--3 Other complement patterns
--
-- Verbs and adjectives can take complements such as sentences,
-- questions, verb phrases, and adjectives.
mkV0 : V -> V0 ;
mkVS : V -> VS ;
mkV2S : V -> Prep -> V2S ;
mkVV : V -> VV ;
mkV2V : V -> Prep -> V2V ;
mkVA : V -> VA ;
mkV2A : V -> Prep -> V2A ;
mkVQ : V -> VQ ;
mkV2Q : V -> Prep -> V2Q ;
mkAS : A -> AS ;
mkA2S : A -> Prep -> A2S ;
mkAV : A -> AV ;
mkA2V : A -> Prep -> A2V ;
-- Notice: categories $V2S, V2V, V2Q$ are in v 1.0 treated
-- just as synonyms of $V2$, and the second argument is given
-- as an adverb. Likewise $AS, A2S, AV, A2V$ are just $A$.
-- $V0$ is just $V$.
V0, V2S, V2V, V2Q : Type ;
AS, A2S, AV, A2V : Type ;
--.
--2 Definitions of paradigms
--
-- The definitions should not bother the user of the API. So they are
-- hidden from the document.
Gender = MorphoGer.Gender ;
Case = MorphoGer.Case ;
Number = MorphoGer.Number ;
masculine = Masc ;
feminine = Fem ;
neuter = Neutr ;
nominative = Nom ;
accusative = Acc ;
dative = Dat ;
genitive = Gen ;
singular = Sg ;
plural = Pl ;
mk6N a b c d e f g = MorphoGer.mkN a b c d e f g ** {lock_N = <>} ;
regN : Str -> N = \hund -> case hund of {
_ + "e" => mk6N hund hund hund hund (hund + "n") (hund + "n") Fem ;
_ + ("ion" | "ung") => mk6N hund hund hund hund (hund + "en") (hund + "en") Fem ;
_ + ("er" | "en" | "el") => mk6N hund hund hund (genitS hund) hund (pluralN hund) Masc ;
_ => mk6N hund hund hund (genitS hund) (hund + "e") (pluralN hund) Masc
} ;
reg2N : (x1,x2 : Str) -> Gender -> N = \hund,hunde,g ->
let
hunds = genitS hund ;
hundE = dativE hund ;
hunden = pluralN hunde
in
case <hund,hunde,g> of { -- Duden p. 223
<_,_ + ("e" | "er"), Masc | Neutr> => -- I,IV
mk6N hund hund hundE hunds hunde hunden g ;
<_ + ("el"|"er"|"en"),_ + ("el"|"er"|"en"), Masc | Neutr> => -- II
mk6N hund hund hund hunds hunde hunden g ;
<_,_ + "s", Masc | Neutr> => -- V
mk6N hund hund hund (hund + "s") hunde hunde g ;
<_,_ + "en", Masc> => -- VI
mk6N hund hunde hunde hunde hunde hunde g ;
<_,_ + ("e" | "er"), Fem> => -- VII,VIII
mk6N hund hund hund hund hunde hunden g ;
<_,_ + ("n" | "s"), Fem> => -- IX,X
mk6N hund hund hund hund hunde hunde g ;
_ => regN hund
} ;
mkN2 = overload {
mkN2 : Str -> N2 = \s -> vonN2 (regN s) ;
mkN2 : N -> N2 = vonN2 ;
mkN2 : N -> Prep -> N2 = mmkN2
} ;
mmkN2 : N -> Prep -> N2 = \n,p -> n ** {c2 = p ; lock_N2 = <>} ;
vonN2 : N -> N2 = \n -> n ** {c2 = {s = "von" ; c = dative} ; lock_N2 = <>} ;
mkN3 = \n,p,q -> n ** {c2 = p ; c3 = q ; lock_N3 = <>} ;
mk2PN = \karolus, karoli ->
{s = table {Gen => karoli ; _ => karolus} ; lock_PN = <>} ;
regPN = \horst ->
mk2PN horst (ifTok Tok (Predef.dp 1 horst) "s" horst (horst + "s")) ;
mkPN = overload {
mkPN : Str -> PN = regPN ;
mkPN : (nom,gen : Str) -> PN = mk2PN ;
mkPN : (nom,acc,dat,gen : Str) -> PN = \nom,acc,dat,gen ->
{s = table {Nom => nom ; Acc => acc ; Dat => dat ; Gen => gen} ; lock_PN = <>}
} ;
mk2PN : (karolus, karoli : Str) -> PN ; -- karolus, karoli
regPN : (Johann : Str) -> PN ;
-- Johann, Johanns ; Johannes, Johannes
mk3A : (gut,besser,beste : Str) -> A = \a,b,c ->
let aa : Str = case a of {
teu + "er" => teu + "r" ;
mud + "e" => mud ;
_ => a
} in
MorphoGer.mkA a aa b (init c) ** {lock_A = <>} ;
regA : Str -> A = \a -> case a of {
teu + "er" => mk3A a (teu + "rer") (teu + "reste") ;
_ + "e" => mk3A a (a + "r") (a + "ste") ;
_ => mk3A a (a + "er") (a + "este")
} ;
invarA = \s -> {s = \\_,_ => s ; lock_A = <>} ; ---- comparison
mkA2 = \a,p -> a ** {c2 = p ; lock_A2 = <>} ;
mkAdv s = {s = s ; lock_Adv = <>} ;
mkPrep s c = {s = s ; c = c ; lock_Prep = <>} ;
accPrep = mkPrep [] accusative ;
datPrep = mkPrep [] dative ;
genPrep = mkPrep [] genitive ;
von_Prep = mkPrep "von" dative ;
zu_Prep = mkPrep "zu" dative ;
mk6V geben gibt gib gab gaebe gegeben =
let
geb = stemVerb geben ;
gebe = geb + "e" ;
gibst = verbST (init gibt) ;
gebt = verbT geb ;
gabst = verbST gab ;
gaben = pluralN gab ;
gabt = verbT gab
in
MorphoGer.mkV
geben gebe gibst gibt gebt gib gab gabst gaben gabt gaebe gegeben
[] VHaben ** {lock_V = <>} ;
regV fragen =
let
frag = stemVerb fragen ;
fragt = verbT frag ;
fragte = fragt + "e" ;
gefragt = "ge" + fragt ;
in
mk6V fragen fragt (frag + "e") fragte fragte gefragt ;
irregV singen singt sang saenge gesungen =
let
sing = stemVerb singen ;
in
mk6V singen singt sing sang saenge gesungen ;
prefixV p v = MorphoGer.prefixV p v ** {lock_V = v.lock_V} ;
habenV v =
{s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VHaben ; vtype = v.vtype} ;
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} ;
no_geV v = let vs = v.s in {
s = table {
p@(VPastPart _) => Predef.drop 2 (vs ! p) ;
p => vs ! p
} ;
prefix = v.prefix ; lock_V = v.lock_V ; aux = v.aux ; vtype = v.vtype
} ;
haben_V = MorphoGer.haben_V ** {lock_V = <>} ;
sein_V = MorphoGer.sein_V ** {lock_V = <>} ;
werden_V = MorphoGer.werden_V ** {lock_V = <>} ;
prepV2 v c = v ** {c2 = c ; lock_V2 = <>} ;
dirV2 v = prepV2 v (mkPrep [] accusative) ;
datV2 v = prepV2 v (mkPrep [] dative) ;
mkV3 v c d = v ** {c2 = c ; c3 = d ; lock_V3 = <>} ;
dirV3 v p = mkV3 v (mkPrep [] accusative) p ;
accdatV3 v = dirV3 v (mkPrep [] dative) ;
mkVS v = v ** {lock_VS = <>} ;
mkVQ v = v ** {lock_VQ = <>} ;
mkVV v = v ** {isAux = False ; lock_VV = <>} ;
V0 : Type = V ;
V2S, V2V, V2Q : Type = V2 ;
AS, A2S, AV : Type = A ;
A2V : Type = A2 ;
mkV0 v = v ** {lock_V = <>} ;
mkV2S v p = prepV2 v p ** {lock_V2 = <>} ;
mkV2V v p = prepV2 v p ** {lock_V2 = <>} ;
mkVA v = v ** {lock_VA = <>} ;
mkV2A v p = prepV2 v p ** {lock_V2A = <>} ;
mkV2Q v p = prepV2 v p ** {lock_V2 = <>} ;
mkAS v = v ** {lock_A = <>} ;
mkA2S v p = mkA2 v p ** {lock_A = <>} ;
mkAV v = v ** {lock_A = <>} ;
mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
-- pre-overload API and overload definitions
regN : Str -> N ;
reg2N : (x1,x2 : Str) -> Gender -> N ;
mk6N : (x1,_,_,_,_,x6 : Str) -> Gender -> N ;
mkN = overload {
mkN : Str -> N = regN ;
mkN : (x1,x2 : Str) -> Gender -> N = reg2N ;
mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> N = mk6N
};
regA : Str -> A ;
mk3A : (gut,besser,beste : Str) -> A ;
mkA = overload {
mkA : Str -> A = regA ;
mkA : (gut,besser,beste : Str) -> A = mk3A
};
regV : Str -> V ;
irregV : (x1,_,_,_,x5 : Str) -> V ;
mk6V : (x1,_,_,_,_,x6 : Str) -> V ;
prefixV : Str -> V -> V ;
mkV = overload {
mkV : Str -> V = regV ;
mkV : (x1,_,_,_,x5 : Str) -> V = irregV ;
mkV : (x1,_,_,_,_,x6 : Str) -> V = mk6V ;
mkV : Str -> V -> V = prefixV
};
prepV2 : V -> Prep -> V2 ;
dirV2 : V -> V2 ;
datV2 : V -> V2 ;
mkV2 = overload {
mkV2 : V -> Prep -> V2 = prepV2;
mkV2 : V -> V2 = dirV2 ;
mkV2 : V -> Case -> V2 = \v,c -> prepV2 v (mkPrep [] c)
};
} ;

View File

@@ -0,0 +1,26 @@
concrete PhraseGer of Phrase = CatGer ** open Prelude, ResGer in {
flags optimize=all_subs ;
lin
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
UttS s = {s = s.s ! Main} ;
UttQS qs = {s = qs.s ! QDir} ;
UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg False} ;
UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Pl False} ;
UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg True} ;
UttIP ip = {s = ip.s ! Nom} ; --- Acc also
UttIAdv iadv = iadv ;
UttNP np = {s = np.s ! Nom} ;
UttVP vp = {s = useInfVP True vp} ; -- without zu
UttAdv adv = adv ;
NoPConj = {s = []} ;
PConjConj conj = conj ;
NoVoc = {s = []} ;
VocNP np = {s = "," ++ np.s ! Nom} ;
}

View File

@@ -0,0 +1,83 @@
concrete QuestionGer of Question = CatGer ** open ResGer in {
flags optimize=all_subs ;
lin
QuestCl cl = {
s = \\m,t,a,p =>
let cls = cl.s ! m ! t ! a ! p
in table {
QDir => cls ! Inv ;
QIndir => "ob" ++ cls ! Sub
}
} ;
QuestVP qp vp = {
s = \\m,t,a,b,q =>
let
cl = (mkClause (qp.s ! Nom) (agrP3 qp.n) vp).s ! m ! t ! a ! b
in
case q of {
QIndir => cl ! Sub ;
_ => cl ! Main
}
} ;
QuestSlash ip slash = {
s = \\m,t,a,p =>
let
cls = slash.s ! m ! t ! a ! p ;
who = appPrep slash.c2 ip.s
in table {
QDir => who ++ cls ! Inv ;
QIndir => who ++ cls ! Sub
}
} ;
QuestIAdv iadv cl = {
s = \\m,t,a,p =>
let
cls = cl.s ! m ! t ! a ! p ;
why = iadv.s
in table {
QDir => why ++ cls ! Inv ;
QIndir => why ++ cls ! Sub
}
} ;
QuestIComp icomp np = {
s = \\m,t,a,p =>
let
vp = predV sein_V ;
cls = (mkClause (np.s ! Nom) np.a vp).s ! m ! t ! a ! p ;
why = icomp.s ! np.a
in table {
QDir => why ++ cls ! Inv ;
QIndir => why ++ cls ! Sub
}
} ;
PrepIP p ip = {
s = appPrep p ip.s
} ;
AdvIP ip adv = {
s = \\c => ip.s ! c ++ adv.s ;
n = ip.n
} ;
IDetCN idet num ord cn =
let
g = cn.g ;
n = idet.n
in {
s = \\c =>
idet.s ! g ! c ++ num.s ++ ord.s ! agrAdj g Weak n c ++
cn.s ! Weak ! n ! c ;
n = n
} ;
CompIAdv a = {s = \\_ => a.s} ;
}

View File

@@ -0,0 +1,48 @@
concrete RelativeGer of Relative = CatGer ** open ResGer in {
flags optimize=all_subs ;
lin
RelCl cl = {
s = \\m,t,a,b,_ => "derart" ++ conjThat ++ cl.s ! m ! t ! a ! b ! Sub ;
c = Nom
} ;
RelVP rp vp = {
s = \\m,t,ant,b,gn =>
let
agr = case rp.a of {
RNoAg => agrP3 (numGenNum gn) ;
RAg a => a ** {g = Neutr}
} ;
cl = mkClause (rp.s ! gn ! Nom) agr vp
in
cl.s ! m ! t ! ant ! b ! Sub ;
c = Nom
} ;
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
} ;
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}
} ;
IdRP = {s = relPron ; a = RNoAg} ;
oper
relPron : GenNum => Case => Str = \\gn,c =>
case <gn,c> of {
<GSg Fem,Gen> => "deren" ;
<GSg g,Gen> => "dessen" ;
<GPl,Dat> => "denen" ;
<GPl,Gen> => "deren" ;
_ => artDef ! gn ! c
} ;
}

View File

@@ -0,0 +1,616 @@
--# -path=.:../abstract:../common:prelude
--1 German auxiliary operations.
--
-- (c) 2002-2006 Aarne Ranta and Harald Hammarström
--
-- This module contains operations that are needed to make the
-- resource syntax work. To define everything that is needed to
-- implement $Test$, it moreover contains some lexical
-- patterns needed for $Lex$.
resource ResGer = ParamX ** open Prelude in {
flags optimize=all ;
--2 For $Noun$
-- These are the standard four-value case and three-value gender.
param
Case = Nom | Acc | Dat | Gen ;
Gender = Masc | Fem | Neutr ;
-- Complex $CN$s, like adjectives, have strong and weak forms.
Adjf = Strong | Weak ;
-- Gender distinctions are only made in the singular.
GenNum = GSg Gender | GPl ;
-- Agreement of $NP$ is a record.
oper Agr = {g : Gender ; n : Number ; p : Person} ;
-- Pronouns are the worst-case noun phrases, which have both case
-- and possessive forms.
param NPForm = NPCase Case | NPPoss GenNum Case ;
--2 For $Adjective$
-- The predicative form of adjectives is not inflected further.
param AForm = APred | AMod GenNum Case ;
--2 For $Verb$
param VForm =
VInf Bool -- True = with the particle "zu"
| VFin Bool VFormFin -- True = prefix glued to verb
| VImper Number -- prefix never glued
| VPresPart AForm -- prefix always glued
| VPastPart AForm ;
param VFormFin =
VPresInd Number Person
| VPresSubj Number Person
| VImpfInd Number Person --# notpresent
| VImpfSubj Number Person --# notpresent
;
param VPForm =
VPFinite Mood Tense Anteriority
| VPImperat Bool
| VPInfinit Anteriority ;
param VAux = VHaben | VSein ;
param VType = VAct | VRefl Case ;
-- The order of sentence is depends on whether it is used as a main
-- clause, inverted, or subordinate.
param
Order = Main | Inv | Sub ;
-- Main clause mood: "es sei, es wäre, es werde sein".
-- Not relevant for $Fut$. ---
Mood = MIndic | MConjunct ;
--2 For $Relative$
RAgr = RNoAg | RAg {n : Number ; p : Person} ;
--2 For $Numeral$
CardOrd = NCard | NOrd AForm ;
DForm = DUnit | DTeen | DTen ;
--2 Transformations between parameter types
oper
agrP3 : Number -> Agr = agrgP3 Neutr ;
agrgP3 : Gender -> Number -> Agr = \g,n ->
{g = g ; n = n ; p = P3} ;
gennum : Gender -> Number -> GenNum = \g,n ->
case n of {
Sg => GSg g ;
Pl => GPl
} ;
-- Needed in $RelativeGer$.
numGenNum : GenNum -> Number = \gn ->
case gn of {
GSg _ => Sg ;
GPl => Pl
} ;
-- Used in $NounGer$.
agrAdj : Gender -> Adjf -> Number -> Case -> AForm = \g,a,n,c ->
let
gn = gennum g n ;
e = AMod (GSg Fem) Nom ;
en = AMod (GSg Masc) Acc ;
in
case a of {
Strong => AMod gn c ;
_ => case <gn,c> of {
<GSg _, Nom> => e ;
<GSg Masc,Acc> => en ;
<GSg _, Acc> => e ;
_ => en
}
} ;
-- This is used twice in NounGer.
adjfCase : Adjf -> Case -> Adjf = \a,c -> case <a,c> of {
<Strong, Nom|Acc> => Strong ;
_ => Weak
} ;
vFin : Bool -> Mood -> Tense -> Agr -> VForm = \b,m,t,a ->
case <t,m> of {
<Pres,MIndic> => VFin b (VPresInd a.n a.p) ;
<Pres,MConjunct> => VFin b (VPresSubj a.n a.p) ;
<Past,MIndic> => VFin b (VImpfInd a.n a.p) ; --# notpresent
<Past,MConjunct> => VFin b (VImpfSubj a.n a.p) ; --# notpresent
_ => VInf False --- never used
} ;
conjAgr : Agr -> Agr -> Agr = \a,b -> {
g = Neutr ; ----
n = conjNumber a.n b.n ;
p = conjPerson a.p b.p
} ;
-- For $Lex$.
-- For conciseness and abstraction, we first define a method for
-- generating a case-dependent table from a list of four forms.
oper
caselist : (x1,_,_,x4 : Str) -> Case => Str = \n,a,d,g ->
table {
Nom => n ;
Acc => a ;
Dat => d ;
Gen => g
} ;
-- For each lexical category, here are the worst-case constructors and
-- some practical special cases.
-- More paradigms are given in $ParadigmsGer$.
-- The worst-case constructor for common nouns needs six forms: all plural forms
-- are always the same except for the dative. Actually the six forms are never
-- needed at the same time, but just subsets of them.
Noun : Type = {s : Number => Case => Str ; g : Gender} ;
mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> Noun =
\mann, mannen, manne, mannes, maenner, maennern, g -> {
s = table {
Sg => caselist mann mannen manne mannes ;
Pl => caselist maenner maenner maennern maenner
} ;
g = g
} ;
-- Adjectives need four forms: two for the positive and one for the other degrees.
Adjective : Type = {s : Degree => AForm => Str} ;
mkA : (x1,_,_,x4 : Str) -> Adjective = \gut,gute,besser,best ->
{s = table {
Posit => adjForms gut gute ;
Compar => adjForms besser besser ;
Superl => adjForms best best
}
} ;
-- Verbs need as many as 12 forms, to cover the variations with
-- suffixes "t" and "st". Auxiliaries like "sein" will have to
-- make extra cases even for this.
Verb : Type = {
s : VForm => Str ;
prefix : Str ;
aux : VAux ;
vtype : VType
} ;
mkV : (x1,_,_,_,_,_,_,_,_,_,_,x12 : Str) -> Str -> VAux -> Verb =
\geben,gebe,gibst,gibt,gebt,gib,
gab,gabst,gaben,gabt,
gaebe,gegeben,ein,aux ->
let
einb : Bool -> Str -> Str = \b,geb ->
if_then_Str b (ein + geb) geb ;
in
{s = table {
VInf False => ein + geben ;
VInf True =>
if_then_Str (isNil ein) ("zu" ++ geben) (ein + "zu" + geben) ;
VFin b vf => einb b (case vf of {
VPresInd Sg P1 => gebe ;
VPresInd Sg P2 => gibst ;
VPresInd Sg P3 => gibt ;
VPresInd Pl P2 => gebt ;
VPresInd Pl _ => geben ;
VImpfInd Sg P2 => gabst ; --# notpresent
VImpfInd Sg _ => gab ; --# notpresent
VImpfInd Pl P2 => gabt ; --# notpresent
VImpfInd Pl _ => gaben ; --# notpresent
VImpfSubj Sg P2 => gaebe + "st" ; --# notpresent
VImpfSubj Sg _ => gaebe ; --# notpresent
VImpfSubj Pl P2 => gaebe + "t" ; --# notpresent
VImpfSubj Pl _ => gaebe + "n" ; --# notpresent
VPresSubj Sg P2 => init geben + "st" ;
VPresSubj Sg _ => init geben ;
VPresSubj Pl P2 => init geben + "t" ;
VPresSubj Pl _ => geben
}) ;
VImper Sg => gib ;
VImper Pl => gebt ;
VPresPart a => ein + (regA (geben + "d")).s ! Posit ! a ;
VPastPart a => ein + (regA gegeben).s ! Posit ! a
} ;
prefix = ein ;
aux = aux ;
vtype = VAct
} ;
-- To add a prefix (like "ein") to an already existing verb.
prefixV : Str -> Verb -> Verb = \ein,verb ->
let
vs = verb.s ;
geben = vs ! VInf False ;
einb : Bool -> Str -> Str = \b,geb ->
if_then_Str b (ein + geb) geb ;
in
{s = table {
VInf False => ein + geben ;
VInf True =>
if_then_Str (isNil ein) ("zu" ++ geben) (ein + "zu" + geben) ;
VFin b vf => einb b (vs ! VFin b vf) ;
VImper n => vs ! VImper n ;
VPresPart a => ein + (regA (geben + "d")).s ! Posit ! a ;
VPastPart a => ein + vs ! VPastPart a
} ;
prefix = ein ;
aux = verb.aux ;
vtype = verb.vtype
} ;
-- These functions cover many regular cases; full coverage inflectional patterns are
-- defined in $MorphoGer$.
mkN4 : (x1,_,_,x4 : Str) -> Gender -> Noun = \wein,weines,weine,weinen ->
mkN wein wein wein weines weine weinen ;
regA : Str -> Adjective = \blau ->
mkA blau blau (blau + "er") (blau + "est") ;
regV : Str -> Verb = \legen ->
let
lege = init legen ;
leg = init lege ;
legt = leg + "t" ;
legte = legt + "e"
in
mkV
legen lege (leg+"st") legt legt leg
legte (legte + "st") (legte + "n") (legte + "t")
legte ("ge" + legt)
[] VHaben ;
-- Prepositions for complements indicate the complement case.
Preposition : Type = {s : Str ; c : Case} ;
-- To apply a preposition to a complement.
appPrep : Preposition -> (Case => Str) -> Str = \prep,arg ->
prep.s ++ arg ! prep.c ;
-- To build a preposition from just a case.
noPreposition : Case -> Preposition = \c ->
{s = [] ; c = c} ;
-- Pronouns and articles
-- Here we define personal and relative pronouns.
-- All personal pronouns, except "ihr", conform to the simple
-- pattern $mkPronPers$.
mkPronPers : (x1,_,_,_,x5 : Str) -> Gender -> Number -> Person ->
{s : NPForm => Str ; a : Agr} =
\ich,mich,mir,meiner,mein,g,n,p -> {
s = table {
NPCase c => caselist ich mich mir meiner ! c ;
NPPoss gn c => mein + pronEnding ! gn ! c
} ;
a = {g = g ; n = n ; p = p}
} ;
pronEnding : GenNum => Case => Str = table {
GSg Masc => caselist "" "en" "em" "es" ;
GSg Fem => caselist "e" "e" "er" "er" ;
GSg Neut => 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" ;
GPl => caselist "die" "die" "den" "der"
} ;
-- This is used when forming determiners that are like adjectives.
appAdj : Adjective -> Number => Gender => Case => 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
} ;
-- This auxiliary gives the forms in each degree of adjectives.
adjForms : (x1,x2 : Str) -> AForm => Str = \teuer,teur ->
table {
APred => teuer ;
AMod (GSg Masc) c =>
caselist (teur+"er") (teur+"en") (teur+"em") (teur+"es") ! c ;
AMod (GSg Fem) c =>
caselist (teur+"e") (teur+"e") (teur+"er") (teur+"er") ! c ;
AMod (GSg Neut) c =>
caselist (teur+"es") (teur+"es") (teur+"em") (teur+"es") ! c ;
AMod GPl c =>
caselist (teur+"e") (teur+"e") (teur+"en") (teur+"er") ! c
} ;
-- For $Verb$.
VP : Type = {
s : Bool => Agr => VPForm => { -- True = prefix glued to verb
fin : Str ; -- hat
inf : Str -- wollen
} ;
a1 : Polarity => Str ; -- nicht
n2 : Agr => Str ; -- dich
a2 : Str ; -- heute
isAux : Bool ; -- is a double infinitive
inf : Str ; -- sagen
ext : Str -- dass sie kommt
} ;
predV : Verb -> VP = predVGen False ;
predVGen : Bool -> Verb -> VP = \isAux, verb ->
let
vfin : Bool -> Mood -> Tense -> Agr -> Str = \b,m,t,a ->
verb.s ! vFin b m t a ;
vinf = verb.s ! VInf False ;
vpart = if_then_Str isAux vinf (verb.s ! VPastPart APred) ;
vHaben = auxPerfect verb ;
hat : Mood -> Tense -> Agr -> Str = \m,t,a ->
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)
} ;
wuerde : Agr -> Str = \a -> --# notpresent
werden_V.s ! VFin False (VImpfSubj a.n a.p) ; --# notpresent
auf = verb.prefix ;
vf : Bool -> Str -> Str -> {fin,inf : Str} = \b,fin,inf -> {
fin = fin ;
inf = if_then_Str b [] auf ++ inf --- negation of main b
} ;
in {
s = \\b,a => table {
VPFinite m t Simul => case t of {
-- Pres | Past => vf (vfin m t a) [] ; -- the general rule
Past => vf b (vfin b m t a) [] ; --# notpresent
Fut => vf True (wird m a) vinf ; --# notpresent
Cond => vf True (wuerde a) vinf ; --# notpresent
Pres => vf b (vfin b m t a) []
} ;
VPFinite m t Anter => case t of { --# notpresent
Pres | Past => vf True (hat m t a) vpart ; --# notpresent
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 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)
} ;
a1 : Polarity => Str = negation ;
n2 : Agr => Str = case verb.vtype of {
VAct => \\_ => [] ;
VRefl c => \\a => reflPron ! a ! c
} ;
a2 : Str = [] ;
isAux = isAux ; ----
inf,ext : Str = []
} ;
auxPerfect : Verb -> VForm => Str = \verb ->
case verb.aux of {
VHaben => haben_V.s ;
VSein => sein_V.s
} ;
haben_V : Verb =
mkV
"haben" "habe" "hast" "hat" "habt" "hab"
"hatte" "hattest" "hatten" "hattet"
"hätte" "gehabt"
[] VHaben ;
werden_V : Verb =
mkV
"werden" "werde" "wirst" "wird" "werdet" "werd"
"wurde" "wurdest" "wurden" "wurdet"
"würde" "geworden"
[] VSein ;
werdenPass : Verb =
mkV
"werden" "werde" "wirst" "wird" "werdet" "werd"
"wurde" "wurdest" "wurden" "wurdet"
"würde" "worden"
[] VSein ;
sein_V : Verb =
let
sein = mkV
"sein" "bin" "bist" "ist" "seid" "sei"
"war" "warst" "waren" "wart"
"wäre" "gewesen"
[] VSein
in
{s = table {
VFin _ (VPresInd Pl (P1 | P3)) => "sind" ;
VFin _ (VPresSubj Sg P2) => (variants {"seiest" ; "seist"}) ;
VFin _ (VPresSubj Sg _) => "sei" ;
VFin _ (VPresSubj Pl P2) => "seiet" ;
VFin _ (VPresSubj Pl _) => "seien" ;
VPresPart a => (regA "seiend").s ! Posit ! a ;
v => sein.s ! v
} ;
prefix = [] ;
aux = VSein ;
vtype = VAct
} ;
auxVV : Verb -> Verb ** {isAux : Bool} = \v -> v ** {isAux = True} ;
negation : Polarity => Str = table {
Pos => [] ;
Neg => "nicht"
} ;
-- Extending a verb phrase with new constituents.
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
s = vp.s ;
a1 = vp.a1 ;
n2 = \\a => vp.n2 ! a ++ obj ! a ;
a2 = vp.a2 ;
isAux = vp.isAux ;
inf = vp.inf ;
ext = vp.ext
} ;
insertAdV : Str -> VP -> VP = \adv,vp -> {
s = vp.s ;
a1 = \\a => vp.a1 ! a ++ adv ;
n2 = vp.n2 ;
a2 = vp.a2 ;
isAux = vp.isAux ;
inf = vp.inf ;
ext = vp.ext
} ;
insertAdv : Str -> VP -> VP = \adv,vp -> {
s = vp.s ;
a1 = vp.a1 ;
n2 = vp.n2 ;
a2 = vp.a2 ++ adv ;
isAux = vp.isAux ;
inf = vp.inf ;
ext = vp.ext
} ;
insertExtrapos : Str -> VP -> VP = \ext,vp -> {
s = vp.s ;
a1 = vp.a1 ;
n2 = vp.n2 ;
a2 = vp.a2 ;
isAux = vp.isAux ;
inf = vp.inf ;
ext = vp.ext ++ ext
} ;
insertInf : Str -> VP -> VP = \inf,vp -> {
s = vp.s ;
a1 = vp.a1 ;
n2 = vp.n2 ;
a2 = vp.a2 ;
isAux = vp.isAux ; ----
inf = inf ++ vp.inf ;
ext = vp.ext
} ;
-- For $Sentence$.
Clause : Type = {
s : Mood => Tense => Anteriority => Polarity => Order => Str
} ;
mkClause : Str -> Agr -> VP -> Clause = \subj,agr,vp -> {
s = \\m,t,a,b,o =>
let
ord = case o of {
Sub => True ; -- glue prefix to verb
_ => False
} ;
verb = vp.s ! ord ! agr ! VPFinite m t a ;
neg = vp.a1 ! b ;
obj = vp.n2 ! agr ;
compl = obj ++ neg ++ vp.a2 ;
inf = vp.inf ++ verb.inf ;
extra = vp.ext ;
inffin =
case <a,vp.isAux> of { --# notpresent
<Anter,True> => verb.fin ++ inf ; -- double inf --# notpresent
_ => --# notpresent
inf ++ verb.fin --- or just auxiliary vp
} --# notpresent
in
case o of {
Main => subj ++ verb.fin ++ compl ++ inf ++ extra ;
Inv => verb.fin ++ subj ++ compl ++ inf ++ extra ;
Sub => subj ++ compl ++ inffin ++ extra
}
} ;
infVP : Bool -> VP -> ((Agr => Str) * Str * Str) = \isAux, vp ->
<
\\agr => vp.n2 ! agr ++ vp.a2,
(vp.s ! (notB isAux) ! agrP3 Sg ! VPInfinit Simul).inf,
vp.inf ++ vp.ext
> ;
useInfVP : Bool -> VP -> Str = \isAux,vp ->
let vpi = infVP isAux vp in
vpi.p1 ! agrP3 Sg ++ vpi.p3 ++ vpi.p2 ;
-- The nominative case is not used as reflexive, but defined here
-- so that we can reuse this in personal pronouns.
-- The missing Sg "ihrer" shows that a dependence on gender would
-- 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"
} ;
conjThat : Str = "daß" ;
conjThan : Str = "als" ;
-- The infinitive particle "zu" is used if and only if $vv.isAux = False$.
infPart : Bool -> Str = \b -> if_then_Str b [] "zu" ;
}

View File

@@ -0,0 +1,68 @@
concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in {
flags optimize=all_subs ;
lin
PredVP np vp = mkClause (np.s ! Nom) np.a vp ;
PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ;
ImpVP vp = {
s = \\pol,n =>
let
ps = case n of {
ImpF _ True => <P3,"Sie",True> ; -- setzen Sie sich
_ => <P2,[],False>
} ;
agr = {g = Fem ; n = numImp n ; p = ps.p1} ; --- g does not matter
verb = vp.s ! False ! agr ! VPImperat ps.p3 ;
inf = vp.inf ++ verb.inf ;
in
verb.fin ++ ps.p2 ++
vp.n2 ! agr ++ vp.a1 ! pol ++ vp.a2 ++ inf ++ vp.ext
} ;
SlashV2 np v2 =
mkClause (np.s ! Nom) np.a (predV v2) ** {c2 = v2.c2} ;
SlashVVV2 np vv v2 =
mkClause (np.s ! Nom) np.a
(insertInf (v2.prefix ++ v2.s ! VInf (notB vv.isAux))
(predVGen vv.isAux vv)) **
{c2 = v2.c2} ;
AdvSlash slash adv = {
s = \\m,t,a,b,o => slash.s ! m ! t ! a ! b ! o ++ adv.s ;
c2 = slash.c2
} ;
SlashPrep cl prep = cl ** {c2 = prep} ;
SlashVS np vs slash =
mkClause (np.s ! Nom) np.a
(insertExtrapos (conjThat ++ slash.s ! Sub) (predV vs)) **
{c2 = slash.c2} ;
EmbedS s = {s = conjThat ++ s.s ! Sub} ;
EmbedQS qs = {s = qs.s ! QIndir} ;
EmbedVP vp = {s = useInfVP False vp} ;
UseCl t a p cl = {
s = \\o => t.s ++ a.s ++ p.s ++ cl.s ! t.m ! t.t ! a.a ! p.p ! o
} ;
UseQCl t a p cl = {
s = \\q => t.s ++ a.s ++ p.s ++ cl.s ! t.m ! t.t ! a.a ! p.p ! q
} ;
UseRCl t a p cl = {
s = \\r => t.s ++ a.s ++ p.s ++ cl.s ! t.m ! t.t ! a.a ! p.p ! r ;
c = cl.c
} ;
UseSlash t a p cl = {
s = \\o => t.s ++ a.s ++ p.s ++ cl.s ! t.m ! t.t ! a.a ! p.p ! o ;
c2 = cl.c2
} ;
AdvS a s = {s = \\o => a.s ++ s.s ! Inv} ;
}

View File

@@ -0,0 +1,130 @@
concrete StructuralGer of Structural = CatGer **
open MorphoGer, Prelude in {
flags optimize=all ;
lin
above_Prep = mkPrep "über" Dat ;
after_Prep = mkPrep "nach" Dat ;
all_Predet = {s = appAdj (regA "all")} ;
almost_AdA, almost_AdN = ss "fast" ;
although_Subj = ss "obwohl" ;
always_AdV = ss "immer" ;
and_Conj = ss "und" ** {n = Pl} ;
because_Subj = ss "weil" ;
before_Prep = mkPrep "vor" Dat ;
behind_Prep = mkPrep "hinter" Dat ;
between_Prep = mkPrep "zwischen" Dat ;
both7and_DConj = sd2 "sowohl" ["als auch"] ** {n = Pl} ;
but_PConj = ss "aber" ;
by8agent_Prep = mkPrep "durch" Acc ;
by8means_Prep = mkPrep "mit" Dat ;
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 ;
either7or_DConj = sd2 "entweder" "oder" ** {n = Sg} ;
everybody_NP = nameNounPhrase {s = caselist "jeder" "jeden" "jedem" "jedes"} ;
every_Det = detLikeAdj Sg "jed" ;
everything_NP = nameNounPhrase {s = caselist "alles" "alles" "allem" "alles"} ;
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 ;
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" ;
how8many_IDet = detLikeAdj Pl "wieviel" ;
if_Subj = ss "wenn" ;
in8front_Prep = mkPrep "vor" Dat ;
i_Pron = mkPronPers "ich" "mich" "mir" "meiner" "mein" Fem Sg P1 ;
in_Prep = mkPrep "in" Dat ;
it_Pron = mkPronPers "es" "es" "ihm" "seiner" "sein" Neutr Sg P3 ;
less_CAdv = ss "weniger" ;
many_Det = detLikeAdj Pl "viel" ;
more_CAdv = ss "mehr" ;
most_Predet = {s = appAdj (regA "meist")} ;
much_Det = detLikeAdj Sg "viel" ;
must_VV = auxVV
(mkV
"müssen" "muß" "mußt" "muß" "müßt" "müß"
"mußte" "mußtest" "mußten" "mußtet"
"müßte" "gemußt" []
VHaben) ;
one_Quant = {
s = \\g,c => "ein" + pronEnding ! GSg g ! c ;
n = Sg ;
a = Strong
} ;
only_Predet = {s = \\_,_,_ => "nur"} ;
no_Phr = ss "nein" ;
on_Prep = mkPrep "auf" Dat ;
or_Conj = ss "oder" ** {n = Sg} ;
otherwise_PConj = ss "sonst" ;
part_Prep = mkPrep "von" Dat ;
please_Voc = ss "bitte" ;
possess_Prep = mkPrep "von" Dat ;
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 = \\g,c => "ein" + pronEnding ! GSg g ! c ;
n = Sg ;
a = Strong
} ;
something_NP = nameNounPhrase {s = \\_ => "etwas"} ;
somewhere_Adv = ss "irgendwo" ;
that_Quant = {s = \\n => (detLikeAdj n "jen").s ; a = Weak} ;
that_NP = nameNounPhrase {s = caselist "das" "das" "denem" "dessen"} ; ----
there_Adv = ss "da" ;
there7to_Adv = ss "dahin" ;
there7from_Adv = ss ["daher"] ;
therefore_PConj = ss "deshalb" ;
these_NP = {s = caselist "diese" "diese" "diesen" "dieser" ; a = agrP3 Pl} ;
they_Pron = mkPronPers "sie" "sie" "ihnen" "ihrer" "ihr" Fem Pl P3 ;
this_Quant = {s = \\n => (detLikeAdj n "dies").s ; a = Weak} ;
this_NP = nameNounPhrase {s = caselist "dies" "dies" "diesem" "dieses"} ; ----
those_NP = {s = caselist "jene" "jene" "jenen" "jener" ; a = agrP3 Pl} ;
through_Prep = mkPrep "durch" Acc ;
too_AdA = ss "zu" ;
to_Prep = mkPrep "nach" Dat ;
under_Prep = mkPrep "unter" Dat ;
very_AdA = ss "sehr" ;
want_VV = auxVV
(mkV
"wollen" "will" "willst" "will" "wollt" "woll"
"wollte" "wolltest" "wollten" "wolltet"
"wollte" "gewollt" []
VHaben) ;
we_Pron = mkPronPers "wir" "uns" "uns" "unser" "unser" Fem Pl P1 ;
whatSg_IP = {s = caselist "was" "was" "was" "wessen" ; n = Sg} ; ----
whatPl_IP = {s = caselist "was" "was" "was" "wessen" ; n = Pl} ; ----
when_IAdv = ss "wann" ;
when_Subj = ss "wenn" ;
where_IAdv = ss "wo" ;
whichPl_IDet = detLikeAdj Pl "welch" ;
whichSg_IDet = detLikeAdj Sg "welch" ;
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 ;
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 ;
yes_Phr = ss "ja" ;
}

View File

@@ -0,0 +1,46 @@
concrete VerbGer of Verb = CatGer ** open Prelude, ResGer in {
flags optimize=all_subs ;
lin
UseV = predV ;
ComplV2 v np =
insertObj (\\_ => appPrep v.c2 np.s) (predV v) ;
ComplV3 v np np2 =
insertObj (\\_ => appPrep v.c2 np.s ++ appPrep v.c3 np2.s) (predV v) ;
ComplVV v vp =
let
vpi = infVP v.isAux vp
in
insertExtrapos vpi.p3 (
insertInf vpi.p2 (
insertObj vpi.p1 (
predVGen v.isAux v))) ;
ComplVS v s =
insertExtrapos (conjThat ++ s.s ! Sub) (predV v) ;
ComplVQ v q =
insertExtrapos (q.s ! QIndir) (predV v) ;
ComplVA v ap = insertObj (\\ _ => ap.s ! APred) (predV v) ;
ComplV2A v np ap =
insertObj (\\_ => appPrep v.c2 np.s ++ ap.s ! APred) (predV v) ;
UseComp comp = insertAdv (comp.s ! agrP3 Sg) (predV sein_V) ; -- agr not used
-- 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} ;
CompAdv a = {s = \\_ => a.s} ;
AdvVP vp adv = insertAdv adv.s vp ;
AdVVP adv vp = insertAdV adv.s vp ;
ReflV2 v = insertObj (\\a => appPrep v.c2 (reflPron ! a)) (predV v) ;
PassV2 v = insertInf (v.s ! VPastPart APred) (predV werdenPass) ;
UseVS, UseVQ = \v -> v ** {c2 = noPreposition Acc} ;
}

297
lib/resource/german/log.txt Normal file
View File

@@ -0,0 +1,297 @@
Steps of building the German implementation.
4/1/2006
ParamGer: Case, Gender, Adjf
CatGer: N, CN
ResGer: mkNoun, mkN2, mkN4
> cc mkN2 "Stube" "Stuben" Fem
ResGer: mkA, mkV, regA, regV
> cc regV "machen"
CatGer: V*, A*
LexGer: N*, A*, V*
> l -table walk_V
NounGer: determiner rules, UseN
ParamGer: gennum, adjAgr
ResGer: pronForms
> p -cat=NP "der Hund" | l -table
5/1
LexGer: Pron, Det
> p "mein Hund"
AdjectiveGer: PositA, ComparA, AdAP
> p -cat=NP "ein warmer Hund" | l -table
> p -cat=NP -lexer=literals "alle meine 3 sehr warmen Hünde"
ResGer: predV, mkClause, aux verbs
VerbGer: UseV
SentenceGer: PredVP
> l -table PredVP (UsePron i_Pron) (UseV walk_V)
("ich nicht gegangen hatte" etc)
ParamGer: VAux
ResGer: added aux : VAux to Verb and mkV
LexGer: mkV updates
> l -table PredVP (UsePron i_Pron) (UseV walk_V)
("ich nicht gegangen war" etc, now correct)
ResGer: appPrep, insertObj, insertAdv
VerbGer: ComplV2, ComplV3
SentenceGer: PosCl, NegCl
> p -cat=S -mcfg "ich zeige ihn meinem warmen Hund"
wc *.gfc
122385 total
70667 CatGer.gfc (largest)
add flags optimize=all_subs to this module:
5781 CatGer.gfc
57499 total
VerbGer: UseComp, Comp*
> p -cat=Cl -mcfg "ich bin ein Hund" | l -table
> vg
(see complex figure)
> i english/TestEng.gf
> vg
(see complex symmetric figure)
ResGer: wollen_V, auxVV, insertExtrapos
VerbGer: ComplVS
> p -cat=Cl -mcfg "ich behaupte daß wir gehen" | l -table
(gets OK with proper extrapos)
VerbGer: ComplVV
= insertObj (\\a => v.part ++ (vp.s ! a ! VPInfinit Simul).inf) (predV v) ;
> p -cat=Cl "ich will gehen" | l -table
Pres Anter Pos Main : ich habe gehen gewollen
Pres Anter Pos Inv : habe ich gehen gewollen
Pres Anter Pos Sub : ich gehen gewollen habe
(Thus "double infinitives" don't get right.)
Added routine stuff to AdverbGer and AdjectiveGer. Noticed failure with
comparison ("schneller als ein Zug" pro "mehr schnell als ein Zug")
SentenceGer: ImpVP
PhraseGer: almost all (actually copied from PhraseScand)
> p -cat=Imp -mcfg "geh hier"
ImpVP (AdvVP (UseV walk_V) here_Adv)
QuestionGer: almost all (copied from Scand)
UntensedGer: PosQCl, NegQCl
> p -cat=QS -mcfg "gehen wir nicht" | l -table
QDir : gehen wir nicht
QIndir : ob wir nicht gehen
VerbGer: ComplVQ
> p -cat=S -mcfg "ich frage ob wir warm sind"
LexGer: *IDet, *IP, *Prep
QuestionGer: IDetCN (using NounGer.MkDet)
> p -cat=QS -mcfg "welcher Hund geht"
> p -cat=QS -mcfg "in welchem Hund geht er"
wc german/*.gfc
69407 total
NounGer: ComplN2, ComplN3, SentCN, QuestCN
LexGer: N2, N3
> p -cat=NP "der Sohn von dem Hund"
> p -cat=CN -mcfg "Hund ob er geht"
SentenceGer: Slash rules
> p -cat=QS -mcfg "wem hilft er"
CatGer: RP, RS, RCl
ParamGer: RAgr
RelativeGer: all (copied from Scand; tweaking betw GenNum, Agr also in CatGer)
UntensedGer: PosRCl, NegRCl
NounGer: RelCN
> p -cat=RCl -mcfg "der geht" | l -table
> p -cat=NP -mcfg "der Hund dem wir helfen wollen" | l -table
NounGer: Num and Ord related rules
CatGer: Ord has parametric AForm; Num has no params
ParamGer: CardOrd
LexGer: Numeral
> p -cat=NP "meine vierzig warmen Hünde"
> p -cat=NP "mein vierzigter Hund"
CatGer: Conj, DConj
ConjunctionGer: all (mostly from Scand)
LexGer: Conj, DConj
> p -cat=NP "ich und der Hund" | l -table
> p -cat=S -mcfg "ich und der Hund sind entweder warm oder warm"
> pm -printer=missing
TestGer
AdVVP AdvSC ComplV2A ComplVA EmbedQS EmbedS EmbedVP PassV2 ReflA2 ReflV2 UttVP
one_Numeral
wc german/*.gfc
1231 4116 98878 total
Now we have finished most of TestGer in two days, 4 + 8 hours. But we had the
old morphology and other files, and the Scandinavian v 1.0 as help.
--------------------
13/1
CatGer: add prefix to V*, isAux to VV - the latter mostly to deal with double infinitives
ResGer: generalize predV to predVGen
LexGer: experiment with gehen --> ausgehen
> l -table PredVP (UsePron he_Pron) (ComplVV want_VV (UseV walk_V))
--- the auxiliary is still in wrong place in subordinate double infinitives
ResGer: reflPron
VerbGer: ReflV2
AdjectiveGer: ReflA2 --- with missing person agreement
> p -cat=Cl -mcfg "ich helfe mir"
PredVP (UsePron i_Pron) (ComplV2 help_V2 (UsePron i_Pron))
PredVP (UsePron i_Pron) (ReflV2 help_V2)
> p -cat=Cl -mcfg "er hilft sich"
PredVP (UsePron he_Pron) (ReflV2 help_V2)
> pm -printer=missing
AdVVP AdvSC OrdInt UttVP
A round of filling these completes the implementation of TestGer.
ResGer: insertAdV
> p -cat=Cl -mcfg "er hilft immer seinem Hund"
PredVP (UsePron he_Pron) (AdVVP always_AdV (ComplV2 help_V2
(DetCN (DetSg (PossSg he_Pron) NoOrd) (UseN dog_N))))
wc german/*.gfc
63 203 4768 german/AdjectiveGer.gfc
63 198 1649 german/AdverbGer.gfc
55 184 7490 german/CatGer.gfc
76 260 4489 german/ConjunctionGer.gfc
94 315 13968 german/LexGer.gfc
121 445 2736 german/MorphoGer.gfc
86 306 6637 german/NounGer.gfc
41 160 1419 german/ParamGer.gfc
81 245 2256 german/PhraseGer.gfc
63 219 3333 german/QuestionGer.gfc
63 219 3800 german/RelativeGer.gfc
87 343 2081 german/ResGer.gfc
112 393 20890 german/SentenceGer.gfc
230 696 4752 german/TestGer.gfc
61 185 1483 german/UntensedGer.gfc
110 366 41629 german/VerbGer.gfc
1406 4737 123380 total
Ca. 4h more work was needed, so we have spent 16h now.
--------------------
15/1 (3h)
TensedGer: just uncomment, except S
StructuralGer: almost complete with some determiner forms to revisit
ParadigmsGer: almost complete with verb form variations to revisit
MorphoGer: very few functions in this module
16/1 (4h)
ParamGer: removed Strong/Weak from AForm to save lexicon storage. Done in agrAdj instead.
Only affects NounGer and QuestionGer. Notice that making case analysis on <a,gn,c> is
much less storage-efficient.
ParadigmsGer: completed
ParamGer: VType
ResGer, ParadigmsGer: the consequences of this
BasicGer; started. Strategy: fill all you know without consulting dictionary;
mark ---- before what you dont know, and after what you are uncertain about.
Insight: to write a *resource* grammar you need not be a fluent speaker, but
just to understand what grammar books say. It is when writing application
grammars that you need to make stylistic judgements to do the right choices
from the resource.
17/1 (4h)
MorphoGer: for numerals
NumeralGer: all
> make stat
66123 german/NumeralGer.gfc
added flags optimize=all_subs ;
17046 german/NumeralGer.gfc
BasicGer: completed. Idea: work in pairs, one consulting the dictionary (or
giving native speaker advice)
ParadigmsGer: remove second arg from mkA ; add heuristics for el/er/en masculines in regN
wc german/*.gfc
63 203 3360 german/AdjectiveGer.gfc
63 198 1649 german/AdverbGer.gfc
276 1159 89069 german/BasicGer.gfc
55 182 7704 german/CatGer.gfc
76 260 4489 german/ConjunctionGer.gfc
523 1575 11728 german/LangGer.gfc
94 315 10783 german/LexGer.gfc
128 469 2892 german/MorphoGer.gfc
99 375 12394 german/NounGer.gfc
100 321 17046 german/NumeralGer.gfc
0 5 83 german/ParadigmsGer.gfc
42 162 1446 german/ParamGer.gfc
81 245 2256 german/PhraseGer.gfc
68 244 4372 german/QuestionGer.gfc
63 219 3800 german/RelativeGer.gfc
90 355 2155 german/ResGer.gfc
123 423 22590 german/SentenceGer.gfc
151 451 14559 german/StructuralGer.gfc
69 224 1715 german/TensedGer.gfc
230 696 4752 german/TestGer.gfc
61 185 1483 german/UntensedGer.gfc
121 406 45746 german/VerbGer.gfc
2576 8672 266071 total
Known bugs: double infinitives in subordinate clauses.
Known uncertainties: marked with ----, mostly in Structural and Basic.
Work: ca 27h for whole German (but with support in 0.6 esp. morphology, Swedish).
22/1
Fixed double infinitives with a new field (isAux : Bool) in VP. Used in
mkClause.
31/1
Fine-tuned the place of negation by changing in ResGerman.mkClause and
VerbGerman.UseCompl. Want to say "ich bin nicht alt" and "ich liebe sie nicht".
31/5
Added inherent Case to RS, RCl and Gender to Agr in order to handle it clefts
properly. (In the meantime, the module IdiomGer had required some incremental
work.)
26/6
The German resource implementation is considered complete, and it is released
in the resource grammar version 1.0.
--------------
13/12
When adding polite imperatives, have to change the lincat of Imp: ImpForm instead
of Number. But the required inflections exist already.
--------------
20/3/2007
Spent half a day adding prefix gluing to the morphology and also
making conjunctive forms accessible as top-level tenses. These facilities
were requested by Nadine Perera writing a paper with me.