--# -path=.:../../prelude --1 Kiswahili morphology Resource Morphology -- -- Benson Kituku 2017-2018 resource MorphoSwa = CommonBantu ,ResSwa ** open Prelude, Predef in { flags optimize=all ; oper Many_prefix : Gender -> Str = \g -> case of { => "we" ; => "mi" ; => "nyi" ; => "pe" ; => "kwi" ; => "vi" ; | => "nyi" ; | => "mwi" ; | | => "me" } ; Few_prefix : Gender -> Str = \g -> case of { => "wa" ; => "mi" ; => "" ; => "pa" ; => "ku" ; => "vi" ; | => "" ; | => "m" ; | | => "ma" } ; Detsomesgprefix : Gender -> Str = \g -> case of { => "li" ; => "ki" ; => "me"; => "pe" ; => "kwi" ; | => "nyi" ; |||| | => "mwi" } ; Detsomeplprefix : Gender -> Str = \g -> case of { => "we" ; => "mi" ; => "nyi" ; => "pe" ; => "kwi" ; => "vi" ; | => "nye" ; | => "mwi" ; | | => "me" } ; mkNum : Str -> Str -> {s : DForm => CardOrd => Gender => Str} = \two, second -> {s = table { unit => table {NCard =>\\g => Cardprefix g + two ; NOrd => \\g => Ordprefix g ++ two} ; teen => table {NCard =>\\g =>"kumi na" ++ Cardprefix g + two ; NOrd => \\g => Ordprefix g ++ "kumi na" ++ Cardprefix g + two} ; ten => table {NCard =>\\g =>second ++"na" ++ Cardprefix g + two ; NOrd => \\g => Ordprefix g ++ second ++"na" ++ Cardprefix g + two}; hund => table {NCard =>\\g =>"mia " ++ two ; NOrd => \\g => Ordprefix g ++ "mia " ++ two } } } ; mkNumn : Str -> Str -> Str -> {s : DForm => CardOrd => Gender => Str} = \two, twelve, second -> {s = table { unit => table {NCard =>\\g => Cardtwoprefix g + two ; NOrd => \\g => Ordprefix g ++ second} ; teen => table {NCard =>\\g =>"kumi na" ++ Cardtwoprefix g + two; NOrd => \\g => Ordprefix g ++ "kumi na" ++ Cardtwoprefix g + two} ; ten => table {NCard =>\\g =>twelve ; NOrd => \\g => Ordprefix g ++ twelve}; hund => table {NCard =>\\g =>"mia mb " + two ; NOrd => \\g => Ordprefix g ++ "mia mb" + two} } } ; mkNume : Str -> Str -> {s : DForm => CardOrd => Gender => Str} = \two, second -> {s = table { unit => table {NCard =>\\g => Cardoneprefix g + two ; NOrd => \\g => Ordprefix g ++ second} ; teen => table {NCard =>\\g =>"kumi na" ++ Cardoneprefix g + two ; NOrd => \\g => Ordprefix g ++ "kumi na" ++ Cardoneprefix g + two} ; ten => table {NCard =>\\g =>"kumi" ; NOrd => \\g => Ordprefix g ++ "kumi"}; hund => table {NCard =>\\g =>"mia " ++ two ; NOrd => \\g => Ordprefix g ++ "mia" ++ two} } } ; regNum : Str ->Str -> {s : DForm => CardOrd => Gender => Str} = \six,sixth -> {s = table { unit => table {NCard =>\\g => six ; NOrd => \\g => Ordprefix g ++ six} ; teen => table {NCard =>\\g =>"kumi na" ++ six ; NOrd => \\g => Ordprefix g ++ "kumi na" ++ six} ; ten => table {NCard =>\\g =>sixth ++"na" ++ six ; NOrd => \\g => Ordprefix g ++ sixth ++"na" ++ six }; hund => table {NCard =>\\g =>"mia " ++ six ; NOrd => \\g => Ordprefix g ++ "mia" ++ 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" + _ => PrefixPlNom G1 + Predef.drop 3 w ; "mwi" + _ => "we" + Predef.drop 3 w ; "ki" + _ => PrefixPlNom G4 + Predef.drop 2 w ; "m" + _ => PrefixPlNom G1 + Predef.drop 1 w ; _ => w }; G2=>case w of { "mw" + _ => PrefixPlNom G2 + Predef.drop 2 w ; "mu" + _ => PrefixPlNom G2 + Predef.drop 2 w ; _ => PrefixPlNom G2 + Predef.drop 1 w }; G4=> case w of { "ki" + _ => PrefixPlNom G4 + Predef.drop 2 w ; "ch" + _ => "vy" + Predef.drop 2 w ; _ => w }; G6 |G8 => PrefixPlNom g + Predef.drop 1 w; G11 |G12|G13 => "" ; _ => PrefixPlNom g + 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"|"u" => VowelAdjprefix G1 Sg + seo; _ => ConsonantAdjprefix G1 Sg + seo }; AAdj G1 Pl =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G1 Pl + seo; "i" => VoweliAdjprefix G1 Pl + seo; _ => ConsonantAdjprefix G1 Pl + seo }; AAdj G2 Sg=>case Predef.take 1 seo of { "a"|"e"|"i"|"o"|"u" => VowelAdjprefix G2 Sg + seo; _ => ConsonantAdjprefix G2 Sg + seo }; AAdj G2 Pl =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G2 Pl + seo; "i" => VoweliAdjprefix G2 Pl + seo; _ => ConsonantAdjprefix G2 Pl + seo }; AAdj G3 Sg=>case Predef.take 1 seo of { "a"|"e"|"i"|"o"|"u" => VowelAdjprefix G3 Sg + seo; _ => ConsonantAdjprefix G3 Sg + seo }; AAdj G3 Pl =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G3 Pl + seo; "i" => VoweliAdjprefix G3 Pl + seo; _ => ConsonantAdjprefix G3 Pl + seo }; AAdj G4 n =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G4 n + seo; "i" => VoweliAdjprefix G4 n + seo; _ => ConsonantAdjprefix G4 n + seo }; AAdj G5 n => case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G5 n + seo; "i" => "ny" + Predef.drop 1 seo; "d"|"g"|"z" => "n" + seo; "b"|"p"|"v" => "m" + seo; _ => ConsonantAdjprefix G5 n + seo }; AAdj G6 Sg=>case Predef.take 1 seo of { "a"|"e"|"i"|"o"|"u" => VowelAdjprefix G6 Sg + seo; _ => ConsonantAdjprefix G6 Sg + seo }; AAdj G6 Pl =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G6 Pl + seo; "i" => "ny" + Predef.drop 1 seo; "d"|"g"|"z" => "n" + seo; "b"|"p"|"v" => "m" + seo; _ => ConsonantAdjprefix G6 Pl + seo }; AAdj G7 n =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G7 n + seo; "i" => VoweliAdjprefix G7 n + seo; _ => ConsonantAdjprefix G7 n + seo }; AAdj G8 n =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G8 n + seo; "i" => VoweliAdjprefix G8 n + seo; _ => ConsonantAdjprefix G8 n + seo }; AAdj G9 n =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G9 n + seo; "i" => VoweliAdjprefix G9 n + seo; _ => ConsonantAdjprefix G9 n + seo }; AAdj G10 n =>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G9 n + seo; "i" => VoweliAdjprefix G9 n + seo; _ => ConsonantAdjprefix G9 n + seo }; AAdj G11 Sg=>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G11 Sg + seo; "i" => VoweliAdjprefix G11 Sg + seo; _ => ConsonantAdjprefix G11 Sg + seo }; AAdj G12 Sg=>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G12 Sg + seo; "i" => VoweliAdjprefix G12 Sg + seo; _ => ConsonantAdjprefix G12 Sg + seo }; AAdj G13 Sg=>case Predef.take 1 seo of { "a"|"e"|"o"|"u" => VowelAdjprefix G13 Sg + seo; "i" => VoweliAdjprefix G13 Sg + seo; _ => ConsonantAdjprefix G13 Sg + seo }; AAdj _ Pl =>[] }}; iregA : Str-> Str -> {s : AForm => Str} = \seo,seoo -> { s = table { AAdj g Sg=> seo; AAdj g Pl => seoo} }; cregA : Str-> {s : AForm => Str} = \seo -> { s = table { AAdj g Sg => ProunSgprefix g + "a" ++"rangi" ++"ya" ++ seo; AAdj g Pl=> ProunPlprefix g + "a" ++"rangi" ++"ya" ++ seo} } ; 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 of { => "ndi"; => "ndu"; => "ndu"; => "twi"; => "mwi"; => "mai"; => "ndu"; => "i"; => "i"; => "mai"; => "ki"; => "i"; => "kai"; => "tui"; => "vai"; => "kui"; => "i"; <_,_,_,_> => "syi" }; Verbprefix : Gender -> Number -> Person -> Str = \g, n, p -> case of { => "na" ; => "wa" ; => "wa" ; => "twa" ; => "mwa" ; => "ma" ; => "wa" ; => "ya" ; => "kya" ; => "sya" ; => "ya" ; => "ma" ; => "ka" ; => "twa" ; => "va" ; => "kwa" ; => "ya" ; <_,_,_> => "sya" } ; Verbfutureprefix : Gender -> Number -> Person -> Str = \g, n, p -> case of { => "nga" ; => "uka" ; => "uka" ; => "tuka" ; => "muka" ; => "maka" ; => "uka" ; => "ika" ; => "kika" ; => "ika" ; => "ika" ; => "maka" ; => "kaka" ; => "tuka" ; => "vaka" ; => "kuka" ; => "ika" ; <_,_,_> => "ika" } ; }