forked from GitHub/gf-rgl
Merge pull request #248 from inariksit/somali
(Som) WIP: Numerals, bugfixes in gender agreement.
This commit is contained in:
@@ -72,7 +72,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in {
|
||||
Predet = {s : Str} ;
|
||||
Quant = ResSom.Quant ;
|
||||
Num = ResSom.Num ;
|
||||
Card, Ord = {s : Str ; n : Number} ;
|
||||
Ord = {s : Str ; n : Number} ;
|
||||
DAP = ResSom.Determiner ;
|
||||
|
||||
|
||||
@@ -80,7 +80,8 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in {
|
||||
|
||||
-- Constructed in NumeralSom.
|
||||
|
||||
Numeral = {s : Str ; n : Number} ;
|
||||
Card = {s : State => Str ; n : Number} ;
|
||||
Numeral = {s : CardOrd => State => Str ; n : Number} ;
|
||||
Digits = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ lin go_V = mkV "tag" ;
|
||||
-- lin horn_N = mkN "" ;
|
||||
-- lin horse_N = mkN "" ;
|
||||
-- lin hot_A = mkA "" ;
|
||||
lin house_N = mkN "aqal" ;
|
||||
lin house_N = mkN "guri" ;
|
||||
-- lin hunt_V2 = mkV2 "" ;
|
||||
-- lin husband_N = mkN "" ;
|
||||
|
||||
@@ -360,7 +360,7 @@ lin speak_V2 = mkV2 "hadlo" ;
|
||||
-- lin table_N = mkN "" ;
|
||||
-- lin tail_N = mkN "" ;
|
||||
-- lin talk_V3 = mkV3 "" ;
|
||||
lin teach_V2 = mkV2 "baray" ku ; -- I suppose this creates progressive forms? TODO implement all forms of verbs properly.
|
||||
lin teach_V2 = mkV2 "bar" ku ;
|
||||
-- lin teacher_N = mkN "" ;
|
||||
-- lin television_N = mkN "" ;
|
||||
-- lin thick_A = mkA "" ;
|
||||
|
||||
@@ -23,14 +23,19 @@ DetCN det cn = useN cn ** {
|
||||
<Nom,True,_> => {nf=det.d ; c=Abs} ;
|
||||
_ => {nf=det.d ; c=c}
|
||||
} ;
|
||||
nf : NForm = case det.isNum of {True => Numerative ; _ => nfc.nf} ;
|
||||
detStr : Str =
|
||||
case <det.isPoss,cn.shortPoss> of {
|
||||
<True,True> => det.shortPoss ;
|
||||
_ => det.s ! nfc.c
|
||||
case <cn.isPoss,det.d,det.isPoss,cn.shortPoss> of {
|
||||
<True, _,_,_> => det.sp ! cn.g ! nfc.c ; -- CN has undergone ComplN2 and is already quantified
|
||||
<_,Numerative,_,_> => [] ; -- s is in pref
|
||||
<_,_, True,True> => det.shortPoss ;
|
||||
_ => det.s ! cn.g ! nfc.c
|
||||
} ;
|
||||
in det.pref -- if det is numeral. TODO find out if gender/case/other distinction.
|
||||
++ cn.s ! nf
|
||||
pref : Str = case det.d of {
|
||||
Numerative => det.s ! cn.g ! nfc.c ;
|
||||
_ => []
|
||||
} ;
|
||||
in pref -- if det is numeral.
|
||||
++ cn.s ! nfc.nf
|
||||
++ detStr -- non-numeral det
|
||||
++ cn.mod ! getNum (getAgr det.d Masc) ! c
|
||||
} ;
|
||||
@@ -87,23 +92,29 @@ DetCN det cn = useN cn ** {
|
||||
|
||||
-- : Quant -> Num -> Det ;
|
||||
DetQuant quant num = quant ** {
|
||||
pref = num.s ;
|
||||
sp = \\g => case <num.n,g> of {
|
||||
<Sg,Masc> => quant.sp ! SgMasc ;
|
||||
<Sg,Fem> => quant.sp ! SgFem ;
|
||||
<Pl,_> => quant.sp ! PlInv } ;
|
||||
s = \\g,c => case <num.n,g> of {
|
||||
<Sg,Masc> => num.s ! quant.st ++ quant.s ! SgMasc ! c ;
|
||||
<Sg,Fem> => num.s ! quant.st ++ quant.s ! SgFem ! c ;
|
||||
-- gender-flipped allomorphs in plural; TODO needs more fine-grained rules
|
||||
<Pl,Fem> => num.s ! quant.st ++ quant.s ! SgMasc ! c ;
|
||||
<Pl,Masc> => num.s ! quant.st ++ quant.s ! SgFem ! c } ;
|
||||
|
||||
sp = \\g,c => case <num.n,g> of {
|
||||
<Sg,Masc> => num.s ! quant.st ++ quant.sp ! SgMasc ! c ;
|
||||
<Sg,Fem> => num.s ! quant.st ++ quant.sp ! SgFem ! c ;
|
||||
-- Independent form uses plural morpheme, not gender-flipped allomorph
|
||||
<Pl,_> => num.s ! quant.st ++ quant.sp ! PlInv ! c } ;
|
||||
|
||||
d = case <num.isNum,quant.st> of {
|
||||
<True,_> => Numerative ;
|
||||
<False,Definite> => Def num.n quant.v ;
|
||||
<False,Indefinite> => Indef num.n } ;
|
||||
isNum = num.isNum ;
|
||||
} ;
|
||||
|
||||
-- : Quant -> Num -> Ord -> Det ; -- these five best
|
||||
DetQuantOrd quant num ord =
|
||||
let theseFive = DetQuant quant num in theseFive ** {
|
||||
s = \\c => theseFive.s ! c ++ ord.s ;
|
||||
s = \\g,c => theseFive.s ! g ! c ++ ord.s ;
|
||||
sp = \\g,c => theseFive.sp ! g ! c ++ ord.s
|
||||
} ;
|
||||
|
||||
@@ -114,27 +125,29 @@ DetCN det cn = useN cn ** {
|
||||
-- the "kernel" of a determiner. It is, however, the $Num$ that determines
|
||||
-- the inherent number.
|
||||
|
||||
NumSg = {s = [] ; n = Sg ; isNum = False} ;
|
||||
NumPl = {s = [] ; n = Pl ; isNum = False} ;
|
||||
{-
|
||||
NumSg = {s = \\_ => [] ; n = Sg ; isNum = False} ;
|
||||
NumPl = {s = \\_ => [] ; n = Pl ; isNum = False} ;
|
||||
|
||||
-- : Card -> Num ;
|
||||
NumCard card = (card ** { isNum = True }) ;
|
||||
NumCard card = card ** {isNum = True} ;
|
||||
|
||||
-- : Digits -> Card ;
|
||||
NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ;
|
||||
-- NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ;
|
||||
|
||||
-- : Numeral -> Card ;
|
||||
NumNumeral num = num ;
|
||||
NumNumeral num = num ** {s = num.s ! NCard};
|
||||
|
||||
{-
|
||||
-- : AdN -> Card -> Card ;
|
||||
AdNum adn card = card ** { s = adn.s ++ card.s } ;
|
||||
|
||||
-- : Digits -> Ord ;
|
||||
OrdDigits digs = digs ** { s = digs.s ! NOrd } ;
|
||||
|
||||
-}
|
||||
-- : Numeral -> Ord ;
|
||||
OrdNumeral num = num ;
|
||||
OrdNumeral num = num ** {s = num.s ! NOrd ! Indefinite} ;
|
||||
|
||||
{-
|
||||
-- : A -> Ord ;
|
||||
OrdSuperl a = { } ;
|
||||
|
||||
@@ -159,10 +172,10 @@ DetCN det cn = useN cn ** {
|
||||
in DefArt ** {
|
||||
shortPoss = BIND ++ p.s ;
|
||||
isPoss = True ;
|
||||
s = \\c => let casevow = case c of {Nom => "u" ; Abs => "a" ; _ => "TODO:case"}
|
||||
in gntbl ! SgMasc ++ BIND ++ casevow ;
|
||||
s = \\gn,c => let casevow = case c of {Nom => "u" ; Abs => "a"}
|
||||
in gntbl ! gn ++ BIND ++ casevow ;
|
||||
sp = \\gn,c => let prefix = case gn of {SgFem => "t" ; _ => "k"} ;
|
||||
casevow = case c of {Nom => "u" ; Abs => "a"; _ => "TODO:case"}
|
||||
casevow = case c of {Nom => "u" ; Abs => "a"}
|
||||
in prefix ++ gntbl ! gn ++ BIND ++ casevow ;
|
||||
v = p.v
|
||||
} ;
|
||||
@@ -175,15 +188,20 @@ DetCN det cn = useN cn ** {
|
||||
|
||||
-- : N2 -> NP -> CN ; -- Sahra hooyadeed
|
||||
ComplN2 n2 np = let cn = useN n2 in cn ** {s = \\nf =>
|
||||
let det = PossPron (pronTable ! np.a) ;
|
||||
detStr = case cn.shortPoss of {
|
||||
True => det.shortPoss ;
|
||||
_ => det.s ! Abs } ;
|
||||
let qnt = PossPron (pronTable ! np.a) ;
|
||||
|
||||
det = case cn.shortPoss of {
|
||||
True => qnt.shortPoss ;
|
||||
_ => qnt.s ! nf2gennum nf cn.g ! Abs } ;
|
||||
num = case nf of {
|
||||
Indef n => n ;
|
||||
Def n v => n ;
|
||||
_ => Sg } ;
|
||||
in np.s ! Abs ++ cn.s ! Def num det.v ++ detStr } ;
|
||||
Indef n => n ;
|
||||
Def n v => n ;
|
||||
_ => Sg } ;
|
||||
noun = case np.isPron of {
|
||||
True => (pronTable ! np.a).sp ; -- long subject pronoun
|
||||
False => np.s ! Abs }
|
||||
in noun ++ cn.s ! Def num qnt.v ++ det ;
|
||||
isPoss = True} ;
|
||||
|
||||
{-
|
||||
-- : N3 -> NP -> N2 ; -- distance from this city (to Paris)
|
||||
@@ -202,6 +220,9 @@ DetCN det cn = useN cn ** {
|
||||
s = table { NomSg => cn.s ! Indef Sg ; -- When an adjective is added, noun loses case marker.
|
||||
x => cn.s ! x } ;
|
||||
mod = \\n,c => cn.mod ! n ! Abs -- If there was something before, it is now in Abs
|
||||
++ case cn.hasMod of {
|
||||
True => "oo" ;
|
||||
False => [] }
|
||||
++ ap.s ! AF n c ;
|
||||
hasMod = True
|
||||
} ;
|
||||
|
||||
@@ -1,88 +1,91 @@
|
||||
concrete NumeralSom of Numeral = CatSom [Numeral,Digits] **
|
||||
open Prelude, ResSom in {
|
||||
open Prelude, ResSom, ParamSom in {
|
||||
|
||||
oper LinDigit : Type = { s : DForm => Str ;
|
||||
n : Number ;
|
||||
even20 : Even20 } ;
|
||||
oper
|
||||
LinDigit : Type = {
|
||||
s : DForm => CardOrd => State => Str -- TODO: for 1, hal and mid. variation kow-koob implemented with pre.
|
||||
} ;
|
||||
|
||||
oper mk20Ten : Str -> Str -> Str -> Str -> LinDigit = \tri,t,fiche,h ->
|
||||
{ s = table { Unit => tri ;
|
||||
Teen => t ;
|
||||
Twenty => fiche ;
|
||||
Hund => h + "TODO"} ;
|
||||
even20 = Ten ;
|
||||
n = Pl } ;
|
||||
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 }
|
||||
} ;
|
||||
|
||||
oper mkeven20 : Str -> Str -> Str -> Str -> LinDigit = \se,t,trifichid,h ->
|
||||
{ s = table { Unit => se ;
|
||||
Teen => t ;
|
||||
Twenty => trifichid ;
|
||||
Hund => h + "TODO" } ;
|
||||
even20 = Even ;
|
||||
n = Pl } ;
|
||||
mkNum2 : (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 Fem ;
|
||||
|
||||
param Even20 = Ten | Even ;
|
||||
param DForm = Unit | Teen | Twenty | Hund ;
|
||||
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 ;
|
||||
|
||||
--lincat Numeral = {s : Str} ;
|
||||
lincat Digit = LinDigit ;
|
||||
lincat Sub10 = LinDigit ;
|
||||
lincat Sub100 = {s : Str ; n : Number } ;
|
||||
lincat Sub1000 = {s : Str ; n : Number ; isHundred : Bool } ;
|
||||
lincat Sub1000000 = {s : Str ; n : Number } ;
|
||||
|
||||
lincat
|
||||
Digit = LinDigit ;
|
||||
Sub10, Sub100, Sub1000, Sub1000000 =
|
||||
{s : CardOrd => State => Str ; n : Number} ;
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
-- num : Sub1000000 -> Numeral ;
|
||||
lin num x0 = lin Numeral x0 ;
|
||||
lin num x = x ;
|
||||
|
||||
lin n2 = mkeven20 "TODO" "TODO" "TODO" "TODO" ;
|
||||
lin n3 = mk20Ten "TODO" "TODO" "TODO" "TODO";
|
||||
lin n4 = mkeven20 "TODO" "TODO" "TODO" "TODO";
|
||||
lin n5 = mk20Ten "TODO" "TODO" "TODO" "TODO";
|
||||
lin n6 = mkeven20 "TODO" "TODO" "TODO" "TODO" ;
|
||||
lin n7 = mk20Ten "TODO" "TODO" "TODO" "TODO" ;
|
||||
lin n8 = mkeven20 "TODO" "TODO" "TODO" "TODO" ;
|
||||
lin n9 = mk20Ten "TODO" "TODO" "TODO" "TODO" ;
|
||||
oper kow : Str = "kow" ; --pre {"iyo" => "koob" ; _ => "kow"} ;
|
||||
|
||||
lin pot01 =
|
||||
{s = table {Unit => "TODO" ; Hund => "TODO" ; _ => []} ; even20 = Ten ; n = Sg };
|
||||
lin pot0 d = d ;
|
||||
lin pot110 = {s = "TODO" ; n = Pl} ;
|
||||
lin pot111 = {s = variants {"TODO" ; "TODO"} ; n = Pl} ;
|
||||
lin pot1to19 d = {s = d.s ! Teen ; n = Pl} ;
|
||||
lin pot0as1 n = {s = n.s ! Unit ; n = n.n} ;
|
||||
lin pot1 d =
|
||||
{s = case d.even20 of {
|
||||
Even => d.s ! Twenty ;
|
||||
Ten => glue (d.s ! Twenty) "TODO" } ;
|
||||
n = Pl} ;
|
||||
lin pot1plus d e =
|
||||
{s = case d.even20 of {
|
||||
Even => d.s ! Twenty ++ "TODO" ++ e.s ! Unit ;
|
||||
Ten => d.s ! Twenty ++ "TODO" ++ e.s ! Teen } ;
|
||||
n = Pl} ;
|
||||
oper n1 = mkNum3 kow "toban" "kowaad" Fem ;
|
||||
lin n2 = mkNum2 "laba" "labaatan" ;
|
||||
lin n3 = mkNum2 "saddex" "soddon" ;
|
||||
lin n4 = mkNum2 "afar" "afartan";
|
||||
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 pot1as2 n = n ** { isHundred = False } ;
|
||||
lin pot2 d = {s = d.s ! Hund ; n = Pl ; isHundred = True } ;
|
||||
lin pot2plus d e =
|
||||
{ s = d.s ! Hund ++ "TODO" ++ e.s ;
|
||||
n = Pl ;
|
||||
isHundred = True } ;
|
||||
lin pot01 = {s = n1.s ! Unit ; n = Sg} ;
|
||||
|
||||
lin pot0 d = {s = d.s ! Unit ; n = Pl} ;
|
||||
|
||||
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 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 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 pot2as3 n = n ;
|
||||
lin pot3 n =
|
||||
{s = table {Sg => [] ; Pl => n.s } ! n.n ++ "TODO" ;
|
||||
n = 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 pot3plus n m =
|
||||
let ta = if_then_Str m.isHundred [] "TODO" ; --no `ta' between 1000 and 100
|
||||
in
|
||||
{ s = table {Sg => [] ; Pl => n.s } ! n.n ++ "TODO" ++ ta ++ m.s ;
|
||||
n = n.n } ;
|
||||
|
||||
--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)
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
lincat Dig = TDigit ;
|
||||
@@ -93,7 +96,7 @@ oper
|
||||
|
||||
mk2Dig : Str -> Number -> TDigit = \c,num ->
|
||||
{ s = table { NCard => c ;
|
||||
NOrd => c + "TODO" } ;
|
||||
NOrd => c + "aan" } ;
|
||||
n = num } ;
|
||||
|
||||
|
||||
|
||||
@@ -99,19 +99,40 @@ oper
|
||||
agr2agrplus : (isPron : Bool) -> Agreement -> AgreementPlus = \isPron,a ->
|
||||
case isPron of {True => IsPron a ; False => NotPronP3} ;
|
||||
|
||||
nf2state : {s:NForm=>Str} -> State=>Str = \ss -> table {
|
||||
Definite => ss.s ! Def Sg vA ;
|
||||
Indefinite => ss.s ! Indef Sg
|
||||
} ;
|
||||
|
||||
gn2gennum : Gender -> Number -> GenNum = \g,n ->
|
||||
case <g,n> of {
|
||||
<Masc,Sg> => SgMasc ;
|
||||
<Fem,Sg> => SgFem ;
|
||||
_ => PlInv } ;
|
||||
|
||||
nf2gennum : NForm -> Gender -> GenNum = \nf,g ->
|
||||
gn2gennum g (getNum (getAgr nf g)) ;
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Numerals
|
||||
|
||||
param
|
||||
|
||||
DForm = Unit | Ten ;
|
||||
|
||||
-- If need to optimise: can remove one multiple of 2, but harder to understand
|
||||
-- CardOrdDFS = Odfs DForm | Cdfs DForm State ;
|
||||
--
|
||||
-- CardOrdState = Ost | Cst State ;
|
||||
|
||||
CardOrd = NOrd | NCard ;
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Adjectives
|
||||
|
||||
param
|
||||
AForm = AF Number Case ; ---- TODO: past tense
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Numerals
|
||||
|
||||
-- TODO: is this necessary?
|
||||
param
|
||||
CardOrd = NCard | NOrd ;
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Prepositions
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in {
|
||||
UttVP vp = { s = linVP vp } ;
|
||||
UttAdv adv = adv ;
|
||||
UttCN n = {s = linCN n } ;
|
||||
UttCard n = n ;
|
||||
UttCard n = {s = n.s ! Indefinite} ;
|
||||
UttAP ap = { s = ap.s ! AF Sg Abs } ;
|
||||
UttInterj i = i ;
|
||||
|
||||
|
||||
@@ -8,7 +8,11 @@ oper
|
||||
Noun2 : Type = Noun ; -- TODO eventually more parameters?
|
||||
Noun3 : Type = Noun ;
|
||||
|
||||
CNoun : Type = Noun ** {mod : Number => Case => Str ; hasMod : Bool} ;
|
||||
CNoun : Type = Noun ** {
|
||||
mod : Number => Case => Str ;
|
||||
hasMod : Bool ;
|
||||
isPoss : Bool -- to prevent impossible forms in ComplN2 with Ns that have short possessive, e.g. "the father of NP".
|
||||
} ;
|
||||
|
||||
PNoun : Type = {s : Str ; a : Agreement} ;
|
||||
|
||||
@@ -107,7 +111,7 @@ oper
|
||||
_ => nXayawaan n } ;
|
||||
|
||||
mkNg : Str -> Gender -> Noun = \n,g -> case n of {
|
||||
_ + ("r"|"n"|"l"|"g")
|
||||
_ -- + ("r"|"n"|"l"|"g")
|
||||
=> case g of {
|
||||
Fem => nUl n ;
|
||||
Masc => mkN1 n } ;
|
||||
@@ -126,7 +130,7 @@ oper
|
||||
|
||||
useN : Noun -> CNoun ** BaseNP = \n -> n **
|
||||
{ mod = \\_,_ => [] ; hasMod = False ;
|
||||
a = Sg3 n.g ; isPron = False ; sp = []
|
||||
a = Sg3 n.g ; isPron,isPoss = False ;
|
||||
} ;
|
||||
|
||||
emptyNP : NounPhrase = {
|
||||
@@ -147,58 +151,58 @@ oper
|
||||
poss : { -- for PossPron : Pron -> Quant
|
||||
sp : GenNum => Str ; -- independent forms, e.g. M:kayga F:tayda Pl:kuwayga
|
||||
s : Str ; -- short possessive suffix: e.g. family members, my/your name
|
||||
v : Vowel}
|
||||
v : Vowel} ;
|
||||
sp : Str ;
|
||||
} ;
|
||||
|
||||
pronTable : Agreement => Pronoun = table {
|
||||
Sg1 => {
|
||||
s = table {Nom => "aan" ; {-Voc => "aniga" ;-} Abs => "i"} ;
|
||||
a = Sg1 ; isPron = True ;
|
||||
s = table {Nom => "aan" ; Abs => "i"} ;
|
||||
a = Sg1 ; isPron = True ; sp = "aniga" ;
|
||||
poss = {s = "ay" ; v = vA ; sp = gnTable "ayg" "ayd" "uwayg"}
|
||||
} ;
|
||||
Sg2 => {
|
||||
s = table {Nom => "aad" ; {-Voc => "adiga" ;-} Abs => "ku"} ;
|
||||
a = Sg2 ; isPron = True ;
|
||||
s = table {Nom => "aad" ; Abs => "ku"} ;
|
||||
a = Sg2 ; isPron = True ; sp ="adiga" ;
|
||||
poss = {s = "aa" ; v = vA ; sp = gnTable "aag" "aad" "uwaag"}
|
||||
} ;
|
||||
Sg3 Masc => {
|
||||
s = table {Nom => "uu" ; {-Voc => "isaga" ;-} Abs => []} ;
|
||||
a = Sg3 Masc ; isPron = True ;
|
||||
s = table {Nom => "uu" ; Abs => []} ;
|
||||
a = Sg3 Masc ; isPron = True ; sp ="isaga" ;
|
||||
poss = {s = "iis" ; v = vI ; sp = gnTable "iis" "iis" "uwiis"}
|
||||
} ;
|
||||
Sg3 Fem => {
|
||||
s = table {Nom => "ay" ; {-Voc => "iyada" ;-} Abs => []} ;
|
||||
a = Sg3 Fem ; isPron = True ;
|
||||
s = table {Nom => "ay" ; Abs => []} ;
|
||||
a = Sg3 Fem ; isPron = True ; sp = "iyada" ;
|
||||
poss = {s = "eed" ; v = vE ; sp = gnTable "eed" "eed" "uweed"}
|
||||
} ;
|
||||
Pl1 Excl => {
|
||||
s = table {Nom => "aan" ; {-Voc => "annaga" ;-} Abs => "na"} ;
|
||||
a = Pl1 Incl ; isPron = True ;
|
||||
s = table {Nom => "aan" ; Abs => "na"} ;
|
||||
a = Pl1 Incl ; isPron = True ; sp ="annaga" ;
|
||||
poss = {s = "een" ; v = vE ; sp = gnTable "eenn" "eenn" "uweenn"}
|
||||
} ;
|
||||
Pl1 Incl => {
|
||||
s = table {Nom => "aynu" ; {-Voc => "innaga" ;-} Abs => "ina"} ;
|
||||
a = Pl1 Incl ; isPron = True ;
|
||||
s = table {Nom => "aynu" ; Abs => "ina"} ;
|
||||
a = Pl1 Incl ; isPron = True ; sp ="innaga" ;
|
||||
poss = {s = "een" ; v = vE ; sp = gnTable "eenn" "eenn" "uweenn"}
|
||||
} ;
|
||||
Pl2 => {
|
||||
s = table {Nom => "aad" ; {-Voc => "idinka" ;-} Abs => "idin"} ;
|
||||
a = Pl2 ; isPron = True ;
|
||||
s = table {Nom => "aad" ; Abs => "idin"} ;
|
||||
a = Pl2 ; isPron = True ; sp ="idinka" ;
|
||||
poss = {s = "iin" ; v = vI ; sp = gnTable "iinn" "iinn" "uwiinn"}
|
||||
} ;
|
||||
Pl3 => {
|
||||
s = table {Nom => "ay" ; {-Voc => "iyaga" ;-} Abs => []} ;
|
||||
a = Pl3 ; isPron = True ;
|
||||
s = table {Nom => "ay" ; Abs => []} ;
|
||||
a = Pl3 ; isPron = True ; sp = "iyaga" ;
|
||||
poss = {s = "ood" ; v = vO ; sp = gnTable "ood" "ood" "uwood"}
|
||||
} ;
|
||||
Impers => {
|
||||
s = table {Nom => "la" ; Abs => "??"} ;
|
||||
a = Impers ; isPron = True ;
|
||||
poss = {s = "??" ; v = vO ; sp = gnTable "??" "??" "??"}
|
||||
a = Impers ; isPron = True ; sp = "??" ;
|
||||
poss = {s = "??" ; v = vA ; sp = gnTable "??" "??" "??"}
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
-- Second series object pronouns, Sayeed p. 74-75
|
||||
-- For two non-3rd person object pronouns, e.g. "They took you away from me"
|
||||
secondObject : Agreement => Str = table {
|
||||
@@ -214,32 +218,31 @@ oper
|
||||
-- Det, Quant, Card, Ord
|
||||
|
||||
BaseQuant : Type = {
|
||||
s : Case => Str ;
|
||||
isPoss : Bool ;
|
||||
shortPoss : Str ; -- short form of possessive, e.g. family members
|
||||
} ;
|
||||
|
||||
Determiner : Type = BaseQuant ** {
|
||||
pref : Str ; -- Numerals ?
|
||||
s,
|
||||
sp : Gender => Case => Str ;
|
||||
d : NForm ; -- combination of number, state and vowel
|
||||
isNum : Bool ; -- whether to choose Numerative as the value of NForm
|
||||
d : NForm ; -- combination of number, state and vowel
|
||||
-- isNum : Bool ; -- placement in NP + whether to choose Numerative from CN
|
||||
} ;
|
||||
|
||||
Quant : Type = BaseQuant ** {
|
||||
s,
|
||||
sp : GenNum => Case => Str ;
|
||||
st : State ;
|
||||
v : Vowel ;
|
||||
} ;
|
||||
|
||||
Num : Type = {
|
||||
s : Str ; -- TODO check if enough
|
||||
s : State => Str ; -- TODO check if enough
|
||||
n : Number ; -- singular or plural
|
||||
isNum : Bool -- whether to choose Numerative as the value of NForm
|
||||
} ;
|
||||
|
||||
baseQuant : BaseQuant = {
|
||||
s = \\_ => [] ;
|
||||
isPoss = False ;
|
||||
shortPoss = []
|
||||
} ;
|
||||
@@ -249,7 +252,7 @@ oper
|
||||
defQuantBind : (bind : Bool) -> (s, kan, tan, kuwan : Str) -> Vowel -> Quant = \b,s,spm,spf,spp,v ->
|
||||
let bind : Str -> Str = \x -> case b of {False => x ; True => BIND ++ x} ;
|
||||
in baseQuant ** {
|
||||
s = \\c =>
|
||||
s = \\gn,c =>
|
||||
let nom = case v of {NA => "u" ; _ => s + "i"}
|
||||
in case c of {Nom => bind nom ; _ => bind s} ;
|
||||
sp = \\gn,c =>
|
||||
@@ -263,6 +266,7 @@ oper
|
||||
table {SgMasc => m ; SgFem => f ; _ => p} ;
|
||||
|
||||
indefQuant : Quant = baseQuant ** {
|
||||
s,
|
||||
sp = \\gn,c => [] ;
|
||||
st = Indefinite ;
|
||||
v = NA ; -- Will be ignored in DetQuant
|
||||
@@ -295,8 +299,8 @@ oper
|
||||
la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ;
|
||||
u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ;
|
||||
noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ;
|
||||
-- impersonal subject clitic combining with object clitics. TODO find out the rest of the forms.
|
||||
passive => mkPrep [] "la <1sg.obj>" "lagu" "la <1pl.obj>" "la <2pl.obj>" "la"
|
||||
-- impersonal subject clitic combining with object clitics.
|
||||
passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la"
|
||||
} ;
|
||||
|
||||
prepCombTable : Agreement => PrepCombination => Str = table {
|
||||
@@ -626,7 +630,10 @@ oper
|
||||
in prepCombTable ! agr ! combine vp.c2 vp.c3 ;
|
||||
|
||||
insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np ->
|
||||
let noun = if_then_Str np.isPron [] (np.s ! Abs) ;
|
||||
let noun = case <np.isPron,np.a> of {
|
||||
<False> => np.s ! Abs ;
|
||||
<True,Sg3 _|Pl3> => (pronTable ! np.a).sp ; -- long object pronoun for 3rd person object
|
||||
_ => [] } -- no long object for other pronouns
|
||||
in case vp.obj2.a of {
|
||||
Unassigned =>
|
||||
vp ** {obj2 = {
|
||||
@@ -652,7 +659,6 @@ oper
|
||||
} ;
|
||||
|
||||
passV2 : Verb2 -> VerbPhrase = \v2 -> useVc v2 ** {
|
||||
--s = forceAgr Impers v2.s ;
|
||||
c2 = passive ;
|
||||
c3 = v2.c2 ;
|
||||
} ;
|
||||
|
||||
Reference in New Issue
Block a user