mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-09-23 02:36:04 -06:00
106 lines
3.4 KiB
Plaintext
106 lines
3.4 KiB
Plaintext
concrete NumeralBel of Numeral = CatBel ** open Prelude in {
|
|
|
|
lincat
|
|
Digit = {
|
|
s, fem, teen, ten, hundred : Str ;
|
|
form : NumForm
|
|
} ;
|
|
Sub10, Sub100, Sub1000 = {
|
|
s, fem, hundred : Str ;
|
|
form : NumForm
|
|
} ;
|
|
Sub1000000, Sub1000000000, Sub1000000000000 = {s : Str} ;
|
|
Dig = {s : Str} ;
|
|
|
|
lin
|
|
num n = n ;
|
|
|
|
n2 = mkDigit "два" "дзве" "дванаццаць" "дваццаць" "дзвесце" Few ;
|
|
n3 = mkDigit "тры" "тры" "трынаццаць" "трыццаць" "трыста" Few ;
|
|
n4 = mkDigit "чатыры" "чатыры" "чатырнаццаць" "сорак" "чатырыста" Few ;
|
|
n5 = mkDigit "пяць" "пяць" "пятнаццаць" "пяцьдзясят" "пяцьсот" Many ;
|
|
n6 = mkDigit "шэсць" "шэсць" "шаснаццаць" "шэсцьдзясят" "шэсцьсот" Many ;
|
|
n7 = mkDigit "сем" "сем" "сямнаццаць" "семдзесят" "семсот" Many ;
|
|
n8 = mkDigit "восем" "восем" "васямнаццаць" "восемдзесят" "восемсот" Many ;
|
|
n9 = mkDigit "дзевяць" "дзевяць" "дзевятнаццаць" "дзевяноста" "дзевяцьсот" Many ;
|
|
|
|
pot01 = {s = "адзін"; fem = "адна"; hundred = "сто"; form = One} ;
|
|
pot0 d = d ;
|
|
pot0as1 n = n ;
|
|
pot110 = mkNum "дзесяць" Many ;
|
|
pot111 = mkNum "адзінаццаць" Many ;
|
|
pot1to19 d = mkNum d.teen Many ;
|
|
pot1 d = mkNum d.ten Many ;
|
|
pot1plus d n = {
|
|
s = d.ten ++ n.s ;
|
|
fem = d.ten ++ n.fem ;
|
|
hundred = [] ;
|
|
form = n.form
|
|
} ;
|
|
pot1as2 n = n ;
|
|
pot21 = mkNum "сто" Many ;
|
|
pot2 n = mkNum n.hundred Many ;
|
|
pot2plus n m = {
|
|
s = n.hundred ++ m.s ;
|
|
fem = n.hundred ++ m.fem ;
|
|
hundred = [] ;
|
|
form = m.form
|
|
} ;
|
|
pot2as3 n = n ;
|
|
pot31 = {s = "тысяча"} ;
|
|
pot3 n = {s = n.fem ++ scaleForm n.form "тысяча" "тысячы" "тысяч"} ;
|
|
pot3plus n m = {s = (pot3 n).s ++ m.s} ;
|
|
pot3as4 n = n ;
|
|
pot3decimal d = {s = d.s ++ "тысяч"} ;
|
|
pot41 = {s = "мільён"} ;
|
|
pot4 n = {s = n.s ++ scaleForm n.form "мільён" "мільёны" "мільёнаў"} ;
|
|
pot4plus n m = {s = (pot4 n).s ++ m.s} ;
|
|
pot4as5 n = n ;
|
|
pot4decimal d = {s = d.s ++ "мільёна"} ;
|
|
pot51 = {s = "мільярд"} ;
|
|
pot5 n = {s = n.s ++ scaleForm n.form "мільярд" "мільярды" "мільярдаў"} ;
|
|
pot5plus n m = {s = (pot5 n).s ++ m.s} ;
|
|
pot5decimal d = {s = d.s ++ "мільярда"} ;
|
|
|
|
IDig d = d ;
|
|
IIDig d ds = {s = d.s ++ BIND ++ ds.s} ;
|
|
|
|
D_0 = {s = "0"} ;
|
|
D_1 = {s = "1"} ;
|
|
D_2 = {s = "2"} ;
|
|
D_3 = {s = "3"} ;
|
|
D_4 = {s = "4"} ;
|
|
D_5 = {s = "5"} ;
|
|
D_6 = {s = "6"} ;
|
|
D_7 = {s = "7"} ;
|
|
D_8 = {s = "8"} ;
|
|
D_9 = {s = "9"} ;
|
|
|
|
PosDecimal d = d ;
|
|
NegDecimal d = {s = "-" ++ BIND ++ d.s} ;
|
|
IFrac d dig = {s = d.s ++ "." ++ BIND ++ dig.s} ;
|
|
|
|
oper
|
|
mkDigit : (unit, feminine, teen, ten, hundred : Str) -> NumForm -> {
|
|
s, fem, teen, ten, hundred : Str ;
|
|
form : NumForm
|
|
} = \unit,feminine,teen,ten,hundred,form -> {
|
|
s = unit ; fem = feminine ; teen = teen ; ten = ten ;
|
|
hundred = hundred ; form = form
|
|
} ;
|
|
|
|
mkNum : Str -> NumForm -> {s, fem, hundred : Str ; form : NumForm} =
|
|
\s,form -> {s = s ; fem = s ; hundred = [] ; form = form} ;
|
|
|
|
scaleForm : NumForm -> (one, few, many : Str) -> Str =
|
|
\form,one,few,many -> case form of {
|
|
One => one ;
|
|
Few => few ;
|
|
Many => many
|
|
} ;
|
|
|
|
param
|
|
NumForm = One | Few | Many ;
|
|
|
|
}
|