forked from GitHub/comp-syntax-gu-mlt
99 lines
2.7 KiB
Plaintext
99 lines
2.7 KiB
Plaintext
resource MiniResEng = open Prelude in {
|
|
|
|
param
|
|
Number = Sg | Pl ;
|
|
Case = Nom | Acc ;
|
|
Person = Per1 | Per2 | Per3 ;
|
|
|
|
Agreement = Agr Number Person ;
|
|
|
|
-- all forms of normal Eng verbs, although not yet used in MiniGrammar
|
|
VForm = Inf | PresSg3 | Past | PastPart | PresPart ;
|
|
|
|
oper
|
|
Noun : Type = {s : Number => Str} ;
|
|
|
|
mkNoun : Str -> Str -> Noun = \sg,pl -> {
|
|
s = table {Sg => sg ; Pl => pl}
|
|
} ;
|
|
|
|
regNoun : Str -> Noun = \sg -> mkNoun sg (sg + "s") ;
|
|
|
|
-- smart paradigm
|
|
smartNoun : Str -> Noun = \sg -> case sg of {
|
|
_ + ("ay"|"ey"|"oy"|"uy") => regNoun sg ;
|
|
x + "y" => mkNoun sg (x + "ies") ;
|
|
_ + ("ch"|"sh"|"s"|"o") => mkNoun sg (sg + "es") ;
|
|
_ => regNoun sg
|
|
} ;
|
|
|
|
Adjective : Type = {s : Str} ;
|
|
|
|
Verb : Type = {s : VForm => Str} ;
|
|
|
|
mkVerb : (inf,pres,past,pastpart,prespart : Str) -> Verb
|
|
= \inf,pres,past,pastpart,prespart -> {
|
|
s = table {
|
|
Inf => inf ;
|
|
PresSg3 => pres ;
|
|
Past => past ;
|
|
PastPart => pastpart ;
|
|
PresPart => prespart
|
|
}
|
|
} ;
|
|
|
|
regVerb : (inf : Str) -> Verb = \inf ->
|
|
mkVerb inf (inf + "s") (inf + "ed") (inf + "ed") (inf + "ing") ;
|
|
|
|
-- regular verbs with predictable variations
|
|
smartVerb : Str -> Verb = \inf -> case inf of {
|
|
pl + ("a"|"e"|"i"|"o"|"u") + "y" => regVerb inf ;
|
|
cr + "y" => mkVerb inf (cr + "ies") (cr + "ied") (cr + "ied") (inf + "ing") ;
|
|
lov + "e" => mkVerb inf (inf + "s") (lov + "ed") (lov + "ed") (lov + "ing") ;
|
|
kis + ("s"|"sh"|"x"|"o") => mkVerb inf (inf + "es") (inf + "ed") (inf + "ed") (inf + "ing") ;
|
|
_ => regVerb inf
|
|
} ;
|
|
|
|
-- normal irregular verbs e.g. drink,drank,drunk
|
|
irregVerb : (inf,past,pastpart : Str) -> Verb =
|
|
\inf,past,pastpart ->
|
|
let verb = smartVerb inf
|
|
in mkVerb inf (verb.s ! PresSg3) past pastpart (verb.s ! PresPart) ;
|
|
|
|
negation : Bool -> Str = \b -> case b of {True => [] ; False => "not"} ;
|
|
|
|
-- two-place verb with "case" as preposition; for transitive verbs, c=[]
|
|
Verb2 : Type = Verb ** {c : Str} ;
|
|
|
|
-- generalized verb, here just "be"
|
|
param
|
|
GVForm = VF VForm | PresSg1 | PresPl | PastPl ;
|
|
|
|
oper
|
|
GVerb : Type = {
|
|
s : GVForm => Str ;
|
|
isAux : Bool
|
|
} ;
|
|
|
|
be_GVerb : GVerb = {
|
|
s = table {
|
|
PresSg1 => "am" ;
|
|
PresPl => "are" ;
|
|
PastPl => "were" ;
|
|
VF vf => (mkVerb "be" "is" "was" "been" "being").s ! vf
|
|
} ;
|
|
isAux = True
|
|
} ;
|
|
|
|
-- in VP formation, all verbs are lifted to GVerb, but morphology doesn't need to know this
|
|
verb2gverb : Verb -> GVerb = \v -> {s =
|
|
table {
|
|
PresSg1 => v.s ! Inf ;
|
|
PresPl => v.s ! Inf ;
|
|
PastPl => v.s ! Past ;
|
|
VF vf => v.s ! vf
|
|
} ;
|
|
isAux = False
|
|
} ;
|
|
|
|
} |