--# -path=.:../abstract:../../prelude --1 Russian Lexical Paradigms -- -- Aarne Ranta, Janna Khegai 2003 -- -- This is an API to the user of the resource grammar -- for adding lexical items. It give shortcuts for forming -- expressions of basic categories: nouns, adjectives, verbs. -- -- Closed categories (determiners, pronouns, conjunctions) are -- accessed through the resource syntax API, $resource.Abs.gf$. -- -- -- The following files are presupposed: resource ParadigmsRus = open (Predef=Predef), Prelude, SyntaxRus, ResourceRus in { flags coding=utf8 ; --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 ; genitive : Case ; dative : Case ; accusative : Case ; instructive : Case ; prepositional : Case ; -- In some (written in English) textbooks accusative case -- is put on the second place. However, we follow the case order -- standard for Russian textbooks. -- To abstract over number names, we define the following. Number : Type ; singular : Number ; plural : Number ; --2 Nouns -- Best case: indeclinabe nouns: "кофе", "пальто", "ВУЗ". Animacy: Type ; animate: Animacy; inanimate: Animacy; mkIndeclinableNoun: Str -> Gender -> Animacy -> N ; -- Worst case - give six singular forms: -- Nominative, Genetive, Dative, Accusative, Instructive and Prepositional; -- corresponding six plural forms and the gender. -- May be the number of forms needed can be reduced, -- but this requires a separate investigation. -- Animacy parameter (determining whether the Accusative form is equal -- to the Nominative or the Genetive one) is actually of no help, -- since there are a lot of exceptions and the gain is just one form less. mkN : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Gender -> Animacy -> N ; -- мужчина, мужчины, мужчине, мужчину, мужчиной, мужчине -- мужчины, мужчин, мужчинам, мужчин, мужчинами, мужчинах -- Here are some common patterns. The list is far from complete. -- Feminine patterns. nMashina : Str -> N ; -- feminine, inanimate, ending with "-а", Inst -"машин-ой" nEdinica : Str -> N ; -- feminine, inanimate, ending with "-а", Inst -"единиц-ей" nZhenchina : Str -> N ; -- feminine, animate, ending with "-a" nNoga : Str -> N ; -- feminine, inanimate, ending with "г_к_х-a" nMalyariya : Str -> N ; -- feminine, inanimate, ending with "-ия" nTetya : Str -> N ; -- feminine, animate, ending with "-я" nBol : Str -> N ; -- feminine, inanimate, ending with "-ь"(soft sign) -- Neuter patterns. nObezbolivauchee : Str -> N ; -- neutral, inanimate, ending with "-ee" nProizvedenie : Str -> N ; -- neutral, inanimate, ending with "-e" nChislo : Str -> N ; -- neutral, inanimate, ending with "-o" -- Masculine patterns. nStomatolog : Str -> N ; -- masculine, animate, ending with consonant -- the next two differ only in -- plural nominative (= accusative) form(s) : nAdres : Str -> N ; -- адрес-а nTelefon : Str -> N ; -- телефон-ы -- masculine, inanimate, ending with consonant nNol : Str -> N ; -- masculine, inanimate, ending with "-ь" (soft sign) nUroven : Str -> N ; -- masculine, inanimate, ending with "-ень" -- Nouns used as functions need a preposition. The most common is with Genitive. mkFun : N -> Preposition -> Case -> Fun ; funGen : N -> Fun ; -- Proper names. mkPN : Str -> Gender -> Animacy -> PN ; -- "Иван", "Маша" -- On the top level, it is maybe $CN$ that is used rather than $N$, and -- $NP$ rather than $PN$. mkCN : N -> CN ; mkNP : Str -> Gender -> Animacy -> NP ; --2 Adjectives -- Non-comparison (only positive degree) one-place adjectives need 28 (4 by 7) -- forms in the worst case: -- Masculine | Feminine | Neutral | Plural -- Nominative -- Genitive -- Dative -- Accusative Inanimate -- Accusative Animate -- Instructive -- Prepositional -- Notice that 4 short forms, which exist for some adjectives are not included -- in the current description, otherwise there would be 32 forms for -- positive degree. -- mkAdj1 : ( : Str) -> Adj1 ; -- Invariable adjective is a special case. adjInvar : Str -> Adj1 ; -- khaki, mini, hindi, netto -- Some regular patterns depending on the ending. adj1Staruyj : Str -> Adj1 ; -- ending with "-ый" adj1Malenkij : Str -> Adj1 ; -- endign with "-ий" adj1Molodoj : Str -> Adj1 ; -- ending with "-ой", -- plural - молод-ые" adj1Kakoj_Nibud : Str -> Str -> Adj1 ; -- ending with "-ой", -- plural - "как-ие" -- Two-place adjectives need a preposition and a case as extra arguments. mkAdj2 : Adj1 -> Str -> Case -> Adj2 ; -- "делим на" -- Comparison adjectives need a positive adjective -- (28 forms without short forms). -- Taking only one comparative form (non-syntaxic) and -- only one superlative form (syntaxic) we can produce the -- comparison adjective with only one extra argument - -- non-syntaxic comparative form. -- Syntaxic forms are based on the positive forms. mkAdjDeg : Adj1 -> Str -> AdjDeg ; -- On top level, there are adjectival phrases. The most common case is -- just to use a one-place adjective. ap : Adj1 -> IsPostfixAdj -> AP ; --2 Verbs -- -- In our lexicon description ("Verbum") there are 62 forms: -- 2 (Voice) by { 1 (infinitive) + [2(number) by 3 (person)](imperative) + -- [ [2(Number) by 3(Person)](present) + [2(Number) by 3(Person)](future) + -- 4(GenNum)(past) ](indicative)+ 4 (GenNum) (subjunctive) } -- Participles (Present and Past) and Gerund forms are not included, -- since they fuction more like Adjectives and Adverbs correspondingly -- rather than verbs. Aspect regarded as an inherent parameter of a verb. -- Notice, that some forms are never used for some verbs. Actually, -- the majority of verbs do not have many of the forms. Voice: Type; Aspect: Type; Tense : Type; Bool: Type; true: Bool; false: Bool; active: Voice ; passive: Voice ; imperfective: Aspect; perfective: Aspect ; present : Tense ; past : Tense ; -- The worst case need 6 forms of the present tense in indicative mood -- ("я бегу", "ты бежишь", "он бежит", "мы бежим", "вы бежите", "они бегут"), -- a past form (singular, masculine: "я бежал"), an imperative form -- (singular, second person: "беги"), an infinitive ("бежать"). -- Inherent aspect should also be specified. mkVerbum : Aspect -> (_,_,_,_,_,_,_,_,_ : Str) -> Verbum ; -- Common conjugation patterns are two conjugations: -- first - verbs ending with "-ать/-ять" and second - "-ить/-еть". -- Instead of 6 present forms of the worst case, we only need -- a present stem and one ending (singular, first person): -- "я люб-лю", "я жд-у", etc. To determine where the border -- between stem and ending lies it is sufficient to compare -- first person from with second person form: -- "я люб-лю", "ты люб-ишь". Stems shoud be the same. -- So the definition for verb "любить" looks like: -- mkRegVerb Imperfective Second "люб" "лю" "любил" "люби" "любить"; mkRegVerb :Aspect -> Conjugation -> (_,_,_,_,_ : Str) -> Verbum ; -- For writing an application grammar one usualy doesn't need -- the whole inflection table, since each verb is used in -- a particular context that determines some of the parameters -- (Tense and Voice while Aspect is fixed from the beginning) for certain usage. -- The "V" type, that have these parameters fixed. -- We can extract the "V" from the lexicon. mkV: Verbum -> Voice -> Tense -> V ; mkPresentV: Verbum -> Voice -> V ; -- Two-place verbs, and the special case with direct object. Notice that -- a particle can be included in a $V$. mkTV : V -> Str -> Case -> TV ; -- "войти в дом"; "в", accusative tvDir : V -> TV ; -- "видеть", "любить" -- The definitions should not bother the user of the API. So they are -- hidden from the document. --. Gender = SyntaxRus.Gender ; Case = SyntaxRus.Case ; Number = SyntaxRus.Number ; Animacy = SyntaxRus.Animacy; Aspect = SyntaxRus.Aspect; Voice = SyntaxRus.Voice ; Tense = SyntaxRus.Tense ; Bool = Prelude.Bool ; true = True; false = False ; masculine = Masc ; feminine = Fem ; neuter = Neut ; nominative = Nom ; accusative = Acc ; dative = Dat ; genitive = Gen ; instructive = Inst ; prepositional = Prepos ; singular = Sg ; plural = Pl ; animate = Animate ; inanimate = Inanimate ; active = Act ; passive = Pass ; imperfective = Imperfective ; perfective = Perfective ; present = Present ; past = Past ; -- Degree = Pos | Comp | Super ; -- Person = P1 | P2 | P3 ; -- AfterPrep = Yes | No ; -- Possessive = NonPoss | Poss GenNum ; -- Noun definitions mkIndeclinableNoun = \s,g, anim -> { s = table { SF _ _ => s } ; g = g ; anim = anim } ** {lock_N = <>}; mkN = \nomSg, genSg, datSg, accSg, instSg, preposSg, nomPl, genPl, datPl, accPl, instPl, preposPl, g, anim -> { s = table { SF Sg Nom => nomSg ; SF Sg Gen => genSg ; SF Sg Dat => datSg ; SF Sg Acc => accSg ; SF Sg Inst => instSg ; SF Sg Prepos => preposSg ; SF Pl Nom => nomPl ; SF Pl Gen => genPl ; SF Pl Dat => datPl ; SF Pl Acc => accPl ; SF Pl Inst => instPl ; SF Pl Prepos => preposPl } ; g = g ; anim = anim } ** {lock_N = <>} ; nMashina = \s -> aEndInAnimateDecl s ** {lock_N = <>}; nEdinica = \s -> ej_aEndInAnimateDecl s ** {lock_N = <>}; nZhenchina = \s -> (aEndAnimateDecl s) ** { g = Fem ; anim = Animate } ** {lock_N = <>}; nNoga = \s -> aEndG_K_KH_Decl s ** {lock_N = <>}; nMalyariya = \s -> i_yaEndDecl s ** {lock_N = <>}; nTetya = \s -> (yaEndAnimateDecl s) ** {g = Fem; anim = Animate; lock_N = <>} ; nBol = \s -> softSignEndDeclFem s ** {lock_N = <>}; -- Neuter patterns. nObezbolivauchee = \s -> eeEndInAnimateDecl s ** {lock_N = <>}; nProizvedenie = \s -> eEndInAnimateDecl s ** {lock_N = <>}; nChislo = \s -> oEndInAnimateDecl s ** {lock_N = <>}; -- Masculine patterns. nStomatolog = \s -> nullEndAnimateDecl s ** {lock_N = <>}; nAdres = \s -> nullEndInAnimateDecl2 s ** {lock_N = <>}; nTelefon = \s -> nullEndInAnimateDecl1 s ** {lock_N = <>}; nNol = \s -> softSignEndDeclMasc s ** {lock_N = <>}; nUroven = \s -> EN_softSignEndDeclMasc s ** {lock_N = <>}; -- mkFun defined in syntax.RusU -- funGen defined in syntax.RusU mkPN = \ivan, g, anim -> case g of { Masc => mkProperNameMasc ivan anim ; _ => mkProperNameFem ivan anim } ** {lock_PN =<>}; mkCN = UseN ; mkNP = \x,y,z -> UsePN (mkPN x y z) ; -- Adjective definitions adjInvar = \s -> { s = \\af => s } ** {lock_Adj1= <>}; adj1Staruyj s = uy_j_EndDecl s ** {lock_Adj1 = <>} ; adj1Malenkij s = ij_EndK_G_KH_Decl s ** {lock_Adj1= <>}; adj1Molodoj s = uy_oj_EndDecl s ** {lock_Adj1= <>}; adj1Kakoj_Nibud s t = i_oj_EndDecl s t ** {lock_Adj1= <>}; mkAdj2 a p c= mkAdjective2 a p c ** {lock_Adj2 = <>}; -- mkAdjDeg defined in morpho.RusU ap a p = mkAdjPhrase a p ** {lock_AP = <>}; -- defined in syntax module -- Verb definitions mkVerbum = \asp, sgP1, sgP2, sgP3, plP1, plP2, plP3, sgMascPast, imperSgP2, inf -> case asp of { Perfective => mkVerb (perfectiveActivePattern inf imperSgP2 (presentConj sgP1 sgP2 sgP3 plP1 plP2 plP3) (pastConj sgMascPast)) (pastConj sgMascPast); Imperfective => mkVerb (imperfectiveActivePattern inf imperSgP2 (presentConj sgP1 sgP2 sgP3 plP1 plP2 plP3) (pastConj sgMascPast)) (pastConj sgMascPast) }; oper presentConj: (_,_,_,_,_,_: Str) -> PresentVerb = \sgP1, sgP2, sgP3, plP1, plP2, plP3 -> table { PRF (ASg _) P1 => sgP1 ; PRF (ASg _) P2 => sgP2 ; PRF (ASg _) P3 => sgP3 ; PRF APl P1 => plP1 ; PRF APl P2 => plP2 ; PRF APl P3 => plP3 }; mkRegVerb = verbDecl ; -- defined in morpho.RusU.gf mkV a b c = extVerb a b c ** {lock_V = <>}; -- defined in types.RusU.gf mkPresentV = \aller, vox -> { s = table { VFin gn p => aller.s ! VFORM vox (VIND (VPresent (numGNum gn) p)) ; VImper n p => aller.s ! VFORM vox (VIMP n p) ; VInf => aller.s ! VFORM vox VINF ; VSubj gn => aller.s ! VFORM vox (VSUB gn) }; t = Present ; a = aller.asp ; w = vox ; lock_V = <>} ; mkTV a b c = mkTransVerb a b c ** {lock_TV = <>}; -- defined in syntax.RusU.gf tvDir v = mkDirectVerb v ** {lock_TV = <>}; -- defined in syntax.RusU.gf } ;