resource ResEng = open Prelude in { -- parameters param Number = Sg | Pl ; Case = Nom | Acc ; Agr = Ag Number Person ; TTense = TPres | TPerf | TPast | TFut ; Person = Per1 | Per2 | Per3 ; VForm = VInf | VPres | VPast | VPart ; ClForm = ClDir | ClInv ; QForm = QDir | QIndir ; -- parts of speech oper VP = { verb : AgrVerb ; compl : Str } ; NP = { s : Case => Str ; a : Agr } ; -- verb as in VP, including copula AgrVerb : Type = { s : ClForm => TTense => Bool => Agr => {fin,inf : Str} ; inf : Str } ; copula : AgrVerb = { s = \\d,t,p,a => case of { => {fin = "am" ; inf = neg p} ; => {fin = "is" ; inf = neg p} ; => {fin = "are" ; inf = neg p} ; => {fin = "has" ; inf = neg p ++ "been"} ; => {fin = "have" ; inf = neg p ++ "been"} ; => {fin = "was" ; inf = neg p} ; => {fin = "were" ; inf = neg p} ; => {fin = "will" ; inf = neg p ++ "be"} } ; inf = "be" } ; agrV : Verb -> AgrVerb = \v -> let vinf = v.s ! VInf ; vpart = v.s ! VPart in { s = \\d,t,p,a => case of { => {fin = v.s ! VPres ; inf = []} ; <_, TPres,_, Ag Sg Per3> => {fin = "does" ; inf = neg p ++ vinf} ; => {fin = vinf ; inf = []} ; <_, TPres,_, _ > => {fin = "do" ; inf = neg p ++ vinf} ; <_, TPerf,_, Ag Sg Per3> => {fin = "has" ; inf = neg p ++ vpart} ; <_, TPerf,_, _ > => {fin = "have" ; inf = neg p ++ vpart} ; => {fin = v.s ! VPast ; inf = []} ; <_, TPast,_, _ > => {fin = "did" ; inf = neg p ++ vinf} ; <_, TFut, _, _ > => {fin = "will" ; inf = neg p ++ vinf} } ; inf = vinf } ; agrAux : (_,_,_,_ : Str) -> AgrVerb = \can,could,beenableto, beableto -> { s = \\d,t,p,a => case of { => {fin = can ; inf = neg p} ; => {fin = "has" ; inf = neg p ++ beenableto} ; => {fin = "have" ; inf = neg p ++ beenableto} ; => {fin = could ; inf = neg p} ; => {fin = "will" ; inf = neg p ++ beableto} } ; inf = beableto } ; infVP : VP -> Str = \vp -> vp.verb.inf ++ vp.compl ; neg : Bool -> Str = \b -> case b of {True => [] ; False => "not"} ; -- for coordination conjAgr : Number -> Agr -> Agr -> Agr = \n,xa,ya -> case of { => Ag (conjNumber (conjNumber xn yn) n) (conjPerson xp yp) } ; conjNumber : Number -> Number -> Number = \m,n -> case m of {Pl => Pl ; _ => n} ; conjPerson : Person -> Person -> Person = \p,q -> case of { | <_,Per1> => Per1 ; | <_,Per2> => Per2 ; _ => Per3 } ; -- for morphology Noun : Type = {s : Number => Str} ; Adj : Type = {s : Str} ; Verb : Type = {s : VForm => Str} ; mkNoun : Str -> Str -> Noun = \man,men -> { s = table {Sg => man ; Pl => men} } ; regNoun : Str -> Noun = \s -> mkNoun s (s + "s") ; ---- mkAdj : Str -> Adj = \s -> ss s ; mkVerb : (_,_,_,_ : Str) -> Verb = \go,goes,went,gone -> { s = table { VInf => go ; VPres => goes ; VPast => went ; VPart => gone } } ; regVerb : Str -> Verb = \v -> case v of { _ + "e" => mkVerb v (v + "s") (v + "d") (v + "d") ; _ => mkVerb v (v + "s") (v + "ed") (v + "ed") } ; -- for structural words mkDet : Str -> Number -> {s : Str ; n : Number} = \s,n -> { s = s ; n = n } ; pronNP : (s,a : Str) -> Number -> Person -> NP = \s,a,n,p -> { s = table { Nom => s ; Acc => a } ; a = Ag n p } ; -- phonological auxiliaries vowel : pattern Str = #("a" | "e" | "i" | "o") ; }