2:- module(categories,
    3          [category/3,       %  +Type, +Cat, -Mood
    4           roles/4,
    5           sense/4,
    6           att/3,
    7           rel/3, 
    8           role/3
    9          ]).   10
   11:- use_module(boxer(slashes)).   12:- use_module(semlib(options)).   13:- use_module(semlib(errors),[warning/2]).   14:- use_module(lex(verbnet),[verbnet/3]).   15
   16
   17/* -------------------------------------------------------------------------
   18   Accessing Attributes
   19------------------------------------------------------------------------- */
   20
   21att([],sense,0):- !.
   22att([],namex,'O'):- !.
   23att([],verbnet,[]):- !.
   24att([],_,unknown):- !.
   25att([F:V|_],F,V):- !.
   26att([_|L],F,V):- att(L,F,V).
   27
   28/* -------------------------------------------------------------------------
   29   Word Senses
   30------------------------------------------------------------------------- */
   31
   32sense(_Sym,_Cat,Sense,A-A):- att(A,sense,Sense), \+ Sense = 0, !.
   33sense(_Sym,_Cat,Sense,A-[sense:Sense|A]):- Sense = 1.
   34
   35
   36/* -------------------------------------------------------------------------
   37   Relations
   38------------------------------------------------------------------------- */
   39
   40rel(_,Att-Att,Rel):- att(Att,relation,Rel), \+ Rel=unknown, !.
   41rel(Rel,Att-[relation:Rel|Att],Rel).
   42
   43role(_,Att-Att,Roles):- att(Att,verbnet,Roles), \+ Roles=[], !.
   44role(Roles,Att-[verbnet:Roles|Att],Roles).
   45
   46
   47/* -------------------------------------------------------------------------
   48   Thematic Roles introduced by PPs
   49------------------------------------------------------------------------- */
   50
   51roles(_,((s:X\np)\(s:X\np))/np,Roles,A-A):- option('--roles',verbnet), att(A,verbnet,Roles), \+ Roles=[], !.
   52roles(by,((s:X\np)\(s:X\np))/np,Roles,A-[verbnet:Roles|A]):- option('--roles',verbnet), !, Roles = ['Agent'].
   53roles(_,((s:X\np)\(s:X\np))/np,Roles,A-[verbnet:Roles|A]):- option('--roles',verbnet), !, Roles = ['Instrument'].
   54roles(_,((s:X\np)\(s:X\np))/np,Roles,A-A):- option('--roles',proto), !, Roles = ['Actor'].
   55roles(for,pp/(s:_\np),Roles,A-A):- option('--roles',verbnet), !, Roles = ['Goal'].
   56roles(_,pp/(s:_\np),Roles,A-A):- option('--roles',verbnet), !, Roles = ['Topic'].
   57roles(for,pp/s:_,Roles,A-A):- option('--roles',verbnet), !, Roles = ['Goal'].
   58roles(_,pp/s:_,Roles,A-A):- option('--roles',verbnet), !, Roles = ['Topic'].
   59
   60
   61/* -------------------------------------------------------------------------
   62   Thematic Roles: passive
   63------------------------------------------------------------------------- */
   64
   65roles(Verb,(s:pss\np)/np,[Role1,Role2],A):- roles(Verb,((s:dcl\np)/np)/np,[Role1,Role2,_],A), !.
   66roles(Verb,(s:pss\np)/s:M,[Role1,Role2],A):- roles(Verb,((s:dcl\np)/s:M)/np,[Role1,Role2,_],A), !.
   67roles(Verb,(s:pss\np)/pp,[Role],A):- roles(Verb,((s:dcl\np)/pp)/np,[Role,_],A), !.
   68roles(Verb,((s:pss\np)/np)/pp,[Role1,Role2],A):- roles(Verb,(((s:dcl\np)/np)/pp)/np,[Role1,Role2,_],A), !.
   69roles(Verb,s:pss\np,[Role],A):- roles(Verb,(s:dcl\np)/np,[Role,_],A), !.
   70roles(Verb,((s:M\s:T)\np)/np,Roles,A):- roles(Verb,((s:M\np)/s:T)/np,Roles,A), !.
   71
   72/* -------------------------------------------------------------------------
   73   Thematic Roles: standard case 
   74------------------------------------------------------------------------- */
   75
   76roles(_,_,Roles,A-A):- option('--roles',verbnet), att(A,verbnet,Roles), \+ Roles=[], !.
   77roles(Verb,Cat,Roles,A-[verbnet:Roles|A]):- option('--roles',verbnet), verbnet(Verb,Cat,Roles), !.
   78roles(Verb,Cat,Roles,A-A):- option('--roles',proto), proto(Verb,Cat,Roles), !.
   79
   80
   81/* -------------------------------------------------------------------------
   82   Thematic Roles: fall-back rules
   83------------------------------------------------------------------------- */
   84
   85roles(Verb,(s:M\np)\np,Roles,A):- !, roles(Verb,(s:M\np)/np,Roles,A).
   86roles(Verb,s:inv/np,Roles,A):- !, roles(Verb,s:dcl\np,Roles,A).
   87roles(Verb,(s:q/np)/np,Roles,A):- !, roles(Verb,(s:dcl\np)/np,Roles,A).
   88roles(Verb,(s:M\pp)/np,Roles,A):- !, roles(Verb,s:M\np,Roles,A).
   89roles(Verb,(s:M/np)/np,Roles,A):- !, roles(Verb,(s:M\np)/np,Roles,A).
   90roles(Verb,s:M/np,Roles,A):- !, roles(Verb,s:M\np,Roles,A).
   91roles(Verb,C/pp,Roles,A):- !, roles(Verb,C,Roles,A).
   92roles(Verb,(C/pp)/np,Roles,A):- !, roles(Verb,C/np,Roles,A).
   93roles(Verb,(C/pp)/s:X,Roles,A):- !, roles(Verb,C/s:X,Roles,A).
   94roles(Verb,(s:M\np)/(s:X\np),Roles,A):- !, roles(Verb,(s:M\np)/s:X,Roles,A).
   95
   96
   97/* -------------------------------------------------------------------------
   98   Thematic Roles: no roles could be assigned
   99------------------------------------------------------------------------- */
  100
  101roles(Verb,Cat,Roles,A-A):- 
  102   warning('role assignment failure for ~p with category ~p',[Verb,Cat]),
  103   Roles = [].
  104
  105
  106/* -------------------------------------------------------------------------
  107   Proto (roles are listed in the order of arguments, not surface order!)
  108------------------------------------------------------------------------- */
  109
  110proto(_, s:adj\np,           ['Holder']):- option('--semantics',amr), !.
  111proto(_, (s:adj\np)\np,      ['Theme','Holder']):- option('--semantics',amr), !.
  112proto(_, s:adj\np,           ['Theme']):- !.
  113proto(_, (s:adj\np)\np,      ['Theme','Pivot']):- !.
  114proto(_, s:_\np,             ['Actor']):- !.
  115proto(_, (s:_\np)/np,        ['Theme','Actor']):- !. 
  116proto(_, (s:_\np)/s:_,       ['Topic','Actor']):- !.
  117proto(_, ((s:_\np)/np)/np,   ['Recipient','Theme','Actor']):- !.
  118proto(_, ((s:_\np)/s:_)/np,  ['Recipient','Topic','Actor']):- !.
  119
  120
  121/* -------------------------------------------------------------------------
  122   Sentence
  123------------------------------------------------------------------------- */
  124
  125category(s, s:X,    X).   
  126
  127
  128/* -------------------------------------------------------------------------
  129   VP adverbials
  130------------------------------------------------------------------------- */
  131
  132category(vpadv, (s:X\np)\(s:X\np),     _).
  133category(vpadv, (s:X\np)/(s:X\np),     _).
  134
  135
  136/* -------------------------------------------------------------------------
  137   S modifiers
  138------------------------------------------------------------------------- */
  139
  140category(smod, s:X/s:X,    _).
  141category(smod, s:X\s:X,    _).
  142category(smod, s:_/s:dcl,  _).
  143category(smod, s:dcl/s:inv, _).
  144
  145
  146/* -------------------------------------------------------------------------
  147   Complementisers
  148------------------------------------------------------------------------- */
  149
  150category(comp, s:poss/s:dcl, _).
  151category(comp, s:qem/s:dcl, _).
  152category(comp, s:bem/s:b, _).
  153category(comp, s:em/s:dcl, _).
  154category(comp, s:em/s:b, _)