From 342ba2e0701ba6c7ee7a37c7a82c341fc3fb1b32 Mon Sep 17 00:00:00 2001 From: Nick Frolov Date: Wed, 14 Dec 2011 16:22:43 +0000 Subject: [PATCH] A tested version of Numerals A bug is known in NP case agreement. The fix does not belong to this part of the resource grammar. --- lib/src/russian/CatRus.gf | 2 +- lib/src/russian/NounRus.gf | 12 +- lib/src/russian/NumeralRus.gf | 221 +++++++++++++++++++++++++-------- lib/src/russian/PhraseRus.gf | 2 +- lib/src/russian/QuestionRus.gf | 2 +- lib/src/russian/ResRus.gf | 3 + lib/src/russian/SymbolRus.gf | 4 +- 7 files changed, 186 insertions(+), 60 deletions(-) diff --git a/lib/src/russian/CatRus.gf b/lib/src/russian/CatRus.gf index 123132b74..cf0f76532 100644 --- a/lib/src/russian/CatRus.gf +++ b/lib/src/russian/CatRus.gf @@ -65,7 +65,7 @@ concrete CatRus of Cat = CommonX ** open ResRus, Prelude in { -- Numeral - Num, Numeral, Card = {s : Case => Gender => Str ; n : Number} ; + Num, Numeral, Card = {s : Gender => Animacy => Case => Str ; n : Number} ; Digits = {s : Str ; n : Number} ; ---- -- Structural diff --git a/lib/src/russian/NounRus.gf b/lib/src/russian/NounRus.gf index 80f9147dc..6350faf46 100644 --- a/lib/src/russian/NounRus.gf +++ b/lib/src/russian/NounRus.gf @@ -82,7 +82,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { } ; DetQuantOrd quant num ord = { - s = \\af => quant.s !af ++ num.s! (caseAF af) ! (genAF af) ++ ord.s!af ; + s = \\af => quant.s !af ++ num.s ! (genAF af) ! (animAF af) ! (caseAF af) ++ ord.s!af ; n = num.n ; g = quant.g; c = quant.c; @@ -91,7 +91,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { } ; DetQuant quant num = { - s = \\af => quant.s !af ++ num.s! (caseAF af) ! (genAF af) ; + s = \\af => quant.s !af ++ num.s ! (genAF af) ! (animAF af) ! (caseAF af); n = num.n ; g = quant.g; c = quant.c; @@ -149,8 +149,8 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { PossPron p = {s = \\af => p.s ! mkPronForm (caseAF af) No (Poss (gennum (genAF af) (numAF af) )); c=Nom; g = PNoGen; q = False} ; NumCard c = c ; - NumSg = {s = \\_,_ => [] ; n = Sg} ; - NumPl = {s = \\_,_ => [] ; n = Pl} ; + NumSg = {s = \\_,_,_ => [] ; n = Sg} ; + NumPl = {s = \\_,_,_ => [] ; n = Pl} ; OrdNumeral numeral = variants {} ; ---- TODO; needed to compile Constructors OrdDigits numeral = variants {} ; ---- TODO; needed to compile Constructors @@ -158,9 +158,9 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { -- {s = \\ af => (uy_j_EndDecl (numeral.s ! caseAF af ! genAF af)).s!af} ; NumNumeral n = n ; - NumDigits n = {s = \\_,_ => n.s ; n = n.n} ; + NumDigits n = {s = \\_,_,_ => n.s ; n = n.n} ; - AdNum adn num = {s = \\c,n => adn.s ++ num.s!c!n ; n = num.n} ; + AdNum adn num = {s = \\c,a,n => adn.s ++ num.s!c!a!n ; n = num.n} ; OrdSuperl a = {s = a.s!Posit}; diff --git a/lib/src/russian/NumeralRus.gf b/lib/src/russian/NumeralRus.gf index 7ece093fa..14b17b940 100644 --- a/lib/src/russian/NumeralRus.gf +++ b/lib/src/russian/NumeralRus.gf @@ -5,77 +5,201 @@ concrete NumeralRus of Numeral = CatRus ** open ResRus in { flags coding=utf8 ; -- Toiska, 13/8/2000, AR with Arto Mustajoki. +-- Nikita Frolov, 2011 -lincat Digit = {s : DForm => Gender => Str ; size : Size} ; -lincat Sub10 = {s : Place => DForm => Gender => Str ; size : Size} ; -lincat Sub100 = {s : Place => Gender => Str ; size : Size} ; -lincat Sub1000 = {s : Place => Gender => Str ; size : Size} ; -lincat Sub1000000 = {s : Gender => Str} ; +lincat Digit = {s : DForm => Gender => Animacy => Case => Str ; size : Size} ; +lincat Sub10 = {s : Place => DForm => Gender => Animacy => Case => Str ; size : Size} ; +lincat Sub100 = {s : Place => Gender => Animacy => Case => Str ; size : Size} ; +lincat Sub1000 = {s : Place => Gender => Animacy => Case => Str ; size : Size} ; +lincat Sub1000000 = {s : Gender => Animacy => Case => Str} ; -lin num x = {s = table{ _ => x.s } ; n = Pl}; ---- n TODO ; Size? AR 18/12/2007 +lin num x = {s = \\ g,a,c => x.s ! g ! a ! c; n = Pl}; ---- n TODO ; Size? AR 18/12/2007 lin n2 = - {s = table {unit => table {Fem => "две" ; _ => "два"} ; - teen => gg "двенадцать" ; - ten => gg "двадцать" ; - hund => gg "двести"} ; + {s = table {unit => \\ g, a, c => + case of { + <(Nom|Acc), Fem, Inanimate > => "две"; + <(Nom|Acc), _, Inanimate > => "два"; + <(Nom|Acc), _, Animate > => "двух"; + <(Gen|Prepos _), _, _ > => "двух"; + => "двум"; + => "двумя" + }; + teen => nadsat "две" ; + ten => n2030 "два" ; + hund => \\ g, a, c => + case of { + <(Nom|Acc), _ > => "двести"; + => "двухсот"; + => "двумстам"; + => "двумяюстами"; + => "двухстах"} } ; size = sgg} ; lin n3 = - {s = table {unit => gg "три" ; - teen => gg "тринадцать" ; - ten => gg "тридцать" ; - hund => gg "триста"} ; + {s = table {unit => tri ; + teen => nadsat "три" ; + ten => n2030 "три" ; + hund => sta tri} ; size = sgg} ; lin n4 = - {s = table {unit => gg "четыре" ; - teen => gg "четырнадцать" ; - ten => gg "сорок" ; - hund => gg "четыреста"} ; + {s = table {unit => chetyre ; + teen => nadsat "четыр" ; + ten => \\ g, a, c => + case of { + <(Nom|Acc), _ > => "сорок"; + <(Gen|Dat|Inst|Prepos _), _ > => "сорока" } ; + hund => sta chetyre } ; size = sgg} ; lin n5 = - {s = table {unit => gg "пять" ; - teen => gg "пятнадцать" ; - ten => gg "пятьдесят" ; - hund => gg "пятьсот"} ; + {s = table {unit => n59 "пят" ; + teen => nadsat "пят" ; + ten => n5070 "пят" ; + hund => sot (n59 "пят")} ; size = plg} ; lin n6 = - {s = table {unit => gg "шесть" ; - teen => gg "шестнадцать" ; - ten => gg "шестьдесят" ; - hund => gg "шестьсот"} ; + {s = table {unit => n59 "шест" ; + teen => nadsat "шест" ; + ten => n5070 "шест" ; + hund => sot (n59 "шест")} ; size = plg} ; lin n7 = - {s = table {unit => gg "семь" ; - teen => gg "семнадцать" ; - ten => gg "семьдесят" ; - hund => gg "семьсот"} ; + {s = table {unit => n59 "сем" ; + teen => nadsat "сем" ; + ten => n5070 "сем" ; + hund => sot (n59 "сем") } ; size = plg} ; lin n8 = - {s = table {unit => gg "восемь" ; - teen => gg "восемнадцать" ; - ten => gg "восемьдесят" ; - hund => gg "восемьсот"} ; + {s = table {unit => vosem ; + teen => nadsat "восем" ; + ten => \\ g, a, c => + case of { + <(Nom|Acc), _ > => "восемьдесят"; + <(Gen|Dat|Prepos _), _ > => "восьмидесяти" ; + => "восемьюдесятью" + }; + hund => sot vosem + } ; size = plg} ; lin n9 = - {s = table {unit => gg "девять" ; - teen => gg "девятнадцать" ; - ten => gg "девяносто" ; - hund => gg "девятьсот"} ; + {s = table {unit => n59 "девят" ; + teen => nadsat "девят" ; + ten => \\ g, a, c => + case of { + <(Nom|Acc), _ > => "девяносто"; + <(Gen|Dat|Inst|Prepos _), _ > => "девяноста" + }; + hund => sot (n59 "девят") } ; size = plg} ; +oper n59 : Str -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n + "ь"; + <(Gen|Dat|Prepos _), _ > => n + "и"; + => n + "ью" + }; + +oper n2030 : Str -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n + "дцать"; + <(Gen|Dat|Prepos _), _ > => n + "дцати" ; + => n + "дцатью" + }; + +oper n5070 : Str -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n + "ьдесят"; + <(Gen|Dat|Prepos _), _ > => n + "идесяти" ; + => n + "ьюдесятью" + }; + +oper tri : Gender => Animacy => Case => Str = \\ g, a, c => + case of { + <(Nom|Acc), _ > => "три"; + <(Gen|Prepos _), _ > => "трех"; + => "трем"; + => "тремя" + }; + +oper chetyre : Gender => Animacy => Case => Str = \\ g, a, c => + case of { + <(Nom|Acc), _ > => "четыре"; + <(Gen|Prepos _), _ > => "четырех"; + => "четырем"; + => "четырьмя" + }; + +oper vosem : Gender => Animacy => Case => Str = \\ g, a, c => + case of { + <(Nom|Acc), _ > => "восемь"; + <(Gen|Dat|Prepos _), _ > => "восьми"; + => "восемью" + }; + +-- a little tribute to Burgess +oper nadsat : Str -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n + "надцать"; + <(Gen|Dat|Prepos _), _ > => n + "надцати"; + => n + "надцатью" + }; + +oper sta : (Gender => Animacy => Case => Str) -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n ! Fem ! Animate ! c + "ста"; + => n ! Fem ! Animate ! c + "сот"; + => n ! Fem ! Animate ! c + "стам"; + => n ! Fem ! Animate ! c + "юстами"; + => n ! Fem ! Animate ! c + "стах" + }; + +oper sot : (Gender => Animacy => Case => Str) -> (Gender => Animacy => Case => Str) = \ n -> \\ g, a, c => + case of { + <(Nom|Acc), _ > => n ! Fem ! Animate ! c + "сот"; + => n ! Fem ! Animate ! c + "сот"; + => n ! Fem ! Animate ! c + "стам"; + => n ! Fem ! Animate ! c + "юстами"; + => n ! Fem ! Animate ! c + "ста" + }; lin pot01 = - {s = table {attr => table {hund => gg "сто" ; _ => gg []} ; - _ => table {hund => gg "сто" ; - _ => table {Masc => "один" ; Fem => "одна" ; _ => "одно"}}} ; + {s = table {attr => table {hund => \\ g, a, c => + case of { + <_, _, (Nom|Acc) > => "сто"; + <_, _, (Gen|Dat|Prepos _) > => "ста"; + <_, _, Inst > => "сотней" + }; + _ => \\ g, a, c => []} ; + _ => table {hund => \\ g, a, c => + case of { + <_, _, (Nom|Acc) > => "сто"; + <_, _, (Gen|Dat|Prepos _) > => "ста"; + -- TODO: case agreement with nouns + <_, _, Inst > => "сотней" + }; + _ => \\ g, a, c => + case of { + => "одного"; + => "один"; + => "один"; + => "одного"; + => "одному"; + => "одним"; + => "одном"; + => "одна"; + => "одной"; + => "одну"; + => "одно"; + => "одного"; + => "одному"; + => "одним"; + => "одном"}}} ; size = nom} ; lin pot0 d = {s = table {_ => d.s} ; size = d.size} ; lin pot110 = - {s = table {_ => gg "десяти"} ; size = plg} ; --- {s = table {_ => gg "десять"} ; size = plg} ; + {s = \\ p => n59 "десять" ; size = plg} ; lin pot111 = - {s = table {_ => gg "одиннадцать"} ; size = plg} ; --- 11 + {s = \\ p => nadsat "один" ; size = plg} ; --- 11 lin pot1to19 d = {s = table {_ => d.s ! teen} ; size = plg} ; lin pot0as1 n = @@ -83,20 +207,19 @@ lin pot0as1 n = lin pot1 d = {s = table {_ => d.s ! ten} ; size = plg} ; --- lin pot1plus d e = - {s = table {_ => - table {g => d.s ! ten ! g ++ e.s ! indep ! unit ! g}} ; size = e.size} ; + {s = table {_ => \\ g, a, c => d.s ! ten ! g ! a ! c ++ e.s ! indep ! unit ! g ! a ! c} ; size = e.size} ; lin pot1as2 n = {s = n.s ; size = n.size} ; lin pot2 d = {s = table {p => d.s ! p ! hund} ; size = plg} ; lin pot2plus d e = - {s = table {p => table {g => d.s ! p ! hund ! g ++ e.s ! indep ! g}} ; size = e.size} ; + {s = \\ p, g, a, c => d.s ! p ! hund ! g ! a ! c ++ e.s ! indep ! g ! a ! c ; size = e.size} ; lin pot2as3 n = {s = n.s ! indep} ; lin pot3 n = - {s = gg (n.s ! attr ! Fem ++ mille ! n.size)} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size} ; lin pot3plus n m = - {s = table {g => n.s ! attr ! Fem ++ mille ! n.size ++ m.s ! indep ! g}} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ++ m.s ! indep ! g ! a ! c} ; --- TODO --- raz/odin diff --git a/lib/src/russian/PhraseRus.gf b/lib/src/russian/PhraseRus.gf index 46d9eb9d8..f4e313288 100644 --- a/lib/src/russian/PhraseRus.gf +++ b/lib/src/russian/PhraseRus.gf @@ -18,7 +18,7 @@ concrete PhraseRus of Phrase = CatRus ** open Prelude, ResRus in { UttVP vp = {s = vp.s ! ClInfinit ! GSg Masc ! P3} ; UttAdv adv = adv ; UttCN n = {s = n.s ! NF Sg Nom} ; - UttCard n = {s = n.s ! Nom ! Neut} ; + UttCard n = {s = n.s ! Neut ! Inanimate ! Nom} ; UttAP ap = {s = ap.s ! AF Nom Inanimate (GSg Neut)} ; ---- gennum ? (AR) NoPConj = {s = []} ; diff --git a/lib/src/russian/QuestionRus.gf b/lib/src/russian/QuestionRus.gf index 27ada61d1..584385962 100644 --- a/lib/src/russian/QuestionRus.gf +++ b/lib/src/russian/QuestionRus.gf @@ -61,7 +61,7 @@ concrete QuestionRus of Question = CatRus ** open ResRus, Prelude in { IdetQuant kakoj pyat = -- okhotnik = {s = \\af => kakoj.s ! pyat.n ! af ++ - pyat.s ! caseAF af ! genAF af ; + pyat.s ! genAF af ! animAF af ! caseAF af ; n = pyat.n ; g = kakoj.g ; c = kakoj.c diff --git a/lib/src/russian/ResRus.gf b/lib/src/russian/ResRus.gf index 477c96cc8..e7d2fbc44 100644 --- a/lib/src/russian/ResRus.gf +++ b/lib/src/russian/ResRus.gf @@ -317,6 +317,9 @@ oper genAF: AdjForm -> Gender = \af -> oper caseAF: AdjForm -> Case = \af -> case af of { AdvF => Nom; AFShort _ => Nom; AF c _ _ => c } ; +oper animAF: AdjForm -> Animacy = \af -> + case af of { AF _ a _ => a ; _ => Inanimate } ; + -- The Degree parameter should also be more complex, since most Russian -- adjectives have two comparative forms: -- attributive (syntactic (compound), declinable) - diff --git a/lib/src/russian/SymbolRus.gf b/lib/src/russian/SymbolRus.gf index d1d8eca47..7df6aead8 100644 --- a/lib/src/russian/SymbolRus.gf +++ b/lib/src/russian/SymbolRus.gf @@ -7,13 +7,13 @@ lin SymbPN i = {s = table {_ => i.s} ; g = Neut; anim = Inanimate } ; IntPN i = {s = table {_ => i.s} ; g = Neut; anim = Inanimate } ; FloatPN i = {s = table {_ => i.s} ; g = Neut; anim = Inanimate } ; - NumPN n = {s = table {_ => n.s ! Nom ! Neut} ; g = Neut; anim = Inanimate } ; + NumPN n = {s = table {_ => n.s ! Neut ! Nom} ; g = Neut; anim = Inanimate } ; CNIntNP cn i = {s = \\cas => cn.s ! NF Sg (extCase cas) ++ i.s; n = Sg ; p = P3 ; g = PGen cn.g ; anim = cn.anim ; pron = False } ; CNNumNP cn n = {s = \\cas => cn.s ! NF Sg (extCase cas) - ++ n.s ! (extCase cas) ! cn.g; + ++ n.s ! cn.g ! (extCase cas) ; n = Sg ; p = P3 ; g = PGen cn.g ; anim = cn.anim ; pron = False } ;