2:- module(categories,
3 [category/3, 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
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
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
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
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
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
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
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
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, _)