From f90ba446202c80a82335b7e5588495666a8e707a Mon Sep 17 00:00:00 2001 From: krasimir Date: Tue, 19 Feb 2008 16:42:31 +0000 Subject: [PATCH] add numerals --- lib/resource/bulgarian/CatBul.gf | 5 ++ lib/resource/bulgarian/GrammarBul.gf | 1 + lib/resource/bulgarian/NumeralBul.gf | 128 +++++++++++++++++++++++++++ lib/resource/bulgarian/ResBul.gf | 53 +++++++++++ 4 files changed, 187 insertions(+) create mode 100644 lib/resource/bulgarian/NumeralBul.gf diff --git a/lib/resource/bulgarian/CatBul.gf b/lib/resource/bulgarian/CatBul.gf index b9389ede1..dcba8411e 100644 --- a/lib/resource/bulgarian/CatBul.gf +++ b/lib/resource/bulgarian/CatBul.gf @@ -39,6 +39,11 @@ concrete CatBul of Cat = CommonX ** open ResBul, Prelude in { Num = {s : Str; n : Number } ; Quant = {s : AForm => Str; spec : Species} ; +-- Numeral + + Numeral = {s : CardOrd => Str; n : Number} ; + Digits = {s : CardOrd => Str; n : Number; tail : DTail} ; + -- Structural Subj = {s : Str} ; diff --git a/lib/resource/bulgarian/GrammarBul.gf b/lib/resource/bulgarian/GrammarBul.gf index d3245aea6..797b46058 100644 --- a/lib/resource/bulgarian/GrammarBul.gf +++ b/lib/resource/bulgarian/GrammarBul.gf @@ -3,6 +3,7 @@ concrete GrammarBul of Grammar = NounBul, VerbBul, + NumeralBul, SentenceBul, QuestionBul, PhraseBul, diff --git a/lib/resource/bulgarian/NumeralBul.gf b/lib/resource/bulgarian/NumeralBul.gf new file mode 100644 index 000000000..d0f689ec9 --- /dev/null +++ b/lib/resource/bulgarian/NumeralBul.gf @@ -0,0 +1,128 @@ +concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in { + +lincat + Digit = {s : DForm => CardOrd => Str} ; + Sub10 = {s : DForm => CardOrd => Str; n : Number } ; + Sub100 = {s : CardOrd => Str; n : Number; i : Bool } ; + Sub1000 = {s : CardOrd => Str; n : Number; i : Bool } ; + Sub1000000 = {s : CardOrd => Str; n : Number} ; + +lin num x = x ; +lin n2 = mkDigit "два" "двама" "две" "втори" "двеста" ; +lin n3 = mkDigit "три" "трима" "три" "трети" "триста" ; +lin n4 = mkDigit "четири" "четирима" "четири" "четвърти" "четиристотин" ; +lin n5 = mkDigit "пет" "петима" "пет" "пети" "петстотин" ; +lin n6 = mkDigit "шест" "шестима" "шест" "шести" "шестстотин" ; +lin n7 = mkDigit "седем" "седмина" "седем" "седми" "седемстотин" ; +lin n8 = mkDigit "осем" "осмина" "осем" "осми" "осемстотин" ; +lin n9 = mkDigit "девет" "деветима" "девет" "девети" "деветстотин" ; + +lin pot01 = + {s = table { + unit => table { + NCard DMasc Indef => "един" ; + NCard DMascPersonal Indef => "един" ; + NCard DFem Indef => "една" ; + NCard DNeut Indef => "едно" ; + NCard DMasc Def => "единия" ; + NCard DMascPersonal Def => "единия" ; + NCard DFem Def => "едната" ; + NCard DNeut Def => "едното" ; + NOrd aform => (mkAdjective "първи" + "първия" + "първият" + "първа" + "първата" + "първо" + "първото" + "първи" + "първите").s ! aform + } ; + teen => mkCardOrd "единадесет" "единадесетима" "единадесет" "единадесети" ; + ten => mkCardOrd "десет" "десетима" "десет" "десети" ; + hundred => mkCardOrd "сто" "стотима" "сто" "стотен" + } + ;n = Sg + } ; +lin pot0 d = d ** {n = Pl} ; + +lin pot110 = {s=pot01.s ! ten; n = Pl; i = True} ; +lin pot111 = {s=pot01.s ! teen; n = Pl; i = True} ; +lin pot1to19 d = {s = d.s ! teen; n = Pl; i = True} ; +lin pot0as1 n = {s = n.s ! unit; n = n.n; i = True} ; +lin pot1 d = {s = d.s ! ten; n = Pl; i = True} ; +lin pot1plus d e = { + s = \\c => d.s ! ten ! NCard DMasc Indef ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ; + +lin pot1as2 n = n ; +lin pot2 n = {s = \\c => n.s ! hundred ! c; n = Pl; i = True} ; +lin pot2plus d e = { + s = \\c => d.s ! hundred ! NCard DMasc Indef ++ case e.i of {False => []; True => "и"} ++ e.s ! c ; + n = Pl ; + i = False + } ; + +lin pot2as3 n = n ; +lin pot3 n = { + s = \\c => case n.n of { + Sg => mkCardOrd "хиляда" "хиляда" "хиляда" "хиляден" ! c ; + Pl => n.s ! NCard DFem Indef ++ mkCardOrd "хиляди" "хиляди" "хиляди" "хиляден" ! c + } ; + n = Pl + } ; +lin pot3plus n m = { + s = \\c => (pot3 n).s ! NCard DMasc Indef ++ case m.i of {False => []; True => "и"} ++ m.s ! c ; + n = Pl + } ; + + +-- numerals as sequences of digits + + lincat + Dig = TDigit ; + + lin + IDig d = d ** {tail = T1} ; + + IIDig d i = { + s = \\o => d.s ! NCard DMasc Indef ++ commaIf i.tail ++ i.s ! o ; + n = Pl ; + tail = inc i.tail + } ; + + D_0 = mk2Dig "0" "0в" ; + D_1 = mk3Dig "1" "1ви" Sg ; + D_2 = mk2Dig "2" "2ри" ; + D_3 = mkDig "3" ; + D_4 = mkDig "4" ; + D_5 = mkDig "5" ; + D_6 = mkDig "6" ; + D_7 = mk2Dig "7" "7ми" ; + D_8 = mk2Dig "8" "8ми" ; + D_9 = mkDig "9" ; + + oper + commaIf : DTail -> Str = \t -> case t of { + T3 => "," ; + _ => [] + } ; + + inc : DTail -> DTail = \t -> case t of { + T1 => T2 ; + T2 => T3 ; + T3 => T1 + } ; + + mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ; + mkDig : Str -> TDigit = \c -> mk2Dig c (c + "ти") ; + + mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> { + s = table {NCard _ _ => c ; NOrd aform => (regAdjective o).s ! aform} ; + n = n + } ; + + TDigit = { + n : Number ; + s : CardOrd => Str + } ; +} diff --git a/lib/resource/bulgarian/ResBul.gf b/lib/resource/bulgarian/ResBul.gf index 138ce0bce..77dc94d5b 100644 --- a/lib/resource/bulgarian/ResBul.gf +++ b/lib/resource/bulgarian/ResBul.gf @@ -60,6 +60,12 @@ resource ResBul = ParamX ** open Prelude in { | AFullDef ; +--2 For $Numeral$ + + DGender = DMasc | DMascPersonal | DFem | DNeut ; + CardOrd = NCard DGender Species | NOrd AForm ; + DForm = unit | teen | ten | hundred ; + --2 Transformations between parameter types oper @@ -293,6 +299,53 @@ resource ResBul = ParamX ** open Prelude in { OQuest => subj ++ verb ++ "ли" ++ compl } } ; + +-- For $Numeral$. + + mkDigit : Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} = + \dva, dvama, dve, vtori, dvesta -> + {s = table { + unit => mkCardOrd dva dvama dve vtori ; + teen => mkCardOrd (dva+"надесет") (dva+"надесетима") (dva+"надесет") (dva+"надесети") ; + ten => mkCardOrd (dva+"десет") (dva+"десетима") (dva+"десет") (dva+"десети") ; + hundred => let dvesten : Str + = case dvesta of { + dvest+"а" => dvest+"ен" ; + chetiristot+"ин" => chetiristot+"ен" + } + in mkCardOrd dvesta dvesta dvesta dvesten + } + } ; + + mkCardOrd : Str -> Str -> Str -> Str -> CardOrd => Str = + \dva, dvama, dve, vtori -> + table { + NCard dg Indef => digitGender dva dvama dve ! dg ; + NCard dg Def => case digitGender dva dvama dve ! dg of { + dves+"та" => dves+"тате" ; + dv+"а" => dv+"ата" ; + x => x+"те" + } ; + NOrd aform => let vtora = init vtori + "а" ; + vtoro = init vtori + "о" + in (mkAdjective vtori + (vtori+"я") + (vtori+"ят") + vtora + (vtora+"та") + vtoro + (vtoro+"то") + vtori + (vtori+"те")).s ! aform + } ; + + digitGender : Str -> Str -> Str -> DGender => Str = + \dva, dvama, dve + -> table { + DMasc => dva ; + DMascPersonal => dvama ; + _ => dve + } ; mkIP : Str -> GenNum -> {s : Str ; gn : GenNum} = \s,gn -> {