--# -path=.:../abstract:../../prelude
--# -opt

concrete PredicEng of Predic = CategoriesEng ** 
  open Prelude, SyntaxEng, DeptypEng in {

  flags optimize=all_subs ;

  lincat
    VType, CType = SS ;
    Verb  = {s : VForm => Str ; isAux : Bool ; s1 : Particle ; c : VComp} ;
    Compl = {s1, s2 : Agr => Str} ; 

  lin
    CtN, CtV, CtS, CtQ, CtA = ss [] ;
    Vt, VtN = \x -> x ;
    Vt_ = ss [] ;

    Compl_      = {s1, s2 = \\_ => []} ;
    ComplN   np = {s1 = \\_ => np.s ! AccP   ; s2 = \\_ => []} ;
    ComplA   ap = {s1 = ap.s                 ; s2 = \\_ => []} ;
    ComplQ   q  = {s1 = \\_ => q.s ! DirQ    ; s2 = \\_ => []} ;
    ComplS   s  = {s1 = \\_ => "that" ++ s.s ; s2 = \\_ => []} ;

    ComplAdd c np co = {s1 = \\_ => c.s ++ np.s ! AccP ; s2 = co.s1} ;


    SPredVerb vt np verb compl = 
      predVerbClause np verb 
        (\\a => vt.s ++
                cprep1 verb.c (compl.s1 ! a) ++
                cprep2 verb.c (compl.s2 ! a)
        ) ; 
    QPredVerb vt np verb compl = 
      intVerbClause np verb 
        (\\a => vt.s ++
                cprep1 verb.c (compl.s1 ! a) ++
                cprep2 verb.c (compl.s2 ! a)
        ) ; 

    RPredVerb vt np verb compl = 
      relVerbClause np verb 
        (\\a => vt.s ++
                cprep1 verb.c (compl.s1 ! a) ++
                cprep2 verb.c (compl.s2 ! a)
        ) ; 

    IPredVerb vt verb compl = 
      predVerbI verb 
        (\\a => vt.s ++
                cprep1 verb.c (compl.s1 ! a) ++
                cprep2 verb.c (compl.s2 ! a)
        ) ; 

    VeV1 v = v ** {isAux = False ; c = CVt_} ;
    VeV2 v = v ** {isAux = False ; c = CVt (CCtN CP_)} ; ---- other preps

{-
    Walk = {s = "walks" ; c = VC_} ;
    Love = {s = "loves" ; c = VC1 C_} ;
    Know = {s = "knows" ; c = VC_} ;
    Give = {s = "gives" ; c = VC2 C_ C_to} ;
    Tell = {s = "tells" ; c = VC_} ;
    Ask  = {s = "asks"  ; c = VC_} ;
-}

}
