From f0685a3233f09cc7b74e60bb8460df3307316d83 Mon Sep 17 00:00:00 2001 From: Aarne Ranta Date: Sat, 4 Apr 2020 09:18:57 +0200 Subject: [PATCH] harmonized the lincats of Numeral and Det --- src/czech/CatCze.gf | 10 +++--- src/czech/NounCze.gf | 14 ++++---- src/czech/NumeralCze.gf | 63 +++++++++++++++++----------------- src/czech/ResCze.gf | 76 +++++++++++++++++++++++++---------------- 4 files changed, 90 insertions(+), 73 deletions(-) diff --git a/src/czech/CatCze.gf b/src/czech/CatCze.gf index 6808ba215..8dceb6a58 100644 --- a/src/czech/CatCze.gf +++ b/src/czech/CatCze.gf @@ -35,10 +35,10 @@ concrete CatCze of Cat = CN = ResCze.Noun ; -- {s : Number => Case => Str ; g : Gender} NP = {s,clit,prep : Case => Str ; a : Agr ; hasClit : Bool} ; ---- 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 - Num = {s : Gender => Case => Str ; n : NumSize} ; - Card = {s : Gender => Case => Str ; n : NumSize} ; + Num = {s : Gender => Case => Str ; size : NumSize} ; + Card = Determiner ; -- {s : Gender => Case => Str ; size : NumSize} ; Pron = PronForms ; Adv = {s : Str} ; @@ -63,8 +63,8 @@ concrete CatCze of Cat = A = \s -> s.msnom ; - lincat Numeral = {s : NumeralForms ; size : NumSize} ; - lincat Digits = {s:Str ; n : NumSize} ; + lincat Numeral = Determiner ; ---- should contain Ord as well + lincat Digits = {s:Str ; size : NumSize} ; } diff --git a/src/czech/NounCze.gf b/src/czech/NounCze.gf index 7e6bbb0a7..03d722cd4 100644 --- a/src/czech/NounCze.gf +++ b/src/czech/NounCze.gf @@ -6,8 +6,8 @@ concrete NounCze of Noun = lin DetCN det cn = { - s,prep,clit = \\c => det.s ! cn.g ! c ++ numSizeForm cn.s det.n c ; - a = numSizeAgr cn.g det.n P3 ; + s,prep,clit = \\c => det.s ! cn.g ! c ++ numSizeForm cn.s det.size c ; + a = numSizeAgr cn.g det.size P3 ; hasClit = False ; } ; @@ -18,14 +18,14 @@ lin } ; DetQuant quant num = { - s = \\g,c => num.s ! g ! c ++ quant.s ! g ! numSizeNumber num.n ! c ; - n = num.n + s = \\g,c => num.s ! g ! c ++ quant.s ! g ! numSizeNumber num.size ! c ; + size = num.size } ; DefArt = {s = \\_,_,_ => []} ; IndefArt = {s = \\_,_,_ => []} ; - NumPl = {s = \\_,_ => [] ; n = Num2_4} ; - NumSg = {s = \\_,_ => [] ; n = Num1} ; + NumPl = {s = \\_,_ => [] ; size = Num2_4} ; ---- size + NumSg = {s = \\_,_ => [] ; size = Num1} ; UsePron pron = { s = table { @@ -94,7 +94,7 @@ lin NumCard c = c ; NumDigits ds = ds ** {s = \\_,_ => ds.s} ; - NumNumeral nu = {s = numeralFormsDeterminer nu.s ; n = nu.size} ; ---- TODO: inflection of numerals + NumNumeral nu = nu ; } diff --git a/src/czech/NumeralCze.gf b/src/czech/NumeralCze.gf index 84313789d..370c6f9fb 100644 --- a/src/czech/NumeralCze.gf +++ b/src/czech/NumeralCze.gf @@ -11,8 +11,8 @@ concrete NumeralCze of Numeral = -- AR 2020-03-20 -oper LinNumeral = {s : NumeralForms ; size : NumSize} ; -oper LinDigit = {unit : NumeralForms ; teen, ten, hundred : Str ; size : NumSize} ; +oper LinNumeral = Determiner ; -- {s : NumeralForms ; size : NumSize} ; +oper LinDigit = {unit : Gender => Case => Str ; teen, ten, hundred : Str ; size : NumSize} ; lincat Digit = LinDigit ; lincat Sub10 = LinDigit ; @@ -21,30 +21,30 @@ lincat Sub100 = LinNumeral ; lincat Sub1000 = LinNumeral ; lincat Sub1000000 = LinNumeral ; -oper mkNum : NumeralForms -> Str -> Str -> Str -> NumSize -> LinDigit = - \dva, dvanast, dvadsat, dveste, sz -> { - unit = dva ; +oper mkNum : Determiner -> Str -> Str -> Str -> LinDigit = + \dva, dvanast, dvadsat, dveste -> { + unit = dva.s ; teen = dvanast + "náct" ; ten = dvadsat ; 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 -> - mkNum unit teenbase (tenbase + "cet") hundred Num2_4 ; + mkNum unit teenbase (tenbase + "cet") hundred ; oper mk5Num : Str -> Str -> Str -> Str -> LinDigit = \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 n2 = mk2Num twoNumeralForms "dva" "dva" ("dvě" ++ "stě") ; -lin n3 = mk2Num threeNumeralForms "tři" "tři" ("tři" ++ "sta") ; -lin n4 = mk2Num fourNumeralForms "čtr" "čtyři" ("čtyři" ++ "sta") ; +lin n2 = mk2Num twoNumeral "dva" "dva" ("dvě" ++ "stě") ; +lin n3 = mk2Num threeNumeral "tři" "tři" ("tři" ++ "sta") ; +lin n4 = mk2Num fourNumeral "čtr" "čtyři" ("čtyři" ++ "sta") ; lin n5 = mk5Num "pět" "pěti" "pat" "pa" ; lin n6 = mk5Num "šest" "šesti" "šest" "še" ; 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 pot01 = { - unit = oneNumeralForms ; hundred = "sto" ; ten = "deset" ; teen = "jedenáct" ; + unit = oneNumeral.s ; hundred = "sto" ; ten = "deset" ; teen = "jedenáct" ; size = Num1 } ; lin pot0 d = d ; @@ -64,7 +64,7 @@ lin pot1to19 d = bigNumeral d.teen ; lin pot0as1 n = {s = n.unit ; size = n.size} ; lin pot1 d = bigNumeral d.ten ; 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 } ; ---- 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 pot2 d = bigNumeral d.hundred ; 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 } ; 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 = { - 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 } ; @@ -94,25 +94,26 @@ oper mkTh : Str -> NumSize -> Str = \attr,size -> Num5 => attr ++ "tisíc" } ; +oper determinerStr : Determiner -> Str = \d -> d.s ! Masc Anim ! Nom ; -- -- Numerals as sequences of digits have a separate, simpler grammar - lincat Dig = {s:Str ; n : NumSize} ; + lincat Dig = {s:Str ; size : NumSize} ; 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_1 = { s = "1" ; n = Num1} ; - D_2 = { s = "2" ; n = Num2_4} ; - D_3 = { s = "3" ; n = Num2_4} ; - D_4 = { s = "4" ; n = Num2_4} ; - D_5 = { s = "5" ; n = Num5} ; - D_6 = { s = "6" ; n = Num5} ; - D_7 = { s = "7" ; n = Num5} ; - D_8 = { s = "8" ; n = Num5} ; - D_9 = { s = "9" ; n = Num5} ; + D_0 = { s = "0" ; size = Num1} ; ---- ?? + D_1 = { s = "1" ; size = Num1} ; + D_2 = { s = "2" ; size = Num2_4} ; + D_3 = { s = "3" ; size = Num2_4} ; + D_4 = { s = "4" ; size = Num2_4} ; + D_5 = { s = "5" ; size = Num5} ; + D_6 = { s = "6" ; size = Num5} ; + D_7 = { s = "7" ; size = Num5} ; + D_8 = { s = "8" ; size = Num5} ; + D_9 = { s = "9" ; size = Num5} ; } diff --git a/src/czech/ResCze.gf b/src/czech/ResCze.gf index 0d4471a40..c48794202 100644 --- a/src/czech/ResCze.gf +++ b/src/czech/ResCze.gf @@ -694,6 +694,11 @@ oper } + s } ; + Determiner : Type = { + s : Gender => Case => Str ; + size : NumSize + } ; + mkDemPronForms : Str -> DemPronForms = \t -> { msnom = t + "en" ; fsnom = t + "a" ; @@ -730,50 +735,61 @@ oper msins, fsins : Str } ; - numeralFormsDeterminer : NumeralForms -> (Gender => Case => Str) = - \nume -> + numeralFormsDeterminer : NumeralForms -> NumSize -> Determiner = + \nume,size -> let dem = nume ** {mpnom, fpnom, pgen, pdat, pins = nume.msnom} ; --- plural forms not used demAdj = dem ** {fsdat = dem.fsgen} ; adjAdj = adjFormsAdjective demAdj - in - \\g,c => adjAdj.s ! g ! Sg ! c ; - + in { + s = \\g,c => adjAdj.s ! g ! Sg ! c ; + size = size + } ; -- 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 - twoNumeralForms : NumeralForms = { - msnom = "dva" ; fsnom, nsnom, fsacc = "dvě" ; - msgen, fsgen, msloc = "dvou" ; - msdat, msins, fsins = "dvěma" - } ; + twoNumeral : Determiner = + let forms = { + msnom = "dva" ; fsnom, nsnom, fsacc = "dvě" ; + msgen, fsgen, msloc = "dvou" ; + msdat, msins, fsins = "dvěma" + } + in numeralFormsDeterminer forms Num2_4 ; - threeNumeralForms : NumeralForms = { - msnom, fsnom, nsnom, fsacc, msgen, fsgen = "tři" ; - msdat = "třem" ; - msloc = "třech" ; - msins,fsins = "třemi" ; - } ; + threeNumeral : Determiner = + let forms = { + msnom, fsnom, nsnom, fsacc, msgen, fsgen = "tři" ; + msdat = "třem" ; + msloc = "třech" ; + msins,fsins = "třemi" ; + } + in numeralFormsDeterminer forms Num2_4 ; - fourNumeralForms : NumeralForms = { - msnom, fsnom, nsnom, fsacc = "čtyři" ; - msgen, fsgen = "čtyř" ; - msdat = "čtyřem" ; - msloc = "čtyřech" ; - msins,fsins = "čtyřmi" ; - } ; + fourNumeral : Determiner = + let forms = { + msnom, fsnom, nsnom, fsacc = "čtyři" ; + msgen, fsgen = "čtyř" ; + msdat = "čtyřem" ; + msloc = "čtyřech" ; + msins,fsins = "čtyřmi" ; + } + in numeralFormsDeterminer forms Num2_4 ; -- for the numbers 5 upwards - regNumeralForms : Str -> Str -> NumeralForms = \pet,peti -> { - msnom,fsnom,nsnom = pet ; - msgen, fsgen, msdat, fsacc, msloc, msins, fsins = peti - } ; + regNumeral : Str -> Str -> Determiner = \pet,peti -> + let forms = { + msnom,fsnom,nsnom = pet ; + msgen, fsgen, msdat, fsacc, msloc, msins, fsins = peti + } + in numeralFormsDeterminer forms Num5 ; - invarNumeralForms : Str -> NumeralForms = \sto -> - regNumeralForms sto sto ; + invarDeterminer : Str -> NumSize -> Determiner = \sto,size -> + regNumeral sto sto ; + + invarNumeral : Str -> Determiner = \s -> invarDeterminer s Num5 ; -------------------------------- -- combining nouns with numerals