:- module(verbs,
          [semlex_verb/5,    % +Cat, +Sym, +Index, +Att--Att, -Sem
           aux_modal_verb/1
          ]).

:- use_module(boxer(slashes)).
:- use_module(semlib(options),[option/2]).
:- use_module(library(lists),[member/2]).
:- use_module(lex(tense),[tense/4,aspect/5]).
:- use_module(boxer(categories),[roles/4,att/3]).
:- use_module(boxer(closure),[plosing/1]).


/* =========================================================================
   I n t r a n s i t i v e   V e r b s
========================================================================= */

/* -------------------------------------------------------------------------
   VP Ellipsis (... so does NP ...)
------------------------------------------------------------------------- */

semlex_verb(Cat,do,Index,Att1-Att3,Sem):- 
   option('--vpe',true),
   member(Cat,[(s:dcl\(s:adj\np))/np]),
   roles(Sym,(s:dcl\np)/np,[Role],Att1-Att2), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,98),
                      B:[]:role(E,X,Role,1)]),
               app(P,E)),
   tense(dcl,[],Att2-Att3,TDRS),
   Sem = lam(NP,lam(_ADJ,app(TDRS,lam(P,app(NP,lam(X,DRS)))))).

/* -------------------------------------------------------------------------
   Intransitive (VP Ellipsis)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   option('--vpe',true),
   option('--modal',true),
   modal_verb(pos,Sym,_),
   member(Cat,[s:Mood\np,s:Mood/np]), 
   roles(Sym,Cat,[Role],Att1-Att2), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,98),
                      B:[]:role(E,X,Role,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,app(TDRS,lam(P,B2:drs([],[B2:[]:pos(app(NP,lam(X,DRS)))])))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   option('--vpe',true),
   option('--modal',true),
   modal_verb(nec,Sym,_),
   member(Cat,[s:Mood\np,s:Mood/np]), 
   roles(Sym,Cat,[Role],Att1-Att2), !,
   DRS = merge(B1:drs([B1:[]:E],
                      [B1:Index:pred(E,Sym,v,98),
                       B1:[]:role(E,X,Role,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,app(TDRS,lam(P,B2:drs([],[B2:[]:nec(app(NP,lam(X,DRS)))])))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   option('--vpe',true),
   aux_modal_verb(Sym),
   member(Cat,[s:Mood\np,s:Mood/np]), 
   roles(Sym,Cat,[Role],Att1-Att2), !,
   ( Sym = do, \+ Mood = pss, \+ Mood = pt ; \+ Sym = do ), 
   ( Sym = can, \+ Mood = pss ; \+ Sym = can ), 
   !,   %%% VP Ellipsis
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,98),
                      B:[]:role(E,X,Role,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,app(TDRS,lam(P,app(NP,lam(X,DRS))))).


/* -------------------------------------------------------------------------
   more/less than X
------------------------------------------------------------------------- */

semlex_verb(s:adj\np,more,Index,Att-[sem:'MOR'|Att],Sem):- !,
   att(Att,sense,Sense),
   Sem = lam(NP,lam(E,app(NP,lam(X,merge(B:drs([B:[]:S],[B:Index:pred(S,more,a,Sense),
                                                         B:[]:role(X,S,'Theme',-1)]),app(E,S)))))).

semlex_verb(s:adj\np,less,Index,Att-[sem:'LES'|Att],Sem):- !,
   att(Att,sense,Sense),
   Sem = lam(NP,lam(E,app(NP,lam(X,merge(B:drs([B:[]:S],[B:Index:pred(S,less,a,Sense),
                                                         B:[]:role(X,S,'Theme',-1)]),app(E,S)))))).


/* -------------------------------------------------------------------------
   Adjectival (possible, necessary)

semlex_verb(s:adj\np,possible,Index,Att-Att,Sem):- 
   option('--modal',true), !,
   Sem = lam(NP,lam(P,merge(B1:drs([B1:[]:E],
                                   [B1:[]:pos(app(NP,lam(X,B2:drs([],[B2:Index:role(E,X,theme,1)]))))]),
                            app(P,E)))).

semlex_verb(s:adj\np,necessary,Index,Att-Att,Sem):- 
   option('--modal',true), !,
   Sem = lam(NP,lam(P,merge(B1:drs([B1:[]:E],
                                   [B1:[]:nec(app(NP,lam(X,B2:drs([],[B2:Index:role(E,X,theme,1)]))))]),
                            app(P,E)))).
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Intransitive (comparative)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   member(Cat,[s:adj\np,s:adj/np]),
   att(Att1,pos,'JJR'),
   roles(Sym,Cat,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,a,Sense),B:[]:role(E,X,Role,1),B:[]:pred(E,more,r,1)]),
               app(P,E)),
   tense(com,[],Att2-Att3,TDRS),
   Sem = lam(NP,app(TDRS,lam(P,app(NP,lam(X,DRS))))).


/* -------------------------------------------------------------------------
   Intransitive (standard case)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   member(Cat,[s:Mood\np,s:Mood/np]),
   roles(Sym,Cat,[Role],Att1-Att2), !,
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,Pos,Sense),B:[]:role(E,X,Role,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,app(TDRS,lam(P,app(NP,lam(X,DRS))))).


/* -------------------------------------------------------------------------
   Passive Phrasal Verbs ("An action has been called for by an official")
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att-[sem:'EVE'|Att],Sem):-
   Cat = (s:pss\np)/(pp/np), !,
   att(Att,sense,Sense),
   Sem = lam(PP,lam(NP,lam(F,merge(B:drs([B:[]:E],
                                         [B:Index:pred(E,Sym,v,Sense)]),
                                   merge(app(app(PP,NP),E),
                                         app(F,E)))))).



/* =========================================================================
   T r a n s i t i v e   V e r b s
========================================================================= */

/* -------------------------------------------------------------------------
    Copula (experimental, giving negation wide scope in 'there is no')
------------------------------------------------------------------------- */

semlex_verb(Cat,be,Index,Att1-Att2,Sem):- 
   option('--x',true),
   option('--copula',true),
   member(Cat,[(s:Mood\np)/np,(s:Mood/np)/np]), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:[]:prop(E,app(NP2,lam(Y,app(NP1,lam(X,B2:drs([],[B2:Index:eq(X,Y)]))))))]),
               app(P,E)),
   tense(Mood,[],Att1-Att2,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,lam(P,DRS)))).


/* -------------------------------------------------------------------------
    Copula 
------------------------------------------------------------------------- */

semlex_verb(Cat,be,Index,Att1-Att2,Sem):- 
   option('--semantics',amr),
   member(Cat,[(s:Mood\np)/np,(s:Mood/np)/np]), !,
   DRS = app(NP2,lam(Y,merge(B2:drs([],[B2:Index:rel(Y,X,domain,1)]),app(P,Y)))),
   tense(Mood,[],Att1-Att2,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,lam(P,app(NP1,lam(X,DRS)))))).

semlex_verb(Cat,be,Index,Att1-Att2,Sem):- 
   option('--copula',true),
   member(Cat,[(s:Mood\np)/np,(s:Mood/np)/np]), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:[]:prop(E,app(NP2,lam(Y,B2:drs([],[B2:Index:eq(X,Y)]))))]),
               app(P,E)),
   tense(Mood,[],Att1-Att2,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,lam(P,app(NP1,lam(X,DRS)))))).



/* -------------------------------------------------------------------------
    Copula  (place holder for be with IS-A sense)
------------------------------------------------------------------------- */

semlex_verb(Cat,be,Index,Att1-Att2,Sem):-         
   option('--copula',true),
   member(Cat,[(s:Mood\np)/np,(s:Mood/np)/np]), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:[]:prop(E,B2:drs([],[B2:[]:imp(merge(B3:drs([B3:[]:X],[]),app(NP1,lam(Y,B4:drs([],[B4:[]:eq(Y,X)])))),
                                                    app(NP2,lam(Y,B5:drs([],[B5:Index:eq(Y,X)]))))]))]),
               app(P,E)),
   tense(Mood,[],Att1-Att2,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,lam(P,DRS)))).


/* -------------------------------------------------------------------------
    Copula  (identity reading)
------------------------------------------------------------------------- */

semlex_verb(Cat,be,Index,Att1-Att3,Sem):- 
   member(Cat,[(s:Mood\np)/np,(s:Mood/np)/np]), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,identical,a,1),
                      B:[]:role(E,X,'Pivot',1),
                      B:[]:role(E,Y,'Theme',1)]),
               app(P,E)),
   tense(Mood,[],Att1-Att3,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,
                             lam(P,app(NP1,
                                       lam(X,app(NP2,
                                                 lam(Y,DRS)))))))).


/* -------------------------------------------------------------------------
   Transitive (np V np) comparative
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat, [(s:adj\np)\np]), 
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),B:[]:pred(E,more,r,1),
                      B:[]:role(E,X,Role1,1),B:[]:role(E,Y,Role2,1)]),
               app(P,E)),
   tense(com,[],Att2-Att3,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,
                             lam(P,app(NP1,
                                       lam(X,app(NP2,
                                                 lam(Y,DRS)))))))).


/* -------------------------------------------------------------------------
   Transitive (np V np) extensional
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat, [(s:Mood\np)/np,(s:Mood/np)/np,(s:Mood\np)\np]), 
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,Pos,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,Y,Role2,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP2,lam(NP1,app(TDRS,
                             lam(P,app(NP1,
                                       lam(X,app(NP2,
                                                 lam(Y,DRS)))))))).

/* -------------------------------------------------------------------------
   Transitive (there is NP)
   Not working currently because thr is stripped of NP category

semlex_verb((s:Mood\np_thr)/np,_,Index,Att1-Att2,Sem):- !,
   tense(Mood,Index,Att1-Att2,TDRS),
   Sem = lam(NP,lam(_,app(TDRS,lam(F,app(NP,lam(X,merge(B:drs([B:[]:E],
                                                            [B:Index:pred(E,be,v,5), 
                                                             B:[]:role(E,X,agent,1)]),
                                                        app(F,E)))))))).
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Transitive (np V pp)
------------------------------------------------------------------------- */

semlex_verb(Cat,be,Index,Att1-Att2,Sem):-
   option('--copula',true),
   member(Cat,[(s:Mood\np)/pp,(s:Mood/np)/pp]), !,
   DRS = merge(B:drs([B:[]:E],
                     [B:[]:prop(E,app(PP,Y))]),
               app(P,E)),
   tense(Mood,Index,Att1-Att2,TDRS),
   Sem = lam(PP,lam(NP,app(TDRS,lam(P,app(NP,lam(Y,DRS)))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[(s:Mood\np)/pp,(s:Mood/np)/pp]), 
   roles(Sym,Cat,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   DRS = merge(merge(B:drs([B:[]:E],
                           [B:Index:pred(E,Sym,Pos,Sense),
                            B:[]:role(E,Y,Role,1)]),
                     app(PP,E)),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP,lam(NP,app(TDRS,lam(P,app(NP,lam(Y,DRS)))))).


/* -------------------------------------------------------------------------
   Transitive (pp V np)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[(s:Mood\pp)/np,(s:Mood/pp)/np]),
   roles(Sym,Cat,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(merge(B:drs([B:[]:E],
                           [B:Index:pred(E,Sym,v,Sense),
                            B:[]:role(E,Y,Role,1)]),
                     app(PP,E)),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,lam(PP,app(TDRS,lam(P,app(NP,lam(Y,DRS)))))).


/* =========================================================================
   D i t r a n s i t i v e   V e r b s
========================================================================= */

/* -------------------------------------------------------------------------
   Ditransitive (np V np np)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/np)/np, !,
   roles(Sym,Cat,[Role3,Role2,Role1],Att1-Att2),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,Y,Role2,1),
                      B:[]:role(E,Z,Role3,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP3,lam(NP2,lam(NP1,app(TDRS,
                                     lam(P,app(NP1,
                                               lam(X,app(NP2,
                                                         lam(Y,app(NP3,
                                                                   lam(Z,DRS))))))))))).

/* -------------------------------------------------------------------------
   Ditransitive (np V np pp)   
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/pp)/np,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,Pos,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,X,Role2,1)]),
               merge(app(PP,E),
                     app(P,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP1,lam(PP,lam(NP2,app(TDRS,
                                    lam(P,app(NP2,
                                              lam(Y,app(NP1,
                                                        lam(X,DRS))))))))).

/* -------------------------------------------------------------------------
   Ditransitive (np V pp np)   
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\np)/np)/pp,((s:Mood\np)\np)/pp,((s:Mood/np)/np)/pp]),
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,Pos,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,X,Role2,1)]),
               merge(app(PP,E),
                     app(P,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP,lam(NP1,lam(NP2,app(TDRS,
                                    lam(P,app(NP2,
                                              lam(Y,app(NP1,
                                                        lam(X,DRS))))))))).


/* -------------------------------------------------------------------------
   Ditransitive (np V pp pp)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\np)/pp)/pp,((s:Mood/np)/pp)/pp]),
   roles(Sym,Cat,[Role],Att1-Att2), !,
   ( Mood=adj, !, Pos=a; \+ Mood=adj, Pos=v ),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,Pos,Sense),
                      B:[]:role(E,Y,Role,1)]),
               merge(app(PP1,E),
                     merge(app(PP2,E),
                           app(P,E)))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP1,lam(PP2,lam(NP,app(TDRS,
                                    lam(P,app(NP,lam(Y,DRS))))))).


/* -------------------------------------------------------------------------
   Ditransitive (pp V np np)   
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\pp)/np)/np,((s:Mood/pp)/np)/np]),
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,X,Role2,1)]),
               merge(app(PP,E),
                     app(P,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP1,lam(NP2,lam(PP,app(TDRS,
                                    lam(P,app(NP2,
                                              lam(Y,app(NP1,
                                                        lam(X,DRS))))))))).

/* -------------------------------------------------------------------------
   Ditransitive (pp V np pp)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\pp)/pp)/np,((s:Mood/pp)/pp)/np]),
   roles(Sym,Cat,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role,1)]),
               merge(app(PP1,E),
                     merge(app(PP2,E),
                           app(P,E)))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP,lam(PP1,lam(PP2,app(TDRS,
                                    lam(P,app(NP,
                                              lam(Y,DRS))))))).


/* =========================================================================
   T r i t r a n s i t i v e   V e r b s
========================================================================= */

/* -------------------------------------------------------------------------
   Tritransitive (np V np pp pp)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (((s:Mood\np)/pp)/pp)/np,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,   
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,X,Role2,1)]),
               merge(merge(app(PP1,E),
                           app(PP2,E)),
                     app(P,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP1,lam(PP1,lam(PP2,lam(NP2,app(TDRS,
                                             lam(P,app(NP2,
                                                       lam(Y,app(NP1,
                                                                 lam(X,DRS)))))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (((s:Mood\np)/pp)/np)/pp,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,   
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,X,Role2,1)]),
               merge(merge(app(PP1,E),
                           app(PP2,E)),
                     app(P,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP1,lam(NP1,lam(PP2,lam(NP2,app(TDRS,
                                             lam(P,app(NP2,
                                                       lam(Y,app(NP1,
                                                                 lam(X,DRS)))))))))).

    
/* =========================================================================
   P r o p o s i t i o n a l   c o m p l e m e n t   v e r b s
========================================================================= */

/* -------------------------------------------------------------------------
   Intransitive (np V s)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (s:Mood\np)/s:Emb,
   member(Emb,[em,bem,qem,for]),
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,   
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,K,Role2,1)]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(S,lam(Q,app(TDRS,lam(F,app(Q,lam(Y,app(S,lam(K,DRS)))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (s:Mood\np)/s:_,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,   
   att(Att2,sense,Sense),
   plosing(CC),
   DRS = merge(B:drs([B:[]:E,B:[]:A],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,A,Role2,1),
                      B:[]:prop(A,app(S,CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(S,lam(Q,app(TDRS,lam(F,app(Q,lam(Y,DRS)))))).

/* -------------------------------------------------------------------------
   Intransitive (np V pp s)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/s:_)/pp,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,   
   att(Att2,sense,Sense),
   plosing(CC),
   DRS = merge(B:drs([B:[]:E,B:[]:A],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,A,Role2,1),
                      B:[]:prop(A,app(S,CC))]),
               merge(app(PP,E),app(F,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP,lam(S,lam(Q,app(TDRS,lam(F,app(Q,lam(Y,DRS))))))).

/* -------------------------------------------------------------------------
   Intransitive (s np V)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   att(Att1,pos,POS),
   \+ member(POS,['IN','RRB','RB','TO']),    %%% exclude prepositions, adverbs
   member(Cat,[(s:Mood\s:SM)\np,(s:Mood/s:SM)/np,(s:Mood\s:SM)/np,(s:Mood/s:SM)\np]),
   roles(Sym,(s:Mood\np)/s:SM,[Role1,Role2],Att1-Att2), !,   
   att(Att2,sense,Sense),
   plosing(CC),
   DRS = merge(B:drs([B:[]:E,B:[]:A],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role2,1),
                      B:[]:role(E,A,Role1,1),
                      B:[]:prop(A,app(S,CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q,lam(S,app(TDRS,lam(F,app(Q,lam(Y,DRS)))))).


/* -------------------------------------------------------------------------
   Intransitive (vp V np)
------------------------------------------------------------------------- */

semlex_verb(Cat,_Sym,Index,Att1-Att2,Sem):-
   Cat = (s:Mood\(s:Aspect\np))/np, !,
   aspect(Aspect,Mood,Index,Att1-Att2,TDRS),
   Sem = lam(NP,lam(VP,app(TDRS,app(VP,NP)))).


/* -------------------------------------------------------------------------
   Transitive (s np V np)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat, [((s:Mood\s:_)\np)/np]), 
   roles(Sym,Cat,[Role3,Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,B:[]:A],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,Y,Role1,1),
                      B:[]:role(E,Z,Role3,1),
                      B:[]:role(E,A,Role2,1),
                      B:[]:prop(A,app(S,CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(R,lam(Q,lam(S,app(TDRS,lam(F,app(R,lam(Z,app(Q,lam(Y,DRS))))))))).


/* -------------------------------------------------------------------------
   Transitive (np V np s)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat, [((s:Mood\np)/s:_)/np]), 
   roles(Sym,Cat,[Role3,Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,B:[]:A],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,A,Role2,1),
                      B:[]:role(E,Y,Role3,1),
                      B:[]:prop(A,app(S,CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP2,lam(S,lam(NP1,app(TDRS,lam(F,app(NP1,lam(X,app(NP2,lam(Y,DRS))))))))).

/* -------------------------------------------------------------------------
   Transitive (np V vp np)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/np)/(s:_\np),
   roles(Sym,(s:Mood\np)/s:_,[Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,B:[]:Z],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,Z,Role2,1),
                      B:[]:prop(Z,app(app(VP,NP2),CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP2,lam(NP1,app(TDRS,lam(F,app(NP1,lam(X,DRS))))))).

/* -------------------------------------------------------------------------
   Transitive (np V vp pp)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/pp)/(s:adj\np),
   roles(Sym,s:Mood\np,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(PP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,merge(B:drs([B:[]:E],
                                                                      [B:Index:pred(E,Sym,v,Sense),
                                                                       B:[]:role(E,X,Role,1)]),
                                                                merge(app(PP,E),
                                                                      merge(app(app(VP,lam(P,app(P,E))),F),
                                                                            app(F,E))))))))))).


/* -------------------------------------------------------------------------
   Transitive (np V pp vp)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/(s:adj\np))/pp,
   roles(Sym,s:Mood\np,[Role],Att1-Att2), !,
   att(Att2,sense,Sense),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP,lam(AP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,merge(B:drs([B:[]:E],
                                                                      [B:Index:pred(E,Sym,v,Sense),
                                                                       B:[]:role(E,X,Role,1)]),
                                                                merge(app(PP,E),
                                                                      merge(app(app(AP,lam(P,app(P,E))),F),
                                                                            app(F,E))))))))))).


/* =========================================================================
   A u x i l i a r y ,  M o d a l ,  C o n t r o l   V e r b s
========================================================================= */

/* =========================================================================
   Infinitivals
========================================================================= */

semlex_verb(Cat,_Sym,Index,Att-[semtag:'SUB'|Att],Sem):-
   Cat = (s:to\np)/(s:b\np), !,
   plosing(CC),
%   Sem = lam(VP,lam(NP,lam(E,B:drs([B:Index:P],
%                                   [B:[]:prop(P,app(app(VP,NP),E))])))).
   Sem =  lam(V0,lam(V1,lam(V2,merge(B3:drs([B3:Index:P4],
                                            [B3:[]:prop(P4,app(app(V0,V1),CC))]),app(V2,P4))))).


/* -------------------------------------------------------------------------
   Standard case (NP aux VP)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-[sem:'POS'|Att1],Sem):-
   option('--modal',true), 
   modal_verb(pos,Sym,_),
   Cat = (s:Mood\np)/(s:Aspect\np), 
   \+ Mood = Aspect, !,
   aspect(Aspect,Mood,Index,Att1-_,TDRS),
   Sem = lam(VP,lam(NP,lam(E,B:drs([],[B:Index:pos(app(app(TDRS,app(VP,NP)),E))])))).

semlex_verb(Cat,Sym,Index,Att1-[sem:'NEC'|Att1],Sem):-
   option('--modal',true),
   Cat = (s:Mood\np)/(s:Aspect\np), 
   modal_verb(nec,Sym,Aspect),
   \+ Mood = Aspect, !,
   aspect(Aspect,Mood,Index,Att1-_,TDRS),
   Sem = lam(VP,lam(NP,lam(E,B:drs([],[B:Index:nec(app(app(TDRS,app(VP,NP)),E))])))).

semlex_verb(Cat,Sym,Index,Att1-Att2,Sem):-
   aux_verb(Sym),
   Cat = (s:Mood\np)/(s:Aspect\np), \+ Aspect=to,
   \+ Mood = Aspect, !,
   aspect(Aspect,Mood,Index,Att1-Att2,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,app(VP,NP)))).


/* -------------------------------------------------------------------------
   Inversion case (aux NP VP)
------------------------------------------------------------------------- */

semlex_verb(Cat,_Sym,Index,Att1-Att2,Sem):-
   Cat = (s:Mood/(s:Aspect\np))/np, 
   \+ Mood = Aspect, \+ Mood = for, !,
   aspect(Aspect,Mood,Index,Att1-Att2,TDRS),
   Sem = lam(NP,lam(VP,app(TDRS,app(VP,NP)))).


/* -------------------------------------------------------------------------
   Control Verbs (intransitive)
------------------------------------------------------------------------- */

% e.g. "is about to swim"
%
semlex_verb(Cat,Sym,Index,Att1-[sem:'UNK'|Att2],Sem):- 
   Cat = (s:adj\np)/(s:to\np), 
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,a,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1)]),
               app(F,E)),
   Sem = lam(VP,lam(NP,lam(F,app(NP,lam(X,app(app(VP,lam(P,app(P,X))),lam(K,DRS))))))).

% e.g.  "hard to take", "easy to please"
%
semlex_verb(Cat,Sym,Index,Att1-[sem:'UNK'|Att2],Sem):- 
   Cat = (s:adj\np)/((s:to\np)/np), 
   roles(Sym,(s:adj\np)/(s:to\np),[Role2,_],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,a,Sense),
                      B:[]:role(E,K,Role2,1)]),
               app(F,E)),
   NP = lam(P,merge(B2:drs([B2:[]:X],[B2:[]:pred(X,thing,n,12)]),app(P,X))),
   Sem = lam(TV,lam(Q,lam(F,app(app(app(TV,Q),NP),lam(K,DRS))))).

% e.g. "wants to swim" 
%
semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   Cat = (s:Mood\np)/(s:to\np), \+ Mood = to,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1)]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,app(app(VP,lam(P,app(P,X))),lam(K,DRS)))))))).

% e.g. "help finish his homework"
%
semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   Cat = (s:b\np)/(s:b\np),   att(Att1,pos,'VB'),
   roles(Sym,(s:b\np)/(s:to\np),[Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,
                      B:[]:K],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1),
                      B:[]:prop(K,app(app(VP,lam(P,app(P,X))),CC))]),
               app(F,E)),
   tense(b,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,DRS)))))).

% e.g. "helping walking home"
%
semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   Cat = (s:ng\np)/(s:ng\np),   att(Att1,pos,'VBG'),
   roles(Sym,(s:ng\np)/(s:to\np),[Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,
                      B:[]:K],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1),
                      B:[]:prop(K,app(app(VP,lam(P,app(P,X))),CC))]),
               app(F,E)),
   tense(ng,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,DRS)))))).

% e.g. "were left stranded"
%
semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   Cat = (s:pss\np)/(s:pss\np),   att(Att1,pos,'VBN'),
   roles(Sym,(s:pss\np)/(s:to\np),[Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,
                      B:[]:K],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1),
                      B:[]:prop(K,app(app(VP,lam(P,app(P,X))),CC))]),
               app(F,E)),
   tense(ng,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,DRS)))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   Cat = (s:Mood\np)/(s:Arg\np), \+ Mood = Arg,
   roles(Sym,Cat,[Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E,
                      B:[]:K],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,K,Role2,1),
                      B:[]:prop(K,app(app(VP,lam(P,app(P,X))),CC))]),
               app(F,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(VP,lam(NP,app(TDRS,lam(F,app(NP,lam(X,DRS)))))).


/* -------------------------------------------------------------------------
   Subject Control Verbs
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Sym,[promise,offer,use]),
   Cat = ((s:Mood\np)/(s:to\np))/np, \+ Mood = to,
   roles(Sym,((s:Mood\np)/np)/np,[Role3,Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = app(app(V,lam(P,app(P,X))),lam(Z,merge(B1:drs([B1:[]:E],
                                                       [B1:Index:pred(E,Sym,v,Sense),
                                                        B1:[]:role(E,X,Role1,1),
                                                        B1:[]:role(E,Y,Role3,1),
                                                        B1:[]:role(E,Z,Role2,1)]),app(F,E)))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(V,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS))))))))).

semlex_verb(((s:Mood\np)/(s:Com\np))/np,Sym,Index,Att1-Att3,Sem):-
   member(Sym,[promise,offer,use]),
   member(Com,[b,ng,adj,pss,pt]), 
   roles(Sym,((s:Mood\np)/s:_)/np,[Role3,Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   Modal = B1:drs([B1:[]:A],
                  [B1:[]:role(E,A,Role3,1),
                   B1:[]:prop(A,app(app(V,lam(R,app(R,X))),CC))]),
   DRS = merge(B2:drs([B2:[]:E],
                      [B2:Index:pred(E,Sym,v,Sense),
                       B2:[]:role(E,Y,Role2,1),
                       B2:[]:role(E,X,Role1,1)]),
               merge(Modal,app(F,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(V,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS))))))))).


/* -------------------------------------------------------------------------
   Object Control Verbs (ECM, exceptional case marking)
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/(s:to\np))/np, \+ Mood = to,
   roles(Sym,((s:Mood\np)/s:_)/np,[Role3,Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = app(app(V,lam(P,app(P,Y))),lam(Z,merge(B1:drs([B1:[]:E],
                                                       [B1:Index:pred(E,Sym,v,Sense),
                                                        B1:[]:role(E,X,Role1,1),
                                                        B1:[]:role(E,Y,Role3,1),
                                                        B1:[]:role(E,Z,Role2,1)]),app(F,E)))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(V,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS))))))))).

semlex_verb(((s:Mood\np)/(s:Com\np))/np,Sym,Index,Att1-Att3,Sem):-
   member(Com,[b,ng,adj,pss,pt]),
   roles(Sym,((s:Mood\np)/s:_)/np,[Role3,Role2,Role1],Att1-Att2), !,
   plosing(CC),
   att(Att2,sense,Sense),
   Modal = B1:drs([B1:[]:A],
                  [B1:[]:role(E,A,Role3,1),
                   B1:[]:prop(A,app(app(V,lam(R,app(R,Y))),CC))]),
   DRS = merge(B1:drs([B1:[]:E],
                      [B1:Index:pred(E,Sym,v,Sense),
                       B1:[]:role(E,Y,Role2,1),
                       B1:[]:role(E,X,Role1,1)]),
               merge(Modal,app(F,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(V,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS))))))))).


/* -------------------------------------------------------------------------
   Object Control Verbs subcatting PP
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/(s:to\np))/pp, \+ Mood = to,
   roles(Sym,((s:Mood\np)/np)/pp,[Role1,Role2],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = app(app(V,lam(P,app(P,X))),lam(Z,merge(B1:drs([B1:[]:E],
                                                       [B1:Index:pred(E,Sym,v,Sense),
                                                        B1:[]:role(E,X,Role2,1),
                                                        B1:[]:role(E,Z,Role1,1)]),merge(app(PP,E),app(F,E))))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(PP,lam(V,lam(Q,app(TDRS,lam(F,app(Q,lam(X,DRS))))))).
                    

/* -------------------------------------------------------------------------
   make NP ADJ to VP
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (((s:Mood\np)/(s:to\np))/(s:adj\np))/np, !,
   plosing(CC),
   att(Att1,sense,Sense),
   roles(Sym,((s:Mood\np)/s:_)/np,[Role3,Role2,Role1],Att1-Att2),
   Modal = merge(B1:drs([B1:[]:A],
                        [B1:[]:role(E,A,Role3,1),
                         B1:[]:prop(A,app(app(V,lam(R,app(R,Y))),CC))]),
                 app(app(AP,lam(P,app(P,A))),CC)),
   DRS = merge(B2:drs([B2:[]:E],
                      [B2:Index:pred(E,Sym,v,Sense),
                       B2:[]:role(E,Y,Role2,1),
                       B2:[]:role(E,X,Role1,1)]),
               merge(Modal,app(F,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(AP,lam(V,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS)))))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = (((s:Mood\np)/s:_)/(s:adj\np))/np, !,
   plosing(CC),
   att(Att1,sense,Sense),
   roles(Sym,((s:Mood\np)/s:_)/np,[Role3,Role2,Role1],Att1-Att2),
   Modal = merge(B1:drs([B1:[]:A],
                        [B1:[]:role(E,A,Role3,1),
                         B1:[]:prop(A,app(S,CC))]),
                 app(app(AP,lam(P,app(P,A))),CC)),
   DRS = merge(B1:drs([B1:[]:E],
                      [B1:Index:pred(E,Sym,v,Sense),
                       B1:[]:role(E,Y,Role2,1),
                       B1:[]:role(E,X,Role1,1)]),
               merge(Modal,app(F,E))),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(Q2,lam(AP,lam(S,lam(Q1,app(TDRS,lam(F,app(Q1,lam(X,app(Q2,lam(Y,DRS)))))))))).



/* -------------------------------------------------------------------------
   Funny transitive case (rare -- often in incorrect parses)
------------------------------------------------------------------------- */

semlex_verb(Cat,_Sym,Index,Att1-Att2,Sem):-
   Cat = ((s:Mood\np)\np)/(s:Aspect\np), !,
   aspect(Aspect,Mood,Index,Att1-Att2,TDRS),
   Sem = lam(VP,lam(_,lam(NP,app(TDRS,app(VP,NP))))).


/* -------------------------------------------------------------------------
   Copula "How ADJ be NP PP"
------------------------------------------------------------------------- */

semlex_verb(Cat,_Sym,Index,Att1-Att2,Sem):-
   Cat = ((s:q/pp)/(s:Aspect\np))/np, !,
   aspect(Aspect,q,Index,Att1-Att2,TDRS),
   Sem = lam(NP,lam(VP,lam(PP,lam(F,app(app(TDRS,app(VP,NP)),lam(E,merge(app(PP,E),app(F,E)))))))).



/* =========================================================================
   E x p l e t i v e   v e r b s
========================================================================= */

/* -------------------------------------------------------------------------
   Cleft  "it was NP who VP"
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):- 
   member(Cat,[((s:Mood\np_exp)/(np\np))/np,
               ((s:Mood\np)/(np\np))/np]),
   roles(Sym,(s:Mood\np)/np,[Role2,Role1],Att1-Att2), !,
   att(Att2,sense,Sense),
   DRS = merge(B:drs([B:[]:E],
                     [B:Index:pred(E,Sym,v,Sense),
                      B:[]:role(E,X,Role1,1),
                      B:[]:role(E,Y,Role2,1)]),
               app(P,E)),
   tense(Mood,[],Att2-Att3,TDRS),
   Sem = lam(NP2,lam(RC,lam(NP1,app(TDRS,
                             lam(P,app(NP1,
                                       lam(X,app(app(RC,NP2),
                                                 lam(Y,DRS))))))))).


%   Sem = lam(NP,lam(M,lam(_,app(TDRS,lam(F,alfa(fac,merge(B1:drs([B1:[]:X],[]),
%                                                          app(app(M,lam(P,app(P,X))),lam(U,merge(B2:drs([B2:[]:E],[B2:[]:role(E,U,theme,1)]),
%                                                                                                 app(F,E))))),
%                                                    app(NP,lam(U,B3:drs([],[B3:Index:eq(U,X)]))))))))).

/* -------------------------------------------------------------------------
   Copula  "it is ADJ to-VP"
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   Cat = ((s:Mood\np)/(s:to\np))/(s:adj\np), 
   roles(Sym,(s:Mood\np)/s:_,[Role,_],Att1-Att2), !,
   tense(Mood,Index,Att2-Att3,TDRS),
   Sem = lam(AP,lam(VP,lam(NP,app(TDRS,lam(E,DRS))))),
   DRS = app(app(AP,NP), 
             lam(X,app(app(VP,lam(P,merge(B1:drs([B1:[]:X],[]),app(P,X)))),
                       lam(F,merge(B3:drs([],[B3:[]:role(X,F,Role,1)]),app(E,X)))))).


/* -------------------------------------------------------------------------
   Copula  "it is so ADJ that S"
           "it is ADJ that S"
           "it is ADJ whether S"
           "it is ADJ for S"
------------------------------------------------------------------------- */

semlex_verb(Cat,Sym,Index,Att-[sem:'UNK'|Att],Sem):-  
   option('--semantics',amr),
   Cat = ((s:adj\np)/s:em)/(s:adj\np), !,
   Sem = lam(AP,lam(S,lam(Q,lam(E,app(app(AP,Q),lam(Y,merge(app(S,lam(X,B:drs([B:[]:F],[B:[]:pred(F,'cause',v,1),
                                                                                        B:Index:pred(Y,Sym,r,2),
                                                                                        B:[]:role(F,Y,'ARG0',1),  
                                                                                        B:[]:role(F,X,'ARG1',1)]))),
                                                            app(E,Y)))))))).

semlex_verb(Cat,Sym,Index,Att1-[sem:'UNK'|Att2],Sem):-
   Cat = ((s:adj\np)/s:em)/(s:adj\np), !,
   att(Att1,sense,Sense),
   roles(Sym,(s:adj\np)/s:_,[Role,_],Att1-Att2), 
   Sem = lam(AP,lam(S,lam(Q,lam(E,app(app(AP,Q),lam(Y,merge(app(S,lam(X,B2:drs([],[B2:Index:pred(Y,Sym,a,Sense),
                                                                                   B2:[]:role(Y,X,Role,1)]))),
                                                            app(E,Y)))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\np_exp)/s:em)/(s:adj\np),
               ((s:Mood\np)/s:em)/(s:adj\np)]), !,
   roles(Sym,(s:Mood\np)/s:_,[Role,_],Att1-Att2), 
   tense(Mood,Index,Att2-Att3,TDRS),
   Sem = lam(AP,lam(S,lam(Q,app(TDRS,lam(E,app(app(AP,Q),lam(Y,merge(app(S,lam(X,B2:drs([],[B2:[]:role(Y,X,Role,1)]))),
                                                                     app(E,Y))))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\np_exp)/s:qem)/(s:adj\np),
               ((s:Mood\np)/s:qem)/(s:adj\np)]), !,
   roles(Sym,(s:Mood\np)/s:_,[Role,_],Att1-Att2), 
   tense(Mood,Index,Att2-Att3,TDRS),
   Sem = lam(AP,lam(S,lam(Q,app(TDRS,lam(E,app(app(AP,Q),lam(Y,merge(app(S,lam(X,B2:drs([],[B2:[]:role(Y,X,Role,1)]))),
                                                                     app(E,Y))))))))).

semlex_verb(Cat,Sym,Index,Att1-Att3,Sem):-
   member(Cat,[((s:Mood\np_exp)/s:for)/(s:adj\np), 
               ((s:Mood\np)/s:for)/(s:adj\np)]), !,
   roles(Sym,(s:Mood\np)/s:_,[Role,_],Att1-Att2), 
   tense(Mood,Index,Att2-Att3,TDRS),
   Sem = lam(AP,lam(S,lam(Q,app(TDRS,lam(E,app(app(AP,Q),lam(Y,merge(app(S,lam(X,B2:drs([],[B2:[]:role(Y,X,Role,1)]))),
                                                                     app(E,Y))))))))).


/* -------------------------------------------------------------------------
   Copula  "it is PP that S"

semlex_verb(Cat,_,_Index,Att-Att,Sem):-
   Cat = ((s:dcl\np_exp)/s:em)/pp, !,
   Sem = lam(PP,lam(S,lam(_,lam(F,app(S,lam(E,merge(app(PP,E),app(F,E)))))))). 
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Copula  "it is NP that S"

semlex_verb(Cat,_,Index,Att1-Att2,Sem):-
   Cat = ((s:Mood\np_exp)/s:em)/np, !,
   tense(Mood,[],Att1-Att2,TDRS),
   plosing(CC),
   Sem = lam(NP,lam(S,lam(_,app(TDRS,lam(E,merge(B1:drs([B1:Index:F,B1:[]:K],
                                            [B1:[]:role(F,K,theme,1),
                                             B1:[]:prop(K,app(S,CC))]),
                                        merge(app(NP,lam(X,B2:drs([],[B2:[]:eq(X,K)]))),
                                              app(E,F)))))))).
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Control "it takes/makes/is NP to VP" 

semlex_verb(Cat,_,Index,Att1-Att2,Sem):-
   Cat = ((s:Mood\np_exp)/(s:to\np))/np, !,
   plosing(CC),
   tense(Mood,[],Att1-Att2,TDRS),
   Sem = lam(NP,lam(VP,lam(_,app(TDRS,lam(F,merge(B1:drs([B1:[]:E],
                                             [B1:[]:imp(merge(B2:drs([B2:[]:X],[]),
                                                              app(app(VP,lam(P,app(P,X))),CC)),
                                                        app(NP,lam(Y,B3:drs([],[B3:Index:eq(Y,X)]))))]),
                                         app(F,E))))))).
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Modal "it may/could/would VP"

semlex_verb(Cat,Sym,Index,Att1-Att2,Sem):-
   option('--modal',true),
   modal_verb(pos,Sym,_),
   Cat = (s:Mood\np_exp)/(s:Aspect\np), !,
   aspect(Aspect,Mood,[],Att1-Att2,TDRS),
   Sem = lam(VP,lam(NP,lam(E,B:drs([],[B:Index:pos(app(app(TDRS,app(VP,NP)),E))])))).

semlex_verb(Cat,Sym,Index,Att1-Att2,Sem):-
   option('--modal',true),
   Cat = (s:Mood\np_exp)/(s:Aspect\np),
   modal_verb(nec,Sym,Aspect), !,
   aspect(Aspect,Mood,[],Att1-Att2,TDRS),
   Sem = lam(VP,lam(NP,lam(E,B:drs([],[B:Index:nec(app(app(TDRS,app(VP,NP)),E))])))).

semlex_verb(Cat,_Sym,Index,Att1-Att2,Sem):-
   option('--modal',false),
   Cat = (s:Mood\np_exp)/(s:Aspect\np), !,
   aspect(Aspect,Mood,Index,Att1-Att2,TDRS),
   Sem = lam(VP,lam(NP,lam(E,app(app(TDRS,app(VP,NP)),E)))).
------------------------------------------------------------------------- */


/* -------------------------------------------------------------------------
   Comparative "V it COMP (for) S"

semlex_verb(Cat,Sym,Index,Att-Att,Sem):-
   Cat = (((s:_\np)/s:_)/(s:adj\np))/np_exp, !,
   plosing(CC),
   att(Att,sense,Sense),
   Sem = lam(_,lam(AP,lam(S,lam(NP,lam(F,
         app(NP,lam(X,merge(B1:drs([B1:[]:K,B1:[]:E],
                                   [B1:Index:pred(E,Sym,v,Sense),
                                    B1:[]:role(E,X,agent,1),
                                    B1;[]:role(E,K,theme,1),
                                    B1:[]:prop(K,app(S,CC))]),
                            merge(app(app(AP,lam(P,app(P,K))),lam(G,B2:drs([],[B2:[]:role(E,G,result,1)]))),
                                  app(F,E)))))))))).
------------------------------------------------------------------------- */

/* -------------------------------------------------------------------------
   Comparative "make/find it COMP to VP"

semlex_verb(Cat,Sym,Index,Att-Att,Sem):-
   Cat = (((s:_\np)/(s:to\np))/(s:adj\np))/np_exp, !,
   plosing(CC),
   att(Att,sense,Sense),
   DRS = app(app(VP,lam(P,merge(B1:drs([B1:[]:X],[]),app(P,X)))),CC),
   Sem = lam(_,lam(AP,lam(VP,lam(NP,lam(F,
         app(NP,lam(X,merge(B2:drs([B2:[]:K,B2:[]:E],
                                   [B2:Index:pred(E,Sym,v,Sense),
                                    B2:[]:role(E,X,agent,1),
                                    B2:[]:role(E,K,theme,1),
                                    B2:[]:prop(K,DRS)]),
                            merge(app(app(AP,lam(P,app(P,K))),lam(G,B3:drs([],[B3:[]:role(E,G,result,1)]))),
                                  app(F,E)))))))))).
------------------------------------------------------------------------- */

/* =========================================================================
   Modal Verbs
========================================================================= */

aux_modal_verb(V):- aux_verb(V).
aux_modal_verb(V):- modal_verb(_,V,_).

aux_verb(be).
aux_verb(do).
aux_verb(have).
aux_verb(to).
aux_verb(will).
aux_verb(would).

modal_verb(pos, ca,    _).     %%% can't
modal_verb(pos, can,   _).
modal_verb(pos, may,   _).
modal_verb(pos, might, _).
modal_verb(pos, could, _).

modal_verb(nec, sha,   _).    %%% shan't
modal_verb(nec, shall, _).
modal_verb(nec, must,  _).
modal_verb(nec, should,_).
modal_verb(nec, have, to).

%modal_verb(nec, would, _).
%modal_verb(nec, will, _).