1
0
forked from GitHub/gf-rgl
Files
gf-rgl/src/kikamba/MorphoKam.gf
kitukb bd556c7789 Adding a bantu Functor (#32)
* added Bantu functor

*  added egekusii language based on Bantu functor

*  added kikamba language based on Bantu functor

*  added kiswahili language based on Bantu functor
2018-10-03 12:52:48 +02:00

435 lines
16 KiB
Plaintext

--# -path=.:../../prelude
--Kikamba Resource Morphology
--
-- Benson Kituku 2017 -- 2018
resource MorphoKam = CommonBantu ,ResKam ** open Prelude, Predef
in {
flags optimize=all ;
oper
mkDet: (i, mine : Str) -> Number -> {s : DetForm => Str ; n : Number} =
\i,mine, m ->
{ s = table {
Sub => i;
Obj g => Detprefix g + mine} ;
n = m } ;
Detsomesgprefix : Gender -> Str = \g ->
case <g> of {
<G1> |<G2> |<G8> |<G9> => "u" ;
<G3> => "yi" ;
<G4> => "ki" ;
<G5> => "ka" ;
<G10> => "ku" ;
<G6> => "va" ;
<G7> => "i"
} ;
Detsomeplprefix : Gender -> Str = \g ->
case <g> of {
<G1> |<G3> |<G8> |<G10> => "a" ;
<G2> => "i" ;
<G4> => "i" ;
<G5> => "tu" ;
<G6> => "ku" ;
<G7> | <G9> => "i"
} ;
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Gender => Str} =
\two, twelve, twenty, second ->
{s = table {
unit => table {NCard =>\\g => Cardprefix g + two ;
NOrd => \\g => Ordprefix g ++ second} ;
teen => table {NCard =>\\g =>"ikumi na" ++ twelve ;
NOrd => \\g => Ordprefix g ++ "ikumi na" ++ twelve} ;
ten => table {NCard =>\\g =>"miongo " ++ twelve ;
NOrd => \\g => Ordprefix g ++ "miongo" ++ twelve};
hund => table {NCard =>\\g =>"maana " ++ twenty ;
NOrd => \\g => Ordprefix g ++ "maana" ++ twenty}
}
} ;
mkNumn : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Gender => Str} =
\two, twelve, twenty, second ->
{s = table {
unit => table {NCard =>\\g => Cardtwoprefix g + two ;
NOrd => \\g => Ordprefix g ++ second} ;
teen => table {NCard =>\\g =>"ikumi na" ++ twelve ;
NOrd => \\g => Ordprefix g ++ "ikumi na" ++ twelve} ;
ten => table {NCard =>\\g =>"miongo " ++ twelve ;
NOrd => \\g => Ordprefix g ++ "miongo" ++ twelve};
hund => table {NCard =>\\g =>"maana " ++ twenty ;
NOrd => \\g => Ordprefix g ++ "maana" ++ twenty}
}
} ;
mkNume : Str -> Str -> Str -> {s : DForm => CardOrd => Gender => Str} =
\two, twenty, second ->
{s = table {
unit => table {NCard =>\\g => Cardoneprefix g + two ;
NOrd => \\g => Ordprefix g ++ second} ;
teen => table {NCard =>\\g =>"ikumi na" ++ Cardoneprefix g + two ;
NOrd => \\g => Ordprefix g ++ "ikumi na" ++ Cardoneprefix g + two} ;
ten => table {NCard =>\\g =>"ikumi" ;
NOrd => \\g => Ordprefix g ++ "ikumi"};
hund => table {NCard =>\\g =>"yiana " ++ twenty ;
NOrd => \\g => Ordprefix g ++ "yiana" ++ twenty}
}
} ;
regNum : Str -> {s : DForm => CardOrd => Gender => Str} =
\six -> {s = table {
unit => table {NCard =>\\g => six ;
NOrd => \\g => Ordprefix g ++ six} ;
teen => table {NCard =>\\g =>"ikumi na" ++ six ;
NOrd => \\g => Ordprefix g ++ "ikumi na" ++ six} ;
ten => table {NCard =>\\g =>"miongo " ++ six ;
NOrd => \\g => Ordprefix g ++ "miongo" ++ six};
hund => table {NCard =>\\g =>"maana " ++ six ;
NOrd => \\g => Ordprefix g ++ "maana" ++ six}
} } ;
regCardOrd : Str -> {s : CardOrd => Gender => Str} = \ten ->
{s = table {NCard => \\g => ten ;
NOrd =>\\g => Ordprefix g ++ ten } } ;
regCardone : Str -> Str -> {s : CardOrd => Gender => Str} = \ten,one ->
{s = table {NCard => \\g => ten ++ Cardoneprefix g + one ;
NOrd =>\\g => Ordprefix g ++ ten ++ Cardoneprefix g + one } } ;
mkCard : CardOrd -> Str -> Gender => Str = \o,ten ->
(regCardOrd ten).s ! o ;
regN : Str ->Gender -> Noun = \w, g -> let wpl = case g of {
G1=>case w of {
"mwa" + _ => Predef.drop 2 w ;
"mwi" + _ => "e" + Predef.drop 3 w ;
_ => PrefixPlNom G1 + Predef.drop 2 w };
G2=>case w of {
"mw" + _ => "my" + Predef.drop 2 w ;
_ => PrefixPlNom G2 + Predef.drop 2 w };
G3 => PrefixPlNom G3 + Predef.drop 1 w;
G4=> case w of {
"ky" + _ => "sy" + Predef.drop 2 w ;
_ => PrefixPlNom G4 + Predef.drop 2 w };
G5 => PrefixPlNom G5 + Predef.drop 2 w;
G6 => PrefixPlNom G6 + Predef.drop 2 w;
G8 => PrefixPlNom G8 + w;
G9 => PrefixPlNom G9 + w ;
G10 => PrefixPlNom G10 + Predef.drop 2 w;
G7 => w };
in iregN w wpl g ;
iregN :Str-> Str ->Gender -> Noun= \man,men,g -> { -- for irregular noun
s = table{Sg => table{Nom => man ;
Loc=> man + "ni" | men + "ni" };
Pl => table{Nom => men ; Loc=> ""}} ;
g = g
} ;
regA:Str -> {s : AForm => Str} = \seo -> {s = table {
AAdj G1 Sg=>case Predef.take 1 seo of {
"a"|"e"|"i"|"o" => "mw" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix G1 Sg + seo };
AAdj G1 Pl =>case Predef.take 1 seo of {
"u" => "o" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G1 Pl + seo };
AAdj G2 Sg=>case Predef.take 1 seo of {
"i" => "mw" + seo;
"a" => "my" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix G2 Sg + seo };
AAdj G2 Pl =>case Predef.take 1 seo of {
"u" => "my" + seo;
"i" => "m" + seo;
_ => ConsonantAdjprefix G2 Pl + seo };
AAdj G3 Sg=>case Predef.take 1 seo of {
"i"|"u" => "y" + seo;
"a" => "yi" + seo;
_ => ConsonantAdjprefix G3 Sg + seo };
AAdj G3 Pl =>case Predef.take 1 seo of {
"u" => "mo"+ Predef.drop 1 seo;
_ => ConsonantAdjprefix G3 Pl + seo };
AAdj G4 Sg=>case Predef.take 1 seo of {
"i" => "k" + seo;
"u" |"a" => "ky" + seo;
_ => ConsonantAdjprefix G4 Sg + seo };
AAdj G4 Pl =>case Predef.take 1 seo of {
"u" => "mb"+ seo;
"i" => "sy" + seo;
"a" => "nd" + seo;
_ => ConsonantAdjprefix G4 Pl + seo };
AAdj G5 Sg=>case Predef.take 1 seo of {
"u" => "ko" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G5 Sg + seo };
AAdj G5 Pl =>case Predef.take 1 seo of {
"u" => "t"+ seo;
"a" | "i" => "tw" + seo;
_ => ConsonantAdjprefix G5 Pl + seo };
AAdj G6 Sg=>case Predef.take 1 seo of {
"u" => "vo" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G6 Sg + seo };
AAdj G6 Pl =>case Predef.take 1 seo of {
"u" => "k" + seo;
"i"|"a" => "kw" + seo;
_ => ConsonantAdjprefix G6 Pl + seo };
AAdj G7 n =>case Predef.take 1 seo of {
"s" |"i" => "nz" + seo;
"v" | "u" => "mb" + seo;
"k" => "ng" + seo;
"t" | "a" => "nd" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G7 n + seo };
AAdj G9 Pl =>case Predef.take 1 seo of {
"s" |"i" => "nz" + seo;
"v" | "u" => "mb" + seo;
"k" => "ng" + seo;
"t" | "a" => "nd" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G9 Pl + seo };
AAdj G10 Sg =>case Predef.take 1 seo of {
"u" => "k" + seo;
"i"|"a" => "kw" + seo;
_ => ConsonantAdjprefix G10 Sg + seo };
AAdj g Pl =>case Predef.take 1 seo of {
"u" => "mo" + Predef.drop 1 seo;
_ => ConsonantAdjprefix g Pl + seo };
AAdj g Sg=>case Predef.take 1 seo of {
"i" => "mw" + seo;
"a" => "my" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix g Sg + seo };
AComp G1 Sg=>let af : Str = case Predef.take 1 seo of {
"a"|"e"|"i"|"o" => "mw" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix G1 Sg + seo };
in init af + "ang" + last af;
AComp G1 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "o" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G1 Pl + seo }
in init af + "ang" + last af;
AComp G2 Sg=>let af : Str = case Predef.take 1 seo of {
"i" => "mw" + seo;
"a" => "my" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix G2 Sg + seo };
in init af + "ang" + last af;
AComp G2 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "my" + seo;
"i" => "m" + seo;
_ => ConsonantAdjprefix G2 Pl + seo }
in init af + "ang" + last af;
AComp G3 Sg=>let af : Str = case Predef.take 1 seo of {
"i"|"u" => "y" + seo;
"a" => "yi" + seo;
_ => ConsonantAdjprefix G3 Sg + seo };
in init af + "ang" + last af;
AComp G3 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "mo"+ Predef.drop 1 seo;
_ => ConsonantAdjprefix G3 Pl + seo }
in init af + "ang" + last af;
AComp G4 Sg=>let af : Str = case Predef.take 1 seo of {
"i" => "k" + seo;
"u" => "ky" + seo;
_ => ConsonantAdjprefix G4 Sg + seo };
in init af + "ang" + last af;
AComp G4 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "mb"+ seo;
"i" => "sy" + seo;
"a" => "nd" + seo;
_ => ConsonantAdjprefix G4 Pl + seo }
in init af + "ang" + last af;
AComp G5 Sg=>let af : Str = case Predef.take 1 seo of {
"u" => "ko" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G5 Sg + seo };
in init af + "ang" + last af;
AComp G5 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "t"+ seo;
"a" | "i" => "tw" + seo;
_ => ConsonantAdjprefix G5 Pl + seo }
in init af + "ang" + last af;
AComp G6 Sg=>let af : Str = case Predef.take 1 seo of {
"u" => "vo" + Predef.drop 1 seo;
_ => ConsonantAdjprefix G6 Sg + seo };
in init af + "ang" + last af;
AComp G6 Pl =>let af : Str = case Predef.take 1 seo of {
"u" => "k" + seo;
"i"|"a" => "kw" + seo;
_ => ConsonantAdjprefix G6 Pl + seo }
in init af + "ang" + last af;
AComp G7 n =>let af : Str = case Predef.take 1 seo of {
"s" |"i" => "nz" + seo;
"v" | "u" => "mb" + seo;
"k" => "ng" + seo;
"t" | "a" => "nd" + seo;
_ => ConsonantAdjprefix G7 n + seo };
in init af + "ang" + last af;
AComp G9 Pl =>let af : Str = case Predef.take 1 seo of {
"s" |"i" => "nz" + seo;
"v" | "u" => "mb" + seo;
"k" => "ng" + seo;
"t" | "a" => "nd" + seo;
_ => ConsonantAdjprefix G9 Pl + seo };
in init af + "ang" + last af;
AComp G10 Sg =>let af : Str = case Predef.take 1 seo of {
"u" => "k" + seo;
"i"|"a" => "kw" + seo;
_ => ConsonantAdjprefix G10 Sg + seo }
in init af + "ang" + last af;
AComp g Pl => let af : Str = case Predef.take 1 seo of {
"u" => "mo" + Predef.drop 1 seo;
_ => ConsonantAdjprefix g Pl + seo }
in init af + "ang" + last af;
AComp g Sg=>let af : Str = case Predef.take 1 seo of {
"i" => "mw" + seo;
"a" => "my" + seo;
"u" => "m" + seo;
_ => ConsonantAdjprefix g Sg + seo };
in init af + "ang" + last af
} };
iregA : Str-> Str -> {s : AForm => Str} = \seo,seoo -> {
s = table {
AAdj g Sg => seo;
AAdj g Pl=> seoo ;
AComp g Sg => init seo + "ang" + last seo;
AComp g Pl => init seoo + "ang" + last seoo}
} ;
--regular expression for adjective colours
cregA : Str-> {s : AForm => Str} = \seo -> {
s = table {
AAdj g Sg => ProunSgprefix g + "a" ++"langi" ++"wa" ++ seo;
AAdj g Pl=> ProunPlprefix g + "a" ++"langi" ++"wa" ++ seo;
AComp g n => ""} } ;
regV : Str -> Verb =
\vika -> {
s = table{ True => table{
VInf => vika;
VPres g n p => Verbprefix g n p + vika;
VPast g n p => Verbprefix g n p + init vika + "ie" ;
VFut g n p => Verbfutureprefix g n p + vika
} ;
False =>table {
VInf => "ndi" + vika;
VPres g n p => neg (Ag g n p) False Pres + "na" + vika ;
VPast g n p => neg (Ag g n p) False Past + "ne" + vika ;
VFut g n p => neg (Ag g n p) False Fut + "ka" + vika
}
};
};
neg : Agr -> Bool ->Tense -> Str = \a,b,t -> let
g = getGender a;
n=getNumber a;
p=getPerson a
in case b of {True => [] ; False => negprefix g n t p} ;
negprefix : Gender -> Number -> Tense -> Person -> Str =\g,n,t,p-> case <g,n,t,p> of {
<G1,Sg,_,P1> => "ndi";
<G1,Sg,_,P2> => "ndu";
<G1,Sg,_,P3> => "ndu";
<G1,Pl,_,P1> => "twi";
<G1,Pl,_,P2> => "mwi";
<G1,Pl,_,P3> => "mai";
<G2,Sg,_,_> => "ndu";
<G2,Pl,_,_> => "i";
<G3,Sg,_,_> => "i";
<G3,Pl,_,_> => "mai";
<G4,Sg,_,_> => "ki";
<G4,Pl,_,_> => "i";
<G5,Sg,_,_> => "kai";
<G5,Pl,_,_> => "tui";
<G6,Sg,_,_> => "vai";
<G6,Pl,_,_> => "kui";
<G7,Sg,_,_> => "i";
<_,_,_,_> => "syi"
};
Verbprefix : Gender -> Number -> Person -> Str = \g, n, p ->
case <g,n,p> of {
<G1,Sg,P1> => "na" ;
<G1,Sg,P2> => "wa" ;
<G1,Sg,P3> => "wa" ;
<G1,Pl,P1> => "twa" ;
<G1,Pl,P2> => "mwa" ;
<G1,Pl,P3> => "ma" ;
<G2,Sg,_> => "wa" ;
<G2,Pl, _> => "ya" ;
<G4,Sg,_> => "kya" ;
<G4,Pl,_> => "sya" ;
<G3,Sg,_> => "ya" ;
<G3,Pl,_> => "ma" ;
<G5,Sg,_> => "ka" ;
<G5,Pl,_> => "twa" ;
<G6,Sg,_> => "va" ;
<G6,Pl,_> => "kwa" ;
<_,Sg,_> => "ya" ;
<_,Pl,_> => "sya"
} ;
Verbfutureprefix : Gender -> Number -> Person -> Str = \g, n, p ->
case <g,n,p> of {
<G1,Sg,P1> => "nga" ;
<G1,Sg,P2> => "uka" ;
<G1,Sg,P3> => "uka" ;
<G1,Pl,P1> => "tuka" ;
<G1,Pl,P2> => "muka" ;
<G1,Pl,P3> => "maka" ;
<G2,Sg,_> => "uka" ;
<G2,Pl, _> => "ika" ;
<G4,Sg,_> => "kika" ;
<G4,Pl,_> => "ika" ;
<G3,Sg,_> => "ika" ;
<G3,Pl,_> => "maka" ;
<G5,Sg,_> => "kaka" ;
<G5,Pl,_> => "tuka" ;
<G6,Sg,_> => "vaka" ;
<G6,Pl,_> => "kuka" ;
<_,Sg,_> => "ika" ;
<_,Pl,_> => "ika"
} ;
}