mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-05-27 17:08:54 -06:00
harmonized the lincats of Numeral and Det
This commit is contained in:
@@ -35,10 +35,10 @@ concrete CatCze of Cat =
|
|||||||
CN = ResCze.Noun ; -- {s : Number => Case => Str ; g : Gender}
|
CN = ResCze.Noun ; -- {s : Number => Case => Str ; g : Gender}
|
||||||
NP = {s,clit,prep : Case => Str ; a : Agr ; hasClit : Bool} ; ----
|
NP = {s,clit,prep : Case => Str ; a : Agr ; hasClit : Bool} ; ----
|
||||||
PN = {s : Case => Str ; g : Gender} ; ----
|
PN = {s : Case => Str ; g : Gender} ; ----
|
||||||
Det = {s : Gender => Case => Str ; n : NumSize} ;
|
Det = Determiner ; -- {s : Gender => Case => Str ; size : NumSize} ;
|
||||||
Quant = {s : Gender => Number => Case => Str} ; -- same as AP
|
Quant = {s : Gender => Number => Case => Str} ; -- same as AP
|
||||||
Num = {s : Gender => Case => Str ; n : NumSize} ;
|
Num = {s : Gender => Case => Str ; size : NumSize} ;
|
||||||
Card = {s : Gender => Case => Str ; n : NumSize} ;
|
Card = Determiner ; -- {s : Gender => Case => Str ; size : NumSize} ;
|
||||||
Pron = PronForms ;
|
Pron = PronForms ;
|
||||||
|
|
||||||
Adv = {s : Str} ;
|
Adv = {s : Str} ;
|
||||||
@@ -63,8 +63,8 @@ concrete CatCze of Cat =
|
|||||||
A = \s -> s.msnom ;
|
A = \s -> s.msnom ;
|
||||||
|
|
||||||
|
|
||||||
lincat Numeral = {s : NumeralForms ; size : NumSize} ;
|
lincat Numeral = Determiner ; ---- should contain Ord as well
|
||||||
lincat Digits = {s:Str ; n : NumSize} ;
|
lincat Digits = {s:Str ; size : NumSize} ;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ concrete NounCze of Noun =
|
|||||||
|
|
||||||
lin
|
lin
|
||||||
DetCN det cn = {
|
DetCN det cn = {
|
||||||
s,prep,clit = \\c => det.s ! cn.g ! c ++ numSizeForm cn.s det.n c ;
|
s,prep,clit = \\c => det.s ! cn.g ! c ++ numSizeForm cn.s det.size c ;
|
||||||
a = numSizeAgr cn.g det.n P3 ;
|
a = numSizeAgr cn.g det.size P3 ;
|
||||||
hasClit = False ;
|
hasClit = False ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@@ -18,14 +18,14 @@ lin
|
|||||||
} ;
|
} ;
|
||||||
|
|
||||||
DetQuant quant num = {
|
DetQuant quant num = {
|
||||||
s = \\g,c => num.s ! g ! c ++ quant.s ! g ! numSizeNumber num.n ! c ;
|
s = \\g,c => num.s ! g ! c ++ quant.s ! g ! numSizeNumber num.size ! c ;
|
||||||
n = num.n
|
size = num.size
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
DefArt = {s = \\_,_,_ => []} ;
|
DefArt = {s = \\_,_,_ => []} ;
|
||||||
IndefArt = {s = \\_,_,_ => []} ;
|
IndefArt = {s = \\_,_,_ => []} ;
|
||||||
NumPl = {s = \\_,_ => [] ; n = Num2_4} ;
|
NumPl = {s = \\_,_ => [] ; size = Num2_4} ; ---- size
|
||||||
NumSg = {s = \\_,_ => [] ; n = Num1} ;
|
NumSg = {s = \\_,_ => [] ; size = Num1} ;
|
||||||
|
|
||||||
UsePron pron = {
|
UsePron pron = {
|
||||||
s = table {
|
s = table {
|
||||||
@@ -94,7 +94,7 @@ lin
|
|||||||
|
|
||||||
NumCard c = c ;
|
NumCard c = c ;
|
||||||
NumDigits ds = ds ** {s = \\_,_ => ds.s} ;
|
NumDigits ds = ds ** {s = \\_,_ => ds.s} ;
|
||||||
NumNumeral nu = {s = numeralFormsDeterminer nu.s ; n = nu.size} ; ---- TODO: inflection of numerals
|
NumNumeral nu = nu ;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ concrete NumeralCze of Numeral =
|
|||||||
-- AR 2020-03-20
|
-- AR 2020-03-20
|
||||||
|
|
||||||
|
|
||||||
oper LinNumeral = {s : NumeralForms ; size : NumSize} ;
|
oper LinNumeral = Determiner ; -- {s : NumeralForms ; size : NumSize} ;
|
||||||
oper LinDigit = {unit : NumeralForms ; teen, ten, hundred : Str ; size : NumSize} ;
|
oper LinDigit = {unit : Gender => Case => Str ; teen, ten, hundred : Str ; size : NumSize} ;
|
||||||
|
|
||||||
lincat Digit = LinDigit ;
|
lincat Digit = LinDigit ;
|
||||||
lincat Sub10 = LinDigit ;
|
lincat Sub10 = LinDigit ;
|
||||||
@@ -21,30 +21,30 @@ lincat Sub100 = LinNumeral ;
|
|||||||
lincat Sub1000 = LinNumeral ;
|
lincat Sub1000 = LinNumeral ;
|
||||||
lincat Sub1000000 = LinNumeral ;
|
lincat Sub1000000 = LinNumeral ;
|
||||||
|
|
||||||
oper mkNum : NumeralForms -> Str -> Str -> Str -> NumSize -> LinDigit =
|
oper mkNum : Determiner -> Str -> Str -> Str -> LinDigit =
|
||||||
\dva, dvanast, dvadsat, dveste, sz -> {
|
\dva, dvanast, dvadsat, dveste -> {
|
||||||
unit = dva ;
|
unit = dva.s ;
|
||||||
teen = dvanast + "náct" ;
|
teen = dvanast + "náct" ;
|
||||||
ten = dvadsat ;
|
ten = dvadsat ;
|
||||||
hundred = dveste ;
|
hundred = dveste ;
|
||||||
size = sz
|
size = dva.size ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
oper mk2Num : NumeralForms -> Str -> Str -> Str -> LinDigit =
|
oper mk2Num : Determiner -> Str -> Str -> Str -> LinDigit =
|
||||||
\unit, teenbase, tenbase, hundred ->
|
\unit, teenbase, tenbase, hundred ->
|
||||||
mkNum unit teenbase (tenbase + "cet") hundred Num2_4 ;
|
mkNum unit teenbase (tenbase + "cet") hundred ;
|
||||||
|
|
||||||
oper mk5Num : Str -> Str -> Str -> Str -> LinDigit =
|
oper mk5Num : Str -> Str -> Str -> Str -> LinDigit =
|
||||||
\unit,uniti, teenbase, tenbase ->
|
\unit,uniti, teenbase, tenbase ->
|
||||||
mkNum (regNumeralForms unit uniti) teenbase (tenbase + "desát") (unit ++ "set") Num5 ;
|
mkNum (regNumeral unit uniti) teenbase (tenbase + "desát") (unit ++ "set") ;
|
||||||
|
|
||||||
oper bigNumeral : Str -> LinNumeral = \s -> {s = invarNumeralForms s ; size = Num5} ;
|
oper bigNumeral : Str -> LinNumeral = \s -> invarNumeral s ;
|
||||||
|
|
||||||
lin num x = x ;
|
lin num x = x ;
|
||||||
|
|
||||||
lin n2 = mk2Num twoNumeralForms "dva" "dva" ("dvě" ++ "stě") ;
|
lin n2 = mk2Num twoNumeral "dva" "dva" ("dvě" ++ "stě") ;
|
||||||
lin n3 = mk2Num threeNumeralForms "tři" "tři" ("tři" ++ "sta") ;
|
lin n3 = mk2Num threeNumeral "tři" "tři" ("tři" ++ "sta") ;
|
||||||
lin n4 = mk2Num fourNumeralForms "čtr" "čtyři" ("čtyři" ++ "sta") ;
|
lin n4 = mk2Num fourNumeral "čtr" "čtyři" ("čtyři" ++ "sta") ;
|
||||||
lin n5 = mk5Num "pět" "pěti" "pat" "pa" ;
|
lin n5 = mk5Num "pět" "pěti" "pat" "pa" ;
|
||||||
lin n6 = mk5Num "šest" "šesti" "šest" "še" ;
|
lin n6 = mk5Num "šest" "šesti" "šest" "še" ;
|
||||||
lin n7 = mk5Num "sedm" "sedmi" "sedm" "sedm";
|
lin n7 = mk5Num "sedm" "sedmi" "sedm" "sedm";
|
||||||
@@ -52,7 +52,7 @@ lin n8 = mk5Num "osm" "osmi" "osm" "osm";
|
|||||||
lin n9 = mk5Num "devět" "devíti" "devate" "deva" ;
|
lin n9 = mk5Num "devět" "devíti" "devate" "deva" ;
|
||||||
|
|
||||||
lin pot01 = {
|
lin pot01 = {
|
||||||
unit = oneNumeralForms ; hundred = "sto" ; ten = "deset" ; teen = "jedenáct" ;
|
unit = oneNumeral.s ; hundred = "sto" ; ten = "deset" ; teen = "jedenáct" ;
|
||||||
size = Num1
|
size = Num1
|
||||||
} ;
|
} ;
|
||||||
lin pot0 d = d ;
|
lin pot0 d = d ;
|
||||||
@@ -64,7 +64,7 @@ lin pot1to19 d = bigNumeral d.teen ;
|
|||||||
lin pot0as1 n = {s = n.unit ; size = n.size} ;
|
lin pot0as1 n = {s = n.unit ; size = n.size} ;
|
||||||
lin pot1 d = bigNumeral d.ten ;
|
lin pot1 d = bigNumeral d.ten ;
|
||||||
lin pot1plus d e = {
|
lin pot1plus d e = {
|
||||||
s = invarNumeralForms (d.ten ++ e.unit.msnom) ; ---- TODO inflection?
|
s = (invarNumeral (d.ten ++ determinerStr (e ** {s = e.unit}))).s ; ---- TODO inflection?
|
||||||
size = tfSize e.size
|
size = tfSize e.size
|
||||||
} ;
|
} ;
|
||||||
---- variants { d.s ! ten ++ e.s ! unit ; glue (glue (e.s ! unit) "a") (d.s ! ten)} ; size = tfSize e.size} ;
|
---- variants { d.s ! ten ++ e.s ! unit ; glue (glue (e.s ! unit) "a") (d.s ! ten)} ; size = tfSize e.size} ;
|
||||||
@@ -72,15 +72,15 @@ lin pot1plus d e = {
|
|||||||
lin pot1as2 n = n ;
|
lin pot1as2 n = n ;
|
||||||
lin pot2 d = bigNumeral d.hundred ;
|
lin pot2 d = bigNumeral d.hundred ;
|
||||||
lin pot2plus d e = {
|
lin pot2plus d e = {
|
||||||
s = invarNumeralForms (d.hundred ++ e.s.msnom) ; ---- TODO inflection?
|
s = (invarNumeral (d.hundred ++ determinerStr e)).s ; ---- TODO inflection?
|
||||||
size = tfSize e.size
|
size = tfSize e.size
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
lin pot2as3 n = n ;
|
lin pot2as3 n = n ;
|
||||||
lin pot3 n = bigNumeral (mkTh n.s.msnom n.size) ;
|
lin pot3 n = bigNumeral (mkTh (determinerStr n) n.size) ;
|
||||||
|
|
||||||
lin pot3plus n m = {
|
lin pot3plus n m = {
|
||||||
s = invarNumeralForms (mkTh n.s.msnom n.size ++ m.s.msnom) ; ---- TODO inflection?
|
s = (invarNumeral (mkTh (determinerStr n) n.size ++ determinerStr m)).s ; ---- TODO inflection?
|
||||||
size = tfSize m.size
|
size = tfSize m.size
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@@ -94,25 +94,26 @@ oper mkTh : Str -> NumSize -> Str = \attr,size ->
|
|||||||
Num5 => attr ++ "tisíc"
|
Num5 => attr ++ "tisíc"
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
oper determinerStr : Determiner -> Str = \d -> d.s ! Masc Anim ! Nom ;
|
||||||
|
|
||||||
|
|
||||||
-- -- Numerals as sequences of digits have a separate, simpler grammar
|
-- -- Numerals as sequences of digits have a separate, simpler grammar
|
||||||
lincat Dig = {s:Str ; n : NumSize} ;
|
lincat Dig = {s:Str ; size : NumSize} ;
|
||||||
|
|
||||||
lin
|
lin
|
||||||
IDig d = d ;
|
IDig d = d ;
|
||||||
|
|
||||||
IIDig d dd = {s = d.s ++ Predef.BIND ++ dd.s ; n = Num5} ; ---- leading zeros ??
|
IIDig d dd = {s = d.s ++ Predef.BIND ++ dd.s ; size = Num5} ; ---- leading zeros ??
|
||||||
|
|
||||||
D_0 = { s = "0" ; n = Num1} ; ---- ??
|
D_0 = { s = "0" ; size = Num1} ; ---- ??
|
||||||
D_1 = { s = "1" ; n = Num1} ;
|
D_1 = { s = "1" ; size = Num1} ;
|
||||||
D_2 = { s = "2" ; n = Num2_4} ;
|
D_2 = { s = "2" ; size = Num2_4} ;
|
||||||
D_3 = { s = "3" ; n = Num2_4} ;
|
D_3 = { s = "3" ; size = Num2_4} ;
|
||||||
D_4 = { s = "4" ; n = Num2_4} ;
|
D_4 = { s = "4" ; size = Num2_4} ;
|
||||||
D_5 = { s = "5" ; n = Num5} ;
|
D_5 = { s = "5" ; size = Num5} ;
|
||||||
D_6 = { s = "6" ; n = Num5} ;
|
D_6 = { s = "6" ; size = Num5} ;
|
||||||
D_7 = { s = "7" ; n = Num5} ;
|
D_7 = { s = "7" ; size = Num5} ;
|
||||||
D_8 = { s = "8" ; n = Num5} ;
|
D_8 = { s = "8" ; size = Num5} ;
|
||||||
D_9 = { s = "9" ; n = Num5} ;
|
D_9 = { s = "9" ; size = Num5} ;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -694,6 +694,11 @@ oper
|
|||||||
} + s
|
} + s
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
Determiner : Type = {
|
||||||
|
s : Gender => Case => Str ;
|
||||||
|
size : NumSize
|
||||||
|
} ;
|
||||||
|
|
||||||
mkDemPronForms : Str -> DemPronForms = \t -> {
|
mkDemPronForms : Str -> DemPronForms = \t -> {
|
||||||
msnom = t + "en" ;
|
msnom = t + "en" ;
|
||||||
fsnom = t + "a" ;
|
fsnom = t + "a" ;
|
||||||
@@ -730,50 +735,61 @@ oper
|
|||||||
msins, fsins : Str
|
msins, fsins : Str
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
numeralFormsDeterminer : NumeralForms -> (Gender => Case => Str) =
|
numeralFormsDeterminer : NumeralForms -> NumSize -> Determiner =
|
||||||
\nume ->
|
\nume,size ->
|
||||||
let
|
let
|
||||||
dem = nume **
|
dem = nume **
|
||||||
{mpnom, fpnom, pgen, pdat, pins = nume.msnom} ; --- plural forms not used
|
{mpnom, fpnom, pgen, pdat, pins = nume.msnom} ; --- plural forms not used
|
||||||
demAdj = dem ** {fsdat = dem.fsgen} ;
|
demAdj = dem ** {fsdat = dem.fsgen} ;
|
||||||
adjAdj = adjFormsAdjective demAdj
|
adjAdj = adjFormsAdjective demAdj
|
||||||
in
|
in {
|
||||||
\\g,c => adjAdj.s ! g ! Sg ! c ;
|
s = \\g,c => adjAdj.s ! g ! Sg ! c ;
|
||||||
|
size = size
|
||||||
|
} ;
|
||||||
|
|
||||||
-- example: number 1
|
-- example: number 1
|
||||||
oneNumeralForms : NumeralForms = mkDemPronForms "jed" ;
|
oneNumeral : Determiner = numeralFormsDeterminer (mkDemPronForms "jed") Num1 ;
|
||||||
|
|
||||||
-- numbers 2,3,4 ---- to check if everything comes out right with this type
|
-- numbers 2,3,4 ---- to check if everything comes out right with this type
|
||||||
twoNumeralForms : NumeralForms = {
|
twoNumeral : Determiner =
|
||||||
|
let forms = {
|
||||||
msnom = "dva" ; fsnom, nsnom, fsacc = "dvě" ;
|
msnom = "dva" ; fsnom, nsnom, fsacc = "dvě" ;
|
||||||
msgen, fsgen, msloc = "dvou" ;
|
msgen, fsgen, msloc = "dvou" ;
|
||||||
msdat, msins, fsins = "dvěma"
|
msdat, msins, fsins = "dvěma"
|
||||||
} ;
|
}
|
||||||
|
in numeralFormsDeterminer forms Num2_4 ;
|
||||||
|
|
||||||
threeNumeralForms : NumeralForms = {
|
threeNumeral : Determiner =
|
||||||
|
let forms = {
|
||||||
msnom, fsnom, nsnom, fsacc, msgen, fsgen = "tři" ;
|
msnom, fsnom, nsnom, fsacc, msgen, fsgen = "tři" ;
|
||||||
msdat = "třem" ;
|
msdat = "třem" ;
|
||||||
msloc = "třech" ;
|
msloc = "třech" ;
|
||||||
msins,fsins = "třemi" ;
|
msins,fsins = "třemi" ;
|
||||||
} ;
|
}
|
||||||
|
in numeralFormsDeterminer forms Num2_4 ;
|
||||||
|
|
||||||
fourNumeralForms : NumeralForms = {
|
fourNumeral : Determiner =
|
||||||
|
let forms = {
|
||||||
msnom, fsnom, nsnom, fsacc = "čtyři" ;
|
msnom, fsnom, nsnom, fsacc = "čtyři" ;
|
||||||
msgen, fsgen = "čtyř" ;
|
msgen, fsgen = "čtyř" ;
|
||||||
msdat = "čtyřem" ;
|
msdat = "čtyřem" ;
|
||||||
msloc = "čtyřech" ;
|
msloc = "čtyřech" ;
|
||||||
msins,fsins = "čtyřmi" ;
|
msins,fsins = "čtyřmi" ;
|
||||||
} ;
|
}
|
||||||
|
in numeralFormsDeterminer forms Num2_4 ;
|
||||||
|
|
||||||
-- for the numbers 5 upwards
|
-- for the numbers 5 upwards
|
||||||
regNumeralForms : Str -> Str -> NumeralForms = \pet,peti -> {
|
regNumeral : Str -> Str -> Determiner = \pet,peti ->
|
||||||
|
let forms = {
|
||||||
msnom,fsnom,nsnom = pet ;
|
msnom,fsnom,nsnom = pet ;
|
||||||
msgen, fsgen, msdat, fsacc, msloc, msins, fsins = peti
|
msgen, fsgen, msdat, fsacc, msloc, msins, fsins = peti
|
||||||
} ;
|
}
|
||||||
|
in numeralFormsDeterminer forms Num5 ;
|
||||||
|
|
||||||
invarNumeralForms : Str -> NumeralForms = \sto ->
|
invarDeterminer : Str -> NumSize -> Determiner = \sto,size ->
|
||||||
regNumeralForms sto sto ;
|
regNumeral sto sto ;
|
||||||
|
|
||||||
|
invarNumeral : Str -> Determiner = \s -> invarDeterminer s Num5 ;
|
||||||
|
|
||||||
--------------------------------
|
--------------------------------
|
||||||
-- combining nouns with numerals
|
-- combining nouns with numerals
|
||||||
|
|||||||
Reference in New Issue
Block a user