concrete ExtraExtZul of ExtraExt = CatZul [NP,VP,CN,V,Temp,S,Cl,Adv,Pron,QCl,QS,A,RS,IAdv,IComp,Pol,Det,Quant,N,PN,Conj,VV], CatExtZul ** open ResZul,Prelude,ParamX in { lin -- use with caution ProDrop pron = { s = table { NFull => case pron.proDrop of { True => "*" ++ pron.s!NFull ; False => pron.empty } ; nform => "*" ++ pron.s!nform } ; agr = pron.agr ; empty = pron.empty ; proDrop = True } ; lin ExistNP np = { s = let cp = (id_cop_pref np.agr) ; -- ng- cop_base = np.s!NFull -- umfundi in cp ++ cop_base ; } ; GreetSg = { s = "sawubona" } ; GreetPl = { s = "sanibonani" } ; -- PotQS pol qcl = { -- s = pol.s ++ qcl.potqcl!pol.p!Princ ; -- qword_pre = qcl.qword_pre ; -- qword_post = qcl.qword_post -- } ; -- SubjunctS s = { s = s.subjs } ; -- AssocCop np = { -- s = \\_ => [] ; -- oc = [] ; -- comp = np.s!Reduced ; -- iadv = [] ; -- advs = [] ; -- hasComp = True ; -- r = case np.proDrop of { -- True => RC ; -- False => initNP np.isPron np.agr -- } ; -- syl = SylMult ; -- asp = Null ; -- asp_pref = \\_ => [] ; -- vptype = CopAssoc ; -- comp_agr = np.agr ; -- ap_comp = \\_ => [] ; -- aux_root = [] ; -- hasAux = False -- } ; -- -- EqCop np = { -- s = \\_ => [] ; -- oc = [] ; -- comp = np.s!Full ; -- iadv = [] ; -- advs = [] ; -- hasComp = True ; -- r = case np.isPron of { -- True => RC ; -- False => initNP np.isPron np.agr -- } ; -- syl = SylMult ; -- asp = Null ; -- asp_pref = \\_ => [] ; -- vptype = CopEq ; -- comp_agr = np.agr ; -- ap_comp = \\_ => [] ; -- aux_root = [] ; -- hasAux = False -- } ; -- UsePNPl pn = let -- agr = Third pn.c Pl -- in { -- empty,predet_pre,predet_post = pn.empty ; -- s = pn.s!Pl ; -- mod = pn.empty ; -- dem = pn.empty ; -- agr = agr ; -- i = nominit!agr ; -- proDrop = False ; -- isPron = False ; -- -- reqLocS = True ; -- qdef = Article Spec ; -- } ; -- PNAsCN pn = pn ** { mod = \\_ => [] } ; -- DemPron quant pron = let -- d = case quant.qdef of { -- Article _ => Dem1 ; -- Demonstrative d => d -- } -- in { -- empty,predet_pre,dem,predet_post = pron.empty ; -- -- dem = case quant.qdef of { -- -- Article _ => dem_pron!Dem1!pron.agr ; -- -- Demonstrative d => dem_pron!d!pron.agr -- -- } ; -- -- s = \\nform => quant.s ++ pron.s!nform ; -- s = table { -- Full => quant.s ++ dem_pron!d!pron.agr ++ pron.empty ; -- Reduced => quant.s ++ dem_pron!d!pron.agr ++ pron.empty ; -- Poss => quant.s ++ dem_pron!d!pron.agr ++ pron.empty ; -- Loc => quant.s ++ dem_pron!d!pron.agr ++ pron.empty -- } ; -- mod = pron.empty ; -- agr = pron.agr ; -- i = RC ; -- proDrop = False ; -- isPron = True ; -- -- reqLocS = True ; -- qdef = case quant.qdef of { -- Article _ => Demonstrative Dem1 ; -- Demonstrative d => Demonstrative d -- } -- } ; -- EmphCN cn = { -- s = \\num,nform => pron_stem!(Third cn.c num) ++BIND++ "na" ++ cn.s!num!nform ; -- mod = cn.mod ; -- c = cn.c ; -- empty = cn.empty -- } ; -- -- ContrastCN cn = { -- s = cn.s ; -- mod = \\num => pron_stem!(Third cn.c num) ++BIND++ "na" ++ cn.mod!num ; -- c = cn.c ; -- empty = cn.empty -- } ; -- ApposCNCN cn1 cn2 = { -- s = cn1.s ; -- mod = \\n => cn1.mod!n ++ cn2.s!n!Full ++ cn2.mod!n ; -- c = cn1.c ; -- empty = cn1.empty ++ cn2.empty -- } ; -- ApposNPN np n = let -- num = case np.agr of { -- First n => n ; -- Second n => n ; -- Third c n => n -- } ; -- in { -- empty = np.empty ; -- s = np.s; -- mod = np.mod ++ np.predet_post ++ n.s!num!Full ; -- dem = np.dem ; -- predet_pre = np.predet_pre ; -- predet_post = np.empty ; -- agr = Third n.c num ; -- i = np.i ; -- proDrop = np.proDrop ; -- isPron = np.isPron ; -- -- reqLocS = np.reqLocS ; -- qdef = np.qdef ; -- } ; PossLocNP locn np = { empty = np.empty ; s = \\n,nform => locn.s ++ poss_concord!(C17)!n!np.i ++BIND++ (poss_NP np); -- mod = \\num => poss_concord!(C17)!Sg!np.i ++BIND++ (poss_NP np) ; c = C17 ; emph = False } ; PossNPLoc cn np = { empty = np.empty ; s = \\n,nform => cn.s!n!nform ++ poss_concord!cn.c!n!RC ++BIND++"s"++BIND++ (loc_NP np); c = cn.c ; emph = False } ; InstrNPAdv np = let pref = instrPref!(initNP np.isPron np.agr) in { s = pref ++BIND++ (np.s!NReduced) ; -- asp = Null ; reqLocS = False } ; InstrAdvNPAdv adv np = let pref = instrPref!(initNP np.isPron np.agr) in { s = adv.s ++ pref ++BIND++ (np.s!NReduced) ; -- asp = adv.asp ; reqLocS = False } ; -- LocNPAdv np = { -- s = np.s!NLoc ; -- -- asp = Null ; -- reqLocS = case np.isPron of { -- False => True ; -- True => False -- ki- -- } ; -- } ; LocAdvNPAdv adv np = { s = adv.s ++ (np.s!NLoc) ; -- asp = adv.asp ; reqLocS = False } ; -- locative kwa KwaNPAdv np = { -- s = "kwa" ++BIND++ (np.s!Reduced) ; s = (poss_concord_agr!(Third C17 Sg)!np.i) ++BIND++ (np.s!NReduced) ; -- asp = Null ; reqLocS = False } ; -- NOTE: this seems to be a specific construction. Not yet found in Poulos+Msimang KwaAdvNPAdv adv np = { s = adv.s ++ (poss_concord_agr!(Third C17 Sg)!np.i) ++BIND++ (np.s!NReduced) ; reqLocS = False } ; -- locative ku KuNPAdv np = { s = case np.isPron of { True => "ki" ; False => case (initNP np.isPron np.agr) of { -- RI => "ki" ; RO => "ko" ; RA => "kw" ; _ => "ku" } } ++BIND++ (np.s!NReduced) ; -- asp = Null ; reqLocS = False } ; KuAdvNPAdv adv np = { s = adv.s ++ case np.proDrop of { True => "ki" ; False => case (initNP np.isPron np.agr) of { RI => "ki" ; RO => "ko" ; RA => "kw" ; _ => "ku" } } ++BIND++ (np.s!NReduced) ; -- asp = Null ; reqLocS = False } ; NaNPAdv np = { s = withPref ! (initNP np.isPron np.agr) ++BIND++ (np.s!NReduced) ; -- asp = Null ; reqLocS = False } ; NPAdv np = { s = case np.proDrop of { False => np.s!NFull ; True => "*" ++ np.s!NFull } ; reqLocS = False } ; LocAdvAdv l = l ** { reqLocS = False } ; LocAdvNP adv np = { s = adv.s ++ (poss_concord_agr!(Third C17 Sg)!np.i) ++BIND++ (np.s!NReduced) ; reqLocS = False } ; -- ngaphezu kwamahora amabili adlule LocNAdv locn = locn ** { reqLocS = False } ; LocNNgaAdv locn = { s = "nga" ++BIND++ locn.s ; reqLocS = False } ; LocNPAdv np = { s = np.s!NLoc ; -- asp = Null ; reqLocS = case np.isPron of { False => True ; True => False -- ki- } ; } ; RelAdv adv = { s = \\a => relConcLookup!a!RC ++BIND++ adv.s } ; -- ProgVP vp = { -- s = vp.s ; -- perfSuff = vp.perfSuff ; -- oc = vp.oc ; -- comp = vp.comp ; -- hasComp = vp.hasComp ; -- r = vp.r ; -- syl = vp.syl ; -- asp = Prog ; -- vptype = vp.vptype ; -- comp_agr = vp.comp_agr ; -- ap_comp = vp.ap_comp ; -- ap_bool = vp.ap_bool ; -- aux_root = vp.aux_root ; -- hasAux = vp.hasAux -- } ; -- QuantRS quant = { -- s = \\a => relConcLookup!a!RC ++BIND++ quantConc!a ++BIND++ quant.s -- } ; -- -- RelRS rel = { -- s = \\a => relConcLookup!a!RC ++BIND++ rel.s -- } ; -- QuantCN quant cn = { -- empty = cn.empty ; -- s = \\num,nform => -- let -- agr = Third cn.c num -- in -- case quant.isPost of { -- True => cn.s ! num ! nform ++ quantConc!agr ++BIND++ quant.s ; -- False => quantConc!agr ++BIND++ quant.s ++ cn.s ! num ! nform -- } ; -- c = cn.c -- } ; -- let -- cn_agr = Third cn.c quant.n -- in -- { -- empty = cn.empty ; -- s = \\p => case quant.isPost of { -- True => cn.s ! quant.n ! p ++ quantConc!cn_agr ++BIND++ quant.s ; -- False => quantConc!cn_agr ++BIND++ quant.s ++ cn.s ! quant.n ! p -- } ; -- loc = quantConc!cn_agr ++BIND++ quant.s ++ cn.loc ! quant.n ; -- desc = cn.desc ! quant.n ; -- det = cn.empty ; -- poss = poss_concord!cn.c!quant.n!(initNP False cn_agr) ++ cn.s ! quant.n ! Reduced ; -- agr = cn_agr ; -- proDrop = False ; -- isPron = False ; -- reqLocS = False ; -- qdef = Article Def -- } ; NumAdjCN cn a = { s = \\num,nform => cn.s!num!nform ++ "na" ++BIND++ a.s!AF2 ; -- loc = cn.loc ; -- desc = \\num => -- let -- agr = Third cn.c num ; -- in -- cn.desc ! num ++ "na" ++BIND++ a.s!AF2 ; c = cn.c ; empty = cn.empty ++ a.empty } ; only_QuantStem = { s = table { Third C1_2 Sg => "yedwa" ; Third C1_2 Pl => "bodwa" ; Third C1a_2a Sg => "yedwa" ; Third C1a_2a Pl => "bodwa" ; Third C3_4 Sg => "wodwa" ; Third C3_4 Pl => "yodwa" ; Third C5_6 Sg => "lodwa" ; Third C5_6 Pl => "odwa" ; Third C7_8 Sg => "sodwa" ; Third C7_8 Pl => "zodwa" ; Third C9_10 Sg => "yodwa" ; Third C9_10 Pl => "zodwa" ; Third C11_10 Sg => "lodwa" ; Third C11_10 Pl => "zodwa" ; Third C9_6 Sg => "yodwa" ; Third C9_6 Pl => "odwa" ; Third C14 _ => "bodwa" ; Third C15 _ => "kodwa" ; Third C17 _ => "kodwa" ; First Sg => "ngedwa" ; First Pl => "sodwa" ; Second Sg => "wedwa" ; Second Pl => "nodwa" } } ; all_QuantStem = { s = table { Third C1_2 Sg => "wonke" ; Third C1_2 Pl => "bonke" ; Third C1a_2a Sg => "wonke" ; Third C1a_2a Pl => "bonke" ; Third C3_4 Sg => "wonke" ; Third C3_4 Pl => "yonke" ; Third C5_6 Sg => "lonke" ; Third C5_6 Pl => "onke" ; Third C7_8 Sg => "sonke" ; Third C7_8 Pl => "zonke" ; Third C9_10 Sg => "yonke" ; Third C9_10 Pl => "zonke" ; Third C11_10 Sg => "lonke" ; Third C11_10 Pl => "zonke" ; Third C9_6 Sg => "yonke" ; Third C9_6 Pl => "onke" ; Third C14 _ => "bonke" ; Third C15 _ => "konke" ; Third C17 _ => "konke" ; First Sg => "ngenke" ; First Pl => "sonke" ; Second Sg => "wenke" ; Second Pl => "nonke" } } ; -- all_pre_Predet = { s = "nke" ; isPost = False } ; painful_RelStem = { s = "buhlungu" } ; -- TPerfPast = { s = [] ; t = Relative PerfTense PastTense } ; -- TPresPres = { s = [] ; t = PresTense } ; -- TPastPres = { s = [] ; t = Relative PastTense PresTense } ; -- TPastPerf = { s = [] ; t = Relative PastTense PerfTense } ; PredNP np = cl_with_np_predicate np ; -- IAdvQS np iadv = { -- s = case np.proDrop of { -- True => np.empty ; -- False => np.s ! Full ++ np.desc -- } ; -- qword_pre = case iadv.postIAdv of { -- False => let -- vform = VFIndic Princ Pos PresTense Null -- in -- (subjConc vform np.agr False) ++ iadv.s ; -- True => [] -- } ; -- qword_post = case iadv.postIAdv of { -- True => let -- vform = VFIndic Princ Pos PresTense Null -- in -- (subjConc vform np.agr False) ++ iadv.s ; -- False => [] -- } ; -- } ; AdvQCl adv qcl = { s = \\p,t,m => qcl.s!p!t!m ++ adv.s ; potqcl = \\p,m => qcl.potqcl!p!m ++ adv.s ; qword_pre = qcl.qword_pre ; qword_post = qcl.qword_post } ; ComplVAux vaux vp = { s = vp.s ; perfSuff = vp.perfSuff ; suff = vp.suff ; oc = vp.oc ; comp = vp.comp ; iadv = vp.iadv ; advs = vp.advs ; hasComp = vp.hasComp ; r = vp.r ; syl = vp.syl ; asp = vp.asp ; asp_pref = vp.asp_pref ; vptype = vp.vptype ; comp_agr = vp.comp_agr ; ap_comp = vp.ap_comp ; aux_root = vaux.s ; hasAux = True } ; -- UseLocNP np = { -- s = [] ; -- perfSuff = [] ; -- oc = [] ; -- comp = "s" ++BIND++ np.loc ++ np.desc ; -- hasComp = True ; -- r = nominit!np.agr ; -- syl = SylMult ; -- asp = Null ; -- vptype = CopIdent ; -- comp_agr = np.agr ; -- ap_comp = \\_ => [] ; -- ap_bool = False ; -- aux_root = [] ; -- hasAux = False -- } ; ConjNAdv conj s = { s = conj.s ++ s.s; -- asp = Null ; reqLocS = False } ; where_ConjN = { s = "lapho" } ; -- IAdvVP vp iadv = { -- s = vp.s ; -- -- perfSuff = vp.perfSuff ; -- -- suff = vp.suff ; -- -- oc = vp.oc ; -- iadv = vp.iadv ++ iadv.s ; -- comp = vp.comp ; -- advs = vp.advs ; -- hasComp = True ; -- r = vp.r ; -- -- syl = vp.syl ; -- -- asp = vp.asp ; -- -- asp_pref = vp.asp_pref ; -- vptype = vp.vptype -- ; -- -- comp_agr = vp.comp_agr ; -- -- ap_comp = vp.ap_comp ; -- -- aux_root = vp.aux_root ; -- -- hasAux = vp.hasAux -- } ; it3_Pron = mkPron (Third C3_4 Sg) ; they4_Pron = mkPron (Third C3_4 Pl) ; it5_Pron = mkPron (Third C5_6 Sg) ; they6_Pron = mkPron (Third C5_6 Pl) ; it7_Pron = mkPron (Third C7_8 Sg) ; they8_Pron = mkPron (Third C7_8 Pl) ; it9_Pron = mkPron (Third C9_10 Sg) ; they10_Pron = mkPron (Third C9_10 Pl) ; it11_Pron = mkPron (Third C11_10 Sg) ; it14_Pron = mkPron (Third C14 Sg) ; it15_Pron = mkPron (Third C15 Sg) ; it17_Pron = mkPron (Third C17 Sg) ; yonder_Quant = { s = \\b,a => dem_pron!Dem3!a ; dist = Dem3 } ; at_which_IAdv np = { s = "nga" ++BIND++ atwhichPhiPref!np.agr ++BIND++ "phi" ++ (np.s!NFull) ; postIAdv = False } ; what_IAdv = {s = BIND++"ni" ; postIAdv = True } ; how_many_IAdj = regAdj "ngaki" ; -- IAdjIAdv np iadj = { -- s = (np.s!Loc) ++ adjConcLookup!np.agr ++BIND++ iadj.s!(aformN np.agr) ; -- postIAdv = False -- } ; how_IComp = { s = "njani" ; postIComp = False } ; -- -njani where_IComp = { s = "phi" ; postIComp = True } ; -- -phi how_much_IComp = { s = "ngakanani" ; postIComp = False } ; -- -ngakanani how2_IAdv = {s = "anjani" ; postIAdv = False } ; how8much2_IAdv = {s = "angakanani" ; postIAdv = False } ; phakathi_LocN = { s = "phakathi" ; empty = [] } ; phansi_LocN = { s = "phansi" ; empty = [] } ; phesheya_LocN = { s = "phesheya" ; empty = [] } ; phandle_LocN = { s = "phandle" ; empty = [] } ; phambili_LocN = { s = "phambili" ; empty = [] } ; phambi_LocN = { s = "phambi" ; empty = [] } ; phakade_LocN = { s = "phakade" ; empty = [] } ; phezulu_LocN = { s = "phezulu" ; empty = [] } ; ngemuva_LocAdv = { s = "ngemuva" ; reqLocS = False } ; emuva_LocAdv = { s = "emuva" ; reqLocS = False } ; ecaleni_LocAdv = { s = "ecaleni" ; reqLocS = False } ; ngaphezu_LocAdv = { s = "ngaphezu" ; reqLocS = False } ; lapha_Loc = { s = table { MainCl => \\a,p,t => let vform = VFIndic MainCl p t ; pcp = ap_cop_pref vform a RelType ; -- u- cop_base = "lapha" in case vform of { VFIndic _ Neg PresTense => (kho_cop vform a) ++ cop_base; VFIndic _ _ _ => pcp ++ cop_base } ; RelCl => \\a,p,t => let vform = VFIndic RelCl p t ; rcp = (relConcCop vform a RC) ; -- o- / onge- pcp = ap_cop_pref vform a RelType ; -- [] / zoba cop_base = "lapha" -- lapha in case vform of { VFIndic _ Neg PresTense => (kho_cop vform a) ++ cop_base; VFIndic _ _ _ => rcp ++ pcp ++ cop_base } } ; imp_s = table { Sg => table { Pos => "yiba" ++ "lapha" ; Neg => "ungabi" ++ "lapha" } ; Pl => table { Pos => "yibani" ++ "lapha" ; Neg => "ningabi" ++ "lapha" } } ; inf_s = table { NFull => table { Pos => "ukuba" ++ "lapha" ; Neg => "ukungabi" ++ "lapha" } ; NReduced | NPoss => table { Pos => "kuba" ++ "lapha" ; Neg => "kungabi" ++ "lapha" } ; NLoc => table { Pos => "ku"++BIND++poss_pron_stem!(Third C15 Sg) ++"ukuba" ++ "lapha" ; Neg => "ku"++BIND++poss_pron_stem!(Third C15 Sg) ++"ukungabi" ++ "lapha" } } } ; khona_Loc = { s = \\c,a,p,t => kho_cop (VFIndic c p t) a ; imp_s = table { Sg => table { Pos => "yiba" ++ "khona" ; Neg => "ungabi" ++ "khona" -- this is a guess } ; Pl => table { Pos => "yibani" ++ "khona" ; Neg => "ningabi" ++ "khona" } } ; inf_s = table { NFull => table { Pos => "ukuba" ++ "khona" ; Neg => "ukungabi" ++ "khona" } ; NReduced | NPoss => table { Pos => "kuba" ++ "khona" ; Neg => "kungabi" ++ "khona" } ; NLoc => table { Pos => "ku"++BIND++poss_pron_stem!(Third C15 Sg) ++"ukuba" ++ "khona" ; Neg => "ku"++BIND++poss_pron_stem!(Third C15 Sg) ++"ukungabi" ++ "khona" } } } ; kakhulu_Adv = { s = "kakhulu" ; reqLocS = False } ; AdvQS adv qs = { s = adv.s ++ qs.s ; qword_pre = [] ; qword_post = [] } ; ExtConjNP np1 conj np2 = { s = \\nform => np1.s!nform ++ (link_conj conj np2.i) ++ np2.s!NReduced ; agr = compAgr np1.agr np2.agr ; i = np1.i ; proDrop = andB np1.proDrop np2.proDrop ; isPron = np1.isPron ; heavy = orB np1.heavy np2.heavy ; empty = np1.empty ++ np2.empty } ; with_Conj = { s = withPref ; fix = True } ; want_VV = regVerb "fun" ; prepare_to_VV = regVerb "lungiselel" ; -- Deverb15 v = -- let -- agr = Third C15 Sg ; -- in -- { -- s = \\_ => table { -- Full => case v.r of { -- RC => "uku"++BIND++(v.s!R_a) ; -- (RA|RE) => "ukw"++BIND++(v.s!R_a) ; -- _ => "uk"++BIND++(v.s!R_a) -- } ; -- Reduced => case v.r of { -- RC => "ku"++BIND++(v.s!R_a) ; -- (RA|RE) => "kw"++BIND++(v.s!R_a) ; -- _ => "k"++BIND++(v.s!R_a) -- } ; -- Poss => case v.r of { -- RC => "ku"++BIND++(v.s!R_a) ; -- (RA|RE) => "kw"++BIND++(v.s!R_a) ; -- _ => "k"++BIND++(v.s!R_a) -- } ; -- Loc => case v.r of { -- RC => "eku"++BIND++(v.s!R_e)++BIND++"ni" ; -- (RA|RE) => "ekw"++BIND++(v.s!R_e)++BIND++"ni" ; -- _ => "ek"++BIND++(v.s!R_e)++BIND++"ni" -- } -- } ; -- c = C15 ; -- empty = [] -- } ; oper -- qcl_np_iadv : NP -> IAdv -> {s : Polarity => ZTense => DMood => Str ; potqcl : Polarity => DMood => Str ; qword_pre : Str ; qword_post : Str } = \np,iadv -> { -- s = \\p,t,dm => -- let -- subj = case np.proDrop of { -- True => np.empty ; -- False => np.s ! Full ++ np.desc -- } ; -- aux_tense = case t of { -- Absolute bt => bt ; -- Relative b1 b2 => b1 -- } ; -- main_tense = case t of { -- Absolute bt => bt ; -- Relative b1 b2 => b2 -- } ; -- vform_aux = VFIndic dm p aux_tense Null ; -- vform_main = VFIndic dm p main_tense Null ; -- aux = case t of { -- Absolute bt => [] ; -- Relative _ _ => relSubjConc aux_tense np.agr -- (subjConcLookup!np.agr!SC) ++BIND++ "b" ++BIND++ (vtermSuff vform_aux False) -- } ; -- in -- subj ++ -- aux ++ -- (subjConc vform_main np.agr False) ++ -- iadv.s ; -- potqcl = \\p,dm => -- let -- subj = case np.proDrop of { -- True => np.empty ; -- False => np.s ! Full ++ np.desc -- } ; -- vform_main = VFPot dm p Null ; -- in -- subj ++ -- -- aux ++ -- (subjConc vform_main np.agr False) ++ -- (potPref vform_main) ++ -- iadv.s ; -- qword_pre = [] ; -- qword_post = [] -- } ; cl_with_np_predicate : NP -> { s : Polarity => BasicTense => Str } = \np -> { -- advs = [] ; s = \\p,t => let vform_main = VFIndic MainCl p t ; --pcp = pre_cop_pref vform_main np.agr ; cp = id_cop_pref np.agr ; cb = np.s!NFull in cp ++BIND++ cb } ; }