(May) Form Det with numerals (NumCard, NumDigits etc.)

This commit is contained in:
Inari Listenmaa
2020-09-01 17:51:49 +02:00
parent c79c113e01
commit e122aea3ad
5 changed files with 40 additions and 23 deletions

View File

@@ -64,7 +64,7 @@ concrete CatMay of Cat = CommonX ** open ResMay, Prelude in {
Det = ResMay.Determiner ; Det = ResMay.Determiner ;
Predet = SS ; Predet = SS ;
Quant = ResMay.Quant ; Quant = ResMay.Quant ;
Num = ResMay.CardNum ; Num = ResMay.Num ;
Ord = { Ord = {
s : Str ; -- AForm => Str ; -- Ord can came from AP and become AP again s : Str ; -- AForm => Str ; -- Ord can came from AP and become AP again
n : Number -- Ord can come from Num, which has inherent number n : Number -- Ord can come from Num, which has inherent number

View File

@@ -8,9 +8,13 @@ concrete NounMay of Noun = CatMay ** open ResMay, Prelude in {
-- : Det -> CN -> NP -- : Det -> CN -> NP
DetCN det cn = emptyNP ** { DetCN det cn = emptyNP ** {
s = \\poss => case det.poss of { s = \\poss =>
Bare => cn.s ! NF det.n poss ; det.pr
_ => cn.s ! NF det.n det.poss -- TODO check if this make sense -- TODO classifier is necessary if numeral comes after noun. See Mintz p. 298.
-- ++ if_then_Str (isNum det.n) "buah" [] -- TODO store classifier in CN
++ case det.poss of {
Bare => cn.s ! NF (toNum det.n) poss ;
_ => cn.s ! NF (toNum det.n) det.poss -- TODO check if this make sense
} ++ det.s ++ cn.heavyMod ; } ++ det.s ++ cn.heavyMod ;
} ; } ;
@@ -62,7 +66,8 @@ concrete NounMay of Noun = CatMay ** open ResMay, Prelude in {
-- : Quant -> Num -> Det ; -- : Quant -> Num -> Det ;
DetQuant quant num = quant ** { DetQuant quant num = quant ** {
s = quant.s ++ num.s ! Attrib ; pr = num.s ; -- if it's not a number or digit, num.s is empty
s = quant.s ;
n = num.n n = num.n
} ; } ;
@@ -79,16 +84,20 @@ concrete NounMay of Noun = CatMay ** open ResMay, Prelude in {
-- the inherent number. -- the inherent number.
NumSg = baseNum ; NumSg = baseNum ;
NumPl = baseNum ** {n = Pl} ; NumPl = baseNum ** {n = NoNum Pl} ;
-- : Card -> Num ; -- : Card -> Num ;
-- NumCard card = NumCard card = card ** {
n = IsNumber -- for the purposes of modifying a noun, this is singular
} ;
-- : Digits -> Card ; -- : Digits -> Card ;
-- NumDigits dig = NumDigits dig = {
s = dig.s ! NCard
} ;
-- : Numeral -> Card ; -- : Numeral -> Card ;
-- NumNumeral num NumNumeral num = num ;
{- {-
-- : AdN -> Card -> Card ; -- : AdN -> Card -> Card ;

View File

@@ -4,11 +4,11 @@ concrete NumeralMay of Numeral = CatMay [Numeral,Digits] **
open Prelude, ResMay in { open Prelude, ResMay in {
lincat lincat
Digit = CardOrdNum ; -- 2..9 Digit = OrdNum ; -- 2..9
Sub10, -- 1..9 Sub10, -- 1..9
Sub100, -- 1..99 Sub100, -- 1..99
Sub1000 = LinNumber ; -- 1..999 Sub1000 = LinNumber ; -- 1..999
Sub1000000 = CardOrdNum ; -- 1..999999 Sub1000000 = OrdNum ; -- 1..999999
oper oper
LinNumber : Type = { LinNumber : Type = {
@@ -17,6 +17,8 @@ concrete NumeralMay of Numeral = CatMay [Numeral,Digits] **
ord : Str ; ord : Str ;
} ; } ;
OrdNum : Type = CardOrdNum ** {n : Number} ;
lin lin
-- : Sub1000000 -> Numeral ; -- 123456 [coercion to top category] -- : Sub1000000 -> Numeral ; -- 123456 [coercion to top category]
num x = x ; num x = x ;
@@ -100,10 +102,10 @@ oper
ord = "ke" + s ; -- Works for all but number 1 ord = "ke" + s ; -- Works for all but number 1
} ; } ;
mkDigit : Str -> CardOrdNum = \s -> mkNum s ** {s=s} ; mkDigit : Str -> OrdNum = \s -> mkNum s ** {s=s} ;
-- Only for Digit -> Sub*: we won't run into 1 here. -- Only for Digit -> Sub*: we won't run into 1 here.
mkNum3 : (digit : CardOrdNum) -> (ten,unit : Str) -> LinNumber = \tiga,puluh,dua -> { mkNum3 : (digit : OrdNum) -> (ten,unit : Str) -> LinNumber = \tiga,puluh,dua -> {
n = Pl ; n = Pl ;
s = \\_ => tiga.s ++ puluh ++ dua ; s = \\_ => tiga.s ++ puluh ++ dua ;
ord = tiga.ord ++ puluh ++ dua ord = tiga.ord ++ puluh ++ dua

View File

@@ -104,13 +104,17 @@ param
CardOrd = NOrd | NCard ; CardOrd = NOrd | NCard ;
-- TODO see if this is needed NumType = NoNum Number | IsNumber ;
NumType = NoNum | IsDigit | IsNumber ;
oper oper
isNum : NumType -> Bool = \nt -> case nt of { isNum : NumType -> Bool = \nt -> case nt of {
NoNum => False ; NoNum _ => False ;
_ => True _ => True
} ;
toNum : NumType -> Number = \nt -> case nt of {
NoNum n => n ;
_ => Sg
} ; } ;
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Adjectives -- Adjectives

View File

@@ -66,19 +66,21 @@ oper
} ; } ;
Determiner : Type = Quant ** { Determiner : Type = Quant ** {
n : Number ; pr : Str ; -- prefix for numbers
-- numtype : NumType ; -- number as in "5" or "Sg/Pl", often makes a difference in lots of things n : NumType ; -- number as in 5 (noun in singular), Sg or Pl
} ; } ;
CardNum : Type = { CardNum : Type = {
s : Str ; s : Str ;
n : Number
} ; } ;
baseNum : CardNum = { Num : Type = CardNum ** {
n : NumType
} ;
baseNum : Num = {
s = [] ; s = [] ;
n = Sg ; n = NoNum Sg
numtype = NoNum
} ; } ;
CardOrdNum : Type = CardNum ** { CardOrdNum : Type = CardNum ** {