extended Numerals API. moved from the WordNet grammar

This commit is contained in:
Krasimir Angelov
2022-10-21 20:50:49 +02:00
parent 96f4543c4c
commit b066fb4d35
29 changed files with 351 additions and 69 deletions

View File

@@ -20,11 +20,13 @@
abstract Numeral = Cat [Numeral,Digits] ** { abstract Numeral = Cat [Numeral,Digits] ** {
cat cat
Digit ; -- 2..9 Digit ; -- 2..9
Sub10 ; -- 1..9 Sub10 ; -- 1..9
Sub100 ; -- 1..99 Sub100 ; -- 1..99
Sub1000 ; -- 1..999 Sub1000 ; -- 1..999
Sub1000000 ; -- 1..999999 Sub1000000 ; -- 1..999999
Sub1000000000 ; -- 1..999999999
Sub1000000000000 ; -- 1..999999999999
data data
num : Sub1000000 -> Numeral ; -- 123456 [coercion to top category] num : Sub1000000 -> Numeral ; -- 123456 [coercion to top category]
@@ -33,18 +35,36 @@ data
pot01 : Sub10 ; -- 1 pot01 : Sub10 ; -- 1
pot0 : Digit -> Sub10 ; -- d * 1 pot0 : Digit -> Sub10 ; -- d * 1
pot0as1 : Sub10 -> Sub100 ; -- coercion of 1..9
pot110 : Sub100 ; -- 10 pot110 : Sub100 ; -- 10
pot111 : Sub100 ; -- 11 pot111 : Sub100 ; -- 11
pot1to19 : Digit -> Sub100 ; -- 10 + d pot1to19 : Digit -> Sub100 ; -- 10 + d
pot0as1 : Sub10 -> Sub100 ; -- coercion of 1..9
pot1 : Digit -> Sub100 ; -- d * 10 pot1 : Digit -> Sub100 ; -- d * 10
pot1plus : Digit -> Sub10 -> Sub100 ; -- d * 10 + n pot1plus : Digit -> Sub10 -> Sub100 ; -- d * 10 + n
pot1as2 : Sub100 -> Sub1000 ; -- coercion of 1..99 pot1as2 : Sub100 -> Sub1000 ; -- coercion of 1..99
pot21 : Sub1000 ; -- a hundred instead of one hundred
pot2 : Sub10 -> Sub1000 ; -- m * 100 pot2 : Sub10 -> Sub1000 ; -- m * 100
pot2plus : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n pot2plus : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n
pot2as3 : Sub1000 -> Sub1000000 ; -- coercion of 1..999 pot2as3 : Sub1000 -> Sub1000000 ; -- coercion of 1..999
pot31 : Sub1000000 ; -- a thousand instead of one thousand
pot3 : Sub1000 -> Sub1000000 ; -- m * 1000 pot3 : Sub1000 -> Sub1000000 ; -- m * 1000
pot3plus : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n pot3plus : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n
pot3as4 : Sub1000000 -> Sub1000000000 ; -- coercion of 1..999999
pot3float : Float -> Sub1000000 ; -- 3.5 thousand
pot41 : Sub1000000000 ; -- a million instead of one million
pot4 : Sub1000 -> Sub1000000000 ; -- m * 1000000000
pot4plus : Sub1000 -> Sub1000000 -> Sub1000000000 ; -- m * 1000000000 + n
pot4as5 : Sub1000000000 -> Sub1000000000000 ; -- coercion of 1..999999999
pot4float : Float -> Sub1000000000 ; -- 3.5 million
pot51 : Sub1000000000000 ; -- a billion instead of one billion
pot5 : Sub1000 -> Sub1000000000000 ; -- m * 1000000000
pot5plus : Sub1000 -> Sub1000000000 -> Sub1000000000000 ; -- m * 1000000000 + n
pot5float : Float -> Sub1000000000000 ; -- 3.5 billion
-- Numerals as sequences of digits have a separate, simpler grammar -- Numerals as sequences of digits have a separate, simpler grammar

View File

@@ -7,7 +7,7 @@ flags optimize = all_subs ;
lincat lincat
Digit = {s : DForm => CardOrd => Str ; en : Str} ; Digit = {s : DForm => CardOrd => Str ; en : Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ;
Sub100, Sub1000, Sub1000000 = Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{s : CardOrd => Str ; n : Number ; attr : Str} ; {s : CardOrd => Str ; n : Number ; attr : Str} ;
lin lin
@@ -50,6 +50,8 @@ lin
pot3plus n m = pot3plus n m =
addAttr {s = \\g => n.attr ++ "duisend" ++ m.s ! g ; n = Pl} ; addAttr {s = \\g => n.attr ++ "duisend" ++ m.s ! g ; n = Pl} ;
pot3as4 n = n ;
pot4as5 n = n ;
lincat lincat
Dig = TDigit ; Dig = TDigit ;

View File

@@ -323,8 +323,8 @@ concrete ExtraGrc of ExtraGrcAbs = CatGrc, NumeralGrc[Sub1000000,tenthousand] **
Sub10000 = {s : CardOrd => Str ; n : Number} ; -- TODO: constructors Sub10000 = {s : CardOrd => Str ; n : Number} ; -- TODO: constructors
lin -- d * 10000 lin -- d * 10000
pot4 d = { s = \\f => d.s ! NAdv ++ (tenthousand ! f) ; n = Pl } ; pot3X d = { s = \\f => d.s ! NAdv ++ (tenthousand ! f) ; n = Pl } ;
pot4plus d m = { pot3Xplus d m = {
s = \\f => d.s ! NAdv ++ tenthousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ; s = \\f => d.s ! NAdv ++ tenthousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ;

View File

@@ -153,8 +153,8 @@ abstract ExtraGrcAbs = Extra, Numeral[Sub1000000] ** {
Sub10000 ; -- 1..9999 Sub10000 ; -- 1..9999
data data
pot4 : Sub10000 -> Sub1000000 ; -- m * 10000 pot3X : Sub10000 -> Sub1000000 ; -- m * 10000
pot4plus : Sub10000 -> Sub10000 -> Sub1000000 ; -- m * 10000 + n pot3Xplus : Sub10000 -> Sub10000 -> Sub1000000 ; -- m * 10000 + n
-- Conjunctions: -- Conjunctions:

View File

@@ -5,9 +5,11 @@ concrete NumeralGrc of Numeral = CatGrc ** open ResGrc, MorphoGrc in {
lincat lincat
Digit = {s : DForm => CardOrd => Str} ; Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
@@ -52,6 +54,8 @@ lin -- mkDigit d (d+10) (d*10) d-th d-times
pot3plus d m = { pot3plus d m = {
s = \\f => d.s ! NAdv ++ thousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ; s = \\f => d.s ! NAdv ++ thousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ;
pot3as4 n = n ;
pot4as5 n = n ;
-- numerals as sequences of digits -- numerals as sequences of digits

View File

@@ -121,9 +121,9 @@ incomplete resource Constructors = open Grammar in { --%
mkText : QS -> Text -- Did she sleep? mkText : QS -> Text -- Did she sleep?
= \q -> TQuestMark (PhrUtt NoPConj (UttQS q) NoVoc) TEmpty ; --% = \q -> TQuestMark (PhrUtt NoPConj (UttQS q) NoVoc) TEmpty ; --%
mkText : (Pol) -> Imp -> Text -- Don't sleep! mkText : (Pol) -> Imp -> Text -- Don't sleep!
= \p,i -> TExclMark (PhrUtt NoPConj (UttImpSg p i) NoVoc) TEmpty; --% = \p,i -> TExclMark (PhrUtt NoPConj (UttImpSg p i) NoVoc) TEmpty ; --%
mkText : Imp -> Text -- Sleep! --% mkText : Imp -> Text -- Sleep! --%
= \i -> TExclMark (PhrUtt NoPConj (UttImpSg PPos i) NoVoc) TEmpty; --% = \i -> TExclMark (PhrUtt NoPConj (UttImpSg PPos i) NoVoc) TEmpty ; --%
-- Finally, two texts can be combined into a text. -- Finally, two texts can be combined into a text.
@@ -374,11 +374,11 @@ incomplete resource Constructors = open Grammar in { --%
mkCl = overload { mkCl = overload {
mkCl : NP -> V -> Cl -- she sleeps mkCl : NP -> V -> Cl -- she sleeps
= \s,v -> PredVP s (UseV v); --% = \s,v -> PredVP s (UseV v) ; --%
mkCl : NP -> V2 -> NP -> Cl -- she loves him mkCl : NP -> V2 -> NP -> Cl -- she loves him
= \s,v,o -> PredVP s (ComplV2 v o); --% = \s,v,o -> PredVP s (ComplV2 v o) ; --%
mkCl : NP -> V3 -> NP -> NP -> Cl -- she sends it to him mkCl : NP -> V3 -> NP -> NP -> Cl -- she sends it to him
= \s,v,o,i -> PredVP s (ComplV3 v o i); --% = \s,v,o,i -> PredVP s (ComplV3 v o i) ; --%
mkCl : NP -> VV -> VP -> Cl -- she wants to sleep mkCl : NP -> VV -> VP -> Cl -- she wants to sleep
= \s,v,vp -> PredVP s (ComplVV v vp) ; --% = \s,v,vp -> PredVP s (ComplVV v vp) ; --%
mkCl : NP -> VS -> S -> Cl -- she says that she sleeps mkCl : NP -> VS -> S -> Cl -- she says that she sleeps
@@ -1006,9 +1006,9 @@ incomplete resource Constructors = open Grammar in { --%
mkCN : A -> N -> CN -- big house mkCN : A -> N -> CN -- big house
= \x,y -> AdjCN (PositA x) (UseN y); --% = \x,y -> AdjCN (PositA x) (UseN y) ; --%
mkCN : A -> CN -> CN -- big blue house mkCN : A -> CN -> CN -- big blue house
= \x,y -> AdjCN (PositA x) y; --% = \x,y -> AdjCN (PositA x) y ; --%
mkCN : AP -> N -> CN -- very big house mkCN : AP -> N -> CN -- very big house
= \x,y -> AdjCN x (UseN y) ; --% = \x,y -> AdjCN x (UseN y) ; --%
mkCN : AP -> CN -> CN -- very big blue house mkCN : AP -> CN -> CN -- very big blue house
@@ -1211,11 +1211,11 @@ incomplete resource Constructors = open Grammar in { --%
mkQCl : IP -> VP -> QCl -- who sleeps --: mkQCl : IP -> VP -> QCl -- who sleeps --:
= QuestVP ; --% = QuestVP ; --%
mkQCl : IP -> V -> QCl -- who sleeps mkQCl : IP -> V -> QCl -- who sleeps
= \s,v -> QuestVP s (UseV v); --% = \s,v -> QuestVP s (UseV v) ; --%
mkQCl : IP -> V2 -> NP -> QCl -- who loves her mkQCl : IP -> V2 -> NP -> QCl -- who loves her
= \s,v,o -> QuestVP s (ComplV2 v o); --% = \s,v,o -> QuestVP s (ComplV2 v o) ; --%
mkQCl : IP -> V3 -> NP -> NP -> QCl -- who sends it to her mkQCl : IP -> V3 -> NP -> NP -> QCl -- who sends it to her
= \s,v,o,i -> QuestVP s (ComplV3 v o i); --% = \s,v,o,i -> QuestVP s (ComplV3 v o i) ; --%
mkQCl : IP -> VV -> VP -> QCl -- who wants to sleep mkQCl : IP -> VV -> VP -> QCl -- who wants to sleep
= \s,v,vp -> QuestVP s (ComplVV v vp) ; --% = \s,v,vp -> QuestVP s (ComplVV v vp) ; --%
mkQCl : IP -> VS -> S -> QCl -- who says that she sleeps mkQCl : IP -> VS -> S -> QCl -- who says that she sleeps
@@ -1408,11 +1408,11 @@ incomplete resource Constructors = open Grammar in { --%
= RelVP ; --% = RelVP ; --%
mkRCl : RP -> V -> RCl -- who sleeps mkRCl : RP -> V -> RCl -- who sleeps
= \s,v -> RelVP s (UseV v); --% = \s,v -> RelVP s (UseV v) ; --%
mkRCl : RP -> V2 -> NP -> RCl -- who loves her mkRCl : RP -> V2 -> NP -> RCl -- who loves her
= \s,v,o -> RelVP s (ComplV2 v o); --% = \s,v,o -> RelVP s (ComplV2 v o) ; --%
mkRCl : RP -> V3 -> NP -> NP -> RCl -- who sends it to her mkRCl : RP -> V3 -> NP -> NP -> RCl -- who sends it to her
= \s,v,o,i -> RelVP s (ComplV3 v o i); --% = \s,v,o,i -> RelVP s (ComplV3 v o i) ; --%
mkRCl : RP -> VV -> VP -> RCl -- who wants to sleep mkRCl : RP -> VV -> VP -> RCl -- who wants to sleep
= \s,v,vp -> RelVP s (ComplVV v vp) ; --% = \s,v,vp -> RelVP s (ComplVV v vp) ; --%
mkRCl : RP -> VS -> S -> RCl -- who says that she sleeps mkRCl : RP -> VS -> S -> RCl -- who says that she sleeps

View File

@@ -4,11 +4,13 @@ concrete NumeralBul of Numeral = CatBul [Numeral,Digits] ** open Prelude, ResBul
lincat lincat
Digit = {s : DForm => CardOrd => Str} ; Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str; n : Number} ; Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ; Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ; Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ; Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ;
Sub1000000000 = {s : CardOrd => NumF => Str; n : Number} ;
Sub1000000000000 = {s : CardOrd => NumF => Str; n : Number} ;
lin num x = {s = \\c => x.s ! c ! Formal; n=x.n} ; lin num x = {s = \\c => x.s ! c ! Formal; n=x.n} ;
lin n2 = mkDigit "два" "двама" "две" "втори" "двайсет" "двеста" "двестата" ; lin n2 = mkDigit "два" "двама" "две" "втори" "двайсет" "двеста" "двестата" ;
@@ -52,24 +54,33 @@ lin pot01 =
;n = Sg ;n = Sg
} ; } ;
lin pot0 d = d ** {n = Pl} ; lin pot0 d = d ** {n = Pl} ;
lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ;
lin pot110 = {s=\\c,nf => pot01.s ! ten nf ! c; n = Pl; i = True} ; lin pot110 = {s=\\c,nf => pot01.s ! ten nf ! c; n = Pl; i = True} ;
lin pot111 = {s=\\c,nf => pot01.s ! teen nf ! c; n = Pl; i = True} ; lin pot111 = {s=\\c,nf => pot01.s ! teen nf ! c; n = Pl; i = True} ;
lin pot1to19 d = {s = \\c,nf => d.s ! teen nf ! c; n = Pl; i = True} ; lin pot1to19 d = {s = \\c,nf => d.s ! teen nf ! c; n = Pl; i = True} ;
lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ;
lin pot1 d = {s = \\c,nf => d.s ! ten nf ! c; n = Pl; i = True} ; lin pot1 d = {s = \\c,nf => d.s ! ten nf ! c; n = Pl; i = True} ;
lin pot1plus d e = { lin pot1plus d e = {
s = \\c,nf => d.s ! ten nf ! NCard (CFMasc Indef NonHuman) ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ; s = \\c,nf => d.s ! ten nf ! NCard (CFMasc Indef NonHuman) ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ;
lin pot1as2 n = n ; lin pot1as2 n = n ;
lin pot21 = {
s = \\o,_ => mkCardOrd100 "сто" "стоте" "стотен" ! o ;
i = False ;
n = Pl
} ;
lin pot2 n = {s = \\c,nf => n.s ! hundred ! c; n = Pl; i = True} ; lin pot2 n = {s = \\c,nf => n.s ! hundred ! c; n = Pl; i = True} ;
lin pot2plus d e = { lin pot2plus d e = {
s = \\c,nf => d.s ! hundred ! NCard (CFMasc Indef NonHuman) ++ case e.i of {False => []; True => "и"} ++ e.s ! c ! nf ; s = \\c,nf => d.s ! hundred ! NCard (CFMasc Indef NonHuman) ++ case e.i of {False => []; True => "и"} ++ e.s ! c ! nf ;
n = Pl ; n = Pl ;
i = False i = False
} ; } ;
lin pot2as3 n = n ; lin pot2as3 n = n ;
lin pot31 = {
s = \\o,_ => mkCardOrd100 "хиляда" "хилядата" "хиляден" ! o ;
n = Pl
} ;
lin pot3 n = { lin pot3 n = {
s = \\c,nf => case n.n of { s = \\c,nf => case n.n of {
Sg => mkCardOrd100 "хиляда" "хилядата" "хиляден" ! c ; Sg => mkCardOrd100 "хиляда" "хилядата" "хиляден" ! c ;
@@ -85,7 +96,52 @@ lin pot3plus n m = {
++ case m.i of {False => []; True => "и"} ++ m.s ! c ! nf ; ++ case m.i of {False => []; True => "и"} ++ m.s ! c ! nf ;
n = Pl n = Pl
} ; } ;
lin pot3as4 n = n ;
lin pot3float f = {
s = \\c,nf => f.s ++ mkCardOrd100 "хиляди" "хилядите" "хиляден" ! c ;
n = Pl
} ;
lin pot41 = {
s = \\o,_ => mkCardOrd100 "милион" "милионите" "милионен" ! o ;
n = Pl
} ;
lin pot4 n = {
s = \\c,nf => case n.n of {
Sg => mkCardOrd100 "милион" "милионите" "милионен" ! c ;
Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "милиони" "милионите" "милионен" ! c
} ;
n = Pl
} ;
lin pot4plus n1 n2 = {
s = \\o,f => (pot4 n1).s ! o ! f ++ "и" ++ n2.s ! o ! f;
n = Pl
} ;
lin pot4as5 n = n ;
lin pot4float f = {
s = \\c,nf => f.s ++ mkCardOrd100 "милиона" "милиона" "милионен" ! c ;
n = Pl
} ;
lin pot51 = {
s = \\o,_ => mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! o ;
n = Pl
} ;
lin pot5 n = {
s = \\c,nf => case n.n of {
Sg => mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! c ;
Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! c
} ;
n = Pl
} ;
lin pot5plus n1 n2 = {
s = \\o,f => (pot5 n1).s ! o ! f ++ "и" ++ n2.s ! o ! f;
n = Pl
} ;
lin pot5float f = {
s = \\c,nf => f.s ++ mkCardOrd100 "милиярда" "милиярда" "милиярден" ! c ;
n = Pl
} ;
-- numerals as sequences of digits -- numerals as sequences of digits

View File

@@ -12,6 +12,8 @@ lincat
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
-- Auxiliaries -- Auxiliaries
@@ -125,7 +127,9 @@ lin
pot3plus n m = pot3plus n m =
{s= \\co => (table {Sg => []; Pl => (n.s ! co)} ! n.n) ++ "mil" ++ (m.s !co); {s= \\co => (table {Sg => []; Pl => (n.s ! co)} ! n.n) ++ "mil" ++ (m.s !co);
n= Pl} ; n= Pl} ;
pot3as4 n = n ;
pot4as5 n = n ;
param param
DForm = unit | teen | ten | tenplus | Aunit | OrdF ; DForm = unit | teen | ten | tenplus | Aunit | OrdF ;

View File

@@ -6,7 +6,7 @@ flags optimize = all_subs ;
lincat lincat
Digit = {s : DForm => CardOrd => Str ; en : Str} ; Digit = {s : DForm => CardOrd => Str ; en : Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ;
Sub100, Sub1000, Sub1000000 = Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{s : CardOrd => Str ; n : Number ; attr : Str} ; {s : CardOrd => Str ; n : Number ; attr : Str} ;
lin lin
@@ -49,6 +49,8 @@ lin
pot3plus n m = pot3plus n m =
addAttr {s = \\g => n.attr ++ "duizend" ++ m.s ! g ; n = Pl} ; addAttr {s = \\g => n.attr ++ "duizend" ++ m.s ! g ; n = Pl} ;
pot3as4 n = n ;
pot4as5 n = n ;
lincat lincat
Dig = TDigit ; Dig = TDigit ;

View File

@@ -4,8 +4,10 @@ lincat
Digit = {s : DForm => CardOrd => Case => Str} ; Digit = {s : DForm => CardOrd => Case => Str} ;
Sub10 = {s : DForm => CardOrd => Case => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Case => Str ; n : Number} ;
Sub100 = {s : CardOrd => Case => Str ; n : Number} ; Sub100 = {s : CardOrd => Case => Str ; n : Number} ;
Sub1000 = {s : Bool => CardOrd => Case => Str ; n : Number} ; Sub1000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
Sub1000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ; Sub1000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
Sub1000000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
Sub1000000000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in
@@ -25,22 +27,71 @@ lin n9 = mkNum "nine" "nineteen" "ninety" "ninth" ;
lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ; lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ;
lin pot0 d = d ** {n = Pl} ; lin pot0 d = d ** {n = Pl} ;
lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
lin pot110 = regCardOrd "ten" ** {n = Pl} ; lin pot110 = regCardOrd "ten" ** {n = Pl} ;
lin pot111 = regCardOrd "eleven" ** {n = Pl} ; lin pot111 = regCardOrd "eleven" ** {n = Pl} ;
lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ; lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ;
lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
lin pot1 d = {s = d.s ! ten} ** {n = Pl} ; lin pot1 d = {s = d.s ! ten} ** {n = Pl} ;
lin pot1plus d e = { lin pot1plus d e = {
s = \\o,c => d.s ! ten ! NCard ! Nom ++ BIND ++ "-" ++ BIND ++ e.s ! unit ! o ! c ; n = Pl} ; s = \\o,c => d.s ! ten ! NCard ! Nom ++ BIND ++ "-" ++ BIND ++ e.s ! unit ! o ! c ; n = Pl} ;
lin pot1as2 n = {s = \\_ => n.s; n=n.n} ; lin pot1as2 n = {s = \\_ => n.s; n=n.n} ;
lin pot21 = {
s = \\d,o,c => case d of {True => []; False => "a"} ++
(regCardOrd "hundred").s ! o ! c;
n = Pl
} ;
lin pot2 d = {s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ mkCard o "hundred" ! c} ** {n = Pl} ; lin pot2 d = {s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ mkCard o "hundred" ! c} ** {n = Pl} ;
lin pot2plus d e = { lin pot2plus d e = {
s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ "hundred" ++ "and" ++ e.s ! o ! c ; n = Pl} ; s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ "hundred" ++ "and" ++ e.s ! o ! c ; n = Pl} ;
lin pot2as3 n = n ; lin pot2as3 n = n ;
lin pot31 = {
s = \\d,o,c => case d of {True => []; False => "a"} ++
(regCardOrd "thousand").s ! o ! c;
n = Pl
} ;
lin pot3 n = { lin pot3 n = {
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ mkCard o "thousand" ! c ; n = Pl} ; s = \\d,o,c => n.s ! d ! NCard ! Nom ++ mkCard o "thousand" ! c ; n = Pl} ;
lin pot3plus n m = { lin pot3plus n m = {
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ "thousand" ++ m.s ! False ! o ! c; n = Pl} ; s = \\d,o,c => n.s ! d ! NCard ! Nom ++ "thousand" ++ m.s ! False ! o ! c; n = Pl} ;
lin pot3as4 n = n ;
lin pot3float f = {
s = \\d,o,c => f.s ++ mkCard o "thousand" ! c ; n = Pl} ;
lin pot41 = {
s = \\d,o,c => case d of {True => []; False => "a"} ++
(regCardOrd "million").s ! o ! c;
n = Pl
} ;
lin pot4 n = {
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ pot41.s ! True ! o ! c ;
n = Pl
} ;
lin pot4plus n1 n2 = {
s = \\d,o,c => n1.s ! d ! NCard ! Nom ++ pot41.s ! True ! NCard ! Nom ++ "and" ++ n2.s ! True ! o ! c;
n = Pl
} ;
lin pot4as5 n = n ;
lin pot4float f = {
s = \\d,o,c => f.s ++ pot41.s ! True ! o ! c ; n = Pl} ;
lin pot51 = {
s = \\d,o,c => case d of {True => []; False => "a"} ++
(regCardOrd "billion").s ! o ! c;
n = Pl
} ;
lin pot5 n = {
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ pot51.s ! True ! o ! c ;
n = Pl
} ;
lin pot5plus n1 n2 = {
s = \\d,o,c => n1.s ! d ! NCard ! Nom ++ pot51.s ! True ! NCard ! Nom ++ "and" ++ n2.s ! True ! o ! c;
n = Pl
} ;
lin pot5float f = {
s = \\d,o,c => f.s ++ pot51.s ! True ! o ! c ; n = Pl} ;
-- numerals as sequences of digits -- numerals as sequences of digits

View File

@@ -6,7 +6,7 @@ concrete NumeralEst of Numeral = CatEst [Numeral,Digits] ** open Prelude, Parad
flags optimize=all_subs ; coding=utf8; flags optimize=all_subs ; coding=utf8;
lincat lincat
Sub1000000 = {s : CardOrd => Str ; n : MorphoEst.Number} ; Sub1000000, Sub1000000000, Sub1000000000000 = {s : CardOrd => Str ; n : MorphoEst.Number} ;
Digit = {s : CardOrd => Str} ; Digit = {s : CardOrd => Str} ;
Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoEst.Number} ; Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoEst.Number} ;
@@ -65,6 +65,9 @@ lin
s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
} ; } ;
pot3as4 n = n ;
pot4as5 n = n ;
oper oper
co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> { co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> {
s = table { s = table {

View File

@@ -7,7 +7,7 @@ flags optimize = all_subs ;
coding=utf8 ; coding=utf8 ;
lincat lincat
Sub1000000 = {s : CardOrd => Str ; n : MorphoFin.Number} ; Sub1000000, Sub1000000000, Sub1000000000000 = {s : CardOrd => Str ; n : MorphoFin.Number} ;
Digit = {s : CardOrd => Str} ; Digit = {s : CardOrd => Str} ;
Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoFin.Number} ; Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoFin.Number} ;
@@ -44,21 +44,21 @@ lin
n = Sg n = Sg
} ; } ;
pot0 d = {n = Pl ; s = \\_ => d.s} ; pot0 d = {n = Pl ; s = \\_ => d.s} ;
pot0as1 n = n ;
pot110 = pot110 =
{s = \\_ => kymmenenN.s ; {s = \\_ => kymmenenN.s ;
n = Pl n = Pl
} ; } ;
pot111 = {n = Pl ; s = \\_,c => yksiN.s ! c ++ BIND ++ "toista"} ; ---- yhdes pot111 = {n = Pl ; s = \\_,c => yksiN.s ! c ++ BIND ++ "toista"} ; ---- yhdes
pot1to19 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ "toista"} ; pot1to19 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ "toista"} ;
pot0as1 n = n ;
pot1 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ kymmentaN.s ! c} ; pot1 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ kymmentaN.s ! c} ;
pot1plus d e = { pot1plus d e = {
n = Pl ; n = Pl ;
s = \\_,c => d.s ! c ++ BIND ++ kymmentaN.s ! c ++ BIND ++ e.s ! NumIndep ! c s = \\_,c => d.s ! c ++ BIND ++ kymmentaN.s ! c ++ BIND ++ e.s ! NumIndep ! c
} ; } ;
pot1as2 n = n ; pot1as2 n = n ;
pot2 d = {n = Pl ; s = \\_,c => d.s ! NumAttr ! c ++ nBIND d.n ++ sataaN.s ! d.n ! c} ; ---- pot2 d = {n = Pl ; s = \\_,c => d.s ! NumAttr ! c ++ nBIND d.n ++ sataaN.s ! d.n ! c} ; ----
pot2plus d e = { pot2plus d e = {
n = Pl ; n = Pl ;
@@ -66,11 +66,19 @@ lin
BIND ++ e.s ! NumIndep ! c BIND ++ e.s ! NumIndep ! c
} ; } ;
pot2as3 n = {n = n.n ; s = n.s ! NumIndep} ; pot2as3 n = {n = n.n ; s = n.s ! NumIndep} ;
pot3 d = {n = Pl ; s = \\c => d.s ! NumAttr ! c ++ nBIND d.n ++ tuhattaN.s ! d.n ! c} ; ---- pot3 d = {n = Pl ; s = \\c => d.s ! NumAttr ! c ++ nBIND d.n ++ tuhattaN.s ! d.n ! c} ; ----
pot3plus d e = { pot3plus d e = {
n = Pl ; n = Pl ;
s = \\c => d.s ! NumAttr ! c ++ nBIND d.n ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c s = \\c => d.s ! NumAttr ! c ++ nBIND d.n ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
} ; } ;
pot3as4 n = n ;
pot3float f = {n = Pl ; s = \\c => f.s ++ BIND ++ tuhattaN.s ! Pl ! c} ;
pot4as5 n = n ;
pot4float f = {n = Pl ; s = \\c => f.s ++ "miljoonaa"} ; -- KA: case inflection missing
pot51 = {n = Pl ; s = \\c => "miljardi"} ; -- KA: case inflection missing
oper oper
-- co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> { -- co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> {

View File

@@ -46,6 +46,8 @@ lincat
Sub100 = {s : CardOrd => Placement => Str ; n : Number} ; Sub100 = {s : CardOrd => Placement => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Placement => Str ; n : Number} ; Sub1000 = {s : CardOrd => Placement => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin num x0 = x0 ; lin num x0 = x0 ;
@@ -139,6 +141,9 @@ lin pot3plus n m =
{s = \\g => (n.s ! NCard Masc ! attr) ++ "mille" ++ m.s ! g ! postpo ; n = {s = \\g => (n.s ! NCard Masc ! attr) ++ "mille" ++ m.s ! g ! postpo ; n =
Pl} ; Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper hyphen = BIND ++ "-" ++ BIND ; oper hyphen = BIND ++ "-" ++ BIND ;

View File

@@ -6,7 +6,7 @@ flags optimize = all_subs ;
lincat lincat
Digit = {s : DForm => CardOrd => Str} ; Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100, Sub1000, Sub1000000 = Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{s : CardOrd => Str ; n : Number} ; {s : CardOrd => Str ; n : Number} ;
lin lin
@@ -29,23 +29,35 @@ lin
n = Sg n = Sg
} ; } ;
pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ; pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ;
pot0as1 n = {s = n.s ! DUnit; n = n.n } ;
pot110 = {s = cardReg "zehn"; n = Pl} ; pot110 = {s = cardReg "zehn"; n = Pl} ;
pot111 = {s = cardReg "elf"; n = Pl} ; pot111 = {s = cardReg "elf"; n = Pl} ;
pot1to19 d = {s = d.s ! DTeen; n = Pl} ; pot1to19 d = {s = d.s ! DTeen; n = Pl} ;
pot0as1 n = {s = n.s ! DUnit; n = n.n } ;
pot1 d = {s = d.s ! DTen; n = Pl} ; pot1 d = {s = d.s ! DTen; n = Pl} ;
pot1plus d e = {s = \\g => pot1plus d e = {s = \\g =>
e.s ! DUnit ! invNum ++ BIND ++ "und" ++ BIND ++ d.s ! DTen ! g; n = Pl} ; e.s ! DUnit ! invNum ++ BIND ++ "und" ++ BIND ++ d.s ! DTen ! g; n = Pl} ;
pot1as2 n = n ; pot1as2 n = n ;
pot2 d = {s = \\g => pot2 d = {s = \\g =>
multiple (d.s ! DUnit) d.n ++ cardOrd "hundert" "hunderte" ! g ; n = Pl} ; multiple (d.s ! DUnit) d.n ++ cardOrd "hundert" "hunderte" ! g ; n = Pl} ;
pot2plus d e = {s = \\g => pot2plus d e = {s = \\g =>
multiple (d.s ! DUnit) d.n ++ "hundert" ++ BIND ++ e.s ! g ; n = Pl} ; multiple (d.s ! DUnit) d.n ++ "hundert" ++ BIND ++ e.s ! g ; n = Pl} ;
pot2as3 n = n ; pot2as3 n = n ;
pot3 n = {s = \\g => pot3 n = {s = \\g =>
multiple n.s n.n ++ cardOrd "tausend" "tausendte" ! g ; n = Pl} ; ---- multiple n.s n.n ++ cardOrd "tausend" "tausendte" ! g ; n = Pl} ; ----
pot3plus n m = {s = \\g => pot3plus n m = {s = \\g =>
multiple n.s n.n ++ "tausend" ++ m.s ! g ; n = Pl} ; multiple n.s n.n ++ "tausend" ++ m.s ! g ; n = Pl} ;
pot3as4 n = n ;
pot3float f = {s = \\g =>
f.s ++ cardOrd "tausend" "tausendte" ! g ; n = Pl} ; ----
pot4as5 n = n ;
pot4float f = {s = \\g =>
f.s ++ cardOrd "Millionen" "Millionte" ! g ; n = Pl} ; ----
pot51 = {s = \\g => "einer Milliarde"; n = Pl} ; -- KA: case inflection missing
oper oper
multiple : (CardOrd => Str) -> Number -> Str = \d,n -> multiple : (CardOrd => Str) -> Number -> Str = \d,n ->

View File

@@ -6,9 +6,11 @@ concrete NumeralGre of Numeral = CatGre [Numeral,Digits] ** open ResGre,Prelude
lincat lincat
Digit = {s : DForm => CardOrd => Str} ; Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
@@ -59,6 +61,9 @@ lin pot3plus n m = {
Pl => Xilias co n.s n.n ++ cardOrdXiliaPl "χιλιάδες" "χιλιοστός" ! co ++ m.s ! co } Pl => Xilias co n.s n.n ++ cardOrdXiliaPl "χιλιάδες" "χιλιοστός" ! co ++ m.s ! co }
} ** {n = Pl} ; } ** {n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper oper

View File

@@ -7,6 +7,8 @@ lincat
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
@@ -72,6 +74,9 @@ lin pot3 n = spl (\\co => n.s ! NCard Masc ++ nBIND n.n ++
lin pot3plus n m = {s = \\g => n.s ! NCard Masc ++ nBIND n.n ++ mille ! n.n ++ "e" ++ m.s ! g ; n = Pl} ; lin pot3plus n m = {s = \\g => n.s ! NCard Masc ++ nBIND n.n ++ mille ! n.n ++ "e" ++ m.s ! g ; n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper oper
nBIND : Number -> Str = \n -> case n of {Sg => [] ; _ => BIND} ; -- no BIND after silent 1 nBIND : Number -> Str = \n -> case n of {Sg => [] ; _ => BIND} ; -- no BIND after silent 1

View File

@@ -6,7 +6,9 @@ lincat
Sub10, Sub10,
Sub100, Sub100,
Sub1000, Sub1000,
Sub1000000 = ResKor.Numeral ; Sub1000000,
Sub1000000000,
Sub1000000000000 = ResKor.Numeral ;
lin lin
-- : Sub1000000 -> Numeral ; -- 123456 [coercion to top category] -- : Sub1000000 -> Numeral ; -- 123456 [coercion to top category]
@@ -84,6 +86,9 @@ lin
-- : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n -- : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n
pot3plus m n = TODO ; pot3plus m n = TODO ;
pot3as4 x = x ;
pot4as5 x = x ;
oper oper
LinDigit : Type = ResKor.Numeral ** {isTwo : Bool ; ten : Str} ; LinDigit : Type = ResKor.Numeral ** {isTwo : Bool ; ten : Str} ;

View File

@@ -12,6 +12,8 @@ lincat
Sub100 = { s : CardOrd => Gender => Case => Str ; num : Number } ; Sub100 = { s : CardOrd => Gender => Case => Str ; num : Number } ;
Sub1000 = { s : CardOrd => Gender => Case => Str ; num : Number } ; Sub1000 = { s : CardOrd => Gender => Case => Str ; num : Number } ;
Sub1000000 = { s : CardOrd => Gender => Case => Str ; num : Number } ; Sub1000000 = { s : CardOrd => Gender => Case => Str ; num : Number } ;
Sub1000000000 = { s : CardOrd => Gender => Case => Str ; num : Number } ;
Sub1000000000000 = { s : CardOrd => Gender => Case => Str ; num : Number } ;
lin lin
@@ -80,6 +82,9 @@ lin
num = e.num num = e.num
} ; } ;
pot3as4 n = n ;
pot4as5 n = n ;
-- Numerals as sequences of digits: -- Numerals as sequences of digits:
lincat lincat

View File

@@ -63,6 +63,8 @@ concrete NumeralMlt of Numeral = CatMlt [Numeral,Digits] ** open Prelude,ResMlt
Sub100 = Form2 ; Sub100 = Form2 ;
Sub1000 = Form2 ; Sub1000 = Form2 ;
Sub1000000 = Form2 ; Sub1000000 = Form2 ;
Sub1000000000 = Form2 ;
Sub1000000000000 = Form2 ;
oper oper
@@ -335,6 +337,9 @@ concrete NumeralMlt of Numeral = CatMlt [Numeral,Digits] ** open Prelude,ResMlt
f = Hund ; -- NOT IMPORTANT f = Hund ; -- NOT IMPORTANT
} ; } ;
pot3as4 m = m ;
pot4as5 m = m ;
oper oper
-- Build "x thousand" table -- Build "x thousand" table
numTable : (CardOrd => NumCase => Str) = overload { numTable : (CardOrd => NumCase => Str) = overload {

View File

@@ -13,7 +13,7 @@ concrete NumeralPol of Numeral = CatPol [Numeral,Digits] ** open ResPol,Prelude,
Sub10 = { unit,hundred: Case * Gender => Str; Sub10 = { unit,hundred: Case * Gender => Str;
ounit,ohundred: AForm => Str; ounit,ohundred: AForm => Str;
a:Accom; n:Number }; -- 1..9 a:Accom; n:Number }; -- 1..9
Sub100, Sub1000, Sub1000000 = Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{ s:Case * Gender => Str; { s:Case * Gender => Str;
o:AForm => Str; o:AForm => Str;
a:Accom; n:Number }; a:Accom; n:Number };
@@ -513,7 +513,10 @@ n9 = { unit = table {
a = case s2.n of { Sg => TysiacA; _=> s2.a } ; a = case s2.n of { Sg => TysiacA; _=> s2.a } ;
n = Pl n = Pl
}; };
pot3as4 n = n ;
pot4as5 n = n ;
oper tysiac = table { oper tysiac = table {
<(Nom|Acc), Sg> => "tysiąc"; <(Nom|Acc), Sg> => "tysiąc";
<Gen, Sg> => "tysiąca"; <Gen, Sg> => "tysiąca";

View File

@@ -14,6 +14,8 @@ concrete NumeralPor of Numeral = CatPor [Numeral,Digits] **
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin lin
num x = x ; num x = x ;
@@ -111,6 +113,33 @@ concrete NumeralPor of Numeral = CatPor [Numeral,Digits] **
++ m.s ! co ; ++ m.s ! co ;
n = Pl} ; n = Pl} ;
pot3as4 n = n ;
pot4 n = {s = table CardOrd {co => n.s ! NCard Masc ++ milhao ! co } ; n = Pl} ;
pot4plus n m = {s = \\co => n.s ! NCard Masc
++ milhao ! co
++ e_CardOrd co ++ m.s ! co ;
n = Pl
} ;
pot21 = mkNum "cem" "centésimo" ;
pot31 = mkNum "mil" "milésimo" ;
-- cem, mil, but um milhão, um bilhão
pot41 = mkNum "um milhão" "milhonésimo" ;
pot4as5 n = n ;
oper
milhao : CardOrd => Str ;
milhao = mkNumStr "milhão" "milhonésimo" ;
mkNum : Str -> Str -> {s : CardOrd => Str ; n : Number} ;
mkNum cem centesimo = spl (mkNumStr cem centesimo) ;
oper oper
mkTal : (_,_,_,_,_,_,_ : Str) -> {s : DForm => CardOrd => Str} = mkTal : (_,_,_,_,_,_,_ : Str) -> {s : DForm => CardOrd => Str} =
\dois,doze,vinte,duzentos,segundo,vigesimo,duocentesimo -> \dois,doze,vinte,duzentos,segundo,vigesimo,duocentesimo ->

View File

@@ -11,6 +11,8 @@ lincat Sub10 = {s : CardOrd => DForm => Placement => Str ; size : Size} ;
lincat Sub100 = {s : CardOrd => NumF => Placement => Str ; size : Size} ; lincat Sub100 = {s : CardOrd => NumF => Placement => Str ; size : Size} ;
lincat Sub1000 = {s : CardOrd => NumF => Placement => Str ; size : Size } ; lincat Sub1000 = {s : CardOrd => NumF => Placement => Str ; size : Size } ;
lincat Sub1000000 = { s : CardOrd => NumF => Placement => Str; size : Size } ; lincat Sub1000000 = { s : CardOrd => NumF => Placement => Str; size : Size } ;
lincat Sub1000000000 = { s : CardOrd => NumF => Placement => Str; size : Size } ;
lincat Sub1000000000000 = { s : CardOrd => NumF => Placement => Str; size : Size } ;
@@ -196,6 +198,9 @@ lin pot3plus n m =
size = m.size size = m.size
}; };
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper mksute : Size -> Str = \sz -> table {sg => "sută" ; _ => "sute" } ! sz ; oper mksute : Size -> Str = \sz -> table {sg => "sută" ; _ => "sute" } ! sz ;
oper mkSute : Size -> Gender -> Str = \sz, g -> oper mkSute : Size -> Gender -> Str = \sz, g ->
table {sg => mkOrdinalForm "sută" g ; table {sg => mkOrdinalForm "sută" g ;

View File

@@ -21,6 +21,8 @@ lincat Sub10 = LinDigit ;
lincat Sub100 = LinNumeral ; lincat Sub100 = LinNumeral ;
lincat Sub1000 = LinNumeral ; lincat Sub1000 = LinNumeral ;
lincat Sub1000000 = LinNumeral ; lincat Sub1000000 = LinNumeral ;
lincat Sub1000000000 = LinNumeral ;
lincat Sub1000000000000 = LinNumeral ;
oper mkNum : Determiner -> Str -> Str -> Str -> LinDigit = oper mkNum : Determiner -> Str -> Str -> Str -> LinDigit =
\dva, dvanast, dvadsat, dveste -> { \dva, dvanast, dvadsat, dveste -> {
@@ -85,6 +87,9 @@ lin pot3plus n m = {
size = tfSize m.size size = tfSize m.size
} ; } ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper tfSize : NumSize -> NumSize = \sz -> oper tfSize : NumSize -> NumSize = \sz ->
table {Num1 => Num5 ; other => other} ! sz ; table {Num1 => Num5 ; other => other} ! sz ;

View File

@@ -1,11 +1,13 @@
concrete NumeralSlv of Numeral = CatSlv [Numeral,Digits] ** open Prelude, ResSlv in { concrete NumeralSlv of Numeral = CatSlv [Numeral,Digits] ** open Prelude, ResSlv in {
lincat lincat
Digit = {s : DForm => Case => Str; n : NumAgr} ; Digit = {s : DForm => Case => Str; n : NumAgr} ;
Sub10 = {s : Gender => Case => Str; h : Case => Str; e : Str; n : NumAgr} ; Sub10 = {s : Gender => Case => Str; h : Case => Str; e : Str; n : NumAgr} ;
Sub100 = {s : Gender => Case => Str; e : Str; n : NumAgr} ; Sub100 = {s : Gender => Case => Str; e : Str; n : NumAgr} ;
Sub1000 = {s : Gender => Case => Str; e : Str; n : NumAgr} ; Sub1000 = {s : Gender => Case => Str; e : Str; n : NumAgr} ;
Sub1000000 = {s : Gender => Case => Str; n : NumAgr} ; Sub1000000 = {s : Gender => Case => Str; n : NumAgr} ;
Sub1000000000 = {s : Gender => Case => Str; n : NumAgr} ;
Sub1000000000000 = {s : Gender => Case => Str; n : NumAgr} ;
lin num x = x ; lin num x = x ;
@@ -143,6 +145,9 @@ lin pot110 = {s=\\g => table {
n = UseGen n = UseGen
} ; } ;
pot3as4 x = x ;
pot4as5 x = x ;
oper mkDigit : (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Gender => Case => Str; oper mkDigit : (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Gender => Case => Str;
mkDigit nomMasc nomFem nomNeut accMasc accFem accNeut mkDigit nomMasc nomFem nomNeut accMasc accFem accNeut
genMasc genFem genNeut datMasc datFem datNeut genMasc genFem genNeut datMasc datFem datNeut

View File

@@ -37,7 +37,7 @@ lincat
where laba 'two' is a feminine noun in absolutive case and where laba 'two' is a feminine noun in absolutive case and
boqol 'hundred' is a masculine noun in genitive case. boqol 'hundred' is a masculine noun in genitive case.
Since laba is head, the whole nominal is feminine." -} Since laba is head, the whole nominal is feminine." -}
Sub10, Sub100, Sub1000, Sub1000000 = { Sub10, Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 = {
s : DForm => Str ; s : DForm => Str ;
thousand : Str ; -- TODO figure out if this really works so thousand : Str ; -- TODO figure out if this really works so
hasThousand : Bool ; hasThousand : Bool ;
@@ -128,6 +128,9 @@ lin pot3plus n m = n ** {
ord = n.ord ++ "kun iyo" ++ m.ord ; ord = n.ord ++ "kun iyo" ++ m.ord ;
n = Pl} ; n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
---------------------------------------------------------------------------- ----------------------------------------------------------------------------

View File

@@ -8,6 +8,8 @@ lincat
Sub100 = {s : CardOrd => Str ; n : Number} ; Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ; Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
@@ -66,6 +68,9 @@ lin pot2as3 n = n ;
lin pot3 n = spl (\\g => n.s ! NCard Masc ++ mil g) ; lin pot3 n = spl (\\g => n.s ! NCard Masc ++ mil g) ;
lin pot3plus n m = {s = \\g => n.s ! NCard Masc ++ mil g ++ m.s ! g ; n = Pl} ; lin pot3plus n m = {s = \\g => n.s ! NCard Masc ++ mil g ++ m.s ! g ; n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
oper oper
mkTal : (x1,_,_,_,_,_,_,x8 : Str) -> {s : DForm => CardOrd => Str} = mkTal : (x1,_,_,_,_,_,_,x8 : Str) -> {s : DForm => CardOrd => Str} =
\due,dodici,venti,ducento,secondo,dodicesimo,ventesimo,ducentesimo -> \due,dodici,venti,ducento,secondo,dodicesimo,ventesimo,ducentesimo ->

View File

@@ -4,9 +4,11 @@ open Prelude,DiffSwa,MorphoSwa in {
lincat lincat
Digit = {s : DForm => CardOrd => Gender => Str} ; Digit = {s : DForm => CardOrd => Gender => Str} ;
Sub10 = {s : DForm => CardOrd => Gender => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Gender => Str ; n : Number} ;
Sub100 = {s : CardOrd => Gender => Str ; n : Number} ; Sub100 = {s : CardOrd => Gender => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Gender => Str ; n : Number} ; Sub1000 = {s : CardOrd => Gender => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Gender => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Gender => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Gender => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Gender => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
lin n2 = mkNumn "ili" "ishirini" "pili" ; lin n2 = mkNumn "ili" "ishirini" "pili" ;
@@ -35,7 +37,7 @@ lin pot2plus d e = {s = table {
NCard => \\g => d.s ! hund ! NCard ! g ++ "na" ++ e.s !NCard ! g ; NCard => \\g => d.s ! hund ! NCard ! g ++ "na" ++ e.s !NCard ! g ;
NOrd => \\g =>Ordprefix g++ d.s ! hund ! NCard ! g ++ "na" ++ e.s ! NCard ! g } ; NOrd => \\g =>Ordprefix g++ d.s ! hund ! NCard ! g ++ "na" ++ e.s ! NCard ! g } ;
n = Pl} ; n = Pl} ;
lin pot2as3 n = n ; lin pot2as3 n = n ;
lin pot3 n = { s = table { lin pot3 n = { s = table {
NCard => \\g => mkCard NCard "elfu" ! g ++ n.s ! NCard ! g ; NCard => \\g => mkCard NCard "elfu" ! g ++ n.s ! NCard ! g ;
NOrd => \\g =>Ordprefix g++ mkCard NCard "elfu" ! g ++ n.s ! NCard ! g } ; NOrd => \\g =>Ordprefix g++ mkCard NCard "elfu" ! g ++ n.s ! NCard ! g } ;
@@ -45,6 +47,9 @@ lin pot3plus n m = { s = table {
NOrd => \\g =>Ordprefix g++ "elfu" ++ n.s ! NCard !g ++ m.s ! NCard ! g} ; NOrd => \\g =>Ordprefix g++ "elfu" ++ n.s ! NCard !g ++ m.s ! NCard ! g} ;
n = Pl} ; n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
-- numerals as sequences of digits0' -- numerals as sequences of digits0'
lincat lincat

View File

@@ -4,7 +4,7 @@ concrete NumeralSwe of Numeral = CatSwe [Numeral,Digits] ** open ResSwe, MorphoS
lincat lincat
Digit = {s : DForm => CardOrd => Str} ; Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100, Sub1000, Sub1000000 = Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{s : CardOrd => Str ; n : Number} ; {s : CardOrd => Str ; n : Number} ;
lin lin
@@ -27,24 +27,47 @@ lin
n = Sg n = Sg
} ; } ;
pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ; pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ;
pot0as1 n = {s = n.s ! ental ; n = n.n} ;
pot110 = numPl (cardReg "tio") ; pot110 = numPl (cardReg "tio") ;
pot111 = numPl (cardOrd "elva" "elfte") ; pot111 = numPl (cardOrd "elva" "elfte") ;
pot1to19 d = numPl (d.s ! ton) ; pot1to19 d = numPl (d.s ! ton) ;
pot0as1 n = {s = n.s ! ental ; n = n.n} ;
pot1 d = numPl (d.s ! tiotal) ; pot1 d = numPl (d.s ! tiotal) ;
pot1plus d e = {s = \\g => d.s ! tiotal ! invNum ++ BIND ++ e.s ! ental ! g ; n = Pl} ; pot1plus d e = {s = \\g => d.s ! tiotal ! invNum ++ BIND ++ e.s ! ental ! g ; n = Pl} ;
pot1as2 n = n ; pot1as2 n = n ;
pot21 = numPl (cardOrd "hundra" "hundrade") ;
pot2 d = pot2 d =
numPl (\\g => d.s ! ental ! invNum ++ BIND ++ cardOrd "hundra" "hundrade" ! g) ; numPl (\\g => d.s ! ental ! invNum ++ BIND ++ cardOrd "hundra" "hundrade" ! g) ;
pot2plus d e = pot2plus d e =
{s = \\g => d.s ! ental ! invNum ++ BIND ++ "hundra" ++ e.s ! g ; n = Pl} ; {s = \\g => d.s ! ental ! invNum ++ BIND ++ "hundra" ++ e.s ! g ; n = Pl} ;
pot2as3 n = n ; pot2as3 n = n ;
pot31 = numPl (cardOrd "tusen" "tusende") ;
pot3 n = pot3 n =
numPl (\\g => n.s ! invNum ++ cardOrd "tusen" "tusende" ! g) ; numPl (\\g => n.s ! invNum ++ cardOrd "tusen" "tusende" ! g) ;
pot3plus n m = pot3plus n m =
{s = \\g => n.s ! invNum ++ BIND ++ "tusen" ++ m.s ! g ; n = Pl} ; {s = \\g => n.s ! invNum ++ BIND ++ "tusen" ++ m.s ! g ; n = Pl} ;
pot3as4 n = n ;
lincat pot41 = numPl (cardOrd "miljon" "miljonde") ;
pot4 n =
numPl (\\g => n.s ! NCard Utr ++ cardOrd "miljon" "miljonde" ! g) ;
pot4plus n m =
{s = \\g => n.s ! NCard Utr ++ BIND ++ "miljon" ++ m.s ! g ; n = Pl} ;
pot4as5 n = n ;
pot4float f =
numPl (\\g => f.s ++ cardOrd "miljoner" "miljonde" ! g) ;
pot51 = numPl (cardOrd "miljard" "miljarde") ;
pot5 n =
numPl (\\g => n.s ! NCard Utr ++ cardOrd "miljard" "miljarde" ! g) ;
pot5plus n m =
{s = \\g => n.s ! NCard Utr ++ BIND ++ "miljard" ++ m.s ! g ; n = Pl} ;
pot5float f =
numPl (\\g => f.s ++ cardOrd "miljarder" "miljarde" ! g) ;
lincat
Dig = TDigit ; Dig = TDigit ;
lin lin

View File

@@ -8,9 +8,11 @@ flags
lincat lincat
Digit = {s : DForm => CardOrd => Number => Case => Str} ; Digit = {s : DForm => CardOrd => Number => Case => Str} ;
Sub10 = {s : DForm => CardOrd => Number => Case => Str ; n : Number ; blank : Str} ; -- the field blank is used to get rid of metavariables at parsing Sub10 = {s : DForm => CardOrd => Number => Case => Str ; n : Number ; blank : Str} ; -- the field blank is used to get rid of metavariables at parsing
Sub100 = {s : CardOrd => Number => Case => Str ; n : Number ; blank : Str} ; Sub100 = {s : CardOrd => Number => Case => Str ; n : Number ; blank : Str} ;
Sub1000 = {s : CardOrd => Number => Case => Str ; n : Number ; blank : Str} ; Sub1000 = {s : CardOrd => Number => Case => Str ; n : Number ; blank : Str} ;
Sub1000000 = {s : CardOrd => Number => Case => Str ; n : Number} ; Sub1000000 = {s : CardOrd => Number => Case => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Number => Case => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Number => Case => Str ; n : Number} ;
lin num x = x ; lin num x = x ;
@@ -48,6 +50,11 @@ lin pot3plus n m = {s = \\t,num,c => case n.n of {
Sg => n.blank ; Sg => n.blank ;
Pl => n.s ! NCard ! Sg !Nom Pl => n.s ! NCard ! Sg !Nom
} ++ "bin" ++ m.s ! t ! num ! c; n = Pl} ; } ++ "bin" ++ m.s ! t ! num ! c; n = Pl} ;
lin pot3as4 n = n ;
lin pot4as5 n = n ;
lincat lincat
Dig = {s : CardOrd => Number => Case => Str ; n : Number} ; Dig = {s : CardOrd => Number => Case => Str ; n : Number} ;
lin lin