Files
gf-rgl/src/kikamba/ParadigmsKam.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

430 lines
10 KiB
Plaintext

--# -path=.:../abstract:../../prelude:../common
resource ParadigmsKam = open
(Predef=Predef),
Prelude,
MorphoKam,
ResKam,
CatKam
in {
oper
Gender : Type ;
mu_a : Gender ;
mu_mi : Gender ;
i_ma : Gender ;
ki_i : Gender ;
ka_tu : Gender ;
va_ku : Gender ;
n_n : Gender ;
u_ma : Gender ;
u_n : Gender ;
ku_ma : Gender ;
Number : Type ;
singular : Number ;
plural : Number ;
Case : Type ;
nominative : Case ;
locative : Case ;
npNumber : NP -> Number ; -- exctract the number of a noun phrase
--2 Nouns
mkN : overload {
mkN : (flash : Str) -> Gender -> N ; --regular plural
mkN : (man,men : Str) ->Gender -> N ; -- irregular plural
mkN : Str -> N -> N
} ;
--3 Relational nouns
mkN2 : overload {
mkN2 : N -> Prep -> N2 ;
mkN2 : N -> Str -> N2 ;
mkN2 : N -> N2 ;
mkN2 : N -> (Gender => Number => Str)-> N2 ;
} ;
oper dfltGender : Gender = G1 ;
dfltNumber : Number = Sg ;
-- Three-place relational nouns ("the connection from x to y") need two prepositions.
mkN3 : N -> Prep -> Prep -> N3 ; -- e.g. connection from x to y
--3 Proper names and noun phrases
--
-- Proper names, with a regular genitive, are formed from strings.
mkPN : overload {
mkPN : Str ->Gender -> PN ;
-- Sometimes a common noun can be reused as a proper name, e.g. "Bank"
mkPN : N -> PN --%
} ;
--3 Determiners
mkOrd : Str -> Ord ; --%
--2 Adjectives
mkA : overload {
mkA : (happy : Str) -> A ;
mkA : (fat,fatter : Str) -> A ; -- irreg.
} ;
--3 Two-place adjectives
mkA2 : overload {
mkA2 : A -> Prep -> A2 ;
mkA2 : A -> Str -> A2 ;
mkA2 : Str -> Prep -> A2 ;
mkA2 : Str -> Str -> A2
} ;
--2 Adverbs
-- Adverbs are not inflected. Most lexical ones have position
-- after the verb. Some can be preverbal (e.g. "always").
mkAdv : Str -> Adv ; -- e.g. umuthi
mkAdV : Str -> AdV ; -- e.g. lila
-- Adverbs modifying adjectives and sentences can also be formed.
mkAdA : Str -> AdA ; -- e.g. pi
-- Adverbs modifying numerals
mkAdN : Str -> AdN ; -- e.g. approximately
--2 Prepositions
mkPrep : overload {
mkPrep : Str -> Prep ;
mkPrep : (Gender => Number => Str) -> Prep ;
} ;
noPrep : Prep ; -- no preposition
--2 Conjunctions
--
mkConj : overload {
mkConj : Str -> Conj ; -- and (plural agreement) --%
mkConj : Str -> Number -> Conj ; -- or (agrement number given as argument) --%
mkConj : Str -> Str -> Conj ; -- both ... and (plural) --%
mkConj : Str -> Str -> Number -> Conj ; -- either ... or (agrement number given as argument) --%
} ;
--2 Verbs
--
-- Verbs are constructed by the function $mkV$, which takes a varying
-- number of arguments.
mkV : overload {
mkV : (cry : Str) -> V ; -- regular, incl. cry-cries, kiss-kisses etc
mkV : Str -> V -> V ; -- fix compound, e.g. under+take
};
--3 Two-place verbs
--
-- Two-place verbs need a preposition, except the special case with direct object.
-- (transitive verbs). Notice that a particle comes from the $V$.-}
mkV2 : overload {
mkV2 : Str -> V2 ; -- kill --%
mkV2 : V -> V2 ; -- transitive, e.g. hit
mkV2 : V -> Prep -> V2 ; -- with preposiiton, e.g. believe in
mkV2 : V -> Str -> V2 ; -- believe in --%
mkV2 : Str -> Prep -> V2 ; -- believe in --%
mkV2 : Str -> Str -> V2 -- believe in --%
};
--3 Three-place verbs
--
-- Three-place (ditransitive) verbs need two prepositions, of which
-- the first one or both can be absent.
mkV3 : overload {
mkV3 : V -> V3 ; -- ditransitive, e.g. give,_,_
mkV3 : V -> Prep -> Prep -> V3 ; -- two prepositions, e.g. speak, with, about
mkV3 : V -> Prep -> V3 ; -- give,_,to --%
mkV3 : V -> Str -> V3 ; -- give,_,to --%
mkV3 : Str -> Str -> V3 ; -- give,_,to --%
mkV3 : Str -> V3 ; -- give,_,_ --%
};
--2 Other categories
mkSubj : Str -> Subj = \s -> lin Subj {s = s} ; --%
mkInterj : Str -> Interj
= \s -> lin Interj (ss s) ;
--.
--2 Definitions of paradigms
--
-- The definitions should not bother the user of the API. So they are
-- hidden from the document.
Gender = MorphoKam.Gender ;
Number = MorphoKam.Number ;
Case = MorphoKam.NPCase ;
mu_a = G1 ;--%
mu_mi = G2 ;
i_ma = G3 ;
ki_i = G4 ;
ka_tu = G5 ;
va_ku = G6 ;
n_n = G7 ;
u_ma = G8;
u_n =G9 ;
ku_ma = G10 ;
singular = Sg ;
plural = Pl ;
nominative = npNom ;
locative = npLoc ;
npNumber np = (agrFeatures np.a).n ;
regN = MorphoKam.regN ;
iregN = MorphoKam.iregN ;
compoundN s n = lin N {s = \\x,y => s ++ n.s ! x ! y ; g=n.g} ;
mkPN = overload {
mkPN : Str -> Gender -> PN = regPN;
mkPN : N -> PN = nounPN
} ;
mkN2 = overload {
mkN2 : N -> Prep -> N2 = prepN2 ;
mkN2 : N -> Str -> N2 = \n,s -> prepN2 n (mkPrep s);
mkN2 : N -> N2 = \n -> prepN2 n (mkPrep mkPrepof ) ;
mkN2 : N -> (Number =>Gender => Str)-> N2= \n,s -> prepN2 n (mkPrep mkPrepof) ;
} ;
prepN2 = \n,p -> lin N2 (n ** {c2 = p}) ;
regN2 = \n -> (prepN2 n (mkPrep mkPrepof )) ;
mkN3 = \n,p,q -> lin N3 (n ** {c2 = p ; c3 = q}) ;
mkPrepof : Number => Gender => Str =
table Number { Sg => table {
G3| G7 => "ya" ;
G4 => "kya" ;
G5 => "ka" ;
G6 => "va" ;
G10 => "kwa";
_ => "wa" } ;
Pl => table { G1|G3| G8 | G10 => "ma" ;
G4| G7 |G9 => "sya" ;
G2 => "ya" ;
G5 => "twa" ;
G6 => "kwa"} } ;
--3 Relational common noun phrases
cnN2 : CN -> Prep -> N2 ;
cnN3 : CN -> Prep -> Prep -> N3 ;
cnN2 = \n,p -> lin N2 (n ** {c2 = p}) ;
cnN3 = \n,p,q -> lin N3 (n ** {c2 = p ; c3 = q}) ;
regPN n g = lin PN {s = table {Loc => "kwa" + n ; _ => n} ; g = g} ;
nounPN n = lin PN {s = n.s ! singular ; g = n.g} ;
mkOrd : Str -> Ord = \x -> lin Ord { s =\\g => x};
prepA2 a p = lin A2 (a ** {c2 = p.s!Sg!G1}) ;
mkAdv x = lin Adv (ss x) ;
mkAdV x = lin AdV (ss x) ;
mkAdA x = lin AdA (ss x) ;
mkAdN x = lin AdN (ss x) ;
mkPrep = overload {
mkPrep : Str -> Prep = \str -> lin Prep {s = \\n,g => str } ;
mkPrep : (Number => Gender => Str) -> Prep = \t ->lin Prep {s = t} ;
} ;
noPrep = mkPrep [] ;
{-} mkPrep : Str -> Str -> Prep = \p,q -> lin Prep
{s = table{Sg => table{G1 => p; _=> "" };
Pl => table{G1 => q; _=> ""}}} ;
prepV2 : V -> Prep -> V2 ;
prepV2 = \v,p -> lin V2 (v ** {c2 = p.s!Sg!G1}) ;
dirV2 : V -> V2 = \v -> prepV2 v noPrep ;
prepPrepV3 v p q = lin V3 (v ** {c2 = p ; c3 = q}) ;
dirV3 v p = prepPrepV3 v noPrep p ;
dirdirV3 v = dirV3 v noPrep ;
mkA2V : A -> Prep -> Prep -> A2V;
A2S, A2V : Type = A2 ;
mkA2V v p q = mkA2 v p ** {s3 = q.p2 ; c3 = q.p1 ; lock_A2V = <>} ;
mkAV v = v ** { lock_AV = <>} ;
mkAV : A -> AV ;
AS, AV : Type = A ;
mkAS : A -> AS ;
mkAS v = v ** {lock_AS = <>} ;
mkVS : V -> VS ;
mkVS v = v ** { lock_VS = <>} ;
mkVQ : V -> VQ ;
mkVQ v = v ** {lock_VQ = <>} ;
-- mkVV : V -> VV ;
-- mkVV v = v ** { lock_VV = <>} ;
mkVA : V -> VA ;
mkVA v = v ** {lock_VA = <>} ;
mkV2V : V -> Prep -> Prep -> V2V ;
mkV2V v p q = prepPrepV3 v p q ** {lock_V2V = <>} ;
mkV2S : V -> Prep -> V2S ;
mkV2S v p = prepV2 v p ** { lock_V2S = <>} ;
mkV2Q : V -> Prep -> V2Q ;
mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ;
mkV2A : V -> Prep -> Prep -> V2A ;
mkV2A v p q = prepPrepV3 v p q ** {lock_V2A = <>} ;
mkV0 : V -> V0 ;
V0 : Type ;
V0 : Type = V;
mkV0 v = v ** {lock_V0 = <>} ;
-}
-- pre-overload API and overload definitions
-- regN : Str ->Gender -> N ;
--iregN : (man,men : Str) ->Gender -> N ;
compoundN : Str -> N -> N ;
mkN = overload {
mkN : Str ->Gender -> N = \n, g -> lin N (regN n g );
mkN : (man,men : Str) ->Gender -> N = \s,p,g -> lin N ( iregN s p g) ;
} ;
prepN2 : N -> Prep -> N2 ;
-- The most common preposition is "of", and the following is a
-- shortcut for regular relational nouns with "of".
regN2 : N -> N2 ;
regA : Str -> A = \s -> lin A (MorphoKam.regA s) ;
cregA : Str -> A = \s -> lin A (MorphoKam.cregA s) ;
iregA : (fat,fatter : Str) -> A =\a,b -> lin A (MorphoKam.iregA a b);
mkA = overload {
mkA : Str -> A = \a -> lin A (regA a |cregA a);
mkA : (fat,fatter : Str) -> A =\a,b -> lin A (iregA a b );
} ;
prepA2 : A -> Prep -> A2 ;
mkA2 = overload {
mkA2 : A -> Prep -> A2 = prepA2 ;
mkA2 : A -> Str -> A2 = \a,p -> prepA2 a (mkPrep p) ;
mkA2 : Str -> Prep -> A2 = \a,p -> prepA2 (regA a) p;
mkA2 : Str -> Str -> A2 = \a,p -> prepA2 (regA a) (mkPrep p);
} ;
regV=MorphoKam.regV ;
{-}
mkV = overload {
mkV : Str -> V =\v ->lin V(regV v) ;
mkV : Str -> V -> V = prefixV
};
prefixV : Str -> V -> V = \p,v -> lin V { s = \\b,vform => p + v.s! b ! vform } ;
mkV2 = overload {
mkV2 : V -> V2 = dirV2 ;
mkV2 : Str -> V2 = \s -> dirV2 (regV s) ;
mkV2 : V -> Prep -> V2 = prepV2;
mkV2 : V -> Str -> V2 = \v,p -> prepV2 v (mkPrep p) ;
mkV2 : Str -> Prep -> V2 = \v,p -> prepV2 (regV v) p ;
mkV2 : Str -> Str -> V2 = \v,p -> prepV2 (regV v) (mkPrep p)
};
prepPrepV3 : V -> Prep -> Prep -> V3 ;
dirV3 : V -> Prep -> V3 ;
dirdirV3 : V -> V3 ;
mkV3 = overload {
mkV3 : V -> Prep -> Prep -> V3 = prepPrepV3 ;
mkV3 : V -> Prep -> V3 = dirV3 ;
mkV3 : V -> Str -> V3 = \v,s -> dirV3 v (mkPrep s);
mkV3 : Str -> Str -> V3 = \v,s -> dirV3 (regV v) (mkPrep s);
mkV3 : V -> V3 = dirdirV3 ;
mkV3 : Str -> V3 = \v -> dirdirV3 (regV v) ;
} ;
-}
mkConj = overload {
mkConj : Str -> Conj = \y -> mk2Conj [] y plural ;
mkConj : Str -> Number -> Conj = \y,n -> mk2Conj [] y n ;
mkConj : Str -> Str -> Conj = \x,y -> mk2Conj x y plural ;
mkConj : Str -> Str -> Number -> Conj = mk2Conj ;
} ;
mk2Conj : Str -> Str -> Number -> Conj = \x,y,n ->
lin Conj (sd2 x y ** {n = n}) ;
regPN : Str ->Gender -> PN ;
nounPN : N -> PN ;
}