From 4282523f2fa3592fe336471777686d9a85a4de6a Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Mon, 1 Jun 2026 07:48:41 +0200 Subject: [PATCH] added ordinal numbers --- src/faroese/CatFao.gf | 5 +- src/faroese/NounFao.gf | 8 +- src/faroese/NumeralFao.gf | 337 ++++++++++++++++++++++++++++++-------- src/faroese/ResFao.gf | 3 + 4 files changed, 280 insertions(+), 73 deletions(-) diff --git a/src/faroese/CatFao.gf b/src/faroese/CatFao.gf index 86d859ab..d5398460 100644 --- a/src/faroese/CatFao.gf +++ b/src/faroese/CatFao.gf @@ -38,7 +38,10 @@ lincat ACard = {s : Str} ; lincat Ord = {s : Gender => Number => Case => Str} ; lincat DAP = {s : Gender => Case => Str ; n : Number ; sp : Species} ; lincat S = {s : Str} ; -lincat Numeral = {s : Gender => Case => Str ; n : Number} ; +lincat Numeral = { + s : CardOrd => Gender => Case => Str ; + n : Number + } ; lincat Digits = {s : Str ; n : Number} ; lincat Decimal = {s : Str ; n : Number ; hasDot : Bool} ; lincat Conj = {s : Str} ; diff --git a/src/faroese/NounFao.gf b/src/faroese/NounFao.gf index 6bd1bcc8..258f8069 100644 --- a/src/faroese/NounFao.gf +++ b/src/faroese/NounFao.gf @@ -88,13 +88,13 @@ lin NumCard card = card ** {hasCard = True} ; NumDigits digits = {s = \\_,_ => digits.s ; n = Pl} ; NumDecimal dec = {s = \\_,_ => dec.s ; n = Pl} ; - NumNumeral numeral = numeral ; + NumNumeral numeral = {s=numeral.s ! NCard; n=numeral.n} ; AdNum adn card = {s = \\g,c => adn.s ++ card.s ! g ! c ; n = card.n} ; - OrdDigits digits = {s = \\_,_,_ => digits.s} ; - OrdNumeral numeral = {s = \\g,_,c => numeral.s ! g ! c} ; + OrdDigits digits = {s = \\_,_,_ => digits.s ++ BIND ++ "."} ; + OrdNumeral numeral = {s = \\g,n,c => numeral.s ! NOrd n ! g ! c} ; OrdSuperl a = {s = a.s} ; OrdNumeralSuperl numeral a = { - s = \\g,n,c => numeral.s ! g ! c ++ a.s ! g ! n ! c + s = \\g,n,c => numeral.s ! NOrd n ! g ! c ++ a.s ! g ! n ! c } ; MassNP cn = { s = \\c => cn.s ! Indef ! Sg ! c ; diff --git a/src/faroese/NumeralFao.gf b/src/faroese/NumeralFao.gf index 86d547b5..2fb91616 100644 --- a/src/faroese/NumeralFao.gf +++ b/src/faroese/NumeralFao.gf @@ -1,80 +1,241 @@ concrete NumeralFao of Numeral = CatFao [Numeral, Digits, Decimal] ** open Prelude, ResFao in { lincat - Digit = {s : Gender => Case => Str ; n : Number ; teen : Str ; ten : Str} ; - Sub10, Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 = - {s : Gender => Case => Str ; n : Number} ; + Digit = { + s,teen,ten : CardOrd => Gender => Case => Str ; + n : Number ; + } ; + Sub10 = { + s : CardOrd => Gender => Case => Str ; + hundredth, thousandth, millionth, milliardth : Gender => Case => Str ; + n : Number + } ; + Sub100, Sub1000 = { + s : CardOrd => Gender => Case => Str ; + thousandth, millionth, milliardth : Gender => Case => Str ; + n : Number + } ; + Sub1000000, Sub1000000000, Sub1000000000000 = + {s : CardOrd => Gender => Case => Str ; n : Number} ; Dig = {s : Str; n : Number} ; lin num n = n ; - n2 = {s = table { - Masc => caseList "tveir" "tveir" "tveimum" "tveggja" ; - Fem => caseList "tvær" "tvær" "tveimum" "tveggja" ; - Neuter => caseList "tvey" "tvey" "tveimum" "tveggja" - } ; - teen = "tólv" ; - ten = "tjúgu" ; - n = Pl - } ; - n3 = {s = table { - Masc => caseList "tríggir" "tríggjar" "trimum" "tríggja" ; - Fem => caseList "tríggjar" "tríggjar" "trimum" "tríggja" ; - Neuter => caseList "trý" "trý" "trimum" "tríggja" - } ; - teen = "trettan" ; - ten = "tríati" ; - n = Pl - } ; - n4 = mkDigit "fýra" "fjúrtan" "fýrati" ; - n5 = mkDigit "fimm" "fimtan" "fimmti" ; - n6 = mkDigit "seks" "sekstan" "seksti" ; - n7 = mkDigit "sjey" "seytjan" "sjeyti" ; - n8 = mkDigit "átta" "átjan" "áttati" ; - n9 = mkDigit "níggju" "nítjan" "níti" ; + n2 = { + s = table { + NCard => table { + Masc => caseList "tveir" "tveir" "tveimum" "tveggja" ; + Fem => caseList "tvær" "tvær" "tveimum" "tveggja" ; + Neuter => caseList "tvey" "tvey" "tveimum" "tveggja" + } ; + NOrd n => table { + Masc => case n of { + Sg => caseList "annar" "annan" "øðrum" "annars" ; + Pl => caseList "aðrir" "aðrar" "øðrum" "annara" + } ; + Fem => case n of { + Sg => caseList "onnur" "aðra" "aðrari" "annarar" ; + Pl => caseList "aðrar" "aðrar" "øðrum" "annara" + } ; + Neuter => case n of { + Sg => caseList "annað" "annað" "øðrum" "annars" ; + Pl => caseList "onnur" "onnur" "øðrum" "annara" + } + } + } ; + teen = table { + NCard => \\_,_ => "tólv" ; + NOrd n => mkWeakOrd "tólvti" ! n + } ; + ten = table { + NCard => \\_,_ => "tjúgu" ; + NOrd n => mkWeakOrd "tjúgundi" ! n + } ; + n = Pl + } ; + n3 = { + s = table { + NCard => table { + Masc => caseList "tríggir" "tríggjar" "trimum" "tríggja" ; + Fem => caseList "tríggjar" "tríggjar" "trimum" "tríggja" ; + Neuter => caseList "trý" "trý" "trimum" "tríggja" + } ; + NOrd n => mkOrdForms "triði" "triðja" "triðju" ! n + } ; + teen = table { + NCard => \\_,_ => "trettan" ; + NOrd n => mkWeakOrd "trettandi" ! n + } ; + ten = table { + NCard => \\_,_ => "tríati" ; + NOrd n => mkWeakOrd "tretivundi" ! n + } ; + n = Pl + } ; + n4 = mkDigit "fýra" "fjúrtan" "fýrati" "fjórði" "fjúrtandi" "fjørutandi" ; + n5 = mkDigit "fimm" "fimtan" "fimmti" "fimti" "fimtandi" "fimtandi" ; + n6 = mkDigit "seks" "sekstan" "seksti" "sætti" "sekstandi" "sekstandi" ; + n7 = mkDigit "sjey" "seytjan" "sjeyti" "sjeyndi" "seytjandi" "sjútandi" ; + n8 = mkDigit "átta" "átjan" "áttati" "áttandi" "átjandi" "áttandi" ; + n9 = mkDigit "níggju" "nítjan" "níti" "níggjundi" "nítjandi" "nítandi" ; pot01 = { s = table { - Masc => caseList "ein" "ein" "einum" "eins" ; - Fem => caseList "einar" "eina" "einari" "einar" ; - Neuter => caseList "eitt" "eitt" "einum" "eins" + NCard => table { + Masc => caseList "ein" "ein" "einum" "eins" ; + Fem => caseList "einar" "eina" "einari" "einar" ; + Neuter => caseList "eitt" "eitt" "einum" "eins" + } ; + NOrd n => mkWeakOrd "fyrsti" ! n } ; + hundredth = mkWeakOrd "hundraðandi" ! Sg ; + thousandth = mkWeakOrd "túsundandi" ! Sg ; + millionth = mkWeakOrd "milliónandi" ! Sg ; + milliardth = mkWeakOrd "milliardandi" ! Sg ; n = Sg } ; - pot0 d = {s = d.s ; n = d.n} ; + pot0 d = d ** { + hundredth = mkCompoundOrd (numBase d) "hundraðandi" ! Pl ; + thousandth = mkCompoundOrd (numBase d) "túsundandi" ! Pl ; + millionth = mkCompoundOrd (numBase d) "milliónandi" ! Pl ; + milliardth = mkCompoundOrd (numBase d) "milliardandi" ! Pl + } ; + pot0as1 n = n ; - pot110 = { + + pot110 = + let ten = + table { + Neuter => \\_ => "ti" ; + _ => \\_ => "tíggju" + } ; + in mkCardOrd ten + (mkWeakOrd "tíggjundi") ** { + thousandth = \\g,c => ten ! g ! Nom ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => ten ! g ! Nom ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => ten ! g ! Nom ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + }; + + pot111 = + mkCardOrd (\\_,_ => "ellivu") + (mkWeakOrd "ellivti") ** { + thousandth = \\g,c => "ellivu" ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => "ellivu" ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => "ellivu" ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + }; + + pot1to19 d = + mkCardOrd (d.teen ! NCard) + (\\n => d.teen ! NOrd n) ** { + thousandth = \\g,c => d.teen ! NCard ! g ! Nom ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => d.teen ! NCard ! g ! Nom ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => d.teen ! NCard ! g ! Nom ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + }; + + pot1 d = + mkCardOrd (d.ten ! NCard) + (\\n => d.ten ! NOrd n) ** { + thousandth = \\g,c => d.ten ! NCard ! g ! Nom ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => d.ten ! NCard ! g ! Nom ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => d.ten ! NCard ! g ! Nom ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + } ; + pot1plus d e = { s = table { - Masc => \\_ => "tíggju" ; - Fem => \\_ => "tíggju" ; - Neuter => \\_ => "ti" + NCard => \\g,c => e.s ! NCard ! g ! c ++ "og" ++ d.ten ! NCard ! g ! Nom ; + NOrd n => \\g,c => d.ten ! NCard ! g ! c ++ "og" ++ e.s ! NOrd n ! g ! Nom + } ; + thousandth = \\g,c => d.ten ! NCard ! g ! Nom ++ "og" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => d.ten ! NCard ! g ! Nom ++ "og" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => d.ten ! NCard ! g ! Nom ++ "og" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom ; + n = Pl + } ; + + pot1as2 n = n ; + + pot21 = + mkCardOrd (\\_,_ => "hundrað") + (mkWeakOrd "hundraðandi") ** { + thousandth = \\g,c => "hundrað" ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => "hundrað" ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => "hundrað" ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + } ; + + pot2 d = + mkCardOrd (\\_,_ => numBase d ++ "hundrað") + (\\_ => d.hundredth) ** { + thousandth = \\g,c => numBase d ++ "hundrað" ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => numBase d ++ "hundrað" ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => numBase d ++ "hundrað" ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom + } ; + + pot2plus d e = { + s = table { + NCard => \\g,c => numBase d ++ "hundrað" ++ e.s ! NCard ! g ! c ; + NOrd n => \\g,c => numBase d ++ "hundrað" ++ "og" ++ e.s ! NOrd n ! g ! c + } ; + thousandth = \\g,c => numBase d ++ "hundrað" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "túsundandi" ! Pl ! g ! Nom ; + millionth = \\g,c => numBase d ++ "hundrað" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "milliónandi" ! Pl ! g ! Nom ; + milliardth = \\g,c => numBase d ++ "hundrað" ++ e.s ! NCard ! g ! c ++ mkWeakOrd "milliardandi" ! Pl ! g ! Nom ; + n = Pl + } ; + + pot2as3 n = n ; + + pot31 = mkCardOrd (\\_,_ => "túsund") + (mkWeakOrd "túsundandi") ; + + pot3 n = mkCardOrd (\\_,_ => numBase n ++ "túsund") + (\\_ => n.thousandth) ; + + pot3plus n m = { + s = table { + NCard => \\g,c => numBase n ++ "túsund" ++ m.s ! NCard ! g ! c ; + NOrd num => \\g,c => numBase n ++ "túsund" ++ "og" ++ m.s ! NOrd num ! g ! c } ; n = Pl } ; - pot111 = mkNum "ellivu" Pl ; - pot1to19 d = mkNum d.teen Pl ; - pot1 d = mkNum d.ten Pl ; - pot1plus d e = {s = \\g,c => e.s ! g ! c ++ "og" ++ d.ten ; n = Pl} ; - pot1as2 n = n ; - pot21 = mkNum "hundrað" Pl ; - pot2 d = mkNum (numBase d ++ "hundrað") Pl ; - pot2plus d e = {s = \\g,c => numBase d ++ "hundrað" ++ e.s ! g ! c ; n = Pl} ; - pot2as3 n = n ; - pot31 = mkNum "túsund" Pl ; - pot3 n = mkNum (numBase n ++ "túsund") Pl ; - pot3plus n m = {s = \\g,c => numBase n ++ "túsund" ++ m.s ! g ! c ; n = Pl} ; + pot3as4 n = n ; - pot3decimal d = mkNum (d.s ++ "túsund") Pl ; - pot41 = mkNum "millión" Pl ; - pot4 n = mkNum (numBase n ++ "millión") Pl ; - pot4plus n m = {s = \\g,c => numBase n ++ "millión" ++ m.s ! g ! c ; n = Pl} ; + + pot3decimal d = mkCardOrd (\\_,_ => d.s ++ "túsund") + (\\_,_,_ => d.s ++ "túsundandi") ; + + pot41 = mkCardOrd (\\_,_ => "millión") + (mkWeakOrd "milliónandi") ; + + pot4 n = mkCardOrd (\\_,_ => numBase n ++ "millión") + (\\_ => n.millionth) ; + + pot4plus n m = { + s = table { + NCard => \\g,c => numBase n ++ "millión" ++ m.s ! NCard ! g ! c ; + NOrd num => \\g,c => numBase n ++ "millión" ++ "og" ++ m.s ! NOrd num ! g ! c + } ; + n = Pl + } ; + pot4as5 n = n ; - pot4decimal d = mkNum (d.s ++ "millión") Pl ; - pot51 = mkNum "milliard" Pl ; - pot5 n = mkNum (numBase n ++ "milliard") Pl ; - pot5plus n m = {s = \\g,c => numBase n ++ "milliard" ++ m.s ! g ! c ; n = Pl} ; - pot5decimal d = mkNum (d.s ++ "milliard") Pl ; + + pot4decimal d = mkCardOrd (\\_,_ => d.s ++ "millión") + (\\_,_,_ => d.s ++ "milliónandi") ; + + pot51 = mkCardOrd (\\_,_ => "milliard") + (mkWeakOrd "milliardandi") ; + + pot5 n = mkCardOrd (\\_,_ => numBase n ++ "milliard") + (\\_ => n.milliardth) ; + + pot5plus n m = { + s = table { + NCard => \\g,c => numBase n ++ "milliard" ++ m.s ! NCard ! g ! c ; + NOrd num => \\g,c => numBase n ++ "milliard" ++ "og" ++ m.s ! NOrd num ! g ! c + } ; + n = Pl + } ; + + pot5decimal d = mkCardOrd (\\_,_ => d.s ++ "milliard") + (\\_,_,_ => d.s ++ "milliardandi") ; IDig d = d ; IIDig d ds = {s = d.s ++ BIND ++ ds.s; n = Pl} ; @@ -98,18 +259,58 @@ oper caseList : Str -> Str -> Str -> Str -> Case => Str = \nom,acc,dat,gen -> table {Nom => nom ; Acc => acc ; Dat => dat ; Gen => gen} ; - mkNum : Str -> Number -> {s : Gender => Case => Str ; n : Number} = \str,n -> { - s = \\_,_ => str ; - n = n - } ; + mkCardOrd : + (Gender => Case => Str) -> + (Number => Gender => Case => Str) -> + {s : CardOrd => Gender => Case => Str ; n : Number} = + \card,ord -> { + s = table { + NCard => card ; + NOrd n => ord ! n + } ; + n = Pl + } ; - mkDigit : Str -> Str -> Str -> {s : Gender => Case => Str ; n : Number ; teen : Str ; ten : Str} = \str,teen,ten -> { - s = \\_,_ => str ; - teen = teen ; - ten = ten ; - n = Pl - } ; + mkDigit : + Str -> Str -> Str -> Str -> Str -> Str -> Digit = + \str,teen,ten,unitOrd,teenOrd,tenOrd -> lin Digit { + s = table { + NCard => \\_,_ => str ; + NOrd n => mkWeakOrd unitOrd ! n + } ; + teen = table { + NCard => \\_,_ => teen ; + NOrd n => mkWeakOrd teenOrd ! n + } ; + ten = table { + NCard => \\_,_ => ten ; + NOrd n => mkWeakOrd tenOrd ! n + } ; + n = Pl + } ; - numBase : {s : Gender => Case => Str ; n : Number} -> Str = \n -> - n.s ! Neuter ! Nom ; + mkOrdForms : Str -> Str -> Str -> Number => Gender => Case => Str = \masc,obl,pl -> + table { + Sg => + table { + Masc => caseList masc obl obl obl ; + Fem => caseList obl pl pl pl ; + Neuter => \\_ => obl + } ; + Pl => \\_,_ => pl + } ; + + mkWeakOrd : Str -> Number => Gender => Case => Str = \lemma -> + let stem : Str = init lemma in + mkOrdForms lemma (stem + "a") (stem + "u") ; + + mkCompoundOrd : Str -> Str -> Number => Gender => Case => Str = \prefix,lemma -> + let stem : Str = init lemma in + mkOrdForms + (prefix ++ BIND ++ lemma) + (prefix ++ BIND ++ (stem + "a")) + (prefix ++ BIND ++ (stem + "u")) ; + + numBase : {s : CardOrd => Gender => Case => Str} -> Str = \n -> + n.s ! NCard ! Neuter ! Nom ; } diff --git a/src/faroese/ResFao.gf b/src/faroese/ResFao.gf index 64aa6377..72b848be 100644 --- a/src/faroese/ResFao.gf +++ b/src/faroese/ResFao.gf @@ -1,5 +1,8 @@ resource ResFao = ParamX - [Tense,Pres,Past] ** { +param + CardOrd = NCard | NOrd Number ; + param Species = Indef | Def ; param Case = Nom | Acc | Dat | Gen ; param Gender = Masc | Fem | Neuter ;