(Som) Restructure nominal morphology + numerals

This commit is contained in:
Inari Listenmaa
2019-06-27 16:19:13 +02:00
parent 388741ef8d
commit 682a0adac0
8 changed files with 292 additions and 229 deletions
+70 -42
View File
@@ -3,15 +3,13 @@ concrete NumeralSom of Numeral = CatSom [Numeral,Digits] **
oper
LinDigit : Type = {
s : DForm => CardOrd => State => Str -- TODO: for 1, hal and mid. variation kow-koob implemented with pre.
unit : {s : DForm => Str ; ord : Str ; da : DefArticle} ;
ten : {s, ord : Str ; da : DefArticle}
} ;
mkNum3 : (ucard,tcard,uord : Str) -> Gender -> LinDigit = \uc,tc,uo,g -> {s =
\\df,co,s => case <co,df,s> of {
<NOrd,Unit,_> => uo ;
<NOrd,Ten, _> => tc + "aad" ;
<NCard,Unit,s> => nf2state (mkNg uc g) ! s ;
<NCard,Ten, s> => nf2state (mkN1 tc) ! s }
mkNum3 : (ucard,tcard,uord : Str) -> DefArticle -> LinDigit = \uc,tc,uo,ud -> {
unit = {s = \\df => uc ; ord = uo ; da = ud} ;
ten = {s = tc ; ord = tc + "aad" ; da = M KA}
} ;
mkNum2 : (ucard,tcard : Str) -> LinDigit = \uc,tc ->
@@ -19,20 +17,25 @@ oper
x + "a" => x + "aad" ; -- ??
x + #v + c@#c => x + c + "aad" ;
_ => uc + "aad" } ;
in mkNum3 uc tc uo Fem ;
in mkNum3 uc tc uo (F DA) ;
mkNum2Masc : (ucard,tcard : Str) -> LinDigit = \uc,tc ->
let uo : Str = case uc of {
x + "a" => x + "aad" ; -- ??
x + #v + c@#c => x + c + "aad" ;
_ => uc + "aad" } ;
in mkNum3 uc tc uo Masc ;
in mkNum3 uc tc uo (M KA) ;
lincat
Digit = LinDigit ;
Sub10, Sub100, Sub1000, Sub1000000 =
{s : CardOrd => State => Str ; n : Number} ;
Sub10, Sub100, Sub1000, Sub1000000 = {
s : DForm => Str ;
thousand : Str ; -- TODO figure out if this really works so
ord : Str ;
da : DefArticle ;
n : Number
} ;
----------------------------------------------------------------------------
@@ -40,9 +43,10 @@ lincat
-- num : Sub1000000 -> Numeral ;
lin num x = x ;
oper kow : Str = "kow" ; --pre {"iyo" => "koob" ; _ => "kow"} ;
oper n1 = mkNum3 kow "toban" "kowaad" Fem ;
oper kow : DForm => Str = table {Kow => "kow" ; Hal => "hal" ; Mid => "mid"} ;
oper n1 : LinDigit = let one : LinDigit = mkNum2 "kow" "toban" in one ** {
unit = one.unit ** {s = kow}
} ;
lin n2 = mkNum2 "laba" "labaatan" ;
lin n3 = mkNum2 "saddex" "soddon" ;
lin n4 = mkNum2 "afar" "afartan";
@@ -50,42 +54,67 @@ lin n5 = mkNum2 "shan" "konton";
lin n6 = mkNum2 "lix" "lixdan" ;
lin n7 = mkNum2 "toddoba" "toddobaatan" ;
lin n8 = mkNum2Masc "siddeed" "siddeetan" ;
lin n9 = mkNum2Masc "sagaal" "sagaaashan" ;
lin n9 = mkNum2Masc "sagaal" "sagaashan" ;
lin pot01 = {s = n1.s ! Unit ; n = Sg} ;
lin pot01 = n1.unit ** {n = Sg ; thousand = []} ;
lin pot0 d = {s = d.s ! Unit ; n = Pl} ;
lin pot0 d = d.unit ** {n = Pl ; thousand = []} ;
lin pot110 = {s = n1.s ! Ten ; n = Pl} ;
lin pot111 = {s = \\co,s => "koob iyo" ++ n1.s ! Ten ! co ! s ; n = Pl} ;
lin pot1to19 d = {s = \\co,s => d.s ! Unit ! co ! s ++ n1.s ! Ten ! co ! s ; n=Pl} ;
lin pot110 = n1.ten ** {
s = \\df => n1.ten.s ;
thousand = [] ;
n = Pl
} ;
lin pot111 = {
s = \\_ => "koob iyo" ++ n1.ten.s ;
ord = "koob iyo" ++ n1.ten.ord ;
thousand = [] ;
da = M KA ; -- TODO check
n = Pl
} ;
lin pot1to19 d = {
s = \\_ => d.unit.s ! Kow ++ "iyo" ++ n1.ten.s ;
thousand = [] ;
ord = d.unit.s ! Kow ++ "iyo" ++ n1.ten.ord ;
da = M KA ; -- TODO check
n = Pl
} ;
lin pot0as1 n = n ;
lin pot1 d = {s = d.s ! Ten ; n=Pl};
-- {s = d.s ! Unit ;
-- n = Pl} ;
lin pot1plus d e = {
s = \\co,s => e.s ! co ! Indefinite ++ "iyo" ++ d.s ! Ten ! co ! s ;
n = Pl} ;
lin pot1 d = d.ten ** {
s = \\df => d.ten.s ;
thousand = [] ;
n = Pl
} ;
lin pot1plus d e = d.ten ** {
s = \\b => d.unit.s ! Kow ++ "iyo" ++ e.s ! b ;
ord = d.unit.s ! Kow ++ "iyo" ++ e.ord ; -- TODO check
thousand = [] ;
n = Pl ;
} ;
lin pot1as2 n = n ;
lin pot2 d = d ** {s = \\co,s => d.s ! co ! s ++ "boqol"} ; -- TODO
lin pot2plus d e = {
s = \\co,s => d.s ! co ! Indefinite ++ "boqol iyo" ++ e.s ! co ! s ;
n = Pl} ;
lin pot2 d = d ** {
thousand = "boqol" ; -- TODO check
ord = d.s ! Kow ++ "boqlaad"
} ; -- TODO what's the def. art. allomorph?
lin pot2plus d e = d ** {
s = \\b => d.s ! b ++ "boqol iyo" ++ e.s ! b ;
ord = d.ord ++ "boqol iyo" ++ e.ord ;
n = Pl} ;
lin pot2as3 n = n ;
lin pot3 n = n ;
lin pot3plus n m = {
s = \\co,s => n.s ! co ! s ++ "iyo" ++ m.s ! co ! s ;
n = n.n } ;
lin pot3 n = n ** {
thousand = "kun" ;
ord = n.s ! Kow ++ "kunaad" ;
--da = M KA ; -- TODO check
n = Pl } ;
lin pot3plus n m = n ** {
s = \\b => n.s ! b ++ "kun iyo" ++ m.s ! b ;
ord = n.ord ++ "kun iyo" ++ m.ord ;
n = Pl} ;
--TODO:
-- my three cats
-- * saddexd &+ ayg &+ a bisadood
-- => saddexd &+ ayd &+ a bisadood
-- my *two* thousand small cats
-- => laba kun oo bisadood oo yar (kun is an attribute, bisadood is an attribute)
-- two thousand small cats
-- => laba kun oo bisadood oo yar (kun and bisadood are both attributes)
----------------------------------------------------------------------------
lincat Dig = TDigit ;
@@ -100,7 +129,6 @@ oper
n = num } ;
lin D_0 = mkDig "0" ;
lin D_1 = mk2Dig "1" Sg ;
lin D_2 = mkDig "2" ;