forked from GitHub/gf-rgl
1675 lines
76 KiB
Plaintext
Executable File
1675 lines
76 KiB
Plaintext
Executable File
--# -path=.:../prelude:../abstract:../common
|
|
|
|
-- structure of module types i.e header which defines the type of module and
|
|
-- tells what other modules it inherits also known as extension(means that a module can inherit the contents
|
|
-- of one or more modules to which new judgements are added. You can optionally inherit parts of it using
|
|
-- [comma separeted functions]) followed by ** and optionally an open statement(if the module type is concrete
|
|
-- or resource i.e open <module name>[namespace identifiers]) and then followed by a mandatory body {}
|
|
-- opening a resource means you can use its contents without inheriting them (how I do not know)
|
|
-- module types include:
|
|
-- 1.abstract modules
|
|
-- 2.concrete modules
|
|
-- 3.resource modules: these define parameter types and operations usable in several concrete syntaxes as general functions in lincat definitions
|
|
-- general structure: <module type> <module name> [of <abstrcat module name if module type is concrete>] = [<extended modules[comma, separted list of objects inherited]>] [**][open <module names[namespace identifiers]> in]{body}
|
|
resource ResCgg = ParamX ** --
|
|
open Prelude, (Predef=Predef) in {
|
|
|
|
param
|
|
--Number = Sg | Pl;
|
|
--Person = Per1 | Per2 | Per3;
|
|
--Use Noun Class (NClass) as suggested in J&M chapter 3 pg 86.
|
|
Gender = MU_BA | KI_BI | N_N | KU_MA | BU_MA |
|
|
RU_BU | GU_GA | ZERO_ZERO | MU_MI | RI_MA |
|
|
I_MA | KA_BU | KA_TU | RU_N | RU_MA | HA |
|
|
MU | KU | ZERO_BU | ZERO_BI | ZERO_MA |
|
|
ZERO_MI | ZERO_TU | ZERO_N | I_ZERO |
|
|
RI_ZERO | KU_ZERO | MU_ZERO | RU_ZERO |
|
|
KA_ZERO |ZERO_BAA | N_ZERO | KI_ZERO | Null;
|
|
Case = Acc | Nom |Gen; -- we need to include Gen because we shall need it with Gen Pronouns
|
|
RCase = RSubj | RObj;
|
|
RForm = RF RCase | Such_That;
|
|
ComplType = Nn |Ap | Adverbial |AdverbialVerb | Empty;
|
|
PersonalPronounType = SubjM | Obj | RelSubj | RelObj |
|
|
AdjPron2 | -- aAdjectival Prefixes with initial vowel with the semantics of "the" e.g. -- omuntu o-mu-rungi
|
|
AdjPron | -- without initial vowel i.e. -- omuntu mu-rungi
|
|
--GenPron | -- different types of pronouns
|
|
GenPrep1 |
|
|
GenPrep2 |
|
|
GenAdj |
|
|
SStandPron ; --Self-standing pronouns
|
|
|
|
ImpPol = ImpPos | ImpNeg;
|
|
INumber = ISg | IPl | INeut;
|
|
-- copied from the English Resource Grammar
|
|
VVType = VVAux | VVInf | VVPresPart ; -- can do / try to do / start doing
|
|
{-
|
|
--there are several and i.e.
|
|
-- na (two nouns, 2 Noun Phrases, 2 Pronouns, 2 relative subject clauses, )
|
|
--kandi (clauses having a commonality of subjects, object or tense)
|
|
--the best structure is a table
|
|
-}
|
|
ConjArg = Nn_Nn | Nps_Nps | Pns_Pns | RelSubjCls | Other;
|
|
AgrConj = AConj ConjArg;
|
|
Agreement = AgP3 Number Gender | AgMUBAP1 Number |AgMUBAP2 Number | NONE; --Default is AgP3 Sg KI_BI
|
|
AgreementPl = AgP3Pl Gender | AgMUBAP1Pl |AgMUBAP2Pl | NONExistPl; --Default is AgP3 Sg KI_BI
|
|
AgreementSg = AgP3Sg Gender | AgMUBAP1Sg |AgMUBAP2Sg | NONExistSg; --Default is AgP3 Sg KI_BI
|
|
AgrExist = AgrNo | AgrYes Agreement;
|
|
--Position = PostDeterminer | PreDeterminer ;
|
|
Position = Post | Pre;
|
|
--Variants = V1|V2;
|
|
--Functional forms of the regular verb
|
|
Mood = Infinitive | Imperative | Subjunctive | Perfective;
|
|
VerbCat = Simple | Prepositional | Causative;
|
|
Voice = Active | Passive;
|
|
-- all forms of normal Eng verbs, although not yet used in MiniGrammar
|
|
VForm = VF Voice Mood VerbCat ;
|
|
-- may not need it
|
|
NounCat = ComNoun | PropNoun; --prepositions agree with nouns to form adverbial Phrases
|
|
PrepForm = Form1 | Form2; -- omu and omuri, aha, ahari
|
|
-- for Extra Tenses not implemented
|
|
-- would be better if I had alliases
|
|
--Tenses = RemotePast|NearPast | ImmediatePast |ExPres|NearFut |RemoteFut;
|
|
|
|
-- for Extra Aspects not implemented
|
|
-- would be better if I had alliases
|
|
--Aspect = Performative | Perfect | Resultative | Retrospective | Habitual | Progressive | Persitive;
|
|
|
|
|
|
{-
|
|
Complete = Nouns with IV,
|
|
Incomplete = Nouns without IV: important for use with pre-determiners
|
|
like buri i.e every
|
|
|
|
-}
|
|
NounState = Complete | Incomplete ;
|
|
VVMood = VVImp | VVPerf | VVBoth;
|
|
|
|
|
|
|
|
oper
|
|
-- the is for Common Nouns only
|
|
Noun : Type = {s : Number=> NounState=> Str ; gender : Gender; nounCat:NounCat} ;
|
|
|
|
ivs : pattern Str = #("a" | "e" | "o"); --pattern for initial vowels
|
|
|
|
human_relations: pattern Str = --expand this list
|
|
#("Taata" | "Maama" | "Shwento" | "Shwenkuru" | "Nyinento" | "Nyinenkuru");
|
|
|
|
|
|
mkNoun : Str -> Str ->Gender ->Noun = \sg,pl, g -> {
|
|
s = table {
|
|
Sg => table {Complete => sg; Incomplete => Predef.drop 1 sg};
|
|
Pl => table {Complete => pl; Incomplete => Predef.drop 1 pl}
|
|
};
|
|
gender = g;
|
|
nounCat = ComNoun;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
mkVerb : Str ->Str ->Str ->Verb = \rad, end1,end2 ->{
|
|
s = rad;
|
|
pres = end1;
|
|
perf = end2;
|
|
isPresBlank = False;
|
|
isPerfBlank = False;
|
|
--morphs = mkVerbMorphs;
|
|
isRegular = False;
|
|
p = [];
|
|
isRefl = False
|
|
};
|
|
-- creates a verb of type that has particles (prepositions or
|
|
--adverbials. this is for phrasal verbs)
|
|
mkVerbV2X : Str ->Str ->Str ->Str -> Bool->Verb = \rad, end1,end2, p, bool ->{
|
|
s = rad;
|
|
pres = end1;
|
|
perf = end2;
|
|
isPresBlank = False;
|
|
isPerfBlank = False;
|
|
--morphs = mkVerbMorphs;
|
|
isRegular = False;
|
|
p = p;
|
|
isRefl = bool
|
|
};
|
|
--These are regular verbs with {a-ire} entry in the dictionary
|
|
smartVerb : Str ->Verb = \rad ->{
|
|
s = rad;
|
|
pres = "a";
|
|
perf = "ire";
|
|
--morphs = mkVerbMorphs;
|
|
isPresBlank = False;
|
|
isPerfBlank = False;
|
|
isRegular = True;
|
|
p = [];
|
|
isRefl = False
|
|
};
|
|
|
|
{- Smart paradigm
|
|
This operation needs thorough testing with all nouns from a file
|
|
-}
|
|
smartNoun : Str -> Gender -> Noun
|
|
= \omuntu, g ->
|
|
case <omuntu , g> of {
|
|
-- Handling the Tone System is also another problem.
|
|
|
|
< "o" + "mu" + stem, MU_BA > => mkNoun omuntu ("aba" + stem) g ;
|
|
--special cases like omwana, omwishiki, omwojo
|
|
|
|
< "o" + "mw" + stem, MU_BA > => mkNoun omuntu (combine_morphemes "aba" stem) g ; --same as mu_ba but the "u" + "a" of the stem to form mwa
|
|
< "o" + "mu" + stem, MU_MI > => mkNoun omuntu (combine_morphemes "emi" stem) g ;
|
|
< "o" + "ru" + stem, RU_MA > => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
< "o" + "ru" + stem, RU_N > => mkNoun omuntu (combine_morphemes "en" stem) g ; --desist from providing a singlar only but give both
|
|
< "o" + "bu" + stem, BU_MA > => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
< "o" + "gu" + stem, GU_GA > => mkNoun omuntu (combine_morphemes "aga" stem) g ;
|
|
< "o" + ("ku" | "kw") + stem, KU_MA > => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
< "o" + "kw" + stem, KU_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ;
|
|
< "o" + "ku" + stem, KU_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "o" + "mu" + stem, MU_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "o" + "mu" + stem, MU_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "o" + "ru" + stem, RU_BU > => mkNoun omuntu (combine_morphemes "obu" stem) g ;
|
|
< "o" + "ru" + stem, RU_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
|
|
< "a" + "ha" + stem, HA_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "a" + "ka" + stem, KA_BU > => mkNoun omuntu (combine_morphemes "obu" stem) g ;
|
|
< "a" + "ka" + stem, KA_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
|
|
< "e" + "ki" + stem, KI_BI > => mkNoun omuntu (combine_morphemes "ebi" stem) g ;
|
|
< "e" + "ki" + stem, KI_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "e" + "i" + stem, I_MA > => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
< "e" + "i" + stem, I_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "e" + "ri" + stem, RI_MA > => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
< "e" + "ri" + stem, RI_ZERO > => mkNoun omuntu (combine_morphemes "" "") g ; -- does not exist as plural
|
|
< "e" + "ry" + stem, I_MA | RI_MA> => mkNoun omuntu (combine_morphemes "ama" stem) g ;
|
|
-- --special cases shall be added with due course as errors are identified
|
|
<"e" + "ky" + stem, KI_BI> => mkNoun omuntu (combine_morphemes "ebi" stem) g ;
|
|
< _ ,N_N | ZERO_MA | ZERO_ZERO > => mkNoun omuntu omuntu g ;
|
|
--< _ ,ZERO_MA > => mkNoun omuntu ("ama" + stem) g (Predef.drop 1 omuntu);
|
|
--< _ ,> => mkNoun omuntu omuntu g (Predef.drop 1 omuntu);
|
|
<_ , ZERO_BAA> => mkNoun omuntu ("baa" + omuntu) g ;
|
|
< _ ,_ > => mkNoun omuntu omuntu g -- improve as we go on.
|
|
};
|
|
|
|
|
|
|
|
{-
|
|
This function tries to handle phonological-conditioning.
|
|
|
|
Usage: Use it whenever you are trying to combine morphemes especially in:
|
|
1. Pronouns
|
|
2. Verbs and verb Phrases.
|
|
3. Noun Phrases
|
|
3. Adjectival Phrases e.t.c
|
|
|
|
Given two morphemes A and B to combine,
|
|
1. compare the last letter of the first morpheme A with the first letter of the second morpheme B
|
|
2. Use parttern matching to obtain the right letters for the comnined word
|
|
|
|
Source of rules:
|
|
1. personal experience
|
|
2. Morris and Kirwan Runynakore Grammar
|
|
3. but we shall add more as we meet them during debugging
|
|
-}
|
|
combine_morphemes : Str -> Str -> Str ;
|
|
combine_morphemes = \ f, s ->
|
|
case <(Predef.dp 1 f), (Predef.take 1 s)> of {
|
|
<"n" , "r"> => f + "d" + (Predef.drop 1 s) ;
|
|
<"u" , "a" | "e" | "o" | "i"> => Predef.tk 1 f + "w" + s ;
|
|
<"i" , "a" | "e" | "o"> => Predef.tk 1 f + "y" + s ;
|
|
<"n" , "b" | "p"> => Predef.tk 1 f + "m" + s ;
|
|
<"n" , "m"> => Predef.tk 1 f + s ; -- However, note that for pronouns, the n changes to m
|
|
<"n" , "h"> => Predef.tk 1 f + "mp" + Predef.drop 1 s ;
|
|
<"i", "i"> => f + Predef.drop 1 s ;
|
|
<_ , _ > => f + s
|
|
} ;
|
|
|
|
|
|
{-
|
|
combine_morphemes = \ f, s ->
|
|
case <(f), (s)> of {
|
|
<a+ "n" , "r"+ g> => f ++ "d" ++ g;
|
|
<a+ "nd" , "i"+ g> => a ++ Predef.BIND ++ "nz" ++ Predef.BIND ++ s;
|
|
<a+ "u" , ("a" | "e" | "o" | "i") + g> => a ++ Predef.BIND ++ "w" ++ Predef.BIND ++ s ;
|
|
<a+ "i" , ("a" | "e" | "o") +g > => a ++ Predef.BIND ++ "y" ++ Predef.BIND ++ s ;
|
|
<a+ "n" , ("b" | "p") + g> => a ++ Predef.BIND ++ "m" ++ Predef.BIND ++ s ;
|
|
<a+ "n" , "m" + g> => a ++ Predef.BIND ++ s ; -- However, note that for pronouns, the n changes to m
|
|
<a+ "n" , "h" +g > => a ++ Predef.BIND ++ "mp" ++ Predef.BIND ++ g ;
|
|
<a+ "i", "i" + g> => f ++ Predef.BIND ++ g ;
|
|
<_ , _ > => f ++ s
|
|
} ;
|
|
-}
|
|
|
|
--separate
|
|
{-
|
|
dealing with ProperNouns
|
|
They do not have plurals but when a proper noun
|
|
refers to a place then it is important to keep
|
|
that label because is helps us disambiguate which
|
|
preposition to use for in, on and at i.e LOCATIVES omuri, ahari, etc
|
|
-}
|
|
ProperNoun : Type = {s: Str ; a:Agreement ; isPlace : Bool; nounCat:NounCat};
|
|
mkPN : Str -> Agreement -> Bool -> ProperNoun = \ pn, a, b->
|
|
{
|
|
s = pn ;
|
|
a = a;
|
|
isPlace = b;
|
|
nounCat = PropNoun;
|
|
} ;
|
|
|
|
-- concatenates the string left to right
|
|
mkClitic : Str -> Str = \c -> c ++ Predef.BIND ;
|
|
|
|
-- concatenates the string right to left
|
|
mkSuffix : Str -> Str = \c -> Predef.BIND ++ c ;
|
|
|
|
-- creating clitics depending on number
|
|
mkClitics : Str -> Str -> Number -> Str = \sg,pl,n ->
|
|
case n of {
|
|
Sg => mkClitic sg ;
|
|
Pl => mkClitic pl
|
|
} ;
|
|
|
|
mkAgreement: Gender -> Person -> Number ->Agreement =\g,p,n ->
|
|
case <g,p,n> of{
|
|
<MU_BA, P1, n> => AgMUBAP1 n;
|
|
<MU_BA, P2, n> => AgMUBAP2 n;
|
|
<g,P3,n> => AgP3 n g;
|
|
<_,_,_,> => NONE
|
|
|
|
};
|
|
mkSubjPrefix : Agreement -> Str =\a ->case a of {
|
|
AgMUBAP1 n => mkClitics "n" "tu" n;
|
|
--AgMUBAP1 Pl => "tu" ;
|
|
AgMUBAP2 n => mkClitics "o" "mu" n;
|
|
--AgMUBAP2 Pl => "mu" ;
|
|
AgP3 n MU_BA => mkClitics "a" "ba" n;
|
|
--AgP3 Pl MU_BA => "ba" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => mkClitic "ru" ;
|
|
AgP3 Pl RU_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg N_N => mkClitic "e";
|
|
AgP3 Pl N_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Pl MU_MI => "e" ;
|
|
AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>mkClitic "ri";
|
|
AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => mkClitic "ga" ;
|
|
AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => mkClitic "ka" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BI => mkClitic "bi" ;
|
|
AgP3 Sg ZERO_MA => mkClitic "ga" ;
|
|
AgP3 Pl RI_ZERO => mkClitic "ga" ;
|
|
AgP3 Sg KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl MU_ZERO => mkClitic "gu" ;
|
|
AgP3 Pl RU_ZERO => mkClitic "ru" ;
|
|
AgP3 Sg ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Pl ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_MI | ZERO_ZERO) => mkClitic "" ;
|
|
AgP3 Pl ZERO_MI => mkClitic "e" ;
|
|
AgP3 Pl KA_ZERO => mkClitic "" ;
|
|
_ => mkClitic "SubjNotKnown" --for checking if there is some class unaccounted for
|
|
};
|
|
mkSubjClitic : Agreement -> Str = \a ->
|
|
case a of {
|
|
AgMUBAP1 n => mkClitics "n" "tu" n;
|
|
--AgMUBAP1 Pl => "tu" ;
|
|
AgMUBAP2 n => mkClitics "o" "mu" n;
|
|
--AgMUBAP2 Pl => "mu" ;
|
|
AgP3 n MU_BA => mkClitics "a" "ba" n;
|
|
--AgP3 Pl MU_BA => "ba" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => mkClitic "ru" ;
|
|
AgP3 Pl RU_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg N_N => mkClitic "e";
|
|
AgP3 Pl N_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Pl MU_MI => "e" ;
|
|
AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>mkClitic "ri";
|
|
AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => mkClitic "ga" ;
|
|
AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => mkClitic "ka" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BI => mkClitic "bi" ;
|
|
AgP3 Sg ZERO_MA => mkClitic "ga" ;
|
|
AgP3 Pl RI_ZERO => mkClitic "ga" ;
|
|
AgP3 Sg KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl MU_ZERO => mkClitic "gu" ;
|
|
AgP3 Pl RU_ZERO => mkClitic "ru" ;
|
|
AgP3 Sg ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Pl ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_MI | ZERO_ZERO) => mkClitic "" ;
|
|
AgP3 Pl ZERO_MI => mkClitic "e" ;
|
|
AgP3 Pl KA_ZERO => mkClitic "" ;
|
|
_ => mkClitic "SubjNotKnown" --for checking if there is some class unaccounted for
|
|
};
|
|
|
|
|
|
mkSubjCliticTable : Agreement => Str = table {
|
|
AgMUBAP1 n => mkClitics "n" "tu" n;
|
|
--AgMUBAP1 Pl => "tu" ;
|
|
AgMUBAP2 n => mkClitics "o" "mu" n;
|
|
--AgMUBAP2 Pl => "mu" ;
|
|
AgP3 n MU_BA => mkClitics "a" "ba" n;
|
|
--AgP3 Pl MU_BA => "ba" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => mkClitic "ru" ;
|
|
AgP3 Pl RU_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg N_N => mkClitic "e";
|
|
AgP3 Pl N_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Pl MU_MI => "e" ;
|
|
AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>mkClitic "ri";
|
|
AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => mkClitic "ga" ;
|
|
AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => mkClitic "ka" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BI => mkClitic "bi" ;
|
|
AgP3 Sg ZERO_MA => mkClitic "ga" ;
|
|
AgP3 Pl RI_ZERO => mkClitic "ga" ;
|
|
AgP3 Sg KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl MU_ZERO => mkClitic "gu" ;
|
|
AgP3 Pl RU_ZERO => mkClitic "ru" ;
|
|
AgP3 Sg ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Pl ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_MI | ZERO_ZERO) => mkClitic "" ;
|
|
AgP3 Pl ZERO_MI => mkClitic "e" ;
|
|
AgP3 Pl KA_ZERO => mkClitic "" ;
|
|
_ => mkClitic "SubjNotKnown" --for checking if there is some class unaccounted for
|
|
};
|
|
|
|
mkSubjCliticTableSg : Agreement => Str = table {
|
|
AgMUBAP1 Sg => mkClitic "n" ;
|
|
--AgMUBAP1 Pl => "tu" ;
|
|
AgMUBAP2 Sg => mkClitic "o" ;
|
|
--AgMUBAP2 Pl => "mu" ;
|
|
AgP3 Sg MU_BA => mkClitic "a";
|
|
--AgP3 Pl MU_BA => "ba" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
--AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => mkClitic "ru" ;
|
|
--AgP3 Pl RU_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg N_N => mkClitic "e";
|
|
--AgP3 Pl N_N => mkClitic "zi"; --| "i";
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
--AgP3 Pl MU_MI => "e" ;
|
|
AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>mkClitic "ri";
|
|
--AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => mkClitic "ga" ;
|
|
AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => mkClitic "ka" ;
|
|
--AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BU => mkClitic "bu" ;
|
|
--AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg ZERO_BI => mkClitic "bi" ;
|
|
AgP3 Sg ZERO_MA => mkClitic "ga" ;
|
|
--AgP3 Pl RI_ZERO => mkClitic "ga" ;
|
|
AgP3 Sg KU_ZERO => mkClitic "ku" ;
|
|
--AgP3 Pl KU_ZERO => mkClitic "ku" ;
|
|
--AgP3 Pl MU_ZERO => mkClitic "gu" ;
|
|
--AgP3 Pl RU_ZERO => mkClitic "ru" ;
|
|
AgP3 Sg ZERO_TU => mkClitic "tu" ;
|
|
--AgP3 Pl ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_MI | ZERO_ZERO) => mkClitic "" ;
|
|
--AgP3 Pl ZERO_MI => mkClitic "e" ;
|
|
--AgP3 Pl KA_ZERO => mkClitic "" ;
|
|
_ => mkClitic "Non-Signular" --for checking if there is some class unaccounted for
|
|
};
|
|
|
|
mkSubjCliticTablePl : Agreement => Str = table {
|
|
--AgMUBAP1 Sg => mkClitic "n" ;
|
|
AgMUBAP1 Pl => mkClitic "tu" ;
|
|
--AgMUBAP2 Sg => mkClitic "o" ;
|
|
AgMUBAP2 Pl => mkClitic "mu" ;
|
|
--AgP3 Sg MU_BA => mkClitic "a";
|
|
AgP3 Pl MU_BA => mkClitic "ba" ;
|
|
--AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
--AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => mkClitic "ru" ;
|
|
AgP3 Pl RU_N => mkClitic "zi"; --| "i";
|
|
--AgP3 Sg N_N => mkClitic "e";
|
|
AgP3 Pl N_N => mkClitic "zi"; --| "i";
|
|
--AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Pl MU_MI => "e" ;
|
|
--AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>mkClitic "ri";
|
|
AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => mkClitic "ga" ;
|
|
--AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => mkClitic "ka" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
--AgP3 Sg ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
--AgP3 Sg ZERO_BI => mkClitic "bi" ;
|
|
--AgP3 Sg ZERO_MA => mkClitic "ga" ;
|
|
AgP3 Pl RI_ZERO => mkClitic "ga" ;
|
|
--AgP3 Sg KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl KU_ZERO => mkClitic "ku" ;
|
|
AgP3 Pl MU_ZERO => mkClitic "gu" ;
|
|
AgP3 Pl RU_ZERO => mkClitic "ru" ;
|
|
--AgP3 Sg ZERO_TU => mkClitic "tu" ;
|
|
AgP3 Pl ZERO_TU => mkClitic "tu" ;
|
|
--AgP3 Sg (ZERO_MI | ZERO_ZERO) => mkClitic "" ;
|
|
AgP3 Pl ZERO_MI => mkClitic "e" ;
|
|
AgP3 Pl KA_ZERO => mkClitic "give example" ;
|
|
AgP3 Pl GU_GA => mkClitic "ga";
|
|
AgP3 Pl ZERO_ZERO => mkClitic "give example";
|
|
AgP3 Pl KA_TU => mkClitic "tu";
|
|
AgP3 Pl HA => mkClitic "ha";
|
|
AgP3 Pl (MU | KU |I_ZERO |ZERO_BAA |N_ZERO |KI_ZERO|Null) => "";
|
|
AgP3 Pl ZERO_N => mkClitic "zimwe";
|
|
_ => "Plural-NonExist" --;_ => mkClitic "Plural-NonExist" --for checking if there is some class unaccounted for
|
|
|
|
};
|
|
|
|
agrToAgrPl: Agreement -> AgreementPl = \a -> case a of {
|
|
AgMUBAP1 Sg => NONExistPl;
|
|
AgMUBAP1 Pl => AgMUBAP1Pl;
|
|
AgMUBAP2 Sg => NONExistPl;
|
|
AgMUBAP2 Pl => AgMUBAP2Pl ;
|
|
AgP3 Sg MU_BA => NONExistPl;
|
|
AgP3 Pl MU_BA => AgP3Pl MU_BA ;
|
|
AgP3 Sg KI_BI => NONExistPl;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => AgP3Pl (KI_BI | ZERO_BI) ;
|
|
AgP3 Sg (RU_N | RU_MA | RU_ZERO | RU_BU) => NONExistPl ;
|
|
AgP3 Pl RU_N => AgP3Pl RU_N ; --| "i";
|
|
AgP3 Sg N_N => NONExistPl;
|
|
AgP3 Pl N_N => AgP3Pl N_N; --| "i";
|
|
AgP3 Sg (MU_MI | MU_ZERO) => NONExistPl;
|
|
AgP3 Pl MU_MI => AgP3Pl MU_MI;
|
|
AgP3 Sg (RI_MA | RI_ZERO | I_ZERO) =>NONExistPl;
|
|
AgP3 Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) => AgP3Pl (RI_MA | BU_MA | KU_MA | ZERO_MA | I_MA |RU_MA) ;
|
|
AgP3 Sg (KA_BU | KA_ZERO | KA_TU) => NONExistPl;
|
|
AgP3 Pl (KA_BU | RU_BU) => AgP3Pl (KA_BU | RU_BU);
|
|
AgP3 Sg ZERO_BU => NONExistPl;
|
|
AgP3 Pl ZERO_BU => AgP3Pl ZERO_BU ;
|
|
AgP3 Sg ZERO_BI => NONExistPl;
|
|
AgP3 Sg ZERO_MA => NONExistPl;
|
|
AgP3 Pl RI_ZERO => AgP3Pl RI_ZERO ;
|
|
AgP3 Sg KU_ZERO => NONExistPl;
|
|
AgP3 Pl KU_ZERO => AgP3Pl KU_ZERO;
|
|
AgP3 Pl MU_ZERO => AgP3Pl MU_ZERO ;
|
|
AgP3 Pl RU_ZERO => AgP3Pl RU_ZERO ;
|
|
AgP3 Sg ZERO_TU => NONExistPl;
|
|
AgP3 Pl ZERO_TU => AgP3Pl ZERO_TU ;
|
|
AgP3 Sg (ZERO_MI | ZERO_ZERO) => NONExistPl;
|
|
AgP3 Pl ZERO_MI => AgP3Pl ZERO_MI ;
|
|
AgP3 Pl KA_ZERO => AgP3Pl KA_ZERO ;
|
|
_ => NONExistPl --for checking if there is some class unaccounted for
|
|
};
|
|
{-Object particle may be used as
|
|
1. a prefix: e.g mu-kwate = catch him,
|
|
2. an infix: o-mu-kwate = you catch him
|
|
}
|
|
|
|
-}
|
|
mkObjClitic : Agreement -> Str = \a ->case a of {
|
|
|
|
AgMUBAP1 n => mkClitics "n" "tu" n;
|
|
--AgMUBAP1 Pl => "tu" ;
|
|
AgMUBAP2 n => mkClitics "ku" "ba" n;
|
|
--AgMUBAP2 Pl => "ba" ;
|
|
AgP3 Sg MU_BA => mkClitic "mu" ;
|
|
AgP3 Pl MU_BA => mkClitic "ba";
|
|
AgP3 Pl (ZERO_BU | KA_BU | KA_TU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Sg BU_MA => mkClitic "bu" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi";
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "ga" ;
|
|
AgP3 (Sg | Pl) HA => mkClitic "ha";
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => mkClitic "ri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU | KA_TU) => mkClitic "ka" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "ku" ;
|
|
{-
|
|
#comment for the following two lines
|
|
the follwing partciles are all used by Noun Classes of Place i.e. HA, KU and MU
|
|
We take the particle to be "ha" for all of them although noun class KU can use
|
|
another particle "gi" -- see Table of Concords in Appendix of Dictionary by Mpairwe and Kahangi
|
|
|
|
Note: The particles do not change with respect to gender
|
|
|
|
TODO: obtain clear examples of usage
|
|
-}
|
|
AgP3 (Sg | Pl) (HA | MU) => mkClitic "ha" ;
|
|
AgP3 (Sg | Pl) KU => mkClitic "ha" ; -- gi is also possible -- see comment above
|
|
|
|
AgP3 Sg (RU_N | RU_ZERO | RU_BU | RU_MA) => mkClitic "ru" ;
|
|
AgP3 Pl (KA_TU | ZERO_TU) => mkClitic "tu" ;
|
|
|
|
AgP3 Sg (N_N | ZERO_ZERO) => mkClitic "gi" ;
|
|
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Pl GU_GA => "ga" ;
|
|
AgP3 Pl (MU_MI | ZERO_MI) => mkClitic "gi" ;
|
|
{-
|
|
According to Mpaiwe & Kahangi in their table of concords, the particle for the plural
|
|
of noun classes N_N , ZERO_ZERO , ZERO_N & RU_N can be either "i" or "zi" depending
|
|
on object they refer to.
|
|
|
|
Problem:
|
|
However, we cannot use the | operator in strings as GF will
|
|
fail to compile to comletion.
|
|
Implication:
|
|
Some of our output strings will have the wrong object particle attached.
|
|
Even if the operator | worked, we would generate two versions of the linearized
|
|
string of which one would be right and the other wrong
|
|
What is the solution to this?
|
|
-}
|
|
AgP3 Pl (N_N | ZERO_ZERO | ZERO_N | RU_N) => mkClitic "zi" ; --some cases require use of particle "i"
|
|
|
|
_ => mkClitic "-" -- Hopefully exhausted all forms
|
|
};
|
|
Adverb = {s :Str; agr : AgrExist} ;
|
|
mkAdv: Str -> AgrExist -> Adverb =\str, agr ->{s=str; agr=agr};
|
|
--dealing with the adjective
|
|
{-
|
|
The Adjective can be before the noun for TRUE or
|
|
it can be after the noun (FLASE)
|
|
Most Adjectives are stems which are meaningless
|
|
without adjectival prefixes. These prefixes are concords that agree
|
|
with the noun before the them.
|
|
|
|
However some adjectives are self-standing.
|
|
|
|
|
|
You can introduce a more meaningful name or using
|
|
Inari's method of avoiding tables
|
|
i.e. Adjective: Type = { pre : Str ; post : Str; isPre: Bool; isProper : Bool}
|
|
pre -- the adjective or adjective stem that comes before noun
|
|
post --the adjective or adjective stem that comes after noun
|
|
isPre --whether the adjective comes before (TRUE) or after (FALSE) the noun
|
|
isProper -- True for a full adjective anf False for an adjectival stem
|
|
isPrep -- does the adjective need a preposition especially those that come after the noun.
|
|
improve that further by avoiding carrying a table of strings
|
|
using arne's technique
|
|
-}
|
|
--AdjectivalPhrase : Type {s : Str ; post : Str; isPre : Bool; isProper : Bool; isPrep: Bool} ;
|
|
AdjectivalPhrase : Type = {s : Str ; position : Position; isProper : Bool; isPrep: Bool};
|
|
--Adjective : Type = {s : Str ; post : Str; isPre : Bool; isProper : Bool; isPrep: Bool};
|
|
Adjective : Type = {s : Str ;
|
|
position : Position;
|
|
isProper : Bool;
|
|
isPrep: Bool;
|
|
isNeg : Bool -- this is for specifying that uncertain is the negative of certain
|
|
};
|
|
mkAdjective: Str -> Position -> Bool -> Bool ->Bool-> Adjective = \ a , pos, isProper, isPrep,isNeg ->
|
|
{ s = a ; position = pos ; isPre = False; isProper = isProper; isPrep = isPrep; isNeg = isNeg};
|
|
|
|
{-
|
|
TO DO:
|
|
--Subject prefixes / particles of clitics using bind
|
|
-}
|
|
-- Adjectival Prefixes with initial vowel with the semantics of "the"
|
|
mkAdjPronIVClitic : Agreement -> Str = \a -> case a of {
|
|
AgMUBAP1 n => mkClitics "omu" "aba" n;
|
|
--AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 n => mkClitics "omu" "aba" n; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => "aba" ;
|
|
AgP3 n MU_BA => mkClitics "omu" "aba" n;
|
|
--AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "ama";
|
|
AgP3 (Sg | Pl) (HA | MU) => mkClitic "aha" ; -- of place HA & MU
|
|
AgP3 (Sg | Pl) KU => mkClitic "en" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aka" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "omu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "en" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "en" ;
|
|
AgP3 Pl MU_MI => mkClitic "emi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "en" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
AgP3 Pl GU_GA => mkClitic "aga" ;
|
|
_ => mkClitic "XXX" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
mkSStand :Agreement -> Str = \a -> case a of {
|
|
AgMUBAP1 Sg => "nyowe";
|
|
AgMUBAP1 Pl => "itwe";
|
|
AgMUBAP2 Sg => "iwe" ; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "imwe" ;
|
|
AgP3 Sg MU_BA => "uwe" ;
|
|
AgP3 Pl MU_BA => "bo" ;
|
|
AgP3 Pl ZERO_BU => "bwo" ;
|
|
AgP3 Sg BU_MA => "bwo" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "bwo" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "byo" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "go";
|
|
AgP3 (Sg | Pl) HA => "ho" ; -- of place HA
|
|
AgP3 (Sg | Pl) MU => "mwo" ; -- of place MU
|
|
AgP3 (Sg | Pl) KU => "yo" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "ryo" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "ko" ;
|
|
AgP3 Sg KI_BI => "kyo" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "kwo" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "gwo" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "rwo" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>"two" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "yo" ;
|
|
AgP3 Pl ZERO_MI => "yo" ;
|
|
AgP3 Pl MU_MI => "yo";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "zo" ;
|
|
AgP3 Sg GU_GA => "gwo" ;
|
|
AgP3 Pl GU_GA => "go" ;
|
|
_ => "XXX-Failed SStand" -- error checking for any case not catered for
|
|
|
|
};
|
|
-- This involved only change of the personal pronouns as for selfstanding pronouns.
|
|
-- How can it be done without code repeation?
|
|
mkPredetPref :Agreement -> Str = \a -> case a of {
|
|
AgMUBAP1 n => mkClitics "ny" "itwe" n;
|
|
--AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 n => mkClitics "we" "mwe" n; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => "aba" ;
|
|
AgP3 n MU_BA => mkClitics "we" "bo" n;
|
|
--AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bwo" ;
|
|
AgP3 Sg BU_MA => mkClitic "bwo" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bwo" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "byo" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "go";
|
|
AgP3 (Sg | Pl) HA => mkClitic "ho" ; -- of place HA
|
|
AgP3 (Sg | Pl) MU => mkClitic "mwo" ; -- of place MU
|
|
AgP3 (Sg | Pl) KU => mkClitic "yo" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "ryo" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ko" ;
|
|
AgP3 Sg KI_BI => mkClitic "kyo" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "kwo" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gwo" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "rwo" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "two" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "yo" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "yo" ;
|
|
AgP3 Pl MU_MI => mkClitic "yo";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "zo" ;
|
|
AgP3 Sg GU_GA => mkClitic "gwo" ;
|
|
AgP3 Pl GU_GA => mkClitic "go" ;
|
|
_ => mkClitic "XXXPredPref" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- TThis is for demonstrative pronouns which can also be use as Quantifiers
|
|
-- How can it be done without code repeation?
|
|
mkThis = table{
|
|
AgMUBAP1 Sg => mkClitic "ogu";
|
|
AgMUBAP1 Pl => mkClitic "aba" ;
|
|
AgMUBAP2 Sg => mkClitic "ogu"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => mkClitic "aba" ;
|
|
AgP3 Sg MU_BA => mkClitic "ogu";
|
|
AgP3 Pl MU_BA => mkClitic "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "aga";
|
|
AgP3 Sg ZERO_MA => mkClitic "aga";
|
|
AgP3 ( Pl) HA => mkClitic "aha" ; -- of place HA
|
|
AgP3 ( Pl) MU => mkClitic "omu" ; -- of place MU
|
|
AgP3 ( Pl) KU => mkClitic "oku" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aka" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "egi" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "egi" ;
|
|
AgP3 Pl MU_MI => mkClitic "egi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
AgP3 Pl GU_GA => mkClitic "aga" ;
|
|
_ => mkClitic "XXXThisThese" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- TThis is for demonstrative pronouns which can also be use as Quantifiers
|
|
-- These are self-standing
|
|
-- How can it be done without code repeation?
|
|
mkThisNoClitic = table{
|
|
AgMUBAP1 Sg => "ogu";
|
|
AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 Sg => "ogu"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "aba" ;
|
|
AgP3 Sg MU_BA => "ogu";
|
|
AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => "obu" ;
|
|
AgP3 Sg BU_MA => "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "aga";
|
|
AgP3 Sg ZERO_MA => "aga";
|
|
AgP3 ( Pl) HA => "aha" ; -- of place HA
|
|
AgP3 ( Pl) MU => "omu" ; -- of place MU
|
|
AgP3 ( Pl) KU => "oku" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "aka" ;
|
|
AgP3 Sg KI_BI => "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "egi" ;
|
|
AgP3 Pl ZERO_MI => "egi" ;
|
|
AgP3 Pl MU_MI => "egi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "ezi" ;
|
|
AgP3 Sg GU_GA => "ogu" ;
|
|
AgP3 Pl GU_GA => "aga" ;
|
|
_ => "XXXThisThese" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
mkAdjClitic = table{
|
|
AgMUBAP1 Sg => "ogu";
|
|
AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 Sg => "ogu"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "aba" ;
|
|
AgP3 Sg MU_BA => "ogu";
|
|
AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => "obu" ;
|
|
AgP3 Sg BU_MA => "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "aga";
|
|
AgP3 Sg ZERO_MA => "aga";
|
|
AgP3 ( Pl) HA => "aha" ; -- of place HA
|
|
AgP3 ( Pl) MU => "omu" ; -- of place MU
|
|
AgP3 ( Pl) KU => "oku" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "aka" ;
|
|
AgP3 Sg KI_BI => "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "en" ;
|
|
AgP3 Pl ZERO_MI => "egi" ;
|
|
AgP3 Pl MU_MI => "egi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "ezi" ;
|
|
AgP3 Sg GU_GA => "ogu" ;
|
|
AgP3 Pl GU_GA => "aga" ;
|
|
_ => "XXXThisThese" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
{-
|
|
-- TThis is for demonstrative pronouns which can also be use as Quantifiers
|
|
-- How can it be done without code repeation?
|
|
mkThis = table{
|
|
AgMUBAP1 Sg => mkClitic "ogu";
|
|
--AgMUBAP1 Pl => mkClitic "aba" ;
|
|
AgMUBAP2 Sg => mkClitic "ogu"; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => mkClitic "aba" ;
|
|
AgP3 Sg MU_BA => mkClitic "ogu";
|
|
--AgP3 Pl MU_BA => mkClitic "aba" ;
|
|
--AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
--AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
--AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
--AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "aga";
|
|
AgP3 (Sg ) HA => mkClitic "aha" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "omu" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "oku" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aka" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
--AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "egi" ;
|
|
--AgP3 Pl ZERO_MI =>mkClitic "egi" ;
|
|
--AgP3 Pl MU_MI => mkClitic "egi";
|
|
--AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
--AgP3 Pl GU_GA => mkClitic "aga" ;
|
|
_ => mkClitic "XXXThis" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- This is for demonstrative pronouns which can also be use as Quantifiers
|
|
-- How can it be done without code repeation?
|
|
mkThat = table{
|
|
AgMUBAP1 Sg => mkClitic ""; --"ogwo";
|
|
AgMUBAP1 Pl => mkClitic ""; --"abo" ;
|
|
AgMUBAP2 Sg => mkClitic ""; --"ogu"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => mkClitic ""; --"abo" ;
|
|
AgP3 Sg MU_BA => mkClitic ""; --"ogu";
|
|
AgP3 Pl MU_BA => mkClitic ""; --"abo" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obwo" ;
|
|
AgP3 Sg BU_MA => mkClitic "obwo" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obwo" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebyo" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "ago";
|
|
AgP3 ( Pl) HA => mkClitic "aho" ; -- of place HA
|
|
AgP3 ( Pl) MU => mkClitic "omwo" ; -- of place MU
|
|
AgP3 ( Pl) KU => mkClitic "okwo" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eryo" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ekyo" ;
|
|
AgP3 Sg KI_BI => mkClitic "ekyo" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "okwo" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogwo" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "orwo" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otwo" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "egyo" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "egyo" ;
|
|
AgP3 Pl MU_MI => mkClitic "egyo";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezo" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogwo" ;
|
|
AgP3 Pl GU_GA => mkClitic "ago" ;
|
|
_ => mkClitic "XXXThatThose" -- error checking for any case not catered for
|
|
|
|
};
|
|
-}
|
|
-- TThis is for demonstrative pronouns which can also be use as Quantifiers
|
|
-- How can it be done without code repeation?
|
|
mkThat = table {
|
|
AgMUBAP1 Sg => mkClitic "ogwo";
|
|
--AgMUBAP1 Pl => mkClitic "aba" ;
|
|
AgMUBAP2 Sg => mkClitic "ogu"; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => mkClitic "aba" ;
|
|
AgP3 Sg MU_BA => mkClitic "ogu";
|
|
--AgP3 Pl MU_BA => mkClitic "aba" ;
|
|
--AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obwo" ;
|
|
--AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
--AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
--AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "aga";
|
|
AgP3 Sg ZERO_MA => mkClitic "agwo";
|
|
AgP3 (Sg ) HA => mkClitic "aho" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "omwo" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "okwo" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eryo" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ako" ;
|
|
AgP3 Sg KI_BI => mkClitic "ekyo" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "okwo" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogwo" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "orwo" ;
|
|
--AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "egyo" ;
|
|
--AgP3 Pl ZERO_MI =>mkClitic "egi" ;
|
|
--AgP3 Pl MU_MI => mkClitic "egi";
|
|
--AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogwo" ;
|
|
--AgP3 Pl GU_GA => mkClitic "aga" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- Adjectival Prefixes without initial vowel with the semantics for adjectives used in Imperative negative form
|
|
mkAdjPronNoIVClitic : Agreement -> Str = \a -> case a of {
|
|
AgMUBAP1 n => mkClitics "mu" "ba" n;
|
|
--AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 n => mkClitics "mu" "ba" n; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => "aba" ;
|
|
AgP3 n MU_BA => mkClitics "mu" "ba" n;
|
|
--AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg BU_MA => mkClitic "bu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "ma";
|
|
AgP3 (Sg | Pl) (HA | MU) => mkClitic "ha" ; -- of place HA & MU
|
|
AgP3 (Sg | Pl) KU => mkClitic "n" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "ri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ka" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "ku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "mu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "ru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "n" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "n" ;
|
|
AgP3 Pl MU_MI => mkClitic "mi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "n" ;
|
|
AgP3 Sg GU_GA => mkClitic "gu" ;
|
|
AgP3 Pl GU_GA => mkClitic "ga" ;
|
|
_ => mkClitic "XX" -- error checking for any case not catered for
|
|
|
|
};
|
|
-- Genetive Preposition: simple "of" without Initila vowel. It does not combine
|
|
mkGenPrepNoIV : Agreement -> Str = \a -> case a of {
|
|
AgMUBAP1 Sg => "wa";
|
|
AgMUBAP1 Pl => "ba" ;
|
|
AgMUBAP2 Sg => "wa" ; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "ba" ;
|
|
AgP3 Sg MU_BA => "wa" ;
|
|
AgP3 Pl MU_BA => "ba" ;
|
|
AgP3 Pl ZERO_BU => "bwa" ;
|
|
AgP3 Sg BU_MA => "bwa" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "bwa" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "bya" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "ga";
|
|
AgP3 (Sg | Pl) HA => "ha" ; -- of place HA
|
|
AgP3 (Sg | Pl) MU => "mwa" ; -- of place MU
|
|
AgP3 (Sg | Pl) KU => "ya" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "rya" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "ka" ;
|
|
AgP3 Sg KI_BI => "kya" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "kwa" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "gwa" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "rwa" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "twa" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "ya" ;
|
|
AgP3 Pl ZERO_MI => "ya" ;
|
|
AgP3 Pl MU_MI => "emi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "za" ;
|
|
AgP3 Sg GU_GA => "gwa" ;
|
|
AgP3 Pl GU_GA => "ga" ;
|
|
_ => "Error mkGenPrepNoIV" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- Genetive Preposition: simple "of" with Initil vowel
|
|
mkGenPrepWithIV : Agreement => Str = table {
|
|
AgMUBAP1 Sg => "owa" ;
|
|
AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 Sg => "owa" ; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "aba" ;
|
|
AgP3 Sg MU_BA => "owa" ;
|
|
AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => "obwa" ;
|
|
AgP3 Sg BU_MA => "obwa" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "obwa" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "ebya" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "aga";
|
|
AgP3 (Sg | Pl) HA => "aha" ; -- of place HA
|
|
AgP3 (Sg | Pl) MU => "amwa" ; -- of place MU
|
|
AgP3 (Sg | Pl) KU => "aya" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "arya" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "aka" ;
|
|
AgP3 Sg KI_BI => "ekya" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "okwa" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "ogwa" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "orwa" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "otwa" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "eya" ;
|
|
AgP3 Pl ZERO_MI => "eya" ;
|
|
AgP3 Pl MU_MI => "emi";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "eza" ;
|
|
AgP3 Sg GU_GA => "ogwa" ;
|
|
AgP3 Pl GU_GA => "aga" ;
|
|
_ => "Error in mkGenPrepWithIVClitic : no pattern matched" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- Genetive Adjectival suffix: Possessive my book= ekitabo kyagye
|
|
mkGenAdjSuffix : Agreement -> Str =\a -> case a of {
|
|
AgMUBAP1 n => mkClitics "ngye" "itu" n;
|
|
--AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 n => mkClitics "we" "nyu" n; --probably an error check your grammar book
|
|
--AgMUBAP2 Pl => "aba" ;
|
|
AgP3 n MU_BA => mkClitics "e" "bo" n;
|
|
--AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bwo" ;
|
|
AgP3 Sg BU_MA => mkClitic "bwo" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bwo" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "byo" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "go";
|
|
AgP3 (Sg | Pl) HA => mkClitic "ho" ; -- of place HA
|
|
AgP3 (Sg | Pl) MU => mkClitic "mwo" ; -- of place MU
|
|
AgP3 (Sg | Pl) KU => mkClitic "yo" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "ryo" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ko" ;
|
|
AgP3 Sg KI_BI => mkClitic "kyo" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "kwo" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gwo" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "rwo" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "two" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "yo" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "yo" ;
|
|
AgP3 Pl MU_MI => mkClitic "yo";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "zo" ;
|
|
AgP3 Sg GU_GA => mkClitic "gwo" ;
|
|
AgP3 Pl GU_GA => mkClitic "go" ;
|
|
_ => mkClitic "Error mkGenAdjSuffix" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
|
|
mkRPs : RCase => Agreement =>Str = table{
|
|
RSubj => table {
|
|
AgMUBAP1 Sg => mkClitic "o";
|
|
AgMUBAP1 Pl => mkClitic "aba" ;
|
|
AgMUBAP2 Sg => mkClitic "o";
|
|
AgMUBAP2 Pl => mkClitic "aba" ;
|
|
AgP3 Sg MU_BA => mkClitic "o";
|
|
AgP3 Pl MU_BA => mkClitic "aba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "aga";
|
|
AgP3 (Sg ) HA => mkClitic "aha" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "aha" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "e" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aka" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "e" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "e" ;
|
|
AgP3 Pl MU_MI => mkClitic "e";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
AgP3 Pl GU_GA => mkClitic "aga" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
};
|
|
_ => table {
|
|
AgMUBAP1 Sg => mkClitic "ou";
|
|
AgMUBAP1 Pl => mkClitic "abu" ; --note: abu or abi is used. GF does not allow free variation. However, abu is more natural
|
|
AgMUBAP2 Sg => mkClitic "ou"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => mkClitic "abu" ;
|
|
AgP3 Sg MU_BA => mkClitic "o";
|
|
AgP3 Pl MU_BA => mkClitic "abu" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "agu";
|
|
AgP3 (Sg ) HA => mkClitic "ahu" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "ahu" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "ei" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aku" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "ei" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "ei" ;
|
|
AgP3 Pl MU_MI => mkClitic "ei";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
AgP3 Pl GU_GA => mkClitic "agu" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
}
|
|
};
|
|
|
|
mkRPsNoClitic : RCase => Agreement =>Str = table{
|
|
RSubj => table {
|
|
AgMUBAP1 Sg => "o";
|
|
AgMUBAP1 Pl => "aba" ;
|
|
AgMUBAP2 Sg => "o";
|
|
AgMUBAP2 Pl => "aba" ;
|
|
AgP3 Sg MU_BA => "o";
|
|
AgP3 Pl MU_BA => "aba" ;
|
|
AgP3 Pl ZERO_BU => "obu" ;
|
|
AgP3 Sg BU_MA => "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "aga";
|
|
AgP3 (Sg ) HA => "aha" ; -- of place HA
|
|
AgP3 (Sg ) MU => "aha" ; -- of place MU
|
|
AgP3 (Sg ) KU => "e" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "aka" ;
|
|
AgP3 Sg KI_BI => "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "e" ;
|
|
AgP3 Pl ZERO_MI => "e" ;
|
|
AgP3 Pl MU_MI => "e";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "ezi" ;
|
|
AgP3 Sg GU_GA => "ogu" ;
|
|
AgP3 Pl GU_GA => "aga" ;
|
|
_ => "XXXThat" -- error checking for any case not catered for
|
|
|
|
};
|
|
_ => table {
|
|
AgMUBAP1 Sg => "ou";
|
|
AgMUBAP1 Pl => "abu" ; --note: abu or abi is used. GF does not allow free variation. However, abu is more natural
|
|
AgMUBAP2 Sg => "ou"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => "abu" ;
|
|
AgP3 Sg MU_BA => "o";
|
|
AgP3 Pl MU_BA => "abu" ;
|
|
AgP3 Pl ZERO_BU => "obu" ;
|
|
AgP3 Sg BU_MA => "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => "agu";
|
|
AgP3 (Sg ) HA => "ahu" ; -- of place HA
|
|
AgP3 (Sg ) MU => "ahu" ; -- of place MU
|
|
AgP3 (Sg ) KU => "ei" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) => "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) => "aku" ;
|
|
AgP3 Sg KI_BI => "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) => "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) => "ei" ;
|
|
AgP3 Pl ZERO_MI => "ei" ;
|
|
AgP3 Pl MU_MI => "ei";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) => "ezi" ;
|
|
AgP3 Sg GU_GA => "ogu" ;
|
|
AgP3 Pl GU_GA => "agu" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
}
|
|
};
|
|
|
|
mkIPPref : Agreement =>Str = table{
|
|
AgMUBAP1 Sg => mkClitic "o";
|
|
AgMUBAP1 Pl => mkClitic "ba" ;
|
|
AgMUBAP2 Sg => mkClitic "o";
|
|
AgMUBAP2 Pl => mkClitic "ba" ;
|
|
AgP3 Sg MU_BA => mkClitic "o";
|
|
AgP3 Pl MU_BA => mkClitic "ba" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "bu" ;
|
|
AgP3 Sg BU_MA => mkClitic "bu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "bu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "bi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "ga";
|
|
AgP3 (Sg ) HA => mkClitic "ha" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "ha" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "e" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "ri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "ka" ;
|
|
AgP3 Sg KI_BI => mkClitic "ki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "ku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "gu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "ru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "tu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "e" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "e" ;
|
|
AgP3 Pl MU_MI => mkClitic "e";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "zi" ;
|
|
AgP3 Sg GU_GA => mkClitic "gu" ;
|
|
AgP3 Pl GU_GA => mkClitic "ga" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
|
|
mkRObjV2 : Agreement=> Str =table {
|
|
AgMUBAP1 Sg => mkClitic "ou";
|
|
AgMUBAP1 Pl => mkClitic "abi" ; --note: abu or abi is used. GF does not allow free variation. However, abu is more natural
|
|
AgMUBAP2 Sg => mkClitic "ou"; --probably an error check your grammar book
|
|
AgMUBAP2 Pl => mkClitic "abi" ;
|
|
AgP3 Sg MU_BA => mkClitic "ou";
|
|
AgP3 Pl MU_BA => mkClitic "abi" ;
|
|
AgP3 Pl ZERO_BU => mkClitic "obu" ;
|
|
AgP3 Sg BU_MA => mkClitic "obu" ;
|
|
AgP3 Pl (KA_BU | RU_BU) => mkClitic "obu" ;
|
|
AgP3 Pl (KI_BI | ZERO_BI) => mkClitic "ebi" ;
|
|
AgP3 Pl (ZERO_MA | KU_MA | RI_MA | I_MA | BU_MA) => mkClitic "agi";
|
|
AgP3 (Sg ) HA => mkClitic "ahi" ; -- of place HA
|
|
AgP3 (Sg ) MU => mkClitic "ahu" ; -- of place MU
|
|
AgP3 (Sg ) KU => mkClitic "ei" ; -- of place KU
|
|
AgP3 Sg (I_ZERO | I_MA | RI_MA) =>mkClitic "eri" ;
|
|
AgP3 Sg (KA_ZERO | KA_BU) =>mkClitic "aki" ;
|
|
AgP3 Sg KI_BI => mkClitic "eki" ;
|
|
AgP3 Sg (KU_ZERO | KU_MA) => mkClitic "oku" ;
|
|
AgP3 Sg (MU_MI | MU_ZERO) => mkClitic "ogu" ;
|
|
AgP3 Sg (RU_ZERO | RU_BU | RU_MA| RU_N) => mkClitic "oru" ;
|
|
AgP3 Pl (ZERO_TU | KA_TU) =>mkClitic "otu" ;
|
|
AgP3 Sg (ZERO_ZERO | N_N) =>mkClitic "ei" ;
|
|
AgP3 Pl ZERO_MI =>mkClitic "ei" ;
|
|
AgP3 Pl MU_MI => mkClitic "ei";
|
|
AgP3 Pl (ZERO_ZERO | ZERO_N | N_N | RU_N) =>mkClitic "ezi" ;
|
|
AgP3 Sg GU_GA => mkClitic "ogu" ;
|
|
AgP3 Pl GU_GA => mkClitic "agi" ;
|
|
_ => mkClitic "XXXThat" -- error checking for any case not catered for
|
|
|
|
};
|
|
|
|
-- type for Determier necessary for catCgg.gf
|
|
{-
|
|
Determiners are of several types:
|
|
1. Definite and Idefinite Articles
|
|
2. Dmonstratives
|
|
3. Quantifiers
|
|
4. Cardinal numbers
|
|
6. Ordinal numbers
|
|
-}
|
|
Determiner : Type = {s : Str ; s2: Agreement=>Str; ntype : NounState ; num : Number ; pos : Position; doesAgree: Bool; numeralS:Agreement=>Str; numeralExists : Bool};
|
|
mkDet : Str -> NounState -> Number -> Position -> Determiner
|
|
= \ det, ns, num,pos ->
|
|
{
|
|
s = det;
|
|
s2 = \\_=>[];
|
|
ntype = ns;
|
|
num = num;
|
|
pos = pos;
|
|
doesAgree = False;
|
|
numeralS = \\_ => []; -- A true determiner is not a quantifier
|
|
numeralExists = False;
|
|
};
|
|
|
|
-- Pronouns must have agreement because they are used
|
|
-- depending on gender, Number and person
|
|
-- all noun classes have pronouns in the third person
|
|
--This is a big problem, probably we create our own abstract syntax
|
|
{-
|
|
TO-DO: DONE but not tested yet. I have attempted to account for all other classes by using a test.
|
|
-}
|
|
Pronoun : Type ={s : Case => Str; third:Agreement => Case=>Str; agr:AgrExist} ;
|
|
{-
|
|
mkPron : Str -> Str ->Pronoun =\nom,acc, ->
|
|
|
|
s = table {Nom => nom; Acc => acc};
|
|
agr = a;
|
|
};
|
|
-}
|
|
|
|
PolTemp = {s : Agreement => Str * Str ; end : Str} ; -- a tupple of two strings
|
|
|
|
-- Structural
|
|
-- prepositions sometimes have two kinds, near or far i.e omu or omuri
|
|
-- We ignore the distal dexis to be entered as a separate lemma
|
|
-- Instead str for positional arguments 1 & 2 cater for prepositions that inflect with Number
|
|
-- while str for positional argument 3 caters for those that do not inflect with Number
|
|
Preposition : Type = {s : Str; other : Str; isGenPrep : Bool};
|
|
|
|
NounPhrase : Type = {s :Case => Str; agr : Agreement};
|
|
{-
|
|
Operation to create Noun Phrases from a Determiner and Nouns.
|
|
In Runyankore and Rukiga, depending on the particular Determiner,
|
|
it can appear before (we call PreDeterminer) or after (PostDeterminer) the noun.
|
|
Examples:
|
|
A. Determiners before the Noun: This is wrong. there is a class of Predeterminers
|
|
1. Definite aricles: Usually using the initial vowel sufficient
|
|
2. Demonstratives: ogu muntu (This person)
|
|
3. Every: every man = "buri muntu"
|
|
B. Determiners fater the noun
|
|
1. Definite aricles: Usually using the initial vowel is sufficient
|
|
2. Demonstratives: omuntu ogu (person this)
|
|
3. few: omuntu mu-kye
|
|
Note: Problem stil exists because we cannot know when the determiner string is empty
|
|
There is a mistake here. If the determiner is empty, we end up with a
|
|
meaningless subject particle standing alone. we can test if det.s is a
|
|
string or empty.
|
|
|
|
-}
|
|
mkDetCN : Determiner -> Noun -> NounPhrase = \ det, cn ->
|
|
let subjClitic = mkSubjClitic (AgP3 det.num cn.gender)
|
|
in
|
|
case <det.pos, det.num> of {
|
|
<Post, Pl> => {s = \\_=> cn.s!det.num! det.ntype ++ subjClitic ++ det.s2 !AgP3 det.num cn.gender; agr = AgP3 det.num cn.gender; nounCat = cn.nounCat}; --subjClitic ++ cn.s!det.num! det.ntype ++ subjClitic ++ det.s2 !AgP3 det.num cn.gender; agr = AgP3 det.num cn.gender; nounCat = cn.nounCat};
|
|
<Post, Sg> => {s = \\_=>cn.s!det.num! det.ntype ++ subjClitic ++ det.s2 ! AgP3 det.num cn.gender; agr = AgP3 det.num cn.gender; nounCat = cn.nounCat};
|
|
<Pre, n> => case det.numeralExists of {
|
|
False => { s =\\_ => det.s2 !(AgP3 det.num cn.gender) ++ cn.s !n ! Complete; agr = AgP3 det.num cn.gender; nounCat = cn.nounCat};
|
|
True => { s =\\_ => cn.s !n ! Complete ++ det.numeralS ! (AgP3 n cn.gender); agr = AgP3 det.num cn.gender; nounCat = cn.nounCat}
|
|
}
|
|
--<PostDeterminer, PFalse> => {s = \\_=> cn.s!det.ntype!det.num; agr = AgP3 det.num cn.gender }
|
|
};
|
|
|
|
|
|
|
|
|
|
--Verb
|
|
param
|
|
VFormMini = VFInf | VFPres | VFPast | VFPastAnt | VFPresAnt | VFPresProg | VFPresPart |VFPastPart;
|
|
oper
|
|
--Verb : Type = {s : VFormMini => Str};
|
|
Verb : Type = {
|
|
s : Str;
|
|
pres:Str;
|
|
perf:Str;
|
|
--morphs: VFormMini => VerbMorphPos=> Str;
|
|
isPresBlank : Bool;
|
|
isPerfBlank : Bool;
|
|
isRegular: Bool;
|
|
p : Str; -- some verbs have particles such as prepositions and adverbial that give the verb a meaning different from what would be automatically deduced
|
|
isRefl : Bool
|
|
};
|
|
|
|
GVerb : Type = {
|
|
s : Bool => Str ;
|
|
--morphs : VFormMini => VerbMorphPos =>Str;
|
|
isAux : Bool
|
|
};
|
|
{-
|
|
The V2 sometimes uses preopsitions for formation
|
|
of direct object. Unlike in English where the verb
|
|
and the preposition are disjunctive such as "send to",
|
|
In runyakore and rukiga, the verb and preposition are
|
|
conjunctive such as sindik-ira.
|
|
--The English equivalents are phrasal verbs not V2 I guess.
|
|
|
|
Because of the fusion, I have deffered including this in
|
|
the compPrep. Actually, it is going to be empty in the next version
|
|
-}
|
|
Verb2 : Type = Verb ** {comp: Str; isCompN2: Bool};
|
|
Verb3 : Type = Verb2 ** {comp2 : Str} ;
|
|
{-
|
|
Given a root, can you form the different verbforms?
|
|
-}
|
|
param
|
|
VerbMorphPos = PreVerb | PriNegM | --ObjRel | SubjMarker |
|
|
SecNegM | TAMarker | PersistiveMarker| --DObjM | IDobjM |
|
|
RestOfVerb;
|
|
oper
|
|
VMorphs : Type = VFormMini => VerbMorphPos => Str;
|
|
VerbPhrase: Type = {
|
|
s:Str;
|
|
pres:Str;
|
|
perf:Str;
|
|
--morphs: VMorphs ;
|
|
isPresBlank : Bool;
|
|
isPerfBlank : Bool;
|
|
isRegular:Bool;
|
|
comp:Str ;
|
|
comp2:Str;
|
|
ap : Str;
|
|
isCompApStem : Bool;
|
|
agr : AgrExist;
|
|
adv:Str;
|
|
containsAdv: Bool;
|
|
adV:Str;
|
|
containsAdV:Bool
|
|
};
|
|
-- in VP formation, all verbs are lifted to GVerb, but morphology doesn't need to know this
|
|
verb2gverb : Verb ->Str -> GVerb = \v, ba -> {
|
|
s = table{
|
|
True => v.s;
|
|
False => ba --the special verb to be
|
|
};
|
|
--morphs = v.morphs;
|
|
isAux = False
|
|
};
|
|
{-
|
|
In Runynakore & Rukiga the verb to be in english has two
|
|
Infinitives i.e.
|
|
a) ri --used when it is the only main and therefore licenses a subject
|
|
b) ba --used usually as commands, such as Imperatives or when another
|
|
verb is acting as the main verb. It also acts as the infitive form
|
|
-}
|
|
be_GVerb : GVerb = {
|
|
s= table{True => "ri"; False =>"b" };
|
|
--morphs = \\form, morphs =>[];
|
|
isAux = True};
|
|
|
|
|
|
be_Copula : Verb = {
|
|
s = "ri" ;
|
|
pres=[];
|
|
perf=[];
|
|
--morphs= mkVerbMorphs;
|
|
isPresBlank = True;
|
|
isPerfBlank = True;
|
|
isRegular=False;
|
|
p = [];
|
|
isRefl = False
|
|
};
|
|
mkBecome : Verb ={
|
|
s = "b" ;
|
|
pres="a";
|
|
perf="ire";
|
|
isPresBlank = False;
|
|
isPerfBlank = False;
|
|
--morphs= mkVerbMorphs;
|
|
isRegular=False;
|
|
p = [];
|
|
isRefl = False
|
|
};
|
|
|
|
|
|
--be1_Verb: Verb = {s="b"; pres = "e"; perf="a"; morphs = mkVerbMorphs};
|
|
--be2_Verb: Verb = {s="ri"; pres = "e"; perf="a"; morphs = mkVerbMorphs};
|
|
{-
|
|
--copulative conjugations of ni and ri as used for adjectives
|
|
|
|
copRiNi :Verb ={
|
|
s= table {
|
|
True => table{
|
|
VPres (Agr (NC_mu_ba) Sg Per1) => "ndi" ;
|
|
VPres (Agr (NC_mu_ba) Pl Per1) => "turi";
|
|
VPres (Agr (NC_mu_ba) Sg Per2) => "ori" ;
|
|
VPres (Agr (NC_mu_ba) Pl Per2) => "muri";
|
|
VPres (Agr (NC_mu_ba) Sg Per3) => "ari" ;
|
|
VPres (Agr (NC_mu_ba) Pl Per3) => "bari";
|
|
VPres (Agr (_) _ _)=> ""
|
|
};
|
|
-}
|
|
{-
|
|
This function packages the different morphemes of the each tense of verb
|
|
that are commonly used and have not more than two possibilities i.e.
|
|
1. infintive marker at begining of verb
|
|
2. ni - continuous marker at begining of the present participle / present continuous
|
|
3. ti - Primary Negative marker
|
|
4. ta - Secondary Negative Marker
|
|
5. Tense and aspect markers
|
|
6. Persistive Marker
|
|
7. Rest of Verb.
|
|
These can be increased further. Note: Only those tenses clossest to the english equivalent
|
|
have been chosen. The full resource shall require even more.
|
|
-}
|
|
mkVerbMorphs:VMorphs = table{
|
|
VFInf => table{
|
|
PreVerb => "ku";
|
|
PriNegM => [];
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => [];
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"a"
|
|
};
|
|
VFPres => table{
|
|
PreVerb => [];
|
|
PriNegM => "ti";
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => [];
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"a"
|
|
};
|
|
VFPresAnt => table{
|
|
PreVerb => [];
|
|
PriNegM => "ti";
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => [];
|
|
TAMarker => [];
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"ire"
|
|
};
|
|
VFPresPart => table{
|
|
PreVerb => [];
|
|
PriNegM => [];
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => "riku";
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"a"
|
|
};
|
|
VFPastPart => table{
|
|
PreVerb => [];
|
|
PriNegM => [];
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => "ku";
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"irwe"
|
|
};
|
|
|
|
--mkVerbPast:Str -> Str =\root -> Predef.BIND ++"ti" ++ Predef.BIND ++ "PriNegM" ++ Predef.BIND ++ "TM1" ++ Predef.BIND ++ "Empy" ++ Predef.BIND ++ "TM2" ++ Predef.BIND ++ "Empty" ++ Predef.BIND ++ "stem" ++ Predef.BIND ++ root ++ Predef.BIND ++ "ire";
|
|
VFPast => table{
|
|
PreVerb => [];
|
|
PriNegM => "ti";
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => [];
|
|
TAMarker => [];
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"ire"
|
|
};
|
|
--"ni" ++ Predef.BIND ++ "ContM" ++ Predef.BIND ++ "ti" ++ Predef.BIND ++ "PriNegM" ++ Predef.BIND ++ "TM1" ++ Predef.BIND ++ "Empy" ++ Predef.BIND ++ "TM2" ++ Predef.BIND ++ "Empty" ++ Predef.BIND ++ "stem" ++ Predef.BIND ++ root ++ Predef.BIND ++"a";
|
|
VFPresProg => table{
|
|
PreVerb => "ni";
|
|
PriNegM => [];
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => [];
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"a"
|
|
};
|
|
VFPastAnt => table{ --always requires auxiliary with
|
|
PreVerb => [];
|
|
PriNegM => [];
|
|
--ObjRel => [];
|
|
--SubjMarker =[];
|
|
SecNegM => "ta";
|
|
TAMarker => "aa";
|
|
PersistiveMarker => [];
|
|
--DObjM => [];
|
|
--IDobjM => [];
|
|
RestOfVerb =>"ire"
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
--oper
|
|
--Concatenates two strings at runtime without spaces
|
|
|
|
glue: Str -> Str ->Str =\ x, y -> x ++ BIND ++ y;
|
|
--Concatenates two strings for the genetive case
|
|
glueGen: Agreement ->Str = \ a -> mkGenPrepNoIV a ++ BIND ++ mkGenAdjSuffix a;
|
|
|
|
--Number determining element
|
|
Numer : Type = { s: Agreement => Str ; n : Number; numeralExists:Bool};
|
|
|
|
--VPSlash : Type = VerbPhrase ** { c : Str };
|
|
VPSlash : Type = {
|
|
s:Str;
|
|
pres:Str;
|
|
perf:Str;
|
|
--morphs: VMorphs;
|
|
isPresBlank : Bool;
|
|
isPerfBlank : Bool;
|
|
comp: Str;
|
|
comp2:Str;
|
|
ap:Str;
|
|
isRegular:Bool;
|
|
adv:Str;
|
|
containsAdv:Bool;
|
|
adV:Str;
|
|
containsAdV:Bool
|
|
}; --comp is empty
|
|
|
|
|
|
{-
|
|
-- Clause is a combination of a Subject, Verb and Object(s)
|
|
-- i.e. Subj, verb with polarity and temp features and verb complement
|
|
-- which is the Objects, NPs PPs APs etc.
|
|
-}
|
|
Clause : Type = { -- word order is fixed in S and QS
|
|
s : Str ; --subject
|
|
subjAgr : Agreement;
|
|
root : Str;
|
|
pres: Str;
|
|
perf: Str;
|
|
isPresBlank : Bool;
|
|
isPerfBlank : Bool;
|
|
--morphs : VFormMini => VerbMorphPos =>Str;
|
|
{-
|
|
inf : Str;
|
|
pres : Str;
|
|
past : Str;
|
|
presPart : Str;
|
|
pastPart : Str; -- subject
|
|
--root : Str ; -- dep. on Pol,Temp, e.g. "does","sleep"
|
|
-}
|
|
compl : Str -- after verb: complement, adverbs
|
|
} ;
|
|
param
|
|
CompSource = NounP | ADverb | AdjP | CommonNoun;
|
|
oper
|
|
Comp : Type = {s:Str; source : CompSource };
|
|
|
|
|
|
--Conjunctions
|
|
Conjunction : Type = {s : AgrConj =>Str ;s2 : Str ; n : Number} ;
|
|
|
|
-- For $Numeral$.
|
|
param
|
|
--2 For $Numeral$
|
|
|
|
CardOrd = NCard | NOrd;
|
|
--DForm = Unit Gender| Ten Gender | N20_50 Gender| N60_n70 Gender; -- | hundred | thousand | tenThousand | hundredThousand | million ;
|
|
oper
|
|
mkNum : Str ->Str -> Gender ->Str-> Gender -> Bool-> --Str-> Gender->Str-> Gender-> Str -> Gender
|
|
{
|
|
s : Str;
|
|
unit : { s:Str ; g : Gender; stem : Str};
|
|
ten : { s:Str ; g : Gender};
|
|
ordinal :Str;
|
|
--twenty_fifty : { s:str ; g : gender; stem : Str};
|
|
--sixty_seventy : { s:str ; g : gender; stem : Str};
|
|
--eighty_ninety : { s:str ; g : gender; stem : Str};
|
|
isOrdDifferent: Bool -- If the ordinal number is different from the cardinal
|
|
} =
|
|
\biri, ibiri, g1, abiri,g2, isOrdDifferent -> case isOrdDifferent of {
|
|
True =>{
|
|
s = [];
|
|
unit = {s = ibiri; g = g1; stem =biri};
|
|
ten = {s = abiri ; g = g2};
|
|
ordinal = "ka" + biri;
|
|
isOrdDifferent = isOrdDifferent
|
|
};
|
|
False =>{
|
|
s = [];
|
|
unit = {s = ibiri; g = g1; stem =biri};
|
|
ten = {s = abiri ; g = g2};
|
|
ordinal = [];
|
|
isOrdDifferent = isOrdDifferent
|
|
}
|
|
};
|
|
|
|
getGender : Agreement -> Gender =\agr ->
|
|
case agr of {
|
|
(AgP3 n g) => g;
|
|
(AgMUBAP1 n) => MU_BA;
|
|
(AgMUBAP2 n) => MU_BA;
|
|
NONE => Null
|
|
};
|
|
getNumber : Agreement -> Number =\agr ->
|
|
case agr of {
|
|
(AgP3 n g) => n;
|
|
(AgMUBAP1 n) => n;
|
|
(AgMUBAP2 n) => n;
|
|
NONE => Sg --default -- a hack
|
|
};
|
|
} |