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
    } ;

}
