Files
gf-rgl/src/russian/ParadigmsRus.gf
2020-08-05 20:31:17 +03:00

420 lines
15 KiB
Plaintext

--1 Russian Lexical Paradigms
resource ParadigmsRus = open CatRus, ResRus, (R=ResRus), ParamRus, (Z=ZaliznyakAlgo), Prelude, Maybe in {
--2 Parameters
--
oper
-- Abstracting gender. Gender is a parameter for mkN, mkN2, mkN3
masculine : Gender
= Masc ;
feminine : Gender
= Fem ;
neuter : Gender
= Neut ;
-- Abstracting numbers. Number is a parameter for mkPN, mkConj
singular : Number
= Sg ;
plural : Number
= Pl ;
-- Limiting number
only_singular : MaybeNumber
= JustSg ;
only_plural : MaybeNumber
= JustPl ;
-- Adjectives can have short and full form. ShortFormPreference type is a parameter for mkA
short : ShortFormPreference
= PrefShort ;
full : ShortFormPreference
= PrefFull ;
-- Animacy is needed for nouns and some pronouns.
animate : Animacy
= Animate ;
inanimate : Animacy
= Inanimate ;
-- Main cases:
nominative : Case
= Nom ;
genitive : Case
= Gen ;
dative : Case
= Dat ;
accusative : Case
= Acc ;
instrumental : Case
= Ins ;
prepositional : Case
= Pre ;
-- "Minor" cases:
locative : Case -- or Pre-2, some nouns have this different from prepositional case
= Loc ;
partitive : Case -- or Gen-2. Some nouns like "tee", have this in addition to genitive, usually spoken language
= Ptv ;
vocative : Case -- can be used in spoken language
= VocRus ;
-- Degrees of adjectives
positive : Degree
= Posit ;
comparative : Degree
= Compar ;
superlative : Degree
= Superl ;
-- Aspects of verbs
perfective : Aspect
= Perfective ;
imperfective : Aspect
= Imperfective ;
-- Transitivity is verb's inherent characteristic. Can influence which forms are possible
transitive : Transitivity
= Transitive ;
intransitive : Transitivity
= Intransitive ;
-- Reflexivity is traditionally understood as inherent characteristic. Not to be confused with passive forms
reflexive : Reflexivity
= Reflexive ;
non_reflexive : Reflexivity
= NonReflexive ;
-- Voice (not yet used)
active : Voice
= Act ;
passive : Voice
= Pass ;
------------------------------
--2 Nouns
mkN : overload {
mkN : Str -> N ; -- can guess declension and gender of some nouns given nominative
mkN : Str -> Gender -> Animacy -> N ; -- can guess declension of more nouns
mkN : Str -> Gender -> Animacy -> (idx : Str) -> N ; -- Fourth parameter is a declension type index (based on Zaliznyak's dictionary), for example, "1*a(1)"
mkN : Str -> Gender -> Animacy -> (idx : Str) -> MaybeNumber -> N ; -- Same, but number restrictions can be added
mkN : A -> Gender -> Animacy -> N ; -- for nouns, which decline as adjective
mkN : A -> Gender -> Animacy -> MaybeNumber -> N ; -- same, with possibility to limit number (usually to only_singular)
mkN : N -> (link : Str) -> N -> N ; -- compound noun. Link can end on "-", in which case parts are glued together. First one characterizes the whole.
} ;
mkN2 : overload {
mkN2 : N -> N2 ;
mkN2 : N -> Prep -> N2 ;
mkN2 : Str -> Gender -> Animacy -> (idx : Str) -> Prep -> N2 ; -- convenience for making N2. Fourth parameter is a declension type index (based on Zaliznyak's dictionary), for example, "1*f''(1)"
} ;
mkN3 : overload {
mkN3 : N -> Prep -> Prep -> N3 ;
mkN3 : Str -> Gender -> Animacy -> (idx : Str) -> Prep -> Prep -> N3 ; -- convenience for making N2. Fourth parameter is a declension type index (based on Zaliznyak's dictionary), for example, "4*b"
} ;
mkPN : overload {
mkPN : N -> PN ;
mkPN : N -> Str -> N -> PN ; -- see compound noun
} ;
--2 Adjectives
mkA : overload {
mkA : Str -> A ; -- can guess declension of many adjectives given nominative masculine
mkA : Str -> Str -> A ; -- same, but comparative given as a second argument
mkA : Str -> Str -> (idx : Str) -> A ; -- nom masc, comparative and third parameter is Zaliznyak's dictionary index, for example, "1a"
mkA : Str -> Str -> (idx : Str) -> ShortFormPreference -> A ; -- same, but with short form preference given
} ;
ShortenA : A -> A ;
-- Two-place adjectives need a preposition and a case as extra arguments.
-- TODO: ? mkA2 : A -> Str -> Case -> A2 ; -- "делим на"
mkA2 : A -> Prep -> A2 ;
mkOrd : overload {
mkOrd : (nom : Str) -> Ord ;
} ;
-------------------------
--2 Verbs
mkV : overload {
mkV : (inf : Str) -> (sg1 : Str) -> V ; -- guess some I conjugation verbs (not "ё") from infinitive and Sg P1, perfective, transitive
mkV : (inf : Str) -> (sg1 : Str) -> (sg3 : Str) -> V ; -- guess verb forms given Inf, Sg P1, Sg P3, perfective, transitive
mkV : Aspect -> (inf : Str) -> (sg1 : Str) -> (sg3 : Str) -> V ; -- same, but aspect as first parameter
mkV : Aspect -> Transitivity -> (inf : Str) -> (sg1 : Str) -> (sg3 : Str) -> V ; -- aspect, transitivity, Inf, Sg P1, Sg P3
mkV : Aspect -> Transitivity -> (inf : Str) -> (sg1 : Str) -> (sg3 : Str) -> (idx : Str) -> V -- aspect, transitivity, Inf, Sg P1, Sg P3 and index from Zaliznyak's dictionary, eg "14a"
} ;
mkV2 : overload {
mkV2 : V -> V2 ; -- most common case with Acc and no preposition
mkV2 : V -> Case -> V2 ; -- given case, but no preposition
mkV2 : V -> Prep -> V2 ;
} ;
mkV3 : overload {
mkV3 : V -> Case -> Case -> V3 ;
mkV3 : V -> Prep -> Prep -> V3 ;
} ;
mkVS : V -> VS ;
mkVQ : V -> VQ ;
mkV2V : V -> Prep -> V2V ;
mkV2S : V -> Prep -> V2S ;
mkV2Q : V -> Prep -> V2Q ;
mkV2A : V -> Prep -> V2A ;
dirV2 : V -> V2 ;
tvDirDir : V -> V3 ;
mkVV : V -> VV;
------------------------
--2 Adverbs, prepositions, conjunctions, ...
mkAdv : overload {
mkAdv : Str -> Adv ;
mkAdv : Temp -> Pol -> VPSlash -> Adv ; -- introduce transgressive: "делая что-то ,"
} ;
mkIAdv : Str -> IAdv ;
mkConj : overload {
mkConj : Str -> Number -> Conj ; -- only middle conjunction
mkConj : Str -> Str -> Number -> Conj ; -- two-part conjunction
} ;
mkInterj : Str -> Interj ;
mkPrep : Str -> Case -> Prep ;
-- The definitions should not bother the user of the API. So they are
-- hidden from the document.
--.
------------------------------
-- Nouns
nullPrep : Prep = lin Prep {s=[]; c=Gen; hasPrep=False} ;
mkN = overload {
mkN : Str -> N
= \nom -> lin N (guessNounForms nom) ;
mkN : Str -> Animacy -> N
= \nom,anim -> lin N ((guessNounForms nom) ** {anim=anim}) ;
mkN : Str -> Gender -> Animacy -> N
= \nom, g, anim -> lin N (guessLessNounForms nom g anim) ;
mkN : Str -> Gender -> Animacy -> Z.ZNIndex -> N
= \word, g, anim, z -> lin N (noMinorCases (Z.makeNoun word g anim z)) ;
mkN : Str -> Gender -> Animacy -> Str -> N
= \word, g, anim, zi -> lin N (noMinorCases (Z.makeNoun word g anim (Z.parseIndex zi))) ;
mkN : Str -> Gender -> Animacy -> Str -> MaybeNumber -> N
= \word, g, anim, zi, mbn -> lin N (applyMaybeNumber ((noMinorCases (Z.makeNoun word g anim (Z.parseIndex zi))) ** {mayben=mbn})) ;
mkN : A -> Gender -> Animacy -> N
= \a, g, anim -> lin N (makeNFFromAF a g anim) ;
mkN : A -> Gender -> Animacy -> MaybeNumber -> N
= \a, g, anim, mbn -> lin N (applyMaybeNumber ((makeNFFromAF a g anim) ** {mayben=mbn})) ;
mkN : N -> Str -> N -> N
= \n1,link,n2 -> lin N (mkCompoundN n1 link n2) ;
-- For backwards compatibility:
mkN : (nomSg, genSg, datSg, accSg, instSg, preposSg, prepos2Sg, nomPl, genPl, datPl, accPl, instPl, preposPl : Str) -> Gender -> Animacy -> N
= \nomSg, genSg, datSg, accSg, instSg, preposSg, prepos2Sg, nomPl, genPl, datPl, accPl, instPl, preposPl, g, anim ->
lin N {
snom=nomSg;pnom=nomPl;sgen=genSg;pgen=genPl;sdat=datSg;pdat=datPl;sacc=accSg;pacc=accPl;sins=instSg;pins=instPl;sprep=preposSg;pprep=preposPl;
sloc=prepos2Sg; sptv=genSg ; svoc=nomSg ;
anim=anim;
mayben=BothSgPl ;
g=g
} ;
} ;
mkN2 = overload {
mkN2 : N -> N2
= \n -> lin N2 (mkFun n nullPrep) ;
mkN2 : N -> Prep -> N2
= \n, p -> lin N2 (mkFun n p) ;
mkN2 : Str -> Gender -> Animacy -> Str -> Prep -> N2
= \word, g, anim, zi, p -> lin N2 (mkFun (noMinorCases (Z.makeNoun word g anim (Z.parseIndex zi))) p) ;
} ;
nullPrep : Prep = lin Prep {s=[]; c=Gen; hasPrep=False} ;
mkN3 = overload {
mkN3 : N -> Prep -> Prep -> N3
= \n, p2, p3 -> lin N3 (mkFun2 n p2 p3) ;
mkN3 : Str -> Gender -> Animacy -> Str -> Prep -> Prep -> N3
= \word, g, anim, zi, p2, p3 -> lin N3 (mkFun2 (noMinorCases (Z.makeNoun word g anim (Z.parseIndex zi))) p2 p3) ;
} ;
mkPN = overload {
mkPN : N -> PN
= \n -> lin PN n ;
mkPN : N -> Str -> N -> PN
= \n1,link,n2 -> lin PN (mkCompoundN n1 link n2) ;
mkPN : Str -> PN
= \nom -> lin PN (guessNounForms nom) ;
mkPN : Str -> Gender -> Animacy -> PN
= \nom, g, anim -> lin PN (guessLessNounForms nom g anim) ;
mkPN : Str -> Gender -> Number -> Animacy -> PN
= \nom, g, n, anim -> lin PN (guessLessNounForms nom g anim) ;
mkPN : Str -> Gender -> Animacy -> Z.ZNIndex -> PN
= \word, g, anim, z -> lin PN (noMinorCases (Z.makeNoun word g anim z)) ;
mkPN : Str -> Gender -> Animacy -> Str -> PN
= \word, g, anim, zi -> lin PN (noMinorCases (Z.makeNoun word g anim (Z.parseIndex zi))) ;
} ;
---------------------
-- Adjectives
mkA = overload {
mkA : Str -> A
= \nom -> lin A (guessAdjectiveForms nom) ;
mkA : Str -> Str -> A
= \nom, comp -> lin A ((guessAdjectiveForms nom) ** {comp=comp}) ;
mkA : Str -> Str -> Str -> A
= \nom, comp, zi -> lin A (makeAdjectiveForms nom comp zi PrefFull) ;
mkA : Str -> Str -> Str -> ShortFormPreference -> A
= \nom, comp, zi, spf -> lin A (makeAdjectiveForms nom comp zi spf) ;
} ;
ShortenA : A -> A
= \a -> a ** {preferShort = PrefShort} ;
-- Two-place adjectives need a preposition and a case as extra arguments.
-- TODO: ? mkA2 : A -> Str -> Case -> A2 ; -- "делим на"
mkA2 : A -> Prep -> A2
= \a,p -> lin A2 (a ** {c = p}) ;
mkOrd = overload {
mkOrd : (nom : Str) -> Ord
= \nom -> lin Ord (guessAdjectiveForms nom) ;
} ;
-------------------------
-- Verbs
mkV = overload {
mkV : Str -> Str -> V
= \inf,sg1 -> lin V (guessVerbForms Perfective Transitive inf sg1 (Z.sg1StemFromVerb sg1 + "ет")) ;
mkV : Str -> Str -> Str -> V
= \inf,sg1,sg3 -> lin V (guessVerbForms Perfective Transitive inf sg1 sg3) ;
mkV : Aspect -> Str -> Str -> V
= \asp,inf,sg1 -> lin V (guessVerbForms asp Transitive inf sg1 (Z.sg1StemFromVerb sg1 + "ет")) ;
mkV : Aspect -> Str -> Str -> Str -> V
= \asp,inf,sg1,sg3 -> lin V (guessVerbForms asp Transitive inf sg1 sg3) ;
mkV : Aspect -> Transitivity -> Str -> Str -> V
= \asp,tran,inf,sg1 -> lin V (guessVerbForms asp tran inf sg1 (Z.sg1StemFromVerb sg1 + "ет")) ;
mkV : Aspect -> Transitivity -> Str -> Str -> Str -> V
= \asp,tran,inf,sg1,sg3 -> lin V (guessVerbForms asp tran inf sg1 sg3) ;
mkV : Aspect -> Transitivity -> Str -> Str -> Str -> Str -> V
= \asp,tran,inf,sg1,sg3,zv -> lin V (Z.makeVerb inf sg1 sg3 (Z.parseVerbIndex zv) asp tran (Z.infStemFromVerb inf).p2 ) ;
mkV : Aspect -> Transitivity -> Str -> Str -> Str -> Z.ZVIndex -> V
= \asp,tran,inf,sg1,sg3,zvi -> lin V (Z.makeVerb inf sg1 sg3 zvi asp tran (Z.infStemFromVerb inf).p2 ) ;
-- For backwards compatibility:
mkV : Aspect -> (presSg1,presSg2,presSg3,presPl1,presPl2,presPl3,pastSgMasc,imp,inf: Str) -> V
= \asp, sgP1, sgP2, sgP3, plP1, plP2, plP3, sgMascPast, imperSgP2, inf ->
lin V ((guessVerbForms asp Transitive inf sgP1 sgP3) ** {
prsg1=Z.dropRefl sgP1 ;
prsg2=Z.dropRefl sgP2 ;
prsg3=Z.dropRefl sgP3 ;
prpl1=Z.dropRefl plP1 ;
prpl2=Z.dropRefl plP2 ;
prpl3=Z.dropRefl plP3 ;
})
} ;
mkV2 = overload {
mkV2 : V -> V2
= \vf -> lin V2 (vf ** {c={s=[] ; c=Acc ; hasPrep=False}}) ;
mkV2 : V -> Case -> V2
= \vf, c -> lin V2 (vf ** {c={s=[] ; c=c ; hasPrep=False}}) ;
mkV2 : V -> Prep -> V2
= \vf, prep -> lin V2 (vf ** {c=prep}) ;
-- For backwards compatibility:
mkV2 : V -> Str -> Case -> V2
= \vf, prep_s, c -> lin V2 (vf ** {c={s=prep_s ; c=c ; hasPrep=True}})
} ;
mkV3 = overload {
mkV3 : V -> Case -> Case -> V3 -- "сложить письмо в конверт"
= \vf, cas1, cas2 -> lin V3 (vf ** {c={s=[] ; c=cas1 ; hasPrep=False} ; c2={s=[] ; c=cas2 ; hasPrep=False}} ) ;
mkV3 : V -> Prep -> Prep -> V3 -- "сложить письмо в конверт"
= \vf, prep1, prep2 -> lin V3 (vf ** {c=prep1 ; c2=prep2} ) ;
-- For backwards compatibility:
mkV3 : V -> Str -> Str -> Case -> Case -> V3
= \vf, prep1, prep2, cas1, cas2 -> lin V3 (vf ** {c={s=prep1 ; c=cas1 ; hasPrep=True} ; c2={s=prep2 ; c=cas2 ; hasPrep=True}} ) ;
} ;
dirV2 v = mkV2 v Acc ;
tvDirDir v = mkV3 v Acc Dat ;
mkVV = \v -> lin VV {v=v; modal=\\a=>[]} ;
mkVS v = lin VS v ;
mkVQ v = lin VQ v ;
mkV2V v prep = lin V2V (v ** {c=prep}) ;
mkV2S v prep = lin V2S (v ** {c=prep}) ;
mkV2Q v prep = lin V2Q (v ** {c=prep}) ;
mkV2A v prep = lin V2A (v ** {c=prep}) ;
------------------------
-- Adverbs, prepositions, conjunctions, ...
mkAdv = overload {
mkAdv : Str -> Adv
= \s -> lin Adv (makeAdverb s) ;
mkAdv : Temp -> Pol -> VPSlash -> Adv
= \temp,pol,vps -> lin Adv {
s=vps.adv ! Ag (GSg Neut) P3
++ pol.s
++ case temp.t of {Pres => vps.verb.prtr ; _ => vps.verb.ptr }
++ verbRefl vps.verb
++ case temp.t of {Cond => "бы" ; _ => []}
++ vps.dep
++ vps.compl ! Ag (GSg Neut) P3
++ vps.c.s ; -- comma is needed. Up to user?
} ;
} ;
mkIAdv : Str -> IAdv
= \s -> lin IAdv (makeAdverb s) ;
mkConj = overload {
mkConj : Str -> Number -> Conj
= \s, n -> lin Conj {s1 = [] ; s2 = s ; n = n} ;
mkConj : Str -> Str -> Number -> Conj
= \s1, s2, n -> lin Conj {s1 = s1 ; s2 = s2 ; n = n} ;
} ;
mkInterj : Str -> Interj
= \s -> lin Interj {s = s} ;
mkPrep : Str -> Case -> Prep
= \s,c -> lin Prep {s = s ; c = c ; hasPrep = True} ;
-- for backwards compatibility only. Use mkV methods instead.
-- These are deprecated!
param Conjugation = First | FirstE | Second | SecondA | Mixed | Dolzhen | Foreign ;
oper
first, firstE, second, mixed, dolzhen, foreign : Conjugation ;
first = First ; firstE = FirstE ; second = Second ; secondA = SecondA ; mixed = Mixed ; dolzhen = Dolzhen; foreign = Foreign;
-- Do not use the following method as it is only approximate because it does not use most informative SgP3 amd
-- SgP3 is being guessed instead from SgP1.
regV : Aspect -> Conjugation -> (stemPresSg1,endPresSg1,pastSg1,imp,inf : Str) -> V ;
regV asp bconj stemPresSg1 endPresSg1 pastSg1 imp inf =
let sg1=stemPresSg1 + endPresSg1 in
let sg3 : Str = case bconj of {
First => (Z.sg1StemFromVerb sg1) + "ет" ;
Mixed => (Z.sg1StemFromVerb sg1) + "чет" ;
FirstE => (Z.sg1StemFromVerb sg1) + "ёт" ;
Second | SecondA => (Z.sg1StemFromVerb sg1) + "ит" ;
_ => (Z.sg1StemFromVerb sg1) + "ет"
} in (guessVerbForms asp Transitive inf sg1 sg3) ** {lock_V=<>} ;
}