forked from GitHub/gf-rgl
(Kor) Add numerals -- so far only up to 100
This commit is contained in:
@@ -94,13 +94,13 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in {
|
|||||||
NumPl = baseNum ** {n = Pl} ;
|
NumPl = baseNum ** {n = Pl} ;
|
||||||
|
|
||||||
-- : Card -> Num ;
|
-- : Card -> Num ;
|
||||||
-- NumCard card =
|
NumCard card = card ;
|
||||||
|
|
||||||
-- : Digits -> Card ;
|
-- : Digits -> Card ;
|
||||||
-- NumDigits dig =
|
-- NumDigits dig =
|
||||||
|
|
||||||
-- : Numeral -> Card ;
|
-- : Numeral -> Card ;
|
||||||
-- NumNumeral num
|
NumNumeral num = num ;
|
||||||
|
|
||||||
{-
|
{-
|
||||||
-- : AdN -> Card -> Card ;
|
-- : AdN -> Card -> Card ;
|
||||||
|
|||||||
@@ -1,4 +1,126 @@
|
|||||||
concrete NumeralKor of Numeral = CatKor [Numeral,Digits] **
|
concrete NumeralKor of Numeral = CatKor [Numeral,Digits] **
|
||||||
open Prelude, ResKor, ParamKor in {
|
open Prelude, ResKor in {
|
||||||
|
|
||||||
|
lincat
|
||||||
|
Digit = LinDigit ;
|
||||||
|
Sub10,
|
||||||
|
Sub100,
|
||||||
|
Sub1000,
|
||||||
|
Sub1000000 = ResKor.Numeral ;
|
||||||
|
|
||||||
|
lin
|
||||||
|
-- : Sub1000000 -> Numeral ; -- 123456 [coercion to top category]
|
||||||
|
num x = x ;
|
||||||
|
|
||||||
|
-- : Digit ;
|
||||||
|
n2 = mkNum4 "이" "둘" "두" "스물" ** {isTwo=True} ;
|
||||||
|
n3 = mkNum4 "삼" "셋" "세" "서른" ;
|
||||||
|
n4 = mkNum4 "사" "넷" "네" "마흔" ;
|
||||||
|
n5 = mkNum4 "오" "다섯" "다섯" "쉰" ;
|
||||||
|
n6 = mkNum2 "육" "여섯" ;
|
||||||
|
n7 = mkNum2 "칠" "일곱" ;
|
||||||
|
n8 = mkNum2 "팔" "여덟" ;
|
||||||
|
n9 = mkNum2 "구" "아홉" ;
|
||||||
|
|
||||||
|
-- : Sub10 ; -- 1
|
||||||
|
pot01 = mkNum4 "일" "하나" "한" "첫" ;
|
||||||
|
|
||||||
|
-- : Digit -> Sub10 ; -- d * 1
|
||||||
|
pot0 x = x ;
|
||||||
|
|
||||||
|
-- : Sub100 ; -- 10
|
||||||
|
pot110 = mkNum2 "십" "열" ;
|
||||||
|
|
||||||
|
-- : Sub100 ; -- 11
|
||||||
|
pot111 = mkNum4 "십일" "열하나" "열한" "십첫" ; -- TODO check
|
||||||
|
|
||||||
|
-- : Digit -> Sub100 ; -- 10 + d
|
||||||
|
pot1to19 d = let newS = xPlus "십" "열" d.s in d ** {
|
||||||
|
s = newS ;
|
||||||
|
n = Pl ;
|
||||||
|
ord = newS ! NK ! Attrib ++ "번째" ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- : Sub10 -> Sub100 ; -- coercion of 1..9
|
||||||
|
pot0as1 x = x ;
|
||||||
|
|
||||||
|
-- : Digit -> Sub100 ; -- d * 10
|
||||||
|
pot1 d = let sk = potTimes "십" "열" d in sk ** {
|
||||||
|
s = table {
|
||||||
|
SK => sk.s ! SK ;
|
||||||
|
NK => case d.isTwo of {
|
||||||
|
True => table {Attrib => "스무" ; Indep => "스물"} ;
|
||||||
|
False => table {_ => d.ten}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- : Digit -> Sub10 -> Sub100 ; -- d * 10 + n
|
||||||
|
pot1plus d n =
|
||||||
|
let dx10 = pot1 d ;
|
||||||
|
tenSK = glue (dx10.s ! SK ! Indep) "십" ;
|
||||||
|
tenNK = d.ten ;
|
||||||
|
newS = xPlus tenSK tenNK n.s
|
||||||
|
in dx10 ** {
|
||||||
|
s = newS ;
|
||||||
|
ord = newS ! NK ! Attrib ++ "번째" ; -- TODO check
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- : Sub100 -> Sub1000 ; -- coercion of 1..99
|
||||||
|
pot1as2 x = x ;
|
||||||
|
|
||||||
|
-- : Sub10 -> Sub1000 ; -- m * 100
|
||||||
|
pot2 = potTimes "백" "백" ;
|
||||||
|
|
||||||
|
-- : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n
|
||||||
|
pot2plus m n = TODO ;
|
||||||
|
|
||||||
|
-- : Sub1000 -> Sub1000000 ; -- coercion of 1..999
|
||||||
|
pot2as3 x = x ;
|
||||||
|
|
||||||
|
-- : Sub1000 -> Sub1000000 ; -- m * 1000
|
||||||
|
pot3 m = TODO ;
|
||||||
|
|
||||||
|
-- : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n
|
||||||
|
pot3plus m n = TODO ;
|
||||||
|
|
||||||
|
|
||||||
|
oper
|
||||||
|
LinDigit : Type = ResKor.Numeral ** {isTwo : Bool ; ten : Str} ;
|
||||||
|
|
||||||
|
mkNum2 : (sk, nk : Str) -> LinDigit =
|
||||||
|
\sk,nk -> mkNum5 sk nk nk nk (sk+"십") ; -- Digits >5: no NK form for d*10
|
||||||
|
|
||||||
|
mkNum4 : (x1,_,_,x4 : Str) -> LinDigit =
|
||||||
|
\sk,nk,ord,ten -> mkNum5 sk nk ord ord ten ; -- Digits >4: NK attrib==indep
|
||||||
|
|
||||||
|
mkNum5 : (x1,_,_,_,x5 : Str) -> LinDigit = \sk,nk,nkAttr,ord,ten -> {
|
||||||
|
s = table {
|
||||||
|
SK => \\_ => sk ;
|
||||||
|
NK => table {Indep => nk ; _ => nkAttr }
|
||||||
|
} ;
|
||||||
|
n = Pl ;
|
||||||
|
numtype = IsNum ;
|
||||||
|
isTwo = False ;
|
||||||
|
ten = ten ;
|
||||||
|
ord = ord ++ "번째" ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
NumForm : Type = NumOrigin => DForm => Str ;
|
||||||
|
|
||||||
|
xTimes : (tenSK, tenNK : Str) -> NumForm -> NumForm = \sk,nk,tbl ->
|
||||||
|
table {SK => \\df => glue (tbl ! SK ! df) sk ;
|
||||||
|
NK => \\df => glue (tbl ! NK ! Indep) nk } ;
|
||||||
|
xPlus : (tenSK, tenNK : Str) -> NumForm -> NumForm = \sk,nk,tbl ->
|
||||||
|
table {SK => \\df => glue sk (tbl ! SK ! df) ;
|
||||||
|
NK => \\df => glue nk (tbl ! NK ! df) } ;
|
||||||
|
|
||||||
|
potTimes : (sk,nk : Str) -> ResKor.Numeral -> ResKor.Numeral = \sk,nk,num ->
|
||||||
|
let newS = xTimes sk nk num.s in num ** {
|
||||||
|
s = newS ;
|
||||||
|
n = Pl ;
|
||||||
|
ord = newS ! NK ! Attrib ++ "번째" ; -- TODO check
|
||||||
|
} ;
|
||||||
|
|
||||||
|
TODO : ResKor.Numeral = mkNum2 "TODO" "TODO" ;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user