Files
gf-rgl/src/zulu/ResZul.gf
2022-08-03 08:39:08 +02:00

1972 lines
77 KiB
Plaintext
Executable File

--# -path=.:../abstract:../common:../../prelude
resource ResZul = open Prelude,Predef,ParamX in {
param
ClassGender = C1_2 | C1a_2a | C3_4 | C5_6 | C7_8 | C9_10 | C11_10 | C9_6 | C14 | C15 | C17 ;
SemanticType = Human | Animate | Misc ;
NForm = NFull | NReduced | NPoss | NLoc ;
Agr = First Number | Second Number | Third ClassGender Number ;
-- SMood = SIndic | SPot | SSubj ; -- | SConsec ;
-- DMood = Princ | Part ; -- mood dimension that depends on grammatical context: principal and participial
CType = MainCl | RelCl ;
Aspect = Null | Prog | Excl ;
BasicTense = PresTense | FutTense | PastTense | RemFutTense | RemPastTense ;
-- ImpForm = Imper | Polite ;
-- Polarity = Pos | Neg ;
-- NOTE: Although Poulos+Msimang use "verb form" instead of mood,
-- we use VForm (verb form) to indicate combination of all parameters
-- regarding the verb, and hence will use use "mood" for convenience.
-- replacing BasicTense with Tense, just for now
-- VForm = VFIndic DMood Polarity BasicTense Aspect | VFPot DMood Polarity Aspect | VFSubj Polarity ;
-- VForm = VFIndic DMood Polarity BasicTense Aspect | VFPot DMood Polarity Aspect | VFSubj Polarity ;
VForm = VFIndic CType Polarity BasicTense ;
VPType = CopIdent | CopAssoc | CopDescr | CopEq | VNPCompl | NoComp | VSCompl | AdvComp | CopLoc ; -- VACompl |
AuxType = PartAux ; -- TODO: add SubjAux, InfAux, ConsecAux etc (p327)
AType = AdjType | RelType ;
AForm = AF1 | AF2 | AF3 ; -- two forms for implementing sound changes Poulos+Msimang p143, one for monosyllabic
SCForm = SC | SCVow | SCNeg | SCNegVow | SCPS | SCPart | SCVowP | SCBe | SCRP ;
OCForm = OC | OCAE | OCIOU | OCMono | OCThing ;
RCForm = RelC | RelCA ;
-- verb root characteristics
RForm = R_a | R_ile | R_e | R_i | R_anga ;
RInit = RA | RE | RI | RO | RU | RC ;
Syl = SylMono | SylMult ;
Voice = Active | Passive ;
QuantDef = Article Specificity | Demonstrative Distance ;
-- Definiteness = Indef | Def ;
Specificity = Spec | Nonspec ;
Distance = Dem1 | Dem2 | Dem3 ;
oper
prefix_nasal : Str -> Str = \r -> case r of {
"ph"+x => "mp" + x ;
"Ph"+x => "mP" + x ;
"bh"+x => "mb" + x ;
"Bh"+x => "mB" + x ;
(#nasal_de_asp|#nasal_de_asp_cap)+"h"+x => "n"+(take 1 r) + x ;
"hl"+x => "nhl"+x ;
"Hl"+x => "Nhl"+x ;
"h"+x => "nk"+x ;
"H"+x => "Nk"+x ;
"sh"+x => "ntsh"+x ;
"Sh"+x => "Ntsh"+x ;
"l"+x => "nd"+x ;
"L"+x => "Nd"+x ;
#nasal_m+x => "m"+r ;
#nasal_m_cap+x => "M"+r ;
#nasal_ng+x => "ng"+r ;
#nasal_ng_cap+x => "Ng"+r ;
#nasal+x => r ;
#nasal_cap+x => r ;
"p"+x => "mp" + x ;
"P"+x => "Mp" + x ;
#vowel_cap+x => "N" + r ;
#cons_cap+x => "N" + r ;
_ => "n"+r
} ;
--------------
-- PRONOUNS --
--------------
-- mkFullPron : Str -> Agr -> { s : NForm => Str ; agr : Agr ; empty : Str ; proDrop : Bool } = \s,agr -> {
-- s = s ;
-- agr = agr ;
-- empty = [] ;
-- proDrop = False
-- } ;
mkPron : Agr -> { s : NForm => Str ; agr : Agr ; empty : Str ; proDrop : Bool } = \agr -> {
s = table {
NFull => pron_stem!agr +"na" ;
NReduced => pron_stem!agr ;
NPoss => poss_pron_stem!agr ;
NLoc => case agr of {
First _ | Second Pl => "ki" ++BIND++ pron_stem!agr ;
_ => "ku" ++BIND++ pron_stem!agr
}
} ;
agr = agr ;
empty = [] ;
proDrop = False
} ;
full_pron : Str -> Str = \s -> s ++BIND++ "na" ;
pron_stem : Agr => Str = table {
First Sg => "mi" ;
First Pl => "thi" ;
Second Sg => "we" ;
Second Pl => "ni" ;
Third C1_2 Sg => "ye" ;
Third C1_2 Pl => "bo" ;
Third C1a_2a Sg => "ye" ;
Third C1a_2a Pl => "bo" ;
Third C3_4 Sg => "wo" ;
Third C3_4 Pl => "yo" ;
Third C5_6 Sg => "lo" ;
Third C5_6 Pl => "wo" ;
Third C7_8 Sg => "so" ;
Third C7_8 Pl => "zo" ;
Third C9_10 Sg => "yo" ;
Third C9_10 Pl => "zo" ;
Third C11_10 Sg => "lo" ;
Third C11_10 Pl => "zo" ;
Third C9_6 Sg => "yo" ;
Third C9_6 Pl => "wo" ;
Third C14 _ => "bo" ;
Third C15 _ => "kho" ;
Third C17 _ => "kho"
} ;
poss_pron_stem : Agr => Str = table {
First Sg => "mi" ;
First Pl => "thu" ;
Second Sg => "kho" ;
Second Pl => "nu" ;
Third C1_2 Sg => "khe" ;
Third C1_2 Pl => "bo" ;
Third C1a_2a Sg => "khe" ;
Third C1a_2a Pl => "bo" ;
Third C3_4 Sg => "wo" ;
Third C3_4 Pl => "yo" ;
Third C5_6 Sg => "lo" ;
Third C5_6 Pl => "wo" ;
Third C7_8 Sg => "so" ;
Third C7_8 Pl => "zo" ;
Third C9_10 Sg => "yo" ;
Third C9_10 Pl => "zo" ;
Third C11_10 Sg => "lo" ;
Third C11_10 Pl => "zo" ;
Third C9_6 Sg => "yo" ;
Third C9_6 Pl => "wo" ;
Third C14 _ => "bo" ;
Third C15 _ => "kho" ;
Third C17 _ => "kho"
} ;
dem_pron : Distance => Agr => Str = table {
Dem1 => table {
First Sg => "lo" ;
First Pl => "laba" ;
Second Sg => "lo" ;
Second Pl => "laba" ;
Third C1_2 Sg => "lo" ;
Third C1_2 Pl => "laba" ;
Third C1a_2a Sg => "lo" ;
Third C1a_2a Pl => "laba" ;
Third C3_4 Sg => "lo" ;
Third C3_4 Pl => "le" ;
Third C5_6 Sg => "leli" ;
Third C5_6 Pl => "la" ;
Third C7_8 Sg => "lesi" ;
Third C7_8 Pl => "lezi" ;
Third C9_10 Sg => "le" ;
Third C9_10 Pl => "lezi" ;
Third C11_10 Sg => "lolu" ;
Third C11_10 Pl => "lezi" ;
Third C9_6 Sg => "le" ;
Third C9_6 Pl => "la" ;
Third C14 _ => "lobu" ;
Third C15 _ => "lokhu" ;
Third C17 _ => "lapha"
} ;
Dem2 => table {
First Sg => "lowo" ;
First Pl => "labo" ;
Second Sg => "lowo" ;
Second Pl => "labo" ;
Third C1_2 Sg => "lowo" ;
Third C1_2 Pl => "labo" ;
Third C1a_2a Sg => "lowo" ;
Third C1a_2a Pl => "labo" ;
Third C3_4 Sg => "lowo" ;
Third C3_4 Pl => "leyo" ;
Third C5_6 Sg => "lelo" ;
Third C5_6 Pl => "lawo" ;
Third C7_8 Sg => "leso" ;
Third C7_8 Pl => "lezo" ;
Third C9_10 Sg => "leyo" ;
Third C9_10 Pl => "lezo" ;
Third C11_10 Sg => "lolo" ;
Third C11_10 Pl => "lezo" ;
Third C9_6 Sg => "leyo" ;
Third C9_6 Pl => "lawo" ;
Third C14 _ => "lobo" ;
Third C15 _ => "lokho" ;
Third C17 _ => "lapho"
} ;
Dem3 => table {
First Sg => "loya" ;
First Pl => "labaya" ;
Second Sg => "loya" ;
Second Pl => "labaya" ;
Third C1_2 Sg => "loya" ;
Third C1_2 Pl => "labaya" ;
Third C1a_2a Sg => "loya" ;
Third C1a_2a Pl => "labaya" ;
Third C3_4 Sg => "loya" ;
Third C3_4 Pl => "leya" ;
Third C5_6 Sg => "leliya" ;
Third C5_6 Pl => "lawaya" ;
Third C7_8 Sg => "lesiya" ;
Third C7_8 Pl => "leziya" ;
Third C9_10 Sg => "leya" ;
Third C9_10 Pl => "leziya" ;
Third C11_10 Sg => "loluya" ;
Third C11_10 Pl => "leziya" ;
Third C9_6 Sg => "leya" ;
Third C9_6 Pl => "lawaya" ;
Third C14 _ => "lobuya" ;
Third C15 _ => "lokhuya" ;
Third C17 _ => "laphaya"
}
} ;
dem_pron_na : Agr => Str = table {
First Sg => BIND++"na" ;
First Pl => [] ;
Second Sg => BIND++"na" ;
Second Pl => [] ;
Third C1_2 Sg => BIND++"na" ;
Third C1_2 Pl => [] ;
Third C1a_2a Sg => BIND++"na" ;
Third C1a_2a Pl => [] ;
Third C3_4 Sg => BIND++"na" ;
Third C3_4 Pl => BIND++"na" ;
Third C5_6 Sg => [] ;
Third C5_6 Pl => BIND++"na" ;
Third C7_8 Sg => [] ;
Third C7_8 Pl => [] ;
Third C9_10 Sg => BIND++"na" ;
Third C9_10 Pl => [] ;
Third C11_10 Sg => [] ;
Third C11_10 Pl => [] ;
Third C9_6 Sg => BIND++"na" ;
Third C9_6 Pl => BIND++"na" ;
Third C14 _ => [] ;
Third C15 _ => [] ;
Third C17 _ => []
} ;
-----------
-- VERBS --
-----------
regVerb : Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \root ->
{
s = table {
R_a => root ++BIND++ "a" ;
R_ile => case root of {
_+"el" => root ++BIND++ "e" ;
_+"al" => (tk 2 root) + "el" ++BIND++ "e" ;
_ => root ++BIND++ "ile"
} ;
R_e => case root of {
_+"al" => (tk 2 root) + "el" ++BIND++ "e" ;
_ => root ++BIND++ "e"
} ;
R_i => root ++BIND++ "i" ;
R_anga => root ++BIND++ "anga"
} ;
r = case root of {
"a"+_ => RA ;
"e"+_ => RE ;
"i"+_ => RI ;
"o"+_ => RO ;
"u"+_ => RU ;
_ => RC
} ;
syl = case root of {
_+#cons+#vowel+#cons+_ => SylMult ;
_ => SylMono
} ;
voice = Active
} ;
th_Verb : Str -> Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \th,thi ->
{
s = table {
R_a => thi ;
R_ile => th ++BIND++ "ile" ;
R_e => th ++BIND++ "e" ;
R_i => th ++BIND++ "i" ;
R_anga => th ++BIND++ "anga"
} ;
r = case th of {
"a"+_ => RA ;
"e"+_ => RE ;
"i"+_ => RI ;
"o"+_ => RO ;
"u"+_ => RU ;
_ => RC
} ;
syl = case th of {
_+#cons+#vowel+#cons+_ => SylMult ;
_ => SylMono
} ;
voice = Active
} ;
three_Verb : Str -> Str -> Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \root,r_a,r_ile -> {
s = table {
R_a => r_a ;
R_ile => r_ile ;
R_e => root ++BIND++ "e" ;
R_i => root ++BIND++ "i" ;
R_anga => root ++BIND++ "anga"
} ;
r = case root of {
"a"+_ => RA ;
"e"+_ => RE ;
"i"+_ => RI ;
"o"+_ => RO ;
"u"+_ => RU ;
_ => RC
} ;
syl = case root of {
_+#cons+#vowel+#cons+_ => SylMult ;
_ => SylMono
} ;
voice = Active
} ;
four_Verb : Str -> Str -> Str -> Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \root,r_a,r_ile,r_e -> {
s = table {
R_a => r_a ;
R_ile => r_ile ;
R_e => r_e ;
R_i => root ++BIND++ "i" ;
R_anga => root ++BIND++ "anga"
} ;
r = case root of {
"a"+_ => RA ;
"e"+_ => RE ;
"i"+_ => RI ;
"o"+_ => RO ;
"u"+_ => RU ;
_ => RC
} ;
syl = case root of {
_+#cons+#vowel+#cons+_ => SylMult ;
_ => SylMono
} ;
voice = Active
} ;
-- irregVerb : Str -> Str -> Str -> Str -> Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \hamba,hambile,hambe,hambi,hambanga -> {
-- s = table {
-- R_a => hamba ;
-- R_ile => hambile ;
-- R_e => hambe ;
-- R_i => hambi ;
-- R_anga => hambanga
-- } ;
-- r = case root of {
-- "a"+_ => RA ;
-- "e"+_ => RE ;
-- "i"+_ => RI ;
-- "o"+_ => RO ;
-- "u"+_ => RU ;
-- _ => RC
-- } ;
-- syl = case root of {
-- _+#cons+#vowel+#cons+_ => SylMult ;
-- _ => SylMono
-- } ;
-- voice = Active
-- } ;
passiveVerb : Str -> { s : RForm => Str ; r : RInit ; syl : Syl ; voice : Voice } = \root ->
{
s = table {
R_a => root ++BIND++ "a" ;
R_ile => root ++BIND++ "ile" ;
R_e => root ++BIND++ "e" ;
R_i => root ++BIND++ "i" ;
R_anga => root ++BIND++ "anga"
} ;
r = case root of {
"a"+_ => RA ;
"e"+_ => RE ;
"i"+_ => RI ;
"o"+_ => RO ;
"u"+_ => RU ;
_ => RC
} ;
syl = case root of {
_+#cons+#vowel+#cons+_ => SylMult ;
_ => SylMono
} ;
voice = Passive
} ;
-- Determine which form of the verb root to use
-- we're keeping the case statement for when we add back -e and -ile
rform : VForm -> Bool -> RForm = \vform,longform -> case longform of {
True => case vform of {
VFIndic _ Pos PresTense => R_a ;
VFIndic MainCl Neg PresTense => R_i ;
VFIndic RelCl Neg PresTense => R_i ;
VFIndic _ _ FutTense => R_a ;
VFIndic _ _ RemFutTense => R_a ;
VFIndic _ Pos PastTense => R_ile ;
VFIndic _ Neg PastTense => R_anga ;
VFIndic _ Pos RemPastTense => R_a ;
VFIndic _ Neg RemPastTense => R_anga
} ;
False => case vform of {
VFIndic _ Pos PresTense => R_a ;
VFIndic MainCl Neg PresTense => R_i ;
VFIndic RelCl Neg PresTense => R_i ;
VFIndic _ _ FutTense => R_a ;
VFIndic _ _ RemFutTense => R_a ;
VFIndic _ Pos PastTense => R_e ;
VFIndic _ Neg PastTense => R_anga ;
VFIndic _ Pos RemPastTense => R_a ;
VFIndic _ Neg RemPastTense => R_anga
}
} ;
-- VERB MORPHEMES --
-- tense prefix
tensePref : VForm -> RInit -> Syl -> Str = \vform,r,syl ->
case <r,vform,syl> of {
<RC,VFIndic _ Pos FutTense,SylMono> => "zoku" ++BIND ;
<RC,VFIndic _ Pos FutTense,_> => "zo" ++BIND ;
<_,VFIndic _ Pos FutTense,_> => "zokw" ++BIND ;
<RC,VFIndic _ Neg FutTense,_> => "zuku" ++BIND ;
<_,VFIndic _ Neg FutTense,_> => "zukw" ++BIND ;
<RC,VFIndic _ Pos RemFutTense,SylMono> => "yoku" ++BIND ;
<RC,VFIndic _ Pos RemFutTense,_> => "yo" ++BIND ;
<_,VFIndic _ Pos RemFutTense,_> => "yokw" ++BIND ;
<RC,VFIndic _ Neg RemFutTense,_> => "yuku" ++BIND ;
<_,VFIndic _ Neg RemFutTense,_> => "yukw" ++BIND ;
<(RA|RE),VFIndic _ _ RemPastTense> => [] ;
<_,VFIndic _ Pos RemPastTense> => "a" ++BIND ;
<_,VFIndic _ _ _,_> => [] --;
-- VFPot _ _ _ => [] ;
-- VFSubj _ => []
} ;
-- negative prefix
negPref : VForm -> Str = \vform ->
case vform of {
VFIndic _ Neg _ => "a"++BIND ;
VFIndic _ _ _ => []
} ;
-- TODO : sound rules to choose between nge and nga
-- negPref2 : VForm -> Str = \vform ->
-- case vform of {
-- VFIndic Part Neg FutTense Null => "nga" ++BIND ; -- sometimes nge? p274
-- -- VFIndic Part Neg _ _ => pre { "z" => "nge" ; _ => "nga" } ++BIND ;
-- VFIndic Part Neg _ _ => "nga" ++BIND ;
-- VFIndic _ _ _ _ => [] ;
-- VFPot _ _ _ => [] ;
-- VFSubj Neg => pre { "z" => "nge" ; _ => "nga" } ++BIND ;
-- VFSubj Pos => []
-- } ;
negPrefNga : VForm -> Str = \vform -> case vform of {
VFIndic _ Neg _ => "nga" ;
VFIndic _ Pos _ => []
} ;
negPrefNge : VForm -> Str = \vform -> case vform of {
VFIndic _ Neg _ => "nge" ;
VFIndic _ Pos _ => []
} ;
icompNeg1 : VForm -> Str = \vform -> case vform of {
VFIndic _ Neg PresTense => "a"++BIND ;
VFIndic _ _ _ => []
} ;
icompNeg2 : VForm -> Str = \vform -> case vform of {
VFIndic _ Neg _ => "nga"++BIND ;
VFIndic _ _ _ => []
} ;
-- -- progressive prefix
-- progPref : VForm -> Str = \vform ->
-- case vform of {
-- VFIndic _ Pos PastTense Prog => nonExist ; -- progressive past does not occur
-- VFIndic _ Pos PastTense _ => [] ;
-- VFIndic _ Pos _ Prog => "sa" ++BIND ;
-- VFIndic _ Pos _ _ => [] ;
-- VFIndic _ Neg FutTense Prog => "se" ++BIND ;
-- VFIndic _ Neg _ Prog => "sa" ++BIND ;
-- VFIndic _ _ _ Prog => nonExist ;
-- VFIndic _ _ _ _ => [] ;
-- VFPot _ _ Prog => "se" ++BIND ;
-- VFPot _ _ _ => [] ;
-- VFSubj _ => []
--
-- } ;
-- progressive prefix
-- progPref : VForm -> Str = \vform ->
-- case vform of {
-- VFIndic _ Pos PastTense _ => nonExist ; -- progressive past does not occur
-- -- VFIndic _ Pos PastTense _ => [] ;
-- VFIndic _ Pos _ _ => "sa" ++BIND ;
-- -- VFIndic _ Pos _ _ => [] ;
-- VFIndic _ Neg FutTense _ => "se" ++BIND ;
-- VFIndic _ Neg _ _ => "sa" ++BIND ;
-- VFIndic _ _ _ _ => nonExist ;
-- -- VFIndic _ _ _ _ => [] ;
-- VFPot _ _ _ => "se" ++BIND ;
-- -- VFPot _ _ _ => [] ;
-- VFSubj _ => nonExist
--
-- } ;
-- exclusive se prefix
-- exclSePref : VForm -> Str = \vform ->
-- case vform of {
-- VFIndic _ Pos _ Excl => "se"++BIND ;
-- VFIndic _ _ _ _ => [] ;
-- VFPot _ Pos Excl => "se"++BIND ;
-- VFPot _ _ _ => [] ;
-- VFSubj _ => []
-- } ;
--
-- -- exclusive ka prefix
-- exclKaPref : VForm -> Str = \vform ->
-- case vform of {
-- VFIndic _ Neg (PresTense | FutTense) Excl => "ka" ++BIND ;
-- VFIndic _ _ _ _ => [] ;
-- VFPot _ _ _ => [] ;
-- VFSubj _ => []
-- } ;
-- potential prefix
-- potPref : VForm -> Str = \vform ->
-- case vform of {
-- VFPot _ Pos _ => "nga" ++BIND ;
-- VFPot _ Neg _ => "nge" ++BIND ;
-- VFIndic _ _ _ _ => [] ;
-- VFSubj _ => []
-- } ;
-- VForm = VFIndic DMood Polarity BasicTense Aspect | VFPot DMood Polarity Aspect | VFSubj Polarity ;
-- aux_be : VForm -> Agr -> Str = \vform,agr ->
-- let
-- sc = subjConc vform agr False ;
-- scvow = subjConc vform agr True ;
-- short_be = case agr of {
-- -- Second Pl => sc ++ "bu" ;
-- -- Third C3_4 Sg => sc ++ "bu" ;
-- -- Third C3_4 Pl => sc ++ "bi" ;
-- -- Third C9_6 Sg | Third C9_10 Sg => sc ++ "bi" ;
-- First _ | Second _ | Third _ _ => subjConcLookup!agr!SCBe
-- }
-- in
-- case vform of {
-- VFIndic Princ Pos PresTense _ => [] ;
-- VFIndic Princ Pos PerfTense _ => short_be ++BIND ; -- 2021-01-26, chose to only implement short form
-- VFIndic Princ Pos FutTense _ => sc ++ "zobe" ;
-- VFIndic Princ Pos PastTense _ => scvow ++ "abe" ;
--
-- VFIndic Princ Neg PresTense _ => [] ;
-- VFIndic Princ Neg PerfTense _ => short_be ++BIND ;
-- VFIndic Princ Neg FutTense _ => sc ++ "zobe" ;
-- VFIndic Princ Neg PastTense _ => scvow ++ "abe" ;
--
-- VFIndic Part Pos PresTense _ => [] ;
-- VFIndic Part Pos PerfTense _ => short_be ++BIND ;
-- VFIndic Part Pos FutTense _ => sc ++ "zobe" ;
-- VFIndic Part Pos PastTense _ => scvow ++ "abe" ;
--
-- VFIndic Part Neg PresTense _ => [] ;
-- VFIndic Part Neg PerfTense _ => short_be ++BIND ;
-- VFIndic Part Neg FutTense _ => sc ++ "zobe" ;
-- VFIndic Part Neg PastTense _ => scvow ++ "abe" ;
--
-- VFPot _ Pos _ => sc ++ "ngaba" ;
-- VFPot _ Neg _ => sc ++ "ngebe" ;
-- VFSubj Pos => sc ++ "be" ++BIND ;
-- VFSubj Neg => sc ++ "ngabi"
-- } ;
-------------
-- ADVERBS --
-------------
regAdv : Str -> { s : Str ; asp : Aspect ; reqLocS : Bool } = \adv ->
{
s = adv ;
asp = Null ;
reqLocS = False
} ;
aspAdv : Str -> Aspect -> { s : Str ; asp : Aspect ; reqLocS : Bool } = \adv,asp ->
{
s = adv ;
asp = asp ;
reqLocS = False
} ;
-- together with
withPref : RInit => Str = table {
RU => "no" ;
RI => "ne" ;
RO => "no" ;
_ => "na"
} ;
-- just like
eqPref : RInit => Str = table {
RU => "njengo" ;
RI => "njenge" ;
RO => "njengo" ;
_ => "njenga"
} ;
-- as big as
eqSizePref : RInit => Str = table {
RU => "ngango" ;
RI => "ngange" ;
RO => "ngango" ;
_ => "nganga"
} ;
-- with
instrPref : RInit => Str = table {
RU => "ngo" ;
RI => "nge" ;
RO => "ngo" ;
_ => "nga"
} ;
--------------------
-- QUALIFICATIVES --
--------------------
regAdj : Str -> { s : AForm => Str ; empty : Str ; t : AType } = \a ->
{
s = table {
AF1 => a ;
AF2 => prefix_nasal a ;
AF3 => case a of {
#cons+#cons*+#vowel => "u"+a ;
_ => a
}
} ;
-- b = case a of {
-- ("kh"|"th"|"sh"|"b"|"f"|"hl")+_ => True ;
-- ("m"|"n")+_ => True ;
-- _ => False
-- } ;
empty = [] ;
t = AdjType
} ;
relAdj : Str -> { s : AForm => Str ; empty : Str ; t : AType } = \a ->
{
s = \\_ => a ;
-- b = case a of {
-- ("kh"|"th"|"sh"|"b"|"f"|"hl")+_ => True ;
-- ("m"|"n")+_ => True ;
-- _ => False
-- } ;
empty = [] ;
t = RelType
} ;
rel_yo_2 : Str = BIND++"yo" ;
relSuf : VForm -> Str = \vform -> case vform of {
VFIndic _ Pos PresTense => rel_yo_2 ;
VFIndic _ Pos PastTense => rel_yo_2 ;
VFIndic _ _ _ => []
} ;
-- chooses the form of the root to use for N-prefixes
aformN : Agr -> AForm = \agr ->
case agr of {
Third C1_2 Sg => AF3 ;
Third C1a_2a Sg => AF3 ;
Third C3_4 Sg => AF3 ;
Third C7_8 Pl => AF2 ;
Third C9_10 Sg => AF2 ;
Third C9_10 Pl => AF2 ;
Third C9_6 Sg => AF2 ;
Third C11_10 Pl => AF2 ;
_ => AF1
} ;
-- TODO: check ; RInit is used to indicate what precedes the adj pref
adjPrefLookup : Agr => VForm => Str =
table {
Third C1_2 Sg => table { VFIndic _ _ _ => "m"++BIND } ;
Third C1_2 Pl => table { VFIndic _ _ _ => "ba"++BIND } ;
Third C1a_2a Sg => table { VFIndic _ _ _ => "m"++BIND } ;
Third C1a_2a Pl => table { VFIndic _ _ _ => "ba"++BIND } ;
Third C3_4 Sg => table { VFIndic _ _ _ => "m"++BIND } ;
Third C3_4 Pl => table { VFIndic _ _ _ => "mi"++BIND } ;
Third C5_6 Sg => table { VFIndic _ _ _ => "li"++BIND } ;
Third C5_6 Pl => table { VFIndic _ _ _ => "ma"++BIND } ;
Third C7_8 Sg => table { VFIndic _ _ _ => "si"++BIND } ;
Third C7_8 Pl => table { VFIndic _ _ _ => "zi"++BIND } ; -- nasal for 8,9,10 assumed to be fixed to root
Third C9_10 Sg => table {
VFIndic MainCl Pos PresTense => "yi" ++BIND ;
VFIndic _ Pos PresTense => [] ;
VFIndic RelCl Neg PresTense => [] ;
VFIndic _ _ FutTense => "yi"++BIND ;
VFIndic _ _ RemFutTense => "yi"++BIND ;
VFIndic _ _ PastTense => "yi" ++BIND ;
VFIndic _ _ RemPastTense => "yi" ++BIND ;
VFIndic _ _ _ => "i"++BIND
} ;
Third C9_10 Pl => table { VFIndic _ _ _ => "zi"++BIND } ;
Third C11_10 Sg => table { VFIndic _ _ _ => "lu"++BIND } ;
Third C11_10 Pl => table { VFIndic _ _ _ => "zi"++BIND } ;
Third C9_6 Sg => table {
VFIndic MainCl Pos PresTense => "yi" ++BIND ;
VFIndic _ Pos PresTense => [] ;
VFIndic RelCl Neg PresTense => [] ;
VFIndic _ _ FutTense => "yi"++BIND ;
VFIndic _ _ RemFutTense => "yi"++BIND ;
VFIndic _ _ PastTense => "yi" ++BIND ;
VFIndic _ _ RemPastTense => "yi" ++BIND ;
VFIndic _ _ _ => "i"++BIND
} ;
Third C9_6 Pl => table { VFIndic _ _ _ => "ma"++BIND } ;
Third C14 _ => table { VFIndic _ _ _ => "bu"++BIND } ;
Third C15 _ => table { VFIndic _ _ _ => "ku"++BIND } ;
Third C17 _ => table { VFIndic _ _ _ => "ku"++BIND } ;
First Sg => table { VFIndic _ _ _ => "m"++BIND } ;
First Pl => table { VFIndic _ _ _ => "ba"++BIND } ;
Second Sg => table { VFIndic _ _ _ => "m"++BIND } ;
Second Pl => table { VFIndic _ _ _ => "om"++BIND }
} ;
adjPref : Agr -> VForm -> Str = \agr,vform -> case vform of {
-- VFIndic RelCl Pos PresTense => case agr of {
-- -- (First Sg | Second Sg | Third C1_2 Sg | Third C1a_2a Sg | Third C3_4 Sg) => "m"++BIND ;
-- -- Third C3_4 Pl => "mi" ++BIND ;
-- -- (First Pl | Second Pl | Third _ _) => []
-- relAdjPrefLookup!agr
-- } ;
VFIndic _ _ _ => adjPrefLookup!agr!vform
} ;
atwhichPhiPref : Agr => Str =
table {
Third C1_2 Sg => "mu" ;
Third C1_2 Pl => "ba" ;
Third C1a_2a Sg => "mu" ;
Third C1a_2a Pl => "ba" ;
Third C3_4 Sg => "mu" ;
Third C3_4 Pl => "mi" ;
Third C5_6 Sg => "li" ;
Third C5_6 Pl => "ma" ;
Third C7_8 Sg => "si" ;
Third C7_8 Pl => "zi" ;
Third C9_10 Sg => "yi" ;
Third C9_10 Pl => "zi" ;
Third C11_10 Sg => "lu" ;
Third C11_10 Pl => "zi" ;
Third C9_6 Sg => "yi" ;
Third C9_6 Pl => "ma" ;
Third C14 _ => "bu" ;
Third C15 _ => "ku" ;
Third C17 _ => "ku" ;
First Sg => "mu" ;
First Pl => "ba" ;
Second Sg => "mu" ;
Second Pl => "om"
} ;
-----------
-- NOUNS --
-----------
-- worst case
mkNoun : (noms,nomp,locs,locp : Str) -> ClassGender -> { s : Number => NForm => Str ; c : ClassGender ; empty : Str } =
\noms,nomp,locs,locp,cg ->
let
sg_agr = Third cg Sg ;
pl_agr = Third cg Pl ;
in
{
s = table {
Sg => table {
NFull => noms ;
NReduced => (drop_init_vowel noms) ;
NPoss => (drop_init_vowel noms) ;
NLoc => locs
} ;
Pl => table {
NFull => nomp ;
NReduced => (drop_init_vowel nomp) ;
NPoss => (drop_init_vowel nomp) ;
NLoc => locp
}
} ;
c = cg ;
empty = []
} ;
semiRegNoun : (root,locs,locp : Str) -> ClassGender -> { s : Number => NForm => Str ; c : ClassGender ; empty : Str } =
\root,locs,locp,cg ->
let
noms : Str = nomNoun root Sg cg ;
nomp : Str = nomNoun root Pl cg ;
in
mkNoun noms nomp locs locp cg ;
mkELocN : (root : Str) -> ClassGender -> { s : Number => NForm => Str ; c : ClassGender ; empty : Str } =
\root,cg ->
let
noms : Str = nomNoun root Sg cg ;
nomp : Str = nomNoun root Pl cg ;
locs : Str = onlyLocPrefix root Sg cg ;
locp : Str = onlyLocPrefix root Pl cg ;
in
mkNoun noms nomp locs locp cg ;
regNoun : Str -> ClassGender -> { s : Number => NForm => Str ; c : ClassGender ; empty : Str } =
\root,cg ->
let
noms : Str = nomNoun root Sg cg ;
nomp : Str = nomNoun root Pl cg ;
locs : Str = locNoun root Sg cg ;
locp : Str = locNoun root Pl cg ;
empty = []
in
mkNoun noms nomp locs locp cg ;
kwaProperName : Str -> ClassGender -> { s : Number => NForm => Str ; c : ClassGender ; empty : Str } =
\root,cg ->
let
noms : Str = nomNoun root Sg cg ;
nomp : Str = nomNoun root Sg cg ;
locs : Str = "Kwa"+root ;
locp : Str = "Kwa"+root ;
in
mkNoun noms nomp locs locp cg ;
initNP : Bool -> Agr -> RInit = \ispron,agr -> case ispron of {
True => RC ;
False => nominit!agr
} ;
nominit : Agr => RInit =
table {
Third C1_2 Sg => RU ;
Third C1_2 Pl => RA ;
Third C1a_2a Sg => RU ;
Third C1a_2a Pl => RO ;
Third C3_4 Sg => RU ;
Third C3_4 Pl => RI ;
Third C5_6 Sg => RI ;
Third C5_6 Pl => RA ;
Third C7_8 Sg => RI ;
Third C7_8 Pl => RI ;
Third C9_10 Sg => RI ;
Third C9_10 Pl => RI ;
Third C11_10 Sg => RU ;
Third C11_10 Pl => RI ;
Third C9_6 Sg => RI ;
Third C9_6 Pl => RA ;
Third C14 _ => RU ;
Third C15 _ => RU ;
Third C17 _ => RU ;
(First _ | Second _ ) => RC
} ;
locinit : Agr => RInit =
table {
Third C1_2 Sg => RC ;
Third C1_2 Pl => RC ;
Third C1a_2a Sg => RC ;
Third C1a_2a Pl => RC ;
Third _ _ => RE ;
(First _ | Second _ ) => RC
} ;
onlyLocPrefix : Str -> Number -> ClassGender -> Str = \root,n,cg ->
case <cg,n> of
{
<C1_2,Sg> => case root of {
_+#cons+#vowel+#cons+_+#vowel+_ => "kum"+root ;
_ => "kumu"+root
} ; -- umu for single syllables, um for the rest
<C1_2,Pl> => "kuba"+root ; -- abe for tribes or guilds
<C1a_2a,Sg> => "ku"+root ;
<C1a_2a,Pl> => "ko"+root ;
<C3_4,Sg> => case root of {
("m"|"M")+_ => "e"+root ;
_ => "em"+root
} ;
<C3_4,Pl> => "emi"+root ;
<C5_6,Sg> => case root of {
("i"|"I")+_ => "e" + (last root) ;
(#vowel|#vowel_cap)+_ => "el" + root ;
_ => "e"+root -- ili long form (not used?)
} ;
<C5_6,Pl> => case root of {
("i"|"I")+_ => "eme"+ (last root) ;
(#vowel|#vowel_cap)+_ => "em"+root ;
_ => "ema"+root
} ; -- ame for roots starting with i
<C7_8,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "es"+root ;
_ => "esi"+root
} ; -- is for roots starting with vowel
<C7_8,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "ez"+root ;
_ => "ezi"+root -- iz for roots starting with vowel
} ;
<C9_10,Sg> => "e"+(prefix_nasal root) ; -- em for labial, en for alveolar (TODO: does this correctly split options?)
<C9_10,Pl> => "ezi"+(prefix_nasal root) ; -- izim for labial, izin for alveolar (TODO: does this correctly split options?)
<C11_10,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "olw" + root ;
("w"|"W")+_ => "ol"+root ;
_ => "o"+root
} ;
<C11_10,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "ezilw" + root ;
("w"|"W")+_ => "ezil" + root ;
_ => "ezi"+(prefix_nasal root)
} ; -- izim for labial, izin for alveolar, izi(n|m)k for roots starting with kh
<C9_6,Sg> => "e"+(prefix_nasal root) ; -- em for labial, en for alveolar (TODO: does this correctly split options?)
<C9_6,Pl> => case root of {
("i"|"I")+_ => "eme"+root ;
_ => "ema"+root
} ; -- ame for roots starting with i
<C14,_> => "ebu"+root ;
<C15,_> => case root of {
("a"|"e"|"A"|"E")+_ => "ekw"+root ;
(#cons|"y"|#cons_cap|"Y")+_ => "eku"+root ;
_ => "ek"+root
} ; -- ukw for roots starting with a/e, uk for roots starting with o
<C17,_> => "eku"+root -- sometimes ukw
} ;
-- Src: Doke, Linda Hall
addLocSuffix : Str -> Str = \root ->
case root of
{
_+"mbo" => (tk 3 root) + "njeni" ;
_+"mbu" => (tk 3 root) + "njini" ;
_+"pho" => (tk 3 root) + "sheni" ;
_+"bho" => (tk 3 root) + "jeni" ;
_+"phu" => (tk 3 root) + "shini" ;
_+"bhu" => (tk 3 root) + "jini" ;
_+"bo" => (tk 2 root) + "tsheni" ;
_+"bu" => (tk 2 root) + "tshini" ;
_+"mo" => (tk 2 root) + "nyeni" ;
_+"mu" => (tk 2 root) + "nyini" ;
_+("a"|"e") => (init root)+"eni" ;
_+"i" => (init root)+"ini" ;
_+"wu" => (init root)+"ini" ;
_+"wo" => (init root)+"eni" ;
_+"o" => (init root)+"weni" ;
_+"u" => (init root)+"wini" ;
_ => root+"ini"
} ;
drop_init_vowel : Str -> Str = \s ->
case s of {
("a"|"e"|"i"|"o"|"u")+_ => (drop 1 s) ;
_ => s
} ;
vowel : pattern Str = #("a"|"e"|"i"|"o"|"u") ;
vowel_cap : pattern Str = #("A"|"E"|"I"|"O"|"U") ;
cons : pattern Str = #("b"|"c"|"d"|"f"|"g"|"h"|"j"|"k"|"l"|"m"|"n"|"p"|"q"|"r"|"s"|"t"|"v"|"w"|"x"|"y"|"z") ;
cons_cap : pattern Str = #("B"|"C"|"D"|"F"|"G"|"H"|"J"|"K"|"L"|"M"|"N"|"P"|"Q"|"R"|"S"|"T"|"V"|"W"|"X"|"Y"|"Z") ;
labial_cons : pattern Str = #("p"|"b"|"f"|"v"|"w") ;
alveolar_cons : pattern Str = #("s"|"d"|"t"|"z") ;
nasal_de_asp : pattern Str = #("t"|"k"|"x"|"c"|"q") ;
nasal_de_asp_cap : pattern Str = #("T"|"K"|"X"|"C"|"Q") ;
nasal_m : pattern Str = #("v"|"f"|"b") ;
nasal_m_cap : pattern Str = #("V"|"F"|"B") ;
nasal_ng : pattern Str = #("x"|"c"|"q") ;
nasal_ng_cap : pattern Str = #("X"|"C"|"Q") ;
nasal : pattern Str = #("n"|"m") ;
nasal_cap : pattern Str = #("N"|"M") ;
nomNoun : Str -> Number -> ClassGender -> Str = \root,n,cg ->
case <cg,n> of
{
<C1_2,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "um"+root ;
_+#cons+#vowel+#cons+_+#vowel+_ => "um"+root ;
_ => "umu"+root
} ; -- umu for single syllables, um for the rest
<C1_2,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "ab"+root ;
_ => "aba"+root -- abe for tribes or guilds
} ;
<C1a_2a,Sg> => "u"+root ;
<C1a_2a,Pl> => "o"+root ;
<C3_4,Sg> => case root of {
("m"|"M")+_+#vowel+#cons+_+#vowel+_ => "u"+root ;
_+(#cons|"y")+#vowel+#cons+_+#vowel+_ => "um"+root ;
("o"|"O")+_ => "um"+root ;
_ => "umu"+root
} ; -- umu for single syllables, um for the rest
<C3_4,Pl> => "imi"+root ;
<C5_6,Sg> => case root of {
("i"|"I")+_ => root ;
(#vowel|#vowel_cap)+_ => "il"+root ;
_ => "i"+root -- ili long form (not used?)
} ;
<C5_6,Pl> => case root of {
("i"|"I")+_ => "ame"+(drop 1 root) ;
(#vowel|#vowel_cap)+_ => "am"+root ;
_ => "ama"+root
} ; -- ame for roots starting with i
<C7_8,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "is"+root ;
_ => "isi"+root
} ; -- is for roots starting with vowel
<C7_8,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "iz"+root ;
_ => "izi" + root
} ;
<C9_10,Sg> => "i" + prefix_nasal root ;
<C9_10,Pl> => "izi" + prefix_nasal root ;
<C11_10,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "ulw"+root ;
("w"|"W")+_ => "ul"+root ;
_ => "u"+root
} ;
<C11_10,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "izilw"+root ;
("w"|"W")+_ => "izil"+root ;
_ => "izi" + prefix_nasal root
} ;
<C9_6,Sg> => "i" + prefix_nasal root ;
<C9_6,Pl> => case root of {
("i"|"I")+_ => "ame"+root ;
_ => "ama"+root
} ; -- ame for roots starting with i
<C14,_> => "ubu"+root ;
<C15,_> => case root of {
("a"|"e"|"A"|"E")+_ => "ukw"+root ;
(#cons|#cons_cap|"y"|"Y")+_ => "uku"+root ;
_ => "uk"+root
} ; -- ukw for roots starting with a/e, uk for roots starting with o
<C17,_> => "uku"+root -- sometimes ukw
} ;
locNoun : Str -> Number -> ClassGender -> Str = \root,n,cg ->
case <cg,n> of
{
<C1_2,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "kum"+root ;
_+#cons+#vowel+#cons+_+#vowel+_ => "kum"+root ;
_ => "kumu"+root
} ; -- umu for single syllables, um for the rest
<C1_2,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "kub"+root ;
_ => "kuba"+root -- abe for tribes or guilds
} ;
<C1a_2a,Sg> => "ku"+root ;
<C1a_2a,Pl> => "ko"+root ;
<C3_4,Sg> => case root of {
("m"|"M")+_ => "e"+(addLocSuffix root) ;
_ => "em"+(addLocSuffix root)
} ;
<C3_4,Pl> => "emi"+(addLocSuffix root) ;
<C5_6,Sg> => case root of {
("i"|"I")+_ => "e"+(addLocSuffix (drop 1 root)) ;
(#vowel|#vowel_cap)+_ => "el"+(addLocSuffix root) ;
_ => "e"+(addLocSuffix root) -- ili long form (not used?)
} ;
<C5_6,Pl> => case root of {
("i"|"I")+_ => "eme"+(addLocSuffix (drop 1 root)) ;
(#vowel|#vowel_cap)+_ => "em"+(addLocSuffix root) ;
_ => "ema"+(addLocSuffix root)
} ; -- ame for roots starting with i
<C7_8,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "es"+(addLocSuffix root) ;
_ => "esi"+(addLocSuffix root)
} ; -- is for roots starting with vowel
<C7_8,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "ez"+(addLocSuffix root) ;
_ => "ezi"+(addLocSuffix root) -- iz for roots starting with vowel
} ;
<C9_10,Sg> => "e"+(addLocSuffix (prefix_nasal root)) ; -- em for labial, en for alveolar (TODO: does this correctly split options?)
<C9_10,Pl> => "ezi"+(addLocSuffix (prefix_nasal root)) ; -- izim for labial, izin for alveolar (TODO: does this correctly split options?)
<C11_10,Sg> => case root of {
(#vowel|#vowel_cap)+_ => "olw"+(addLocSuffix root) ;
("w"|"W")+_ => "ol"+(addLocSuffix root) ;
_ => "o"+(addLocSuffix root)
} ;
<C11_10,Pl> => case root of {
(#vowel|#vowel_cap)+_ => "ezilw"+(addLocSuffix root) ;
("w"|"W")+_ => "ezil"+(addLocSuffix root) ;
_ => "ezi"+(addLocSuffix (prefix_nasal root)) -- izim for labial, izin for alveolar, izi(n|m)k for roots starting with kh
} ;
<C9_6,Sg> => "e"+(addLocSuffix (prefix_nasal root)) ; -- em for labial, en for alveolar (TODO: does this correctly split options?)
<C9_6,Pl> => case root of {
("i"|"I")+_ => "eme"+(addLocSuffix root) ;
_ => "ema"+(addLocSuffix root)
} ; -- ame for roots starting with i
<C14,_> => "ebu"+(addLocSuffix root) ;
<C15,_> => case root of {
("a"|"e"|"A"|"E")+_ => "ekw"+(addLocSuffix root) ;
(#cons|"y"|#cons_cap|"Y")+_ => "eku"+root ;
_ => "ek"+(addLocSuffix root)
} ; -- ukw for roots starting with a/e, uk for roots starting with o
<C17,_> => "eku"+(addLocSuffix root) -- sometimes ukw
} ;
locS : Agr => Str = table {
Third C1_2 _ => [] ;
Third C1a_2a _ => [] ;
Third _ _ => "s"++BIND ;
(First _ | Second _ ) => []
} ;
-- loc_n_cop_pref : VForm -> Agr -> Str = \vform,agr -> case vform of {
-- VFIndic _ Neg PresTense => kho_cop vform agr ;
-- VFIndic _ _ _ => id_pre_cop_pref vform agr
-- } ;
loc_n_cop_base : {
empty : Str ;
s : NForm => Str ;
agr : Agr ;
i : RInit ;
proDrop : Bool ;
isPron : Bool ;
} -> VForm -> Str = \np,vform -> case vform of {
VFIndic _ Neg PresTense => np.s!NLoc ;
VFIndic _ _ _ => locS!np.agr ++ np.s!NLoc
} ;
lin_NP : {
empty : Str ;
s : NForm => Str ;
mod : Str ;
dem : Str ;
predet_pre : Str ;
predet_post : Str ;
agr : Agr ;
proDrop : Bool ;
isPron : Bool ;
-- reqLocS : Bool ;
qdef : QuantDef
} -> Str = \np ->
np.predet_pre ++
case <np.qdef,np.isPron> of {
<Article d,_> => np.s ! NFull ++ np.mod ;
<Demonstrative d,False> => np.dem ++ np.s ! NReduced ++ np.mod ;
<Demonstrative d,True> => np.dem ++ np.s ! NFull ++ np.mod
}
++ np.predet_post ;
loc_NP : {
empty : Str ;
s : NForm => Str ;
-- mod : Str ;
-- dem : Str ;
-- predet_pre : Str ;
-- predet_post : Str ;
agr : Agr ;
proDrop : Bool ;
isPron : Bool ;
-- reqLocS : Bool ;
-- qdef : QuantDef
} -> Str = \np -> np.s!NLoc ;
poss_NP : {
empty : Str ;
s : NForm => Str ;
-- mod : Str ;
-- dem : Str ;
-- predet_pre : Str ;
-- predet_post : Str ;
agr : Agr ;
proDrop : Bool ;
isPron : Bool
-- reqLocS : Bool ;
-- qdef : QuantDef
} -> Str = \np -> np.s!NPoss ;
pref_lin_NP : {
empty : Str ;
s : NForm => Str ;
mod : Str ;
dem : Str ;
predet_pre : Str ;
predet_post : Str ;
agr : Agr ;
proDrop : Bool ;
isPron : Bool ;
-- reqLocS : Bool ;
qdef : QuantDef
} -> Str = \np -> np.s ! NReduced ++ np.dem ++ np.mod
++ np.predet_pre ++ np.predet_post ;
----------------
-- CONGRUENCE --
----------------
-- SUBJECT AGREEMENT MORPHEME --
-- NOTE : the empty SCVow for class 6 might produce a dangling BIND token, causing bugs
-- TODO: SC following vowel
subjConcLookup : Agr => SCForm => Str =
table {
-- agr default before vowel after neg pref sit/part potential/subjunct/indirect relative
First Sg => table {SC => "ngi" ; SCVow => "ng"++BIND ; SCNeg => "ngi" ; SCNegVow => "ng" ; SCPart => "ngi" ; SCPS => "ngi" ; SCVowP => "ngi" ; SCBe => "bengi" ; SCRP => "ngangi" } ;
Second Sg => table {SC => "u" ; SCVow => "w"++BIND ; SCNeg => "wu" ; SCNegVow => "w" ; SCPart => "u" ; SCPS => "u" ; SCVowP => "wu" ; SCBe => "ubu" ; SCRP => "wawu" } ;
First Pl => table {SC => "si" ; SCVow => "s"++BIND ; SCNeg => "si" ; SCNegVow => "s" ; SCPart => "si" ; SCPS => "si" ; SCVowP => "si" ; SCBe => "besi" ; SCRP => "sasi" } ;
Second Pl => table {SC => "ni" ; SCVow => "n"++BIND ; SCNeg => "ni" ; SCNegVow => "n" ; SCPart => "ni" ; SCPS => "ni" ; SCVowP => "ni" ; SCBe => "beni" ; SCRP => "nani" } ;
Third C1_2 Sg => table {SC => "u" ; SCVow => "w"++BIND ; SCNeg => "ka" ; SCNegVow => "k" ; SCPart => "e" ; SCPS => "a" ; SCVowP => "wu" ; SCBe => "ube" ; SCRP => "waye" } ;
Third C1_2 Pl => table {SC => "ba" ; SCVow => "b"++BIND ; SCNeg => "ba" ; SCNegVow => "b" ; SCPart => "be" ; SCPS => "ba" ; SCVowP => "ba" ; SCBe => "babe" ; SCRP => "babe" } ;
Third C1a_2a Sg => table {SC => "u" ; SCVow => "w"++BIND ; SCNeg => "ka" ; SCNegVow => "k" ; SCPart => "e" ; SCPS => "a" ; SCVowP => "wu" ; SCBe => "ube" ; SCRP => "waye" } ;
Third C1a_2a Pl => table {SC => "ba" ; SCVow => "b"++BIND ; SCNeg => "ba" ; SCNegVow => "b" ; SCPart => "be" ; SCPS => "ba" ; SCVowP => "ba" ; SCBe => "babe" ; SCRP => "babe" } ;
Third C3_4 Sg => table {SC => "u" ; SCVow => "w"++BIND ; SCNeg => "wu" ; SCNegVow => "w" ; SCPart => "u" ; SCPS => "u" ; SCVowP => "wu" ; SCBe => "ubu" ; SCRP => "wawu" } ;
Third C3_4 Pl => table {SC => "i" ; SCVow => "y"++BIND ; SCNeg => "yi" ; SCNegVow => "y" ; SCPart => "i" ; SCPS => "i" ; SCVowP => "yi" ; SCBe => "ibi" ; SCRP => "yayi" } ;
Third C5_6 Sg => table {SC => "li" ; SCVow => "l"++BIND ; SCNeg => "li" ; SCNegVow => "l" ; SCPart => "li" ; SCPS => "li" ; SCVowP => "li" ; SCBe => "beli" ; SCRP => "lali" } ;
Third C5_6 Pl => table {SC => "a" ; SCVow => [] ; SCNeg => "wa" ; SCNegVow => "w" ; SCPart => "e" ; SCPS => "a" ; SCVowP => "wa" ; SCBe => "abe" ; SCRP => "aye" } ;
Third C7_8 Sg => table {SC => "si" ; SCVow => "s"++BIND ; SCNeg => "si" ; SCNegVow => "s" ; SCPart => "si" ; SCPS => "si" ; SCVowP => "si" ; SCBe => "besi" ; SCRP => "sasi" } ;
Third C7_8 Pl => table {SC => "zi" ; SCVow => "z"++BIND ; SCNeg => "zi" ; SCNegVow => "z" ; SCPart => "zi" ; SCPS => "zi" ; SCVowP => "zi" ; SCBe => "bezi" ; SCRP => "zazi" } ;
Third C9_10 Sg => table {SC => "i" ; SCVow => "y"++BIND ; SCNeg => "yi" ; SCNegVow => "y" ; SCPart => "yi" ; SCPS => "i" ; SCVowP => "yi" ; SCBe => "ibi" ; SCRP => "yayi" } ;
-- Third C9_10 Sg => table {SC => "i" ; SCVow => "i"++BIND ; SCNeg => "yi" ; SCPart => "yi" ; SCPS => "i" ; SCVowP => "yi" ; SCBe => "ibi" } ;
Third C9_10 Pl => table {SC => "zi" ; SCVow => "z"++BIND ; SCNeg => "zi" ; SCNegVow => "z" ; SCPart => "zi" ; SCPS => "zi" ; SCVowP => "zi" ; SCBe => "bezi" ; SCRP => "zazi" } ;
Third C11_10 Sg => table {SC => "lu" ; SCVow => "lw"++BIND ; SCNeg => "lu" ; SCNegVow => "l" ; SCPart => "lu" ; SCPS => "lu" ; SCVowP => "lu" ; SCBe => "belu" ; SCRP => "lwalu" } ;
Third C11_10 Pl => table {SC => "zi" ; SCVow => "z"++BIND ; SCNeg => "zi" ; SCNegVow => "z" ; SCPart => "zi" ; SCPS => "zi" ; SCVowP => "zi" ; SCBe => "bezi" ; SCRP => "zazi" } ;
Third C9_6 Sg => table {SC => "i" ; SCVow => "y"++BIND ; SCNeg => "yi" ; SCNegVow => "y" ; SCPart => "yi" ; SCPS => "i" ; SCVowP => "yi" ; SCBe => "ibi" ; SCRP => "yayi" } ;
Third C9_6 Pl => table {SC => "a" ; SCVow => [] ; SCNeg => "wa" ; SCNegVow => "w" ; SCPart => "e" ; SCPS => "a" ; SCVowP => "wa" ; SCBe => "abe" ; SCRP => "aye" } ;
Third C14 _ => table {SC => "bu" ; SCVow => "b"++BIND ; SCNeg => "bu" ; SCNegVow => "b" ; SCPart => "bu" ; SCPS => "bu" ; SCVowP => "bu" ; SCBe => "bebu" ; SCRP => "kwaku" } ;
Third C15 _ => table {SC => "ku" ; SCVow => "kw"++BIND ; SCNeg => "ku" ; SCNegVow => "k" ; SCPart => "ku" ; SCPS => "ku" ; SCVowP => "ku" ; SCBe => "beku" ; SCRP => "kwaku" } ;
Third C17 _ => table {SC => "ku" ; SCVow => "kw"++BIND ; SCNeg => "ku" ; SCNegVow => "k" ; SCPart => "ku" ; SCPS => "ku" ; SCVowP => "ku" ; SCBe => "beku" ; SCRP => "kwaku" }
} ;
-- scvow_bind : Agr -> Str = \agr -> case agr of {
-- (Third C5_6 Pl|Third C9_6 Pl) => [] ;
-- _ => subjConcLookup ! agr ! SCVow ++BIND
-- } ;
subjConc : VForm -> Agr -> Bool -> Str = \vform,agr,prevow ->
case <prevow,vform> of {
<False,VFIndic _ Neg _> => subjConcLookup ! agr ! SCNeg ++BIND ;
<True,VFIndic _ Neg _> => subjConcLookup ! agr ! SCNegVow ++BIND ;
<True,VFIndic _ _ _> => subjConcLookup ! agr ! SCVow ;
<_,VFIndic _ _ RemPastTense> => subjConcLookup ! agr ! SCVow ;
<_,VFIndic _ _ _> => subjConcLookup ! agr ! SC ++BIND
} ;
-- -be aux: reference time in relation to coding time
-- relSubjConc : BasicTense -> Agr -> Str = \tense,agr ->
-- relSubjConc : BasicTense -> Agr -> Str = \tense,agr ->
-- case tense of {
-- PastTense => (subjConcLookup ! agr ! SCVow) ++ "a" ++BIND++ case agr of {
-- Second Sg | Third C3_4 Sg => "w" ++BIND ;
-- Third C1_2 Sg | Third C1a_2a Sg | Third C3_4 Pl | Third C5_6 Pl | Third C9_10 Sg => "y" ++BIND ;
-- First _ | Second _ | Third _ _ => []
-- } ;
-- PerfTense | PresTense => subjConcLookup ! agr ! SC ++BIND++ "be" ; -- NOTE: present tense doesn't make much sense here, so default to perf
-- FutTense => subjConcLookup ! agr ! SC ++BIND++ "zobe"
-- } ;
impPref : Polarity -> Str = \pol -> case pol of {
Pos => [] ;
Neg => "u" ++BIND++ "nga" ++BIND
} ;
icomp_pref : VForm -> Agr -> Str = \vform,agr ->
let
neg1 = icompNeg1 vform ;
neg2 = icompNeg2 vform ;
in
case vform of {
VFIndic _ Pos PresTense => subjConcLookup ! agr ! SC ++BIND ;
VFIndic _ Pos PastTense => [] ; -- "be"++BIND++ subjConcLookup ! agr ! SCBe ++BIND ;
VFIndic _ Pos RemPastTense => subjConcLookup ! agr ! SC ++BIND++ "be" ++ subjConcLookup ! agr ! SCBe ++BIND ;
VFIndic _ Pos FutTense => subjConcLookup ! agr ! SC ++BIND ++ "zobe" ++ subjConcLookup ! agr ! SC ++BIND ;
VFIndic _ Pos RemFutTense => subjConcLookup ! agr ! SC ++BIND ++ "yobe" ++ subjConcLookup ! agr ! SC ++BIND ;
-- might have to add an SCNegBe to the table
VFIndic _ Neg PresTense => neg1 ++ subjConcLookup ! agr ! SCNeg ++BIND ++ neg2 ;
VFIndic _ Neg PastTense => "nga" ; -- neg1 ++ "be"++BIND++ subjConcLookup ! agr ! SCBe ++BIND ++ neg2 ;
VFIndic _ Neg RemPastTense => neg1 ++ subjConcLookup ! agr ! SC ++BIND++ "be" ++ subjConcLookup ! agr ! SCBe ++BIND ++ neg2 ;
VFIndic _ Neg FutTense => neg1 ++ subjConcLookup ! agr ! SCNeg ++BIND ++ "zobe" ++ subjConcLookup ! agr ! SCBe ++BIND ++ neg2 ;
VFIndic _ Neg RemFutTense => neg1 ++ subjConcLookup ! agr ! SCNeg ++BIND ++ "yobe" ++ subjConcLookup ! agr ! SCBe ++BIND ++ neg2
} ;
-- OBJECT AGREEMENT MORPHEME --
objConcLookup : Agr => OCForm => Str =
table {
First Sg => table {OC => "ngi" ; OCAE => "ng" ; OCIOU => "ng" ; OCMono => "ngi" ; OCThing => "ngi" } ;
Second Sg => table {OC => "ku" ; OCAE => "k" ; OCIOU => "k" ; OCMono => "ku" ; OCThing => "ku" } ;
First Pl => table {OC => "si" ; OCAE => "s" ; OCIOU => "s" ; OCMono => "si" ; OCThing => "si" } ;
Second Pl => table {OC => "ni" ; OCAE => "n" ; OCIOU => "n" ; OCMono => "ni" ; OCThing => "ni" } ;
Third C1_2 Sg => table {OC => "m" ; OCAE => "m" ; OCIOU => "m" ; OCMono => "mu" ; OCThing => "wu" } ;
Third C1_2 Pl => table {OC => "ba" ; OCAE => "b" ; OCIOU => "b" ; OCMono => "ba" ; OCThing => "ba" } ;
Third C1a_2a Sg => table {OC => "m" ; OCAE => "m" ; OCIOU => "m" ; OCMono => "mu" ; OCThing => "wu" } ;
Third C1a_2a Pl => table {OC => "ba" ; OCAE => "b" ; OCIOU => "b" ; OCMono => "ba" ; OCThing => "ba" } ;
Third C3_4 Sg => table {OC => "wu" ; OCAE => "w" ; OCIOU => "w" ; OCMono => "wu" ; OCThing => "wu" } ;
Third C3_4 Pl => table {OC => "yi" ; OCAE => "y" ; OCIOU => "y" ; OCMono => "yi" ; OCThing => "yi" } ;
Third C5_6 Sg => table {OC => "li" ; OCAE => "l" ; OCIOU => "l" ; OCMono => "li" ; OCThing => "li" } ;
Third C5_6 Pl => table {OC => "wa" ; OCAE => "w" ; OCIOU => "w" ; OCMono => "wa" ; OCThing => "wa" } ;
Third C7_8 Sg => table {OC => "si" ; OCAE => "s" ; OCIOU => "s" ; OCMono => "si" ; OCThing => "si" } ;
Third C7_8 Pl => table {OC => "zi" ; OCAE => "z" ; OCIOU => "z" ; OCMono => "zi" ; OCThing => "zi" } ;
Third C9_10 Sg => table {OC => "yi" ; OCAE => "y" ; OCIOU => "y" ; OCMono => "yi" ; OCThing => "yi" } ;
Third C9_10 Pl => table {OC => "zi" ; OCAE => "z" ; OCIOU => "z" ; OCMono => "zi" ; OCThing => "zi" } ;
Third C11_10 Sg => table {OC => "lu" ; OCAE => "lw" ; OCIOU => "l" ; OCMono => "lu" ; OCThing => "lu" } ;
Third C11_10 Pl => table {OC => "zi" ; OCAE => "z" ; OCIOU => "z" ; OCMono => "zi" ; OCThing => "zi" } ;
Third C9_6 Sg => table {OC => "yi" ; OCAE => "y" ; OCIOU => "y" ; OCMono => "yi" ; OCThing => "yi" } ;
Third C9_6 Pl => table {OC => "wa" ; OCAE => "w" ; OCIOU => "w" ; OCMono => "wa" ; OCThing => "wa" } ;
Third C14 _ => table {OC => "bu" ; OCAE => "bw" ; OCIOU => "b" ; OCMono => "bu" ; OCThing => "bu" } ;
Third C15 _ => table {OC => "ku" ; OCAE => "kw" ; OCIOU => "k" ; OCMono => "ku" ; OCThing => "ku" } ;
Third C17 _ => table {OC => "ku" ; OCAE => "kw" ; OCIOU => "k" ; OCMono => "ku" ; OCThing => "ku" }
} ;
-- ignoring the thing thing for now, must probably add something like gender to nouns...
objConc : Agr -> RInit -> Syl -> Str = \agr,rinit,syl ->
case rinit of {
(RA|RE) => objConcLookup ! agr ! OCAE ++BIND ;
(RI|RO|RU) => objConcLookup ! agr ! OCIOU ++BIND ;
RC => case syl of {
SylMono => objConcLookup ! agr ! OCMono ++BIND ;
_ => objConcLookup ! agr ! OC ++BIND
}
} ;
-- ADJECTIVE ANTECEDENT AGREEMENT MORPHEME --
relAdjPrefLookup : Agr => Str =
table {
Third C1_2 Sg => "m" ;
Third C1_2 Pl => "" ;
Third C1a_2a Sg => "m" ;
Third C1a_2a Pl => "" ;
Third C3_4 Sg => "m" ;
Third C3_4 Pl => "mi" ;
Third C5_6 Sg => "" ;
Third C5_6 Pl => "ma" ;
Third C7_8 Sg => "" ;
Third C7_8 Pl => "" ;
Third C9_10 Sg => "" ;
Third C9_10 Pl => "" ;
Third C11_10 Sg => "" ;
Third C11_10 Pl => "" ;
Third C9_6 Sg => "" ;
Third C9_6 Pl => "ma" ;
Third C14 _ => "bu" ;
Third C15 _ => "ku" ;
Third C17 _ => "ku" ;
(First _ | Second _ ) => "m"
} ;
-- RELATIVE ANTECEDENT AGREEMENT MORPHEME --
relConc : VForm -> Agr -> RInit -> Str = \p,a,r -> case p of {
-- VFIndic CType Polarity BasicTense
VFIndic RelCl Pos PresTense => relConcLookup!a!r ;
VFIndic RelCl Pos RemPastTense => relConcLookup!a!RA ;
VFIndic RelCl Pos PastTense => relConcLookup!a!r ;
VFIndic RelCl Pos _ => relConcLookup!a!RC ;
VFIndic RelCl Neg PresTense => case r of {
RC => relConcLookup!a!RC ++ "nga" ++BIND ;
_ => relConcLookup!a!RC ++ "ng" ++BIND
} ;
VFIndic RelCl Neg PastTense => case r of {
RC => relConcLookup!a!RC ++ "nga" ++BIND ;
_ => relConcLookup!a!RC ++ "ng" ++BIND
} ;
VFIndic RelCl Neg RemPastTense => case r of {
RC => relConcLookup!a!RC ++ "nga" ++BIND ;
_ => relConcLookup!a!RC ++ "ng" ++BIND
} ;
VFIndic RelCl Neg FutTense => relConcLookup!a!RC ++ "nga" ++BIND ;
VFIndic RelCl Neg RemFutTense => relConcLookup!a!RC ++ "nga" ++BIND ;
VFIndic _ _ _ => []
} ;
relConcCop : VForm -> Agr -> RInit ->Str = \vform,a,r -> case vform of {
VFIndic _ _ PresTense => relConcLookup!a!RC ;
VFIndic _ _ FutTense => relConcLookup!a!RC ;
VFIndic _ _ RemFutTense => relConcLookup!a!RC ;
VFIndic _ _ PastTense => relCopConcBeLookup!a ;
VFIndic _ _ RemPastTense => case a of {
Third C5_6 Pl => [] ; -- relConcLookup!a!RA ; -- a + aye = aye
(First _ | Second _ | Third _ _ ) => shortRelConc!a --++ subjConcLookup!a!SCRP
}
} ;
adjConcCop : VForm -> Agr -> RInit ->Str = \vform,a,r -> case vform of {
VFIndic _ Pos PresTense => shortRelConc!a ;
VFIndic _ Neg PresTense => adjConcLookup!a!RC ;
VFIndic _ _ FutTense => adjConcLookup!a!RC ;
VFIndic _ _ RemFutTense => adjConcLookup!a!RC ;
VFIndic _ _ PastTense => relCopConcBeLookup!a ;
VFIndic _ _ RemPastTense => case a of {
Third C5_6 Pl => [] ; -- relConcLookup!a!RA ; -- a + aye = aye
(First _ | Second _ | Third _ _ ) => shortRelConc!a --++ subjConcLookup!a!SCRP
}
} ;
relConcLookup : Agr => RInit => Str =
table {
Third C1_2 Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C1_2 Pl => table { RC => "aba"++BIND ; _ => "ab"++BIND } ;
Third C1a_2a Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C1a_2a Pl => table { RC => "aba"++BIND ; _ => "ab"++BIND } ;
Third C3_4 Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C3_4 Pl => table { RE => [] ; (RA|RO) => "ey" ++BIND ; _ => "e"++BIND } ;
Third C5_6 Sg => table { RC => "eli"++BIND ; _ => "el"++BIND } ;
Third C5_6 Pl => table { RC => "a"++BIND ; _ => [] } ;
Third C7_8 Sg => table { RC => "esi"++BIND ; _ => "es"++BIND } ;
Third C7_8 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C9_10 Sg => table { RE => [] ; (RA|RO) => "ey" ++BIND ; _ => "e"++BIND } ;
Third C9_10 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C11_10 Sg => table { RC => "olu"++BIND ; (RA|RE) => "olw" ; _ => "ol"++BIND } ;
Third C11_10 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C9_6 Sg => table { RE => [] ; (RA|RO) => "ey" ; _ => "e"++BIND } ;
Third C9_6 Pl => table { RC => "a"++BIND ; _ => [] } ;
Third C14 _ => table { RC => "obu"++BIND ; _ => "ob"++BIND } ;
Third C15 _ => table { RC => "oku"++BIND ; (RA|RE) => "okw" ; _ => "ok"++BIND } ;
Third C17 _ => table { RC => "oku"++BIND ; (RA|RE) => "okw" ; _ => "ok"++BIND } ;
First Sg => table { RC => "engi"++BIND ; _ => "eng"++BIND } ;
First Pl => table { RC => "esi"++BIND ; _ => "es"++BIND } ;
Second Sg => table { RE => "ow"++BIND ; _ => "o"++BIND } ;
Second Pl => table { RC => "eni"++BIND ; _ => "en"++BIND }
} ;
adjConcLookup : Agr => RInit => Str =
table {
Third C1_2 Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C1_2 Pl => table { RC => "aba"++BIND ; _ => "ab"++BIND } ;
Third C1a_2a Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C1a_2a Pl => table { RC => "aba"++BIND ; _ => "ab"++BIND } ;
Third C3_4 Sg => table { RO => [] ; (RA|RE) => "ow"++BIND ; _ => "o"++BIND } ;
Third C3_4 Pl => table { RC => "emi"++BIND ; _ => "em"++BIND } ;
Third C5_6 Sg => table { RC => "eli"++BIND ; _ => "el"++BIND } ;
Third C5_6 Pl => table { RC => "a"++BIND ; _ => [] } ;
Third C7_8 Sg => table { RC => "esi"++BIND ; _ => "es"++BIND } ;
Third C7_8 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C9_10 Sg => table { RE => [] ; (RA|RO) => "ey" ++BIND ; _ => "e"++BIND } ;
Third C9_10 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C11_10 Sg => table { RC => "olu"++BIND ; (RA|RE) => "olw" ; _ => "ol"++BIND } ;
Third C11_10 Pl => table { RC => "ezi"++BIND ; _ => "ez"++BIND } ;
Third C9_6 Sg => table { RE => [] ; (RA|RO) => "ey" ; _ => "e"++BIND } ;
Third C9_6 Pl => table { RC => "a"++BIND ; _ => [] } ;
Third C14 _ => table { RC => "obu"++BIND ; _ => "ob"++BIND } ;
Third C15 _ => table { RC => "oku"++BIND ; (RA|RE) => "okw" ; _ => "ok"++BIND } ;
Third C17 _ => table { RC => "oku"++BIND ; (RA|RE) => "okw" ; _ => "ok"++BIND } ;
First Sg => table { RC => "engi"++BIND ; _ => "eng"++BIND } ;
First Pl => table { RC => "esi"++BIND ; _ => "es"++BIND } ;
Second Sg => table { RE => "ow"++BIND ; _ => "o"++BIND } ;
Second Pl => table { RC => "eni"++BIND ; _ => "en"++BIND }
} ;
relCopConcBeLookup : Agr => Str =
table {
Third C1_2 Sg => "obe"++BIND ;
Third C1_2 Pl => "ababe"++BIND ;
Third C1a_2a Sg => "obe"++BIND ;
Third C1a_2a Pl => "ababe"++BIND ;
Third C3_4 Sg => "obu"++BIND ;
Third C3_4 Pl => "ebi"++BIND ;
Third C5_6 Sg => "ebeli"++BIND ;
Third C5_6 Pl => "abe"++BIND ;
Third C7_8 Sg => "ebesi"++BIND ;
Third C7_8 Pl => "ebezi"++BIND ;
Third C9_10 Sg => "ebi"++BIND ;
Third C9_10 Pl => "ebezi"++BIND ;
Third C11_10 Sg => "obelu"++BIND ;
Third C11_10 Pl => "ebezi"++BIND ;
Third C9_6 Sg => "ebi"++BIND ;
Third C9_6 Pl => "abe"++BIND ;
Third C14 _ => "obebu"++BIND ;
Third C15 _ => "obeku"++BIND ;
Third C17 _ => "obeku"++BIND ;
First Sg => "ebengi"++BIND ;
First Pl => "ebesi"++BIND ;
Second Sg => "obu"++BIND ;
Second Pl => "ebeni"++BIND
} ;
-- relCopConcBeLookup : Agr => RInit => Str =
-- table {
-- Third C1_2 Sg => table { _ => "obe"++BIND } ;
-- Third C1_2 Pl => table { _ => "ababe"++BIND } ;
-- Third C1a_2a Sg => table { _ => "obe"++BIND } ;
-- Third C1a_2a Pl => table { _ => "ababe"++BIND } ;
-- Third C3_4 Sg => table { _ => "obe"++BIND } ;
-- Third C3_4 Pl => table { _ => "ebi"++BIND } ;
-- Third C5_6 Sg => table { _ => "beli"++BIND } ;
-- Third C5_6 Pl => table { _ => "abe"++BIND } ;
-- Third C7_8 Sg => table { _ => "ebesi"++BIND } ;
-- Third C7_8 Pl => table { _ => "ebezi"++BIND } ;
-- Third C9_10 Sg => table { _ => "ebi"++BIND } ;
-- Third C9_10 Pl => table { _ => "ebezi"++BIND } ;
-- Third C11_10 Sg => table { _ => "obelu"++BIND } ;
-- Third C11_10 Pl => table { _ => "ebezi"++BIND } ;
-- Third C9_6 Sg => table { _ => "ebi"++BIND } ;
-- Third C9_6 Pl => table { _ => "abe"++BIND } ;
-- Third C14 _ => table { _ => "obebu"++BIND } ;
-- Third C15 _ => table { _ => "obeku"++BIND } ;
-- Third C17 _ => table { _ => "obeku"++BIND } ;
-- First Sg => table { _ => "ebengi"++BIND } ;
-- First Pl => table { _ => "ebesi"++BIND } ;
-- Second Sg => table { _ => "obe"++BIND } ;
-- Second Pl => table { _ => "ebeni"++BIND }
-- } ;
-- ENUMERATIVE ANTECEDENT AGREEMENT MORPHEME --
enumConc : Polarity -> Agr -> Str = \pol,agr -> case pol of {
Pos => enumConcLookup!agr ;
Neg => "nge" ++BIND++ enumConcLookup!agr
} ;
enumConcLookup : Agr => Str =
table {
Third C1_2 Sg => "mu" ;
Third C1_2 Pl => "ba" ;
Third C1a_2a Sg => "mu" ;
Third C1a_2a Pl => "ba" ;
Third C3_4 Sg => "mu" ;
Third C3_4 Pl => "mi" ;
Third C5_6 Sg => "li" ;
Third C5_6 Pl => "ma" ;
Third C7_8 Sg => "si" ;
Third C7_8 Pl => "zi" ;
Third C9_10 Sg => "yi" ;
Third C9_10 Pl => "zi" ;
Third C11_10 Sg => "lu" ;
Third C11_10 Pl => "zi" ;
Third C9_6 Sg => "yi" ;
Third C9_6 Pl => "ma" ;
Third C14 _ => "bu" ;
Third C15 _ => "ku" ;
Third C17 _ => "ku" ;
(First _ | Second _ ) => "mu"
} ;
shortRelConc : Agr => Str =
table {
Third C1_2 Sg => "o" ++BIND ;
Third C1_2 Pl => "a" ++BIND ;
Third C1a_2a Sg => "o" ++BIND ;
Third C1a_2a Pl => "a" ++BIND ;
Third C3_4 Sg => "o" ++BIND ;
Third C3_4 Pl => "e" ++BIND ;
Third C5_6 Sg => "e" ++BIND ;
Third C5_6 Pl => "a" ++BIND ;
Third C7_8 Sg => "e" ++BIND ;
Third C7_8 Pl => "e" ++BIND ;
Third C9_10 Sg => "e" ++BIND ;
Third C9_10 Pl => "e" ++BIND ;
Third C11_10 Sg => "o" ++BIND ;
Third C11_10 Pl => "e" ++BIND ;
Third C9_6 Sg => "e" ++BIND ;
Third C9_6 Pl => "a" ++BIND ;
Third C14 _ => "o" ++BIND ;
Third C15 _ => "o" ++BIND ;
Third C17 _ => "o" ++BIND ;
First Sg => "e" ++BIND ;
First Pl => "e" ++BIND ;
Second Sg => "o" ++BIND ;
Second Pl => "e" ++BIND
} ;
-- POSSESSIVE ANTECEDENT AGREEMENT MORPHEME --
poss_concord_agr : Agr => RInit => Str =
table {
First Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
First Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" } ;
Second Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Second Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" } ;
Third C1_2 Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Third C1_2 Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" } ;
Third C1a_2a Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Third C1a_2a Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" } ;
Third C3_4 Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Third C3_4 Pl => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" } ;
Third C5_6 Sg => table {(RA|RC) => "la" ; (RE|RI) => "le" ; (RO|RU) => "lo" } ;
Third C5_6 Pl => table {(RA|RC) => "a" ; (RE|RI) => "e" ; (RO|RU) => "o" } ;
Third C7_8 Sg => table {(RA|RC) => "sa" ; (RE|RI) => "se" ; (RO|RU) => "so" } ;
Third C7_8 Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" } ;
Third C9_10 Sg => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" } ;
Third C9_10 Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" } ;
Third C11_10 Sg => table {(RA|RC) => "lwa" ; (RE|RI) => "lwe" ; (RO|RU) => "lo" } ;
Third C11_10 Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" } ;
Third C9_6 Sg => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" } ;
Third C9_6 Pl => table {(RA|RC) => "a" ; (RE|RI) => "e" ; (RO|RU) => "o" } ;
Third C14 _ => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" } ;
Third C15 _ => table {(RA|RC) => "kwa" ; (RE|RI) => "kwe" ; (RO|RU) => "ko" } ;
Third C17 _ => table {(RA|RC) => "kwa" ; (RE|RI) => "kwe" ; (RO|RU) => "ko" }
} ;
poss_concord : ClassGender => Number => RInit => Str =
table {
C1_2 => table {
Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" }
} ;
C1a_2a => table {
Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Pl => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" }
} ;
C3_4 => table {
Sg => table {(RA|RC) => "wa" ; (RE|RI) => "we" ; (RO|RU) => "wo" } ;
Pl => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" }
} ;
C5_6 => table {
Sg => table {(RA|RC) => "la" ; (RE|RI) => "le" ; (RO|RU) => "lo" } ;
Pl => table {(RA|RC) => "a" ; (RE|RI) => "e" ; (RO|RU) => "o" }
} ;
C7_8 => table {
Sg => table {(RA|RC) => "sa" ; (RE|RI) => "se" ; (RO|RU) => "so" } ;
Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" }
} ;
C9_10 => table {
Sg => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" } ;
Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" }
} ;
C11_10 => table {
Sg => table {(RA|RC) => "lwa" ; (RE|RI) => "lwe" ; (RO|RU) => "lo" } ;
Pl => table {(RA|RC) => "za" ; (RE|RI) => "ze" ; (RO|RU) => "zo" }
} ;
C9_6 => table {
Sg => table {(RA|RC) => "ya" ; (RE|RI) => "ye" ; (RO|RU) => "yo" } ;
Pl => table {(RA|RC) => "a" ; (RE|RI) => "e" ; (RO|RU) => "o" }
} ;
C14 => table {
_ => table {(RA|RC) => "ba" ; (RE|RI) => "be" ; (RO|RU) => "bo" }
} ;
C15 => table {
_ => table {(RA|RC) => "kwa" ; (RE|RI) => "kwe" ; (RO|RU) => "ko" }
} ;
C17 => table {
_ => table {(RA|RC) => "kwa" ; (RE|RI) => "kwe" ; (RO|RU) => "ko" }
}
} ;
poss_concord_c1a : ClassGender => Number => RInit => Str =
table {
C1_2 => table {
Sg => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" } ;
Pl => table {(RA|RC) => "baka" ; (RE|RI) => "bake" ; (RO|RU) => "bako" }
} ;
C1a_2a => table {
Sg => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" } ;
Pl => table {(RA|RC) => "baka" ; (RE|RI) => "bake" ; (RO|RU) => "bako" }
} ;
C3_4 => table {
Sg => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" } ;
Pl => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" }
} ;
C5_6 => table {
Sg => table {(RA|RC) => "lika" ; (RE|RI) => "like" ; (RO|RU) => "liko" } ;
Pl => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" }
} ;
C7_8 => table {
Sg => table {(RA|RC) => "sika" ; (RE|RI) => "sike" ; (RO|RU) => "siko" } ;
Pl => table {(RA|RC) => "zika" ; (RE|RI) => "zike" ; (RO|RU) => "ziko" }
} ;
C9_10 => table {
Sg => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" } ;
Pl => table {(RA|RC) => "zika" ; (RE|RI) => "zike" ; (RO|RU) => "ziko" }
} ;
C11_10 => table {
Sg => table {(RA|RC) => "luka" ; (RE|RI) => "luke" ; (RO|RU) => "luko" } ;
Pl => table {(RA|RC) => "zika" ; (RE|RI) => "zike" ; (RO|RU) => "ziko" }
} ;
C9_6 => table {
Sg => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" } ;
Pl => table {(RA|RC) => "ka" ; (RE|RI) => "ke" ; (RO|RU) => "ko" }
} ;
C14 => table {
_ => table {(RA|RC) => "buka" ; (RE|RI) => "buke" ; (RO|RU) => "buko" }
} ;
C15 => table {
_ => table {(RA|RC) => "kuka" ; (RE|RI) => "kuke" ; (RO|RU) => "kuko" }
} ;
C17 => table {
_ => table {(RA|RC) => "kuka" ; (RE|RI) => "kuke" ; (RO|RU) => "kuko" }
}
} ;
-- QUANTITATIVE AGREEMENT MORPHEME --
-- (demonstatives)
exclQuantConc : Agr => Str = table {
Third C1_2 Sg => "ye" ;
Third C1_2 Pl => "bo" ;
Third C1a_2a Sg => "ye" ;
Third C1a_2a Pl => "bo" ;
Third C3_4 Sg => "wo" ;
Third C3_4 Pl => "yo" ;
Third C5_6 Sg => "lo" ;
Third C5_6 Pl => "o" ;
Third C7_8 Sg => "so" ;
Third C7_8 Pl => "zo" ;
Third C9_10 Sg => "yo" ;
Third C9_10 Pl => "zo" ;
Third C11_10 Sg => "lo" ;
Third C11_10 Pl => "zo" ;
Third C9_6 Sg => "yo" ;
Third C9_6 Pl => "o" ;
Third C14 _ => "bo" ;
Third C15 _ => "ko" ;
Third C17 _ => "ko" ;
First Sg => "nge" ;
First Pl => "so" ;
Second Sg => "we" ;
Second Pl => "no"
} ;
-----------------
-- COPULATIVES --
-----------------
pre_cop_pref : VForm -> Agr -> Str = \vform,agr ->
let
sc = subjConc vform agr False ;
scvow = subjConc vform agr True
in
case vform of {
VFIndic _ Pos PresTense => sc ;
VFIndic _ Neg PresTense => "a" ++BIND++ subjConcLookup!agr!SCNeg ++BIND ;
VFIndic _ _ FutTense => sc ++ (tensePref vform RC SylMult) ++ "ba" ;
VFIndic _ _ RemFutTense => sc ++ (tensePref vform RC SylMult) ++ "ba" ;
VFIndic _ _ _ => []
} ;
ap_cop_pref : VForm -> Agr -> AType -> Str = \vform,agr,atype ->
let
sc = subjConc vform agr False ;
scvow = subjConc vform agr True
in
-- TODO:
-- for positive, present: SC only inserted with class 9
case vform of {
VFIndic MainCl Pos PresTense => case <agr,atype> of {
<(Third _ _ | First _ | Second _),AdjType> => [] ;
<(Third C9_10 Sg | Third C9_6 Sg),_> => sc ; -- i++i = i
<(Third _ _ | First _ | Second _),_> => sc
} ;
VFIndic MainCl Neg PresTense => case <agr,atype> of {
<(Third C9_10 Sg | Third C9_6 Sg),AdjType> => "a" ++BIND++ "y" ++BIND ;
<(Third C9_10 Sg | Third C9_6 Sg),_> => "a" ++BIND++ subjConcLookup!agr!SCNeg ++BIND ;
<(Third _ _ | First _ | Second _),_> => "a" ++BIND++ subjConcLookup!agr!SCNeg ++BIND
} ;
VFIndic RelCl Pos PresTense => [] ;
VFIndic RelCl Neg PresTense => "nge" ++BIND ;
VFIndic MainCl Pos (FutTense|RemFutTense) => case agr of {
-- Third C9_10 Sg | Third C9_6 Sg => sc ++ (tensePref vform RC SylMult) ++ "b" ; -- ++BIND ;
Third _ _ | First _ | Second _ => sc ++ (tensePref vform RC SylMult) ++ "ba" -- ++BIND
} ;
VFIndic RelCl Pos (FutTense|RemFutTense) => case agr of {
-- Third C9_10 Sg | Third C9_6 Sg => (tensePref vform RC SylMult) ++ "b" ; -- ++BIND ;
Third _ _ | First _ | Second _ => (tensePref vform RC SylMult) ++ "ba" -- ++BIND
} ;
VFIndic MainCl Neg (FutTense|RemFutTense) => case agr of {
-- Third C9_10 Sg | Third C9_6 Sg => "a" ++BIND++ sc ++ (tensePref vform RC SylMult) ++ "b" ;
Third _ _ | First _ | Second _ => "a" ++BIND++ sc ++ (tensePref vform RC SylMult) ++ "ba"
} ;
VFIndic RelCl Neg (FutTense|RemFutTense) => "nge" ++BIND++ (tensePref vform RC SylMult) ++ "ba" ;
VFIndic MainCl Pos PastTense => subjConcLookup!agr!SCBe ++BIND ;
VFIndic MainCl Neg PastTense => subjConcLookup!agr!SCBe ++BIND++ "nge" ++BIND ;
VFIndic RelCl Pos PastTense => [] ;
VFIndic RelCl Neg PastTense => "nge" ++BIND ;
VFIndic _ Pos RemPastTense => subjConcLookup!agr!SCRP ++BIND ;
VFIndic _ Neg RemPastTense => subjConcLookup!agr!SCRP ++BIND++ "nge" ++BIND
} ;
id_pre_cop_pref : VForm -> Agr -> Str = \vform,agr -> let
sc = subjConc vform agr False
in case vform of {
VFIndic MainCl Pos PresTense => sc ;
VFIndic MainCl Neg PresTense => "a" ++BIND++ sc ; -- "aku" ++BIND ;
VFIndic RelCl Pos PresTense => [] ;
VFIndic RelCl Neg PresTense => "nge" ++BIND ;
VFIndic MainCl Pos FutTense => sc ++ "zoba" ;
VFIndic MainCl Neg FutTense => "a" ++BIND++ sc ++ "zukuba" ;
VFIndic RelCl Pos FutTense => "zoba" ;
VFIndic RelCl Neg FutTense => "nge" ++BIND++ "zukuba" ;
VFIndic MainCl Pos RemFutTense => sc ++ "yoba" ;
VFIndic MainCl Neg RemFutTense => "a" ++BIND++ sc ++ "yukuba" ;
VFIndic RelCl Pos RemFutTense => "yoba" ;
VFIndic RelCl Neg RemFutTense => "nge" ++BIND++ "yukuba" ;
VFIndic MainCl Pos PastTense => subjConcLookup!agr!SCBe ++BIND ;
VFIndic MainCl Neg PastTense => subjConcLookup!agr!SCBe ++ BIND ++ "nge" ++BIND ;
VFIndic RelCl Pos PastTense => [] ;
VFIndic RelCl Neg PastTense => "nge" ++BIND ;
VFIndic _ Pos RemPastTense => subjConcLookup!agr!SCRP ++BIND ;
VFIndic _ Neg RemPastTense => subjConcLookup!agr!SCRP ++BIND++ "nge" ++BIND
} ;
assoc_pre_cop_pref : VForm -> Agr -> Str = \vform,agr -> let
sc = subjConc vform agr False
in case vform of {
VFIndic MainCl Pos PresTense => sc ;
VFIndic MainCl Neg PresTense => "a" ++BIND++ sc ;
VFIndic RelCl Pos PresTense => [] ;
VFIndic RelCl Neg PresTense => "nge"++BIND ;
VFIndic MainCl Pos FutTense => sc ++ "zoba" ;
VFIndic MainCl Neg FutTense => "a" ++BIND++ sc ++ "zukuba" ;
VFIndic RelCl Pos FutTense => "zoba" ;
VFIndic RelCl Neg FutTense => "nge" ++BIND++ "zukuba" ;
VFIndic MainCl Pos RemFutTense => sc ++ "yoba" ;
VFIndic MainCl Neg RemFutTense => "a" ++BIND++ sc ++ "yukuba" ;
VFIndic RelCl Pos RemFutTense => "yoba" ;
VFIndic RelCl Neg RemFutTense => "nge" ++BIND++ "yukuba" ;
VFIndic MainCl Pos PastTense => subjConcLookup!agr!SCBe ++BIND ;
VFIndic MainCl Neg PastTense => subjConcLookup!agr!SCBe ++BIND++ "nge" ++BIND ;
VFIndic RelCl Pos PastTense => [] ;
VFIndic RelCl Neg PastTense => "nge" ++BIND ;
VFIndic _ Pos RemPastTense => subjConcLookup!agr!SCRP ++BIND ;
VFIndic _ Neg RemPastTense => subjConcLookup!agr!SCRP ++BIND++ "nge" ++BIND
} ;
-- REF: Poulos & Msimang p355
-- id_cop_pref has the following forms
-- ngu:
-- - absolute pronoun of 2nd person sg
-- - class 1
-- - all other a-, o-, u- commencing absolute pronouns and nouns except class 11
--
-- y:
-- - i- commencing absolute pronouns and nouns
--
-- ngu:
-- - everything else?
id_cop_pref : Agr -> Str = \agr -> case agr of {
Third C1_2 Sg => "ng"++BIND ;
Third C1_2 Pl => "ng"++BIND ;
Third C1a_2a Sg => "ng"++BIND ;
Third C1a_2a Pl => "ng"++BIND ;
Third C3_4 Sg => "ng"++BIND ;
Third C3_4 Pl => "y"++BIND ;
Third C5_6 Sg => "y"++BIND ;
Third C5_6 Pl => "ng"++BIND ;
Third C7_8 Sg => "y"++BIND ;
Third C7_8 Pl => "y"++BIND ;
Third C9_10 Sg => "y"++BIND ;
Third C9_10 Pl => "y"++BIND ;
Third C11_10 Sg => "w"++BIND ;
Third C11_10 Pl => "y"++BIND ;
Third C9_6 Sg => "y"++BIND ;
Third C9_6 Pl => "ng"++BIND ;
Third C14 _ => "ng"++BIND ;
Third C15 _ => "ng"++BIND ;
Third C17 _ => "ng"++BIND ;
First Sg => "y"++BIND ;
First Pl => "y"++BIND ;
Second Sg => "ng"++BIND ;
Second Pl => "y"++BIND
} ;
assoc_cop_pref : Polarity -> Agr -> Str = \pol,agr -> case pol of {
Neg => "na"++BIND ;
Pos => case agr of {
Third C1_2 Sg => "no" ;
Third C1_2 Pl => "na" ;
Third C1a_2a Sg => "no" ;
Third C1a_2a Pl => "na" ;
Third C3_4 Sg => "no" ;
Third C3_4 Pl => "ne" ;
Third C5_6 Sg => "ne" ;
Third C5_6 Pl => "na" ;
Third C7_8 Sg => "ne" ;
Third C7_8 Pl => "ne" ;
Third C9_10 Sg => "ne" ;
Third C9_10 Pl => "ne" ;
Third C11_10 Sg => "no" ;
Third C11_10 Pl => "ne" ;
Third C9_6 Sg => "ne" ;
Third C9_6 Pl => "na" ;
Third C14 _ => "no" ;
Third C15 _ => "no" ;
Third C17 _ => "no" ;
First Sg => "na" ;
First Pl => "na" ;
Second Sg => "na" ;
Second Pl => "na"
} ++BIND
} ;
kho_cop : VForm -> Agr -> Str = \vform,agr -> case vform of {
VFIndic MainCl Neg PresTense => neg_kho_cop_pref agr ++ "kho";
VFIndic RelCl Neg PresTense => (relConcCop vform agr RC) ++ (ap_cop_pref (VFIndic RelCl Neg PresTense) agr RelType) ++BIND++ "kho" ;
VFIndic RelCl p t => (relConcCop vform agr RC) ++ (ap_cop_pref (VFIndic RelCl p t) agr RelType) ++ "khona" ;
VFIndic MainCl p t => (ap_cop_pref (VFIndic MainCl p t) agr RelType) ++ "khona"
} ;
neg_kho_cop_pref : Agr -> Str = \agr ->
"a" ++BIND++
case agr of {
Third C1_2 Sg => "ke" ;
Third C1_2 Pl => "be" ;
Third C1a_2a Sg => "ke" ;
Third C1a_2a Pl => "be" ;
-- Third C3_4 Sg => "no" ;
-- Third C3_4 Pl => "ne" ;
-- Third C5_6 Sg => "ne" ;
Third C5_6 Pl => "we" ;
-- Third C7_8 Sg => "ne" ;
-- Third C7_8 Pl => "ne" ;
-- Third C9_10 Sg => "ne" ;
-- Third C9_10 Pl => "ne" ;
-- Third C11_10 Sg => "no" ;
-- Third C11_10 Pl => "ne" ;
-- Third C9_6 Sg => "ne" ;
-- Third C9_6 Pl => "na" ;
-- Third C14 _ => "no" ;
-- Third C15 _ => "no" ;
-- Third C17 _ => "no" ;
-- First Sg => "na" ;
-- First Pl => "na" ;
-- Second Sg => "na" ;
-- Second Pl => "na"
(First _ | Second _ | Third _ _ ) => subjConcLookup!agr!SCNeg
} ++BIND ;
----------------------------------------
-- OTHER
----------------------------------------
link_conj : { s: RInit => Str ; fix : Bool } -> RInit -> Str = \conj,rinit -> case conj.fix of {
True => conj.s!rinit ++BIND ;
False => conj.s!RC
} ;
compAgr : Agr -> Agr -> Agr = \a1,a2 -> case <a1,a2> of {
<First _,(First _ | Second _ | Third _ _)> => First Pl ;
<(First _ | Second _ | Third _ _),First _> => First Pl ;
<Second _,(First _ | Second _ | Third _ _)> => Second Pl ;
<(First _ | Second _ | Third _ _),Second _> => Second Pl ;
<Third (C1_2|C1a_2a) _, Third _ _> => Third C1_2 Pl ;
<Third _ _,Third c _> => Third c Pl
} ;
}