--# -path=.:../abstract:../common:../prelude -- Adam Slaski, 2009 concrete NumeralPol of Numeral = CatPol ** open ResPol,Prelude, AdjectiveMorphoPol in { flags coding=utf8 ; lincat -- a = accomodation Digit = { unit,teen,ten,hundred: Case * Gender => Str; ounit,oteen,oten,ohundred: AForm => Str; a:Accom }; -- 2..9 Sub10 = { unit,hundred: Case * Gender => Str; ounit,ohundred: AForm => Str; a:Accom; n:Number }; -- 1..9 Sub100, Sub1000, Sub1000000 = { s:Case * Gender => Str; o:AForm => Str; a:Accom; n:Number }; lin -- num : Sub1000000 -> Numeral ; num a = { s = \\x,y=>a.s!; o=a.o; a=a.a; n=a.n }; -- n2, n3, n4, n5, n6, n7, n8, n9 : Digit ; n2 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "dwoje"; => "dwojga"; <(Dat|Loc),NeutGr > => "dwojgu"; => "dwojgiem"; <(Nom|VocP),Masc Personal > => "dwóch"; <(Nom|VocP|Acc),Fem > => "dwie"; (|) => "dwóch"; <(Nom|VocP|Acc),_ > => "dwa"; => "dwóm"; => "dwiema"; => "dwoma"; => "dwóch" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "dwanaścioro"; => "dwanaściorga"; <(Dat|Loc),NeutGr > => "dwanaściorgu"; => "dwanaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "dwunastu"; <(Nom|VocP|Acc),_ > => "dwanaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "dwadzieścioro"; => "dwadzieściorga"; <(Dat|Loc),NeutGr > => "dwadzieściorgu"; => "dwadzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "dwudziestu"; <(Nom|VocP|Acc),_ > => "dwadzieścia" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "dwustu"; <(Nom|VocP|Acc),_ > => "dwieście" }; ounit = mkAtable( guess_model "drugi" ); oteen = mkAtable( guess_model "dwunasty" ); oten = mkAtable( guess_model "dwudziesty" ); ohundred = mkAtable( guess_model "dwusetny" ); a=DwaA }; n3 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "troje"; => "trojga"; => "trojgu"; => "trojgiem"; <(Nom|VocP),Masc Personal > => "trzech"; <(Nom|VocP|Acc),Fem > => "trzy"; (|) => "trzech"; <(Nom|VocP|Acc),_ > => "trzy"; => "trzem"; => "trzema"; => "trzema"; => "trzech" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "trzynaścioro"; => "trzynaściorga"; <(Dat|Loc),NeutGr > => "trzynaściorgu"; => "trzynaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "trzynastu"; <(Nom|VocP|Acc),_ > => "trzynaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "trzydzieścioro"; => "trzydzieściorga"; <(Dat|Loc),NeutGr > => "trzydzieściorgu"; => "trzydzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "trzydziestu"; <(Nom|VocP|Acc),_ > => "trzydzieści" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "trzystu"; <(Nom|VocP|Acc),_ > => "trzysta" }; ounit = mkAtable( guess_model "trzeci" ); oteen = mkAtable( guess_model "trzynasty" ); oten = mkAtable( guess_model "trzydziesty" ); ohundred = mkAtable( guess_model "trzechsetny" ); a=DwaA }; n4 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "czworo"; => "czworga"; => "czworgu"; => "czworgiem"; <(Nom|VocP),Masc Personal > => "czterech"; <(Nom|VocP|Acc),Fem > => "cztery"; (|) => "czterch"; <(Nom|VocP|Acc),_ > => "cztery"; => "czterem"; => "czterema"; => "czterma"; => "czterech" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "czternaścioro"; => "czternaściorga"; <(Dat|Loc),NeutGr > => "czternaściorgu"; => "czternaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "czternastu"; <(Nom|VocP|Acc),_ > => "czternaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "czterdzieścioro"; => "czterdzieściorga"; <(Dat|Loc),NeutGr > => "czterdzieściorgu"; => "czterdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "czterdziestu"; <(Nom|VocP|Acc),_ > => "czterdzieści" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "czterystu"; <(Nom|VocP|Acc),_ > => "czterysta" }; ounit = mkAtable( guess_model "czwarty" ); oteen = mkAtable( guess_model "czternasty" ); oten = mkAtable( guess_model "czterdziesty" ); ohundred = mkAtable( guess_model "czterechsetny" ); a=DwaA }; n5 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "pięcioro"; => "pięciorga"; => "pięciorgu"; => "pięciorgiem"; <(Nom|VocP),Masc Personal > => "pięciu"; (|) => "pięciu"; <(Nom|VocP|Acc),_ > => "pięć"; => "pięciu"; => "pięcioma"; => "pięciu" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "piętnaścioro"; => "piętnaściorga"; <(Dat|Loc),NeutGr > => "piętnaściorgu"; => "piętnaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "piętnastu"; <(Nom|VocP|Acc),_ > => "piętnaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "pięćdzieścioro"; => "pięćdzieściorga"; <(Dat|Loc),NeutGr > => "pięćdzieściorgu"; => "pięćdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "pięćdziesięciu"; <(Nom|VocP|Acc),_ > => "pięćdziesiąt" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "pięciuset"; <(Nom|VocP|Acc),_ > => "pięćset" }; ounit = mkAtable( guess_model "piąty" ); oteen = mkAtable( guess_model "piętnasty" ); oten = mkAtable( guess_model "pięćdziesiąty" ); ohundred = mkAtable( guess_model "pięćsetny" ); a=PiecA }; n6 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "sześcioro"; => "sześciorga"; => "sześciorgu"; => "sześciorgiem"; <(Nom|VocP),Masc Personal > => "sześciu"; (|) => "sześciu"; <(Nom|VocP|Acc),_ > => "sześć"; => "sześciu"; => "sześcioma"; => "sześciu" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "szesnaścioro"; => "szesnaściorga"; <(Dat|Loc),NeutGr > => "szesnaściorgu"; => "szesnaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "szesnastu"; <(Nom|VocP|Acc),_ > => "szesnaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "sześćdzieścioro"; => "sześćdzieściorga"; <(Dat|Loc),NeutGr > => "sześćdzieściorgu"; => "sześćdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "sześćdziesięciu"; <(Nom|VocP|Acc),_ > => "sześćdziesiąt" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "sześciuset"; <(Nom|VocP|Acc),_ > => "sześćset" }; ounit = mkAtable( guess_model "szósty" ); oteen = mkAtable( guess_model "szesnasty" ); oten = mkAtable( guess_model "sześćdziesiąty" ); ohundred = mkAtable( guess_model "sześćsetny" ); a=PiecA }; n7 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "siedmioro"; => "siedmiorga"; => "siedmiorgu"; => "siedmiorgiem"; <(Nom|VocP),Masc Personal > => "siedmiu"; (|) => "siedmiu"; <(Nom|VocP|Acc),_ > => "siedem"; => "siedmiu"; => "siedmioma"; => "siedmiu" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "siedemnaścioro"; => "siedemnaściorga"; <(Dat|Loc),NeutGr > => "siedemnaściorgu"; => "siedemnaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "siedemnastu"; <(Nom|VocP|Acc),_ > => "siedemnaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "siedemdzieścioro"; => "siedemdzieściorga"; <(Dat|Loc),NeutGr > => "siedemdzieściorgu"; => "siedemdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "siedemdziesięciu"; <(Nom|VocP|Acc),_ > => "siedemdziesiąt" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "siedemiuset"; <(Nom|VocP|Acc),_ > => "siedemset" }; ounit = mkAtable( guess_model "siódmy" ); oteen = mkAtable( guess_model "siedemnasty" ); oten = mkAtable( guess_model "siedemdziesiąty" ); ohundred = mkAtable( guess_model "siedemsetny" ); a=PiecA }; n8 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "ośmioro"; => "ośmiorga"; => "ośmiorgu"; => "ośmiorgiem"; <(Nom|VocP),Masc Personal > => "ośmiu"; (|) => "ośmiu"; <(Nom|VocP|Acc),_ > => "osiemm"; => "ośmiu"; => "ośmioma"; => "ośmiu" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "osiemnaścioro"; => "osiemnaściorga"; <(Dat|Loc),NeutGr > => "osiemnaściorgu"; => "osiemnaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "osiemnastu"; <(Nom|VocP|Acc),_ > => "osiemnaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "osiemdzieścioro"; => "osiemdzieściorga"; <(Dat|Loc),NeutGr > => "osiemdzieściorgu"; => "osiemdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "osiemdziesięciu"; <(Nom|VocP|Acc),_ > => "osiemdziesiąt" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "ośmiuset"; <(Nom|VocP|Acc),_ > => "osiemset" }; ounit = mkAtable( guess_model "ósmy" ); oteen = mkAtable( guess_model "osiemnasty" ); oten = mkAtable( guess_model "osiemdziesiąty" ); ohundred = mkAtable( guess_model "osiemsetny" ); a=PiecA }; n9 = { unit = table { <(Nom|VocP|Acc),NeutGr > => "dziewięcioro"; => "dziewięciorga"; => "dziewięciorgu"; => "dziewięciorgiem"; <(Nom|VocP),Masc Personal > => "dziewięciu"; (|) => "dziewięciu"; <(Nom|VocP|Acc),_ > => "dziewięć"; => "dziewięciu"; => "dziewięcioma"; => "dziewięciu" }; teen = table { <(Nom|VocP|Acc),NeutGr > => "dziewiętnaścioro"; => "dziewiętnaściorga"; <(Dat|Loc),NeutGr > => "dziewiętnaściorgu"; => "dziewiętnaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "dziewiętnastu"; <(Nom|VocP|Acc),_ > => "dziewiętnaście" }; ten = table { <(Nom|VocP|Acc),NeutGr > => "dziewięćdzieścioro"; => "dziewięćdzieściorga"; <(Dat|Loc),NeutGr > => "dziewięćdzieściorgu"; => "dziewięćdzieściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "dziewięćdziesięciu"; <(Nom|VocP|Acc),_ > => "dziewięćdziesiąt" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| ) => "dziewięciuset"; <(Nom|VocP|Acc),_ > => "dziewięćset" }; ounit = mkAtable( guess_model "dziewiąty" ); oteen = mkAtable( guess_model "dziewiętnasty" ); oten = mkAtable( guess_model "dziewięćdziesiąty" ); ohundred = mkAtable( guess_model "dziewięćsetny" ); a=PiecA }; -- pot01 : Sub10 ; -- 1 pot01 = { unit = table { (<(Nom|VocP),Masc _>|) => "jeden"; <(Nom|Acc|VocP),Neut|NeutGr> => "jedno"; <(Nom|VocP),Fem> => "jedna"; <(Gen|Dat|Loc),Fem> => "jednej"; <(Acc|Instr),Fem> => "jedną"; (|) => "jednego"; => "jednemu"; <(Instr|Loc),_> => "jednym" }; hundred = table { (<(Nom|VocP|Acc),Masc Personal>| <(Gen|Dat|Instr|Loc),_>) => "stu"; <(Nom|VocP|Acc),_ > => "sto" }; ounit = mkAtable( guess_model "pierwszy" ); ohundred = mkAtable( guess_model "setny" ); a=NoA; n=Sg }; -- pot0 : Digit -> Sub10 ; -- d * 1 pot0 d = { unit = d.unit; hundred = d.hundred; ounit = d.ounit; ohundred = d.ohundred; a = d.a; n = Pl }; -- pot110 : Sub100 ; -- 10 pot110 = { s =table { <(Nom|VocP|Acc),NeutGr > => "dziesięcioro"; => "dziesięciorga"; <(Dat|Loc),NeutGr > => "dziesięciorgu"; => "dziesięciorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "dziesięciu"; <(Nom|VocP|Acc),_ > => "dziesięć" }; o = mkAtable( guess_model "osiemdziesiąty" ); a=PiecA; n=Pl }; -- pot111 : Sub100 ; -- 11 pot111 = { s = table { <(Nom|VocP|Acc),NeutGr > => "jedenaścioro"; => "jedenaściorga"; <(Dat|Loc),NeutGr > => "jedenaściorgu"; => "jedenaściorgiem"; (<(Nom|VocP|Acc),Masc Personal>| ) => "jedenastu"; <(Nom|VocP|Acc),_ > => "jedenaście" }; o = mkAtable( guess_model "osiemnasty" ); a=PiecA; n=Pl }; -- pot1to19 : Digit -> Sub100 ; -- 10 + d pot1to19 d = { s = d.teen; o = d.oteen; a = PiecA; n = Pl }; -- pot0as1 : Sub10 -> Sub100 ; -- coercion of 1..9 pot0as1 s = { s = s.unit; o = s.ounit; a = s.a; n = s.n }; -- pot1 : Digit -> Sub100 ; -- d * 10 pot1 d = { s = d.ten; o = d.oten; a = PiecA; n = Pl }; -- pot1plus : Digit -> Sub10 -> Sub100 ; -- d * 10 + n pot1plus d s = { s = \\x => d.ten!x ++ s.unit!x; o = \\x => d.oten!x ++ s.ounit!x; a = s.a; n = Pl }; -- pot1as2 : Sub100 -> Sub1000 ; -- coercion of 1..99 pot1as2 s = { s = s.s; o = s.o; a = s.a; n = s.n }; -- pot2 : Sub10 -> Sub1000 ; -- m * 100 pot2 s = { s = s.hundred; o = s.ohundred; a = StoA; n = Pl }; -- pot2plus : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n pot2plus s10 s100 = { s = \\x => s10.hundred!x ++ case s100.n of { Sg => "jeden"; _=>s100.s!x } ; o = \\x => s10.hundred! ++ s100.o!x; -- sto drugi, nie setny drugi a = case s100.n of { Sg => StoA; _=> s100.a }; n = Pl }; -- pot2as3 : Sub1000 -> Sub1000000 ; -- coercion of 1..999 pot2as3 s = { s = s.s; o = s.o; a = s.a; n = Pl }; -- pot3 : Sub1000 -> Sub1000000 ; -- m * 1000 pot3 s = { s = \\x => case s.n of { Sg => ""; Pl => s.s! } ++ tysiac!<(accom_case! ),s.n>; o = \\x => s.o!x ++ (mkAtable (guess_model "tysięczny"))!x; --FIXME dwu tysieczny, nie dwa tysieczny a = TysiacA; n = Pl }; -- pot3plus : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n pot3plus s s2 = { s = \\x => case s.n of { Sg => ""; Pl => s.s! } ++ tysiac!<(accom_case! ),s.n> ++ case s2.n of { Sg => "jeden"; _=>s2.s!x } ; --zabiłem dwa tysiące jeden policjantów o = \\x => case s.n of { Sg => ""; Pl => s.s! } -- tysiąc dwieście dziewięćdziesiąty pierwszy ++ tysiac!<(accom_case! ),s.n> ++ s2.o!x; a = case s2.n of { Sg => TysiacA; _=> s2.a } ; n = Pl }; oper tysiac = table { <(Nom|Acc), Sg> => "tysiąc"; => "tysiąca"; => "tysiącowi"; => "tysiącem"; <(Loc|VocP),Sg> => "tysiącu"; <(Nom|Acc|VocP), Pl> => "tysiące"; => "tysięcy"; => "tysiącom"; => "tysiącami"; => "tysiącach" }; -- -- Numerals as sequences of digits have a separate, simpler grammar lincat Dig = {s:Str; o:Str; n:Number; a:Accom}; -- single digit 0..9 lin -- IDig : Dig -> Digits ; -- 8 IDig d = d; -- IIDig : Dig -> Digits -> Digits ; -- 876 IIDig d dd = { s = d.s ++ dd.s; o = d.s ++ dd.o; n=Pl; a=dd.a }; D_0 = { s = "0"; o="0."; n=Pl; a=TysiacA }; D_1 = { s = "1"; o="1."; n=Sg; a=NoA }; D_2 = { s = "2"; o="2."; n=Pl; a=DwaA }; D_3 = { s = "3"; o="3."; n=Pl; a=DwaA }; D_4 = { s = "4"; o="4."; n=Pl; a=DwaA }; D_5 = { s = "5"; o="5."; n=Pl; a=PiecA }; D_6 = { s = "6"; o="6."; n=Pl; a=PiecA }; D_7 = { s = "7"; o="7."; n=Pl; a=PiecA }; D_8 = { s = "8"; o="8."; n=Pl; a=PiecA }; D_9 = { s = "9"; o="9."; n=Pl; a=PiecA }; }