2:- module(drs2amr,[drs2amr/4,printAMR/2]). 3
4:- use_module(library(lists),[select/3,member/2,append/3]). 5:- use_module(semlib(errors),[warning/2]). 6:- use_module(semlib(options),[option/2]). 7:- use_module(semlib(drs2tacitus),[label/4]). 8:- use_module(knowledge(amrmfs),[mfs/2]). 9:- use_module(knowledge('verbalization-list-v1.01'),[verbalize/2,verbalize/3,verbalize/4,verbalize/6]). 10:- use_module(knowledge(role91),[role91/3]). 11:- use_module(knowledge(negprefix),[negprefix/4]). 12:- use_module(knowledge(negsuffix),[negsuffix/4]). 13:- use_module(knowledge(nationality),[nationality/5]). 14:- use_module(knowledge(wiki),[wiki/3]). 15
19
20drs2amr(DRS,Tags,N,AMR5):-
21 drs2amr(DRS,Tags,[],AMR1,N-_,_Root),
22 pp(AMR1,AMR2),
23 fixRoots(AMR2,AMR3),
24 replace(AMR3,AMR4),
25 addins(AMR4,AMR5), !.
26
27drs2amr(_,_,_,[[]:ins(x,and)]):-
28 warning('unable to build AMR',[]).
29
30
34
35reachable(X,_,R,R):- member(X,R), !.
36reachable(X,AMR,R1,R2):-
37 findall(Y,(member(_:arg(_,X,Y),AMR);member(_:arg(_,Y,X),AMR)),L),
38 reachableL(L,AMR,[X|R1],R2).
39
40reachableL([],_,R,R).
41reachableL([X|L],AMR,R1,R3):-
42 reachable(X,AMR,R1,R2),
43 reachableL(L,AMR,R2,R3).
44
45
49
50countVertices([],C,N):-
51 length(C,N).
52
53countVertices([_:arg(_,X,Y)|L],C1,N):-
54 addV(X,C1,C2), addV(Y,C2,C3),
55 countVertices(L,C3,N).
56
57countVertices([_:ins(X,_)|L],C1,N):-
58 addV(X,C1,C2),
59 countVertices(L,C2,N).
60
61
65
66addV(X,L,L):- member(X,L), !.
67addV(X,L,[X|L]).
68
69
73
74fixRoots(AMR1,AMR2):-
75 getRoots(AMR1,Roots),
77 select(Root,Roots,FixRoots),
78 inverseRoles(FixRoots,AMR1,AMR2),
79 checkInstance(Root,AMR2,[]), !.
80
81fixRoots(AMR1,AMR2):-
82 getRoots(AMR1,[R1,R2]), !, I=[],
83 AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2)|AMR1],
84 warning('cannot inverse roles for AMR with roots ~p and ~p, added artificial root',[R1,R2]).
85
86fixRoots(AMR1,AMR2):-
87 getRoots(AMR1,[R1,R2,R3]), !, I=[],
88 AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2),I:arg(snt3,root,R3)|AMR1],
89 warning('cannot inverse roles for AMR with roots ~p, ~p, and ~p, added artificial root',[R1,R2,R3]).
90
91fixRoots(AMR1,AMR2):-
92 getRoots(AMR1,[R1,R2,R3,R4]), !, I=[],
93 AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2),I:arg(snt3,root,R3),I:arg(snt4,root,R4)|AMR1],
94 warning('cannot inverse roles for AMR with roots ~p, ~p, ~p, and ~p, added artificial root',[R1,R2,R3,R4]).
95
96fixRoots(AMR1,AMR2):-
97 getRoots(AMR1,[]),
98 member(_:ins(X,_),AMR1),
99 AMR2=[[]:ins(root,and),[]:arg(op1,root,X)|AMR1],
100 checkInstance(root,AMR2,[]), !,
101 warning('cyclic AMR, added new root to ~p',[X]).
102
103fixRoots(AMR,AMR):-
104 getRoots(AMR,Roots), !,
105 warning('cannot inverse roles for AMR with roots ~p',[Roots]).
106
107
111
112inverseRoles([],AMR,AMR).
113
114inverseRoles([Root|Roots],AMR1,AMR3):-
115 inverseR(ARG,INV),
116 select(I:arg(ARG,Root,X),AMR1,AMR2),
117 inverseRoles(Roots,[I:arg(INV,X,Root)|AMR2],AMR3).
118
119inverseRoles([Root|Roots],AMR1,AMR4):-
120 inverseR(ARG1,INV1),
121 select(I1:arg(ARG1,Root,X),AMR1,AMR2),
122 inverseR(ARG2,INV2),
123 select(I2:arg(ARG2,X,Y),AMR2,AMR3),
124 inverseRoles(Roots,[I1:arg(INV1,X,Root),I2:arg(INV2,Y,X)|AMR3],AMR4).
125
126
130
131inverseR('ARG0','ARG0-of').
132inverseR('ARG1','ARG1-of').
133inverseR('ARG2','ARG2-of').
134inverseR('op1', 'op1-of').
135inverseR('op2', 'op2-of').
136inverseR('quant', 'quant-of').
137inverseR('domain', 'domain-of').
138inverseR('mod', 'mod-of').
139inverseR('in', 'in-of').
140
141
146
147replace(AMR1,AMR4):-
148 select(replace(Old,New),AMR1,AMR2), !,
149 replace(AMR2,Old,New,AMR3),
150 replace(AMR3,AMR4).
151
152replace(A,A).
153
154
159
160addins(AMR1,AMR2):-
161 member(_:arg(_,X,_),AMR1),
162 \+ member(_:ins(X,_),AMR1), !,
164 addins([[]:ins(X,thing)|AMR1],AMR2).
165
166addins(AMR1,AMR2):-
167 member(I:arg(_,_,X),AMR1),
168 variable(X),
169 \+ member(_:ins(X,_),AMR1), !,
170 warning('added ins/2 thing to AMR for ~p on position ~p',[X,I]),
171 addins([[]:ins(X,thing)|AMR1],AMR2).
172
173addins(A,A).
174
175
179
180variable(X):-
181 \+ member(X,[imperative]),
182 atom(X), name(X,[C|_]),
183 C > 96, C < 123.
184
185
189
190replace(Atom,_,_,Atom):- atomic(Atom), !.
191replace([],_,_,[]):- !.
192replace([Var|L1],Old,New,[Var|L2]):- var(Var), !, replace(L1,Old,New,L2).
193replace([Old|L1],Old,New,[New|L2]):- !, replace(L1,Old,New,L2).
194replace([Term1|L1],Old,New,[Term2|L2]):-
195 Term1 =.. [F|Args1], !, replace(Args1,Old,New,Args2),
196 Term2 =.. [F|Args2], replace(L1,Old,New,L2).
197
198
202
203pp(AMR1,AMR4):-
205 rule(Selects,Members,Adds,Conds),
206 selectall(Selects,AMR1,AMR2),
207 memberall(Members,AMR2), condsall(Conds), !,
208 addall(Adds,AMR2,AMR3),
209 pp(AMR3,AMR4).
210
211pp(AMR,AMR).
212
213
217
218selectall([],A,A).
219selectall([X|L],A1,A3):- select(X,A1,A2), selectall(L,A2,A3).
220
221memberall([],_).
222memberall([not(X)|L],A):- \+ member(X,A), memberall(L,A).
223memberall([X|L],A):- member(X,A), memberall(L,A).
224
225condsall([]).
226condsall([X|L]):- call(X), condsall(L).
227
228addall([],A,A).
229addall([X|L],A1,[X|A2]):- addall(L,A1,A2).
230
231
236
238rule([J:ins(S,more),_:arg(than,S,X),_:arg('ARG1-of',Y,S),I:arg(quant,X,Q)],[],[I:arg(quant,Y,S),J:ins(S,'more-than'),[]:arg('op1',S,Q)],[]).
239rule([J:ins(S,less),_:arg(than,S,X),_:arg('ARG1-of',Y,S),I:arg(quant,X,Q)],[],[I:arg(quant,Y,S),J:ins(S,'less-than'),[]:arg('op1',S,Q)],[]).
240
242rule([I:arg(manner,E,A)],[_:ins(A,also)],[I:arg(mod,E,A)],[]).
243rule([I:arg(manner,E,A),J:ins(A,ful)],[],[I:arg(degree,E,A),J:ins(A,full)],[]).
244
247rule([_:ins(X,such),I:arg(as,X,Y)],[_:ins(X,_)],[I:arg(example,X,Y)],[]).
248
250rule([[I]:ins(X,next)],[_:arg(time,X,Y),_:ins(X,_)],[I:ins(New,next),[]:arg(mod,Y,New)],[name(I,L),name(New,[117|L])]).
251rule([[I]:ins(X,last)],[_:arg(time,X,Y),_:ins(X,_)],[I:ins(New,last),[]:arg(mod,Y,New)],[name(I,L),name(New,[117|L])]).
252rule([_:arg(manner,E,X)],[[I]:ins(X,last),[J]:ins(Y,_),_:arg(time,E,Y)],[[]:arg(mod,Y,X)],[J is I + 1]).
253rule([_:arg(manner,E,X)],[[I]:ins(X,next),[J]:ins(Y,_),_:arg(time,E,Y)],[[]:arg(mod,Y,X)],[J is I + 1]).
254
256rule([I:arg(manner,E,V)],[_:ins(V,very),_:arg(manner,E,M)],[I:arg(degree,M,V)],[]).
257rule([I:arg(manner,E,V)],[_:ins(V,too), _:arg(manner,E,M)],[I:arg(degree,M,V)],[]).
258rule([I:arg(manner,E,V)],[_:ins(V,so), _:arg(manner,E,M)],[I:arg(degree,M,V)],[]).
259rule([I:arg(manner,E,V)],[_:ins(V,very)],[I:arg(degree,E,V)],[]).
260rule([I:arg(manner,E,V)],[_:ins(V,less)],[I:arg(degree,E,V)],[]).
261rule([I:arg(manner,E,V)],[_:ins(V,more)],[I:arg(degree,E,V)],[]).
262rule([I:arg(manner,E,V)],[_:ins(V,most)],[I:arg(degree,E,V)],[]).
263rule([I:arg(mod,E,V)],[_:ins(V,more)],[I:arg(degree,E,V)],[]).
264rule([I:arg(mod,E,V)],[_:ins(V,so)],[I:arg(degree,E,V)],[]).
265rule([I:arg(ord,E,S)],[_:arg(degree,X,M),_:ins(M,most),_:arg(domain,X,E)],[I:arg(ord,M,S)],[]).
266rule([I:arg(manner,X,S)],[_:ins(S,so),_:arg(quant,X,M),_:ins(M,much)],[I:arg(degree,M,S)],[]).
267rule([I:arg(mod,X,S)],[_:ins(S,great),_:arg(quant,X,M),_:ins(M,many)],[I:arg(mod,M,S)],[]).
268
270rule([I:arg(mod,E,V)],[_:ins(V,overseas)],[I:arg(location,E,V)],[]).
271rule([I:arg(mod,E,V)],[_:ins(V,rural)],[I:arg(location,E,V)],[]).
272rule([I:arg(manner,E,V)],[_:ins(V,overseas)],[I:arg(location,E,V)],[]).
273
275rule([I:arg(mod,E,O),J:ins(O,first)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,1)],[]).
276rule([I:arg(mod,E,O),J:ins(O,second)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,2)],[]).
277rule([I:arg(mod,E,O),J:ins(O,third)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,3)],[]).
278rule([I:arg(mod,E,O),J:ins(O,fourth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,4)],[]).
279rule([I:arg(mod,E,O),J:ins(O,fifth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,5)],[]).
280rule([I:arg(mod,E,O),J:ins(O,fifth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,5)],[]).
281rule([I:arg(mod,E,O),J:ins(O,sixth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,6)],[]).
282rule([I:arg(mod,E,O),J:ins(O,seventh)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,7)],[]).
283rule([I:arg(mod,E,O),J:ins(O,eighth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,8)],[]).
284rule([I:arg(mod,E,O),J:ins(O,ninth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,9)],[]).
285rule([I:arg(mod,E,O),J:ins(O,tenth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,10)],[]).
286rule([I:arg(mod,E,O),J:ins(O,X)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,Num)],
287 [name(X,Codes), member(Suffix,["st","nd","rd","th"]), append(Int,Suffix,Codes), name(Num,Int), number(Num)]).
288
290rule([_:arg(manner,E,V),I:ins(V,please)],[],[I:arg(polite,E,'+')],[]).
291rule([I:arg(manner,E,A)],[_:ins(A,always)],[I:arg(time,E,A)],[]).
292rule([I:arg(manner,E,A)],[_:ins(A,now)],[I:arg(time,E,A)],[]).
293rule([I:arg(manner,E,A)],[_:ins(A,once)],[I:arg(time,E,A)],[]).
294rule([I:arg(manner,E,A)],[_:ins(A,after)],[I:arg(time,E,A)],[]).
295rule([I:arg(manner,E,A)],[_:ins(A,before)],[I:arg(time,E,A)],[]).
296rule([I:arg(manner,E,A)],[_:ins(A,since)],[I:arg(time,E,A)],[]).
297rule([I:arg(manner,E,A)],[_:ins(A,soon)],[I:arg(time,E,A)],[]).
298rule([I:arg(manner,E,A)],[_:ins(A,then)],[I:arg(time,E,A)],[]).
299rule([I:arg(manner,E,A)],[_:ins(A,today)],[I:arg(time,E,A)],[]).
300rule([I:arg(manner,E,A)],[_:ins(A,ever)],[I:arg(time,E,A)],[]).
301rule([I:arg(manner,E,A)],[_:ins(A,day)],[I:arg(time,E,A)],[]).
302rule([I:arg(manner,E,A)],[_:ins(A,already)],[I:arg(time,E,A)],[]).
303rule([I:arg(manner,E,A)],[_:ins(A,recent)],[I:arg(time,E,A)],[]).
304rule([I:arg(manner,E,A)],[_:ins(A,sometimes)],[I:arg(frequency,E,A)],[]).
305rule([I:arg(at,E,A)],[_:ins(A,present)],[I:arg(time,E,A)],[]).
306
308rule([I:ins(X,agricultural)],[],[I:ins(X,agriculture)],[]).
309rule([I:ins(X,coastal)],[],[I:ins(X,coast)],[]).
310rule([I:ins(X,commercial)],[],[I:ins(X,commerce)],[]).
311rule([I:ins(X,cultural)],[],[I:ins(X,culture)],[]).
312rule([I:ins(X,drastical)],[],[I:ins(X,drastic)],[]).
313rule([I:ins(X,domestical)],[],[I:ins(X,domestic)],[]).
314rule([I:ins(X,economic)],[],[I:ins(X,economy)],[]).
315rule([I:ins(X,economical)],[],[I:ins(X,economy)],[]).
316rule([I:ins(X,electronical)],[],[I:ins(X,electronics)],[]).
317rule([I:ins(X,electrical)],[],[I:ins(X,electricity)],[]).
318rule([I:ins(X,electromechanical)],[],[I:ins(X,electromechanics)],[]).
319rule([I:ins(X,emphatical)],[],[I:ins(X,emphasis)],[]).
320rule([I:ins(X,environmental)],[],[I:ins(X,environment)],[]).
321rule([I:ins(X,experimental)],[],[I:ins(X,'experiment-01')],[]).
322rule([I:ins(X,financial)],[],[I:ins(X,finance)],[]).
323rule([I:ins(X,'non-financial')],[],[I:ins(X,finance),[]:arg(polarity,X,'-')],[]).
324rule([I:ins(X,governmental)],[],[I:ins(X,government)],[]).
325rule([I:ins(X,historical)],[],[I:ins(X,history)],[]).
326rule([I:ins(X,industrial)],[],[I:ins(X,industry)],[]).
327rule([I:ins(X,mechanical)],[],[I:ins(X,mechanics)],[]).
328rule([I:ins(X,medical)],[],[I:ins(X,medicine)],[]).
329rule([I:ins(X,meeting)],[],[I:ins(X,'meeting-03')],[]).
330rule([I:ins(X,metallurgical)],[],[I:ins(X,metallurgy)],[]).
331rule([I:ins(X,national)],[],[I:ins(X,nation)],[]).
332rule([I:ins(X,natural)],[],[I:ins(X,'natural-03')],[]).
333rule([I:ins(X,orbital)],[],[I:ins(X,'orbit-01')],[]).
334rule([I:ins(X,pharmaceutical)],[],[I:ins(X,pharmacy)],[]).
335rule([I:ins(X,political)],[],[I:ins(X,politics)],[]).
336rule([I:ins(X,provincial)],[],[I:ins(X,province)],[]).
337rule([I:ins(X,regional)],[],[I:ins(X,region)],[]).
338rule([I:ins(X,racial)],[],[I:ins(X,race)],[]).
339rule([I:ins(X,scientifical)],[],[I:ins(X,science)],[]).
340rule([I:ins(X,social)],[],[I:ins(X,society)],[]).
341rule([I:ins(X,statistics)],[],[I:ins(X,statistic)],[]).
342rule([I:ins(X,statistical)],[],[I:ins(X,statistic)],[]).
343rule([I:ins(X,specifical)],[],[I:ins(X,'specific-02')],[]).
344rule([I:ins(X,technical)],[],[I:ins(X,technology)],[]).
345rule([I:ins(X,technological)],[],[I:ins(X,technology)],[]).
346rule([I:ins(X,theoretical)],[],[I:ins(X,theory)],[]).
347rule([I:ins(X,territorial)],[],[I:ins(X,territory)],[]).
348rule([I:ins(X,theatrical)],[],[I:ins(X,theater)],[]).
349rule([I:ins(X,traditional)],[],[I:ins(X,tradition)],[]).
350
351
353rule([[I]:arg(after,X,Y)],[],[I:ins(A,after),[]:arg(time,X,A),[]:arg(op1,A,Y)],[name(I,Codes),append("a",Codes,NewCodes),name(A,NewCodes)]).
354rule([[I]:arg(since,X,Y)],[],[I:ins(A,since),[]:arg(time,X,A),[]:arg(op1,A,Y)],[name(I,Codes),append("s",Codes,NewCodes),name(A,NewCodes)]).
355
357rule([I:arg(without,E,X)],[],[I:arg(manner,E,X),[]:arg(polarity,X,'-')],[]).
358
360rule([I:ins(E,'accord-00'),J:arg(to,E,P)],[],[I:ins(E,'say-01'),J:arg('ARG0',E,P)],[]).
361rule([I:arg(manner,E,N),J:ins(N,never)],[],[I:arg(time,E,N),J:ins(N,ever),[]:arg(polarity,E,'-')],[]).
362rule([I:arg(like,E,N),J:ins(E,'be-00')],[],[I:arg('ARG1',E,N),J:ins(E,'resemble-01')],[]).
363rule([I:arg(in,E,L)],[_:ins(L,'location')],[I:arg(location,E,L)],[]).
364rule([I:arg(rel,E,L)],[_:ins(L,'location')],[I:arg(location,E,L)],[]).
365rule([I:arg(manner,E,L)],[_:ins(L,'here')],[I:arg(location,E,L)],[]).
366rule([I:arg(rel,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).
367rule([I:arg(on,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).
368rule([I:arg(in,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).
369rule([_:arg(time,D,X),_:ins(X,'date-entity'),I:arg(R,X,Y)],[_:ins(D,'date-entity')],[I:arg(R,D,Y)],[]).
370rule([_:arg(poss,D,X),_:ins(X,'date-entity'),I:arg(year,X,Y)],[_:ins(D,'date-entity')],[I:arg(year,D,Y)],[]).
371
373rule([[I]:arg(from,F,X),_:arg(to,F,Y)],[_:ins(X,'date-entity'),_:ins(Y,'date-entity')],[I:arg(time,F,D),[]:ins(D,'date-interval'),[]:arg('op1',D,X),[]:arg('op2',D,Y)],[name(I,Codes),name(D,[110|Codes])]).
374
376rule([I:arg(manner,E,V),_:ins(V,imperative)],[],[I:arg(mode,E,imperative)],[]).
377
379rule([I:arg(manner,E,A)],[[1001]:ins(A,and)],[I:arg('op2-of',E,A)],[]).
380rule([I:arg(manner,E,A),[1001]:ins(A,but)],[],[[1001]:ins(A,'contrast-01'),I:arg('ARG2-of',E,A)],[]).
381
384
385rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5),I6:arg(op6,Y,O6),I7:arg(op7,Y,O7)],[],
386 [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5),I6:arg(op7,X,O6),I7:arg(op8,X,O7)],[]).
387
388rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5),I6:arg(op6,Y,O6)],[],
389 [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5),I6:arg(op7,X,O6)],[]).
390
391rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5)],[],
392 [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5)],[]).
393
394rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4)],[],
395 [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4)],[]).
396
397rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3)],[],
398 [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3)],[]).
399
400rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2)],[],
401 [I1:arg(op2,X,O1),I2:arg(op3,X,O2)],[]).
402
408
410rule([I:arg(op1,X,Y)],[_:ins(X,'contrast-01')],[I:arg('ARG1',X,Y)],[]).
411rule([I:arg(op2,X,Y)],[_:ins(X,'contrast-01')],[I:arg('ARG2',X,Y)],[]).
412rule([I:arg(op1,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt1',X,Y)],[]).
413rule([I:arg(op2,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt2',X,Y)],[]).
414rule([I:arg(op3,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt3',X,Y)],[]).
415rule([I:arg(op4,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt4',X,Y)],[]).
416rule([I:arg(op5,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt5',X,Y)],[]).
417rule([I:arg(op6,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt6',X,Y)],[]).
418rule([I:arg(op7,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt7',X,Y)],[]).
419rule([I:arg(op8,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt8',X,Y)],[]).
420rule([I:arg(op9,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt9',X,Y)],[]).
421rule([I:arg(op10,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt10',X,Y)],[]).
422rule([I:ins(X,continuation)],[],[I:ins(X,'multi-sentence')],[]).
423
425rule([_:ins(X,there),_:arg(domain,_,X)],[],[],[]).
426rule([_:ins(X,it),_:arg(domain,E,X)],[_:arg('ARG1',E,_)],[],[]).
427
429rule([[I8]:arg(name,X,A8),[I8]:ins(A8,name),[I8]:arg('op1',A8,N8),
430 [I7]:arg(name,X,A7),[I7]:ins(A7,name),[I7]:arg('op1',A7,N7),
431 [I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
432 [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
433 [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
434 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
435 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
436 [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
437 [],
438 [[I1,I2,I3,I4,I5,I6,I7,I8]:arg(name,X,A1),
439 [I1,I2,I3,I4,I5,I6,I7,I8]:ins(A1,name),
440 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op1',A1,N1),
441 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op2',A1,N2),
442 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op3',A1,N3),
443 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op4',A1,N4),
444 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op5',A1,N5),
445 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op6',A1,N6),
446 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op7',A1,N7),
447 [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op8',A1,N8)],
448 [I2 is I1+1,
449 I3 is I2+1,
450 I4 is I3+1,
451 I5 is I4+1,
452 I6 is I5+1,
453 I7 is I6+1,
454 I8 is I7+1,warning('put 8 names together',[])]).
455
457rule([[I7]:arg(name,X,A7),[I7]:ins(A7,name),[I7]:arg('op1',A7,N7),
458 [I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
459 [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
460 [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
461 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
462 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
463 [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
464 [],
465 [[I1,I2,I3,I4,I5,I6,I7]:arg(name,X,A1),
466 [I1,I2,I3,I4,I5,I6,I7]:ins(A1,name),
467 [I1,I2,I3,I4,I5,I6,I7]:arg('op1',A1,N1),
468 [I1,I2,I3,I4,I5,I6,I7]:arg('op2',A1,N2),
469 [I1,I2,I3,I4,I5,I6,I7]:arg('op3',A1,N3),
470 [I1,I2,I3,I4,I5,I6,I7]:arg('op4',A1,N4),
471 [I1,I2,I3,I4,I5,I6,I7]:arg('op5',A1,N5),
472 [I1,I2,I3,I4,I5,I6,I7]:arg('op6',A1,N6),
473 [I1,I2,I3,I4,I5,I6,I7]:arg('op7',A1,N7)],
474 [I2 is I1+1,
475 I3 is I2+1,
476 I4 is I3+1,
477 I5 is I4+1,
478 I6 is I5+1,
479 I7 is I6+1]).
480
482rule([[I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
483 [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
484 [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
485 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
486 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
487 [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
488 [],
489 [[I1,I2,I3,I4,I5,I6]:arg(name,X,A1),
490 [I1,I2,I3,I4,I5,I6]:ins(A1,name),
491 [I1,I2,I3,I4,I5,I6]:arg('op1',A1,N1),
492 [I1,I2,I3,I4,I5,I6]:arg('op2',A1,N2),
493 [I1,I2,I3,I4,I5,I6]:arg('op3',A1,N3),
494 [I1,I2,I3,I4,I5,I6]:arg('op4',A1,N4),
495 [I1,I2,I3,I4,I5,I6]:arg('op5',A1,N5),
496 [I1,I2,I3,I4,I5,I6]:arg('op6',A1,N6)],
497 [I2 is I1+1,
498 I3 is I2+1,
499 I4 is I3+1,
500 I5 is I4+1,
501 I6 is I5+1]).
502
504rule([[I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
505 [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
506 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
507 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
508 [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
509 [],
510 [[I1,I2,I3,I4,I5]:arg(name,X,A1),
511 [I1,I2,I3,I4,I5]:ins(A1,name),
512 [I1,I2,I3,I4,I5]:arg('op1',A1,N1),
513 [I1,I2,I3,I4,I5]:arg('op2',A1,N2),
514 [I1,I2,I3,I4,I5]:arg('op3',A1,N3),
515 [I1,I2,I3,I4,I5]:arg('op4',A1,N4),
516 [I1,I2,I3,I4,I5]:arg('op5',A1,N5)],
517 [I2 is I1+1,
518 I3 is I2+1,
519 I4 is I3+1,
520 I5 is I4+1]).
521
523rule([[I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
524 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
525 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
526 [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
527 [],
528 [[I1,I2,I3,I4]:arg(name,X,A1),
529 [I1,I2,I3,I4]:ins(A1,name),
530 [I1,I2,I3,I4]:arg('op1',A1,N1),
531 [I1,I2,I3,I4]:arg('op2',A1,N2),
532 [I1,I2,I3,I4]:arg('op3',A1,N3),
533 [I1,I2,I3,I4]:arg('op4',A1,N4)],
534 [I2 is I1+1,
535 I3 is I2+1,
536 I4 is I3+1]).
537
539rule([[I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1),
540 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
541 [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3)],
542 [],
543 [[I1,I2,I3]:arg(name,X,A1), [I1,I2,I3]:ins(A1,name),
544 [I1,I2,I3]:arg('op1',A1,N1),
545 [I1,I2,I3]:arg('op2',A1,N2),
546 [I1,I2,I3]:arg('op3',A1,N3)],
547 [I2 is I1+1,
548 I3 is I2+1]).
549
551rule([[I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1),
552 [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2)],
553 [],
554 [[I1,I2]:arg(name,X,A1), [I1,I2]:ins(A1,name),
555 [I1,I2]:arg('op1',A1,N1),
556 [I1,I2]:arg('op2',A1,N2)],
557 [I2 is I1+1]).
558
559
561rule([_:arg(timex,T,date(_:_,[I]:Y,[J]:M,[K]:Y))],[],[I:arg(year,M,Y),J:arg(month,T,M),K:arg(day,T,Y)],[]).
562rule([_:arg(timex,T,date(_:_,_:_,[J]:M,[K]:Y))],[],[J:arg(month,T,M),K:arg(day,T,Y)],[]).
563rule([_:arg(timex,T,date(_:_,[I]:Y,[J]:M,_:_))],[],[I:arg(year,T,Y),J:arg(month,T,M)],[]).
564rule([_:arg(timex,T,date(_:_,[I]:Y,_:_,_:_))],[],[I:arg(year,T,Y)],[]).
565rule([_:arg(timex,T,date(_:_,_:_,[J]:M,_:_))],[],[J:arg(month,T,M)],[]).
566rule([_:arg(timex,T,date(_:_,_:_,_:_,[K]:D))],[],[K:arg(day,T,D)],[]).
567
569rule([I:arg(month,X,'01')],[],[I:arg(month,X,1)],[]).
570rule([I:arg(month,X,'02')],[],[I:arg(month,X,2)],[]).
571rule([I:arg(month,X,'03')],[],[I:arg(month,X,3)],[]).
572rule([I:arg(month,X,'04')],[],[I:arg(month,X,4)],[]).
573rule([I:arg(month,X,'05')],[],[I:arg(month,X,5)],[]).
574rule([I:arg(month,X,'06')],[],[I:arg(month,X,6)],[]).
575rule([I:arg(month,X,'07')],[],[I:arg(month,X,7)],[]).
576rule([I:arg(month,X,'08')],[],[I:arg(month,X,8)],[]).
577rule([I:arg(month,X,'09')],[],[I:arg(month,X,9)],[]).
578rule([I:arg(day,X,'01')],[],[I:arg(day,X,1)],[]).
579rule([I:arg(day,X,'02')],[],[I:arg(day,X,2)],[]).
580rule([I:arg(day,X,'03')],[],[I:arg(day,X,3)],[]).
581rule([I:arg(day,X,'04')],[],[I:arg(day,X,4)],[]).
582rule([I:arg(day,X,'05')],[],[I:arg(day,X,5)],[]).
583rule([I:arg(day,X,'06')],[],[I:arg(day,X,6)],[]).
584rule([I:arg(day,X,'07')],[],[I:arg(day,X,7)],[]).
585rule([I:arg(day,X,'08')],[],[I:arg(day,X,8)],[]).
586rule([I:arg(day,X,'09')],[],[I:arg(day,X,9)],[]).
587
588
590rule([_:ins(X,':')],[_:ins(X,_)],[],[]). 591rule([_:ins(X,namenam)],[_:ins(X,_)],[],[]). 592rule([_:ins(X,nameper)],[_:ins(X,_)],[],[]). 593rule([_:ins(X,namegeo)],[_:ins(X,_)],[],[]). 594rule([_:ins(X,nameorg)],[_:ins(X,_)],[],[]). 595rule([_:ins(X,nameart)],[_:ins(X,_)],[],[]). 596rule([_:ins(X,nameeve)],[_:ins(X,_)],[],[]). 597rule([_:ins(X,nametim)],[_:ins(X,_)],[],[]). 598rule([_:ins(X,manner)],[_:ins(X,_)],[],[]). 599rule([_:ins(X,thing)],[_:ins(X,_)],[],[]). 600rule([_:ins(X,Same)],[_:ins(X,Same)],[],[]). 601rule([_:ins(X,Y)],[_:ins(X,_)],[],[warning('removed instance: ~p attached to ~p',[Y,X])]).
602rule([_:arg(wiki,X,'-')],[_:arg(wiki,X,'-')],[],[]).
603
605rule([[I]:ins(X,inch)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,inch),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
606rule([[I]:ins(X,foot)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,foot),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
607rule([[I]:ins(X,yard)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,yard),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
608rule([[I]:ins(X,mile)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,mile),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
609rule([[I]:ins(X,leaque)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,leaque),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
610rule([[I]:ins(X,metre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
611rule([[I]:ins(X,meter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
612rule([[I]:ins(X,m)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
613rule([[I]:ins(X,nanometre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,nanometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
614rule([[I]:ins(X,nanometer)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,nanometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
615rule([[I]:ins(X,millimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
616rule([[I]:ins(X,millimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
617rule([[I]:ins(X,mm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
618rule([[I]:ins(X,centimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
619rule([[I]:ins(X,centimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
620rule([[I]:ins(X,cm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
621rule([[I]:ins(X,decimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
622rule([[I]:ins(X,decimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
623rule([[I]:ins(X,dm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
624rule([[I]:ins(X,kilometer)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
625rule([[I]:ins(X,kilometre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
626rule([[I]:ins(X,km)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
627
629rule([[I]:ins(X,franc)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,franc),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
630rule([[I]:ins(X,mark)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,mark),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
631rule([[I]:ins(X,ruble)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,ruble),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
632rule([[I]:ins(X,rupee)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,rupee),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
633rule([[I]:ins(X,yen)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,yen),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
634rule([[I]:ins(X,cent)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,cent),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
635rule([[I]:ins(X,euro)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,euro),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
636rule([[I]:ins(X,pound)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,pound),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
637rule([[I]:ins(X,yuan)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,yuan),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
638rule([[I]:ins(X,dollar)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,dollar),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
639
641rule([[I]:ins(X,millenium)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,millenium),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
642rule([[I]:ins(X,century)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,century),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
643rule([[I]:ins(X,decade)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,decade),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
644rule([[I]:ins(X,year)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,year),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
645rule([[I]:ins(X,month)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,month),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
646rule([[I]:ins(X,week)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,week),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
647rule([[I]:ins(X,day)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,day),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
648rule([[I]:ins(X,night)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,night),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
649rule([[I]:ins(X,minute)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,minute),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
650rule([[I]:ins(X,second)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,second),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
651rule([[I]:ins(X,hour)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,hour),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
652
654rule([[I]:ins(X,kilogram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,kilogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
655rule([[I]:ins(X,kg)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,kilogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
656rule([[I]:ins(X,milligram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,milligram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
657rule([[I]:ins(X,mg)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,milligram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
658rule([[I]:ins(X,picogram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,picogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
659rule([[I]:ins(X,gram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,gram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
660rule([[I]:ins(X,ton)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,ton),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
661rule([[I]:ins(X,tonne)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,tonne),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
662rule([[I]:ins(X,pound)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,pound),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
663rule([[I]:ins(X,ounce)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,ounce),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
664
666rule([[I]:ins(X,gallon)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,gallon),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
667rule([[I]:ins(X,barrel)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,barrel),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
668rule([[I]:ins(X,bottle)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,bottle),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
669rule([[I]:ins(X,cup)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,cup),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
670rule([[I]:ins(X,'cubic-meter')],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,'cubic-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
671rule([[I]:ins(X,litre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,liter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
672rule([[I]:ins(X,millilitre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
673rule([[I]:ins(X,milliliter)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
674rule([[I]:ins(X,ml)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
675rule([[I]:ins(X,centilitre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
676rule([[I]:ins(X,centiliter)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
677rule([[I]:ins(X,cl)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
678
680rule([[I]:ins(X,hectare)],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,hectare),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
681rule([[I]:ins(X,acre)],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,acre),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
682rule([[I]:ins(X,'square-metre')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
683rule([[I]:ins(X,'square-meter')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
684rule([[I]:ins(X,'square-kilometre')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-kilometer'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
685rule([[I]:ins(X,'square-kilometer')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-kilometer'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
686rule([[I]:ins(X,'square-foot')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-foot'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
687
688
690rule([I:ins(X,percent),J:arg(quant,X,Y)],[],[I:ins(X,'percentage-entity'),J:arg(value,X,Y)],[]).
691
693rule([[I]:arg(name,M,N),J:arg(wiki,M,'-')],[_:ins(N,name),_:arg(op1,N,'"us"'),_:ins(M,'monetary-quantity'),_:arg(unit,M,U),_:ins(U,dollar)],
694 [[]:arg(mod,U,C),[]:ins(C,country),I:arg(name,C,N),J:arg(wiki,C,'"United_States"')],[name(I,Codes),name(C,[112|Codes])]).
695
697rule([I:ins(C,location)],[_:arg(name,C,N),_:ins(N,name),_:arg(op1,N,Name)],[I:ins(C,Type)],[nationality(_,_,Country,_,Type),addQuotes(Country,Name)]).
698rule([I:arg(wiki,X,'-')],[_:ins(X,Type),_:arg(name,X,N),_:ins(N,name),_:arg(op1,N,Name)],[I:arg(wiki,X,W)],[nationality(_,_,Country,Wiki,Type),addQuotes(Country,Name),addQuotes(Wiki,W)]).
699
701rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(op5,N,Name5),_:arg(op6,N,Name6),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4,Name5,Name6]),\+ Type=Old, warning('added 6 wiki ~p ~p',[Type,Wiki])]).
702rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(op5,N,Name5),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4,Name5]),\+ Type=Old, warning('added 5 wiki ~p ~p',[Type,Wiki])]).
703rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4]),\+ Type=Old, warning('added 4 wiki ~p ~p',[Type,Wiki])]).
704rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(name,X,N),not(_:arg(op4,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3]),\+ Type=Old, warning('added 3 wiki ~p ~p',[Type,Wiki])]).
705rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(name,X,N),not(_:arg(op3,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2]),\+ Type=Old]).
706rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name),_:arg(name,X,N),not(_:arg(op2,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name]),\+ Type=Old]).
707
709rule([I:arg('ARG1',E,X),J:ins(E,necessary)],[],[I:arg('ARG2',E,X),J:ins(E,'obligate-01')],[]).
710rule([I:arg('ARG1',E,X),J:ins(E,obligatory)],[],[I:arg('ARG2',E,X),J:ins(E,'obligate-01')],[]).
711rule([J:ins(E,permissible)],[_:arg('ARG1',E,_)],[J:ins(E,'permit-01')],[]).
712rule([J:ins(E,possible)],[_:arg('ARG1',E,_)],[J:ins(E,'possible-01')],[]).
713rule([J:ins(E,impossible)],[_:arg('ARG1',E,_)],[J:ins(E,'possible-01'),[]:arg('polarity',E,'-')],[]).
714rule([J:ins(E,likely)],[_:arg('ARG1',E,_)],[J:ins(E,'likely-01')],[]).
715
717rule([[I]:ins(X,Old)],[],[[I]:ins(X,New),[]:arg(Rel1,X,Y),[]:ins(Y,Ins1),[]:arg(Rel2,Y,Z),[]:ins(Z,Ins2)],[verbalize(Old,New,Rel1,Ins1,Rel2,Ins2),name(I,L),name(Y,[118|L]),name(Z,[119|L])]).
718rule([[I]:ins(X,Old)],[],[[I]:ins(X,New),[]:arg(Rel,X,Y),[]:ins(Y,Ins)],[verbalize(Old,New,Rel,Ins),name(I,L),name(Y,[118|L])]).
719rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[verbalize(Old,New,'polarity-')]).
720rule([I:ins(X,Old)],[],[I:ins(X,New)],[verbalize(Old,New)]).
721
723rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[negprefix(_,Old,_,New),warning('added prefix ~p',[Old])]).
724rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[negsuffix(_,Old,_,New),warning('added suffix ~p',[Old])]).
725rule([[I]:ins(X,A)],[],[[I]:ins(X,Type),[]:arg(name,X,N),[]:ins(N,name),[]:arg(op1,N,Q),[]:arg(wiki,X,W)],[nationality(A,a,C,D,Type),name(I,L),name(N,[112|L]),addQuotes(C,Q),addQuotes(D,W)]).
726
728rule([I:arg(of,X,Y)],[],[I:arg(poss,X,Y)],[]).
729rule([I:ins(X,begin)],[],[I:ins(X,'begin-01')],[]).
730rule([I:ins(X,end)],[],[I:ins(X,'end-01')],[]).
731rule([I:ins(X,'etc.')],[],[I:ins(X,'et-cetera')],[]).
732rule([I:ins(X,'etc')],[],[I:ins(X,'et-cetera')],[]).
733rule([I:ins(X,'(')],[],[I:ins(X,lrb)],[]).
734rule([I:ins(X,')')],[],[I:ins(X,rrb)],[]).
735rule([I:ins(X,':')],[],[I:ins(X,and)],[]).
736rule([I:ins(X,';')],[],[I:ins(X,and)],[]).
737rule([I:ins(X,',')],[],[I:ins(X,and)],[]).
738rule([I:ins(X,'/')],[],[I:ins(X,slash)],[]).
739rule([I:ins(X,'/-01')],[],[I:ins(X,slash)],[]).
740rule([I:ins(X,namenam)],[],[I:ins(X,thing)],[]).
741rule([I:ins(X,nameper)],[],[I:ins(X,person)],[]).
742rule([I:ins(X,namegeo)],[],[I:ins(X,location)],[]).
743rule([I:ins(X,nameart)],[],[I:ins(X,product)],[]).
744rule([I:ins(X,nameeve)],[],[I:ins(X,event)],[]).
745rule([I:ins(X,nameorg)],[],[I:ins(X,organization)],[]).
746rule([I:ins(X,nametim)],[],[I:ins(X,time)],[]).
747rule([I:arg(':',X,Y)],[],[I:arg(mod,X,Y)],[]).
748rule([I:arg('-',X,Y)],[],[I:arg(mod,X,Y)],[]).
749rule([I:arg('--',X,Y)],[],[I:arg(mod,X,Y)],[]).
750rule([I:ins(X,Old)],[],[I:ins(X,New)],[mfs(Old,New)]).
751rule([I:ins(X,Old)],[],[I:ins(X,New)],[name(Old,Codes),append(Prefix,"-00",Codes),append(Prefix,"-01",NewCodes),name(New,NewCodes)]).
752
754rule([[I]:ins(X,Role),J:arg(poss,X,Y)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),J:arg('ARG1',E,Y),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
755rule([[I]:ins(X,Role),J:arg(for,X,Y)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),J:arg('ARG1',E,Y),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
756rule([[I]:ins(X,Role)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
757
760rule([_:arg(rel,X,E),I:arg(example,S,X)],[[J]:ins(E,'et-cetera')],[I:arg(example,S,New),[]:ins(New,and),[]:arg(op1,New,X),[]:arg(op2,New,E)],[name(J,L),name(New,[97|L])]).
761
764
765
766
770
771drs2amr(alfa(_,B1,B2),P,T1,T2,N,H):- !,
772 drs2amr(merge(B1,B2),P,T1,T2,N,H).
773
774drs2amr(_:drs(_,Conds),P,T1,T3,N,H):- !,
775 conds2amr(Conds,P,[],T2,N,[],H),
776 append(T1,T2,T3).
777
778drs2amr(merge(B1,B2),P,T1,T3,N1-N3,H2):- !,
779 drs2amr(B1,P,T1,T2,N1-N2,_),
780 drs2amr(B2,P,T2,T3,N2-N3,H2).
781
782drs2amr(sdrs([],Rel),P,T1,T2,N,Root):- !,
783 conds2amr(Rel,P,T1,T2,N,[],Root).
784
785drs2amr(sdrs([D|L],R),P,T1,T3,N1-N3,H):- !,
786 drs2amr(D,P,T1,T2,N1-N2,_),
787 drs2amr(sdrs(L,R),P,T2,T3,N2-N3,H).
788
789drs2amr(lab(K,B),P,T1,T4,N1-N2,K):- !,
790 drs2amr(B,P,[],T2,N1-N2,H),
791 replace([replace(H,K)|T2],T3),
792 append(T1,T3,T4).
793
794drs2amr(sub(B1,B2),P,T1,T3,N1-N3,H):-
795 drs2amr(B1,P,T1,T2,N1-N2,H),
796 drs2amr(B2,P,T2,T3,N2-N3,_).
797
798
802
803conds2amr([],_,T1,T3,N-N,Heads,Root):-
804 getRoots(T1,Roots),
807 determineRoot(T1,T3,Roots,Heads,Root), !.
808
809conds2amr([],_,T,T,N-N,Heads,Root):-
810 pickHead(Heads,Root), !,
811 warning('cannot determine head: ~p',[T]).
812
813conds2amr([_:Cond|L],P,T1,T3,N1-N3,Heads,Head):-
814 cond2amr(Cond,P,T1,T2,N1-N2,E),
815 conds2amr(L,P,T2,T3,N2-N3,[E|Heads],Head).
816
817
821
822determineRoot(AMR,AMR,[Root],_,Root):- 823 checkInstance(Root,AMR,[]), !. 824
825determineRoot(AMR,AMR,[Root],_,Root):- 826 warning('proposed root ~p not covering all vertices',[Root]), !.
827
828determineRoot(AMR1,AMR2,Roots,_Heads,Root):-
829 connected(AMR1), !,
830 select(Root,Roots,FixRoots),
832 inverseRoles(FixRoots,AMR1,AMR2),
834 checkInstance(Root,AMR2,[]), !.
835
836determineRoot(AMR,AMR,[Root|_],_Heads,Root):-
837 connected(AMR), !,
838 warning('connected but unable to inverse roles',[]).
839
840determineRoot(AMR1,AMR2,Roots,Heads,Root):-
841 Roots=[R1,R2], !,
842 (member(_:[Num]:_,Heads),!;Num=1),
843 name(Num,Codes), append("root",Codes,RootCodes), name(Root,RootCodes),
844 warning('fixed multiple roots: ~p with new root ~p',[Roots,Root]),
845 AMR2=[[]:ins(Root,'multi-sentence'),[]:arg(snt1,Root,R1),[]:arg(snt2,Root,R2)|AMR1].
846
847determineRoot(AMR1,AMR2,Roots,Heads,Root):-
848 Roots=[R1,R2,R3], !,
849 (member(_:[Num]:_,Heads),!;Num=1),
850 name(Num,Codes), append("root",Codes,RootCodes), name(Root,RootCodes),
851 warning('fixed multiple roots: ~p',[Roots]),
852 AMR2=[[]:ins(Root,'multi-sentence'),[]:arg(snt1,Root,R1),[]:arg(snt2,Root,R2),[]:arg(snt3,Root,R3)|AMR1].
853
854determineRoot(AMR,AMR,Roots,_,Root):-
855 Roots=[Root|_], !,
856 warning('unable to fix multiple roots: ~p',[Roots]).
857
858
862
863connected(AMR):-
864 countVertices(AMR,[],N),
865 member(_:ins(X,_),AMR),
866 reachable(X,AMR,[],Reachable),
867 length(Reachable,N), !.
868
871
872
876
877pickHead(Heads,Event):- member(closing:_:Event,Heads), !.
878pickHead(Heads,Event):- member(event:[_]:Event,Heads), !.
879pickHead(Heads,Event):- member(noun:[_]:Event,Heads), !.
880pickHead(Heads,Event):- member(named:[_]:Event,Heads), !.
881pickHead([_:[_]:Head|_],Head):- !.
882pickHead([_:_:Head|_],Head):- !.
883pickHead(_,_).
884
885
889
890cond2amr(I:nec(Drs),P,T1,[I:ins(E1,'recommend-01'),I:arg('ARG1',E1,E2)|T2],N1-N3,complex:I:E1):-
891 I=[Index], member(Index:F,P), member(tok:should,F), !,
892 label(N1,e,E1,N2),
893 drs2amr(Drs,P,T1,T2,N2-N3,E2).
894
895cond2amr(I:nec(Drs),P,T1,[I:ins(E1,'obligate-01'),I:arg('ARG2',E1,E2)|T2],N1-N3,complex:I:E1):- !,
896 label(N1,e,E1,N2),
897 drs2amr(Drs,P,T1,T2,N2-N3,E2).
898
899cond2amr(I:pos(Drs),P,T1,[I:ins(E1,'possible-01'),I:arg('ARG1',E1,E2)|T2],N1-N3,complex:I:E1):- !,
900 label(N1,e,E1,N2),
901 drs2amr(Drs,P,T1,T2,N2-N3,E2).
902
903cond2amr(I:not(Drs),P,T1,[I:arg(polarity,E,'-')|T2],N1-N2,complex:I:E):- !,
904 drs2amr(Drs,P,T1,T2,N1-N2,E).
905
906cond2amr(I:prop(E,Drs),P,T1,T4,N,complex:I:E):- !,
907 drs2amr(Drs,P,[],T2,N,H),
908 append(T1,T2,T3),
909 replace([replace(H,E)|T3],T4).
910
911cond2amr(I:or(Drs1,Drs2),P,T1,[I:ins(E,or),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
912 label(N1,e,E,N2),
913 drs2amr(Drs1,P,T1,T2,N2-N3,H1),
914 drs2amr(Drs2,P,T2,T3,N3-N4,H2).
915
916cond2amr(I:imp(Drs1,Drs2),P,T1,[I:ins(E,condition),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
917 label(N1,e,E,N2),
918 drs2amr(Drs1,P,T1,T2,N2-N3,H1),
919 drs2amr(Drs2,P,T2,T3,N3-N4,H2).
920
921cond2amr(I:whq(Drs1,Drs2),P,T1,[I:ins(E,question),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
922 label(N1,e,E,N2),
923 drs2amr(Drs1,P,T1,T2,N2-N3,H1),
924 drs2amr(Drs2,P,T2,T3,N3-N4,H2).
925
926cond2amr(I:duplex(_,Drs1,_,Drs2),P,T1,[I:ins(E,duplex),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
927 label(N1,e,E,N2),
928 drs2amr(Drs1,P,T1,T2,N2-N3,H1),
929 drs2amr(Drs2,P,T2,T3,N3-N4,H2).
930
931cond2amr(I:timex(X,Date),_,T,[I:ins(X,'date-entity'),I:arg(timex,X,Date)|T],N1-N2,timex:I:E):- !, label(N1,e,E,N2).
932
933cond2amr(I:named(X,S1,Sort,_),_,T,[I:ins(X,Sym),I:arg(name,X,N),I:ins(N,name),I:arg(op1,N,S2),I:arg(wiki,X,'-')|T],N1-N2,named:I:N):- !,
934 addQuotes(S1,S2), label(N1,n,N,N2), name(Sort,Codes), append("name",Codes,SymCodes), name(Sym,SymCodes).
935
936cond2amr(I:card(X,C,_),_,T,[I:arg(quant,X,C)|T],N-N,card:I:X):- !.
937
938cond2amr(I:eq(X,Y),_,T,[I:ins(E,'equal-01'),I:arg('ARG1',E,X),I:arg('ARG2',E,Y)|T],N1-N2,equal:I:E):- !, label(N1,e,E,N2).
939
940cond2amr(I:pred(X,S1,n,_),_,T,[I:ins(X,S2)|T],N-N,noun:I:X):-
941 name(S1,Codes), member(47,Codes), !, addQuotes(S1,S2).
942
943cond2amr(I:pred(X,closing,v,99),_,T,T,N-N,closing:I:X):- !.
944cond2amr(I:pred(X,interrogative,r,1),_,T,[I:arg(mode,X,'interrogative')|T],N-N,mod:I:X):- !.
945cond2amr(I:pred(X,S,r,2),_,T,[I:ins(E,S),I:arg(mod,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
946cond2amr(I:pred(X,S,r,_),_,T,[I:ins(E,S),I:arg(manner,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
947cond2amr(I:pred(X,amount,n,3),_,T,[I:ins(E,much),I:arg(quant,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
948cond2amr(I:pred(X,quantity,n,1),_,T,[I:ins(E,many),I:arg(quant,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
949cond2amr(I:pred(X,S,n,_),_,T,[I:ins(X,S)|T],N-N,noun:I:X):- !.
950cond2amr(I:pred(E,S1,v,_),_,T,[I:ins(E,S2)|T],N-N,event:I:E):- !, atom_concat(S1,'-00',S2).
951cond2amr(I:pred(E,S,a,_),_,T,[I:ins(E,S)|T],N-N,mod:I:E):- !.
952
955cond2amr(I:rel(X,Y,of,1),_,T,[I:arg(poss,X,Y)|T],N-N,rel:I:X):- !.
956cond2amr(I:rel(X,Y,'Holder',_),_,T,[I:arg(domain,X,Y)|T],N-N,rel:I:Y):- !.
957cond2amr(I:rel(X,Y,'Actor',_),_,T,[I:arg('ARG0',X,Y)|T],N-N,rel:I:X):- !.
958cond2amr(I:rel(X,Y,'Theme',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
959cond2amr(I:rel(X,Y,'Holder',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
960cond2amr(I:rel(X,Y,'Topic',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
961cond2amr(I:rel(X,Y,'Recipient',_),_,T,[I:arg('ARG2',X,Y)|T],N-N,rel:I:X):- !.
962cond2amr(I:rel(X,Y,P,_),_,T,[I:arg(P,X,Y)|T],N-N,rel:I:X):- !.
963
964cond2amr(I:role(X,Y,'Holder', 1),_,T,[I:arg('domain',X,Y)|T],N-N,rel:I:X):- !.
965cond2amr(I:role(X,Y,'Actor', 1),_,T,[I:arg('ARG0',X,Y)|T],N-N,rel:I:X):- !.
966cond2amr(I:role(X,Y,'Theme', 1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
967cond2amr(I:role(X,Y,'Pivot', 1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
968cond2amr(I:role(X,Y,'Topic', 1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
969cond2amr(I:role(X,Y,'Recipient', 1),_,T,[I:arg('ARG2',X,Y)|T],N-N,rel:I:X):- !.
970cond2amr(I:role(X,Y,'Time', 1),_,T,[I:arg('time',X,Y)|T],N-N,rel:I:X):- !.
971cond2amr(I:role(X,Y,'Location', 1),_,T,[I:arg('location',X,Y)|T],N-N,rel:I:X):- !.
972cond2amr(I:role(X,Y,'Manner', 1),_,T,[I:arg('manner',X,Y)|T],N-N,rel:I:X):- !.
973cond2amr(I:role(X,Y,'Pivot', -1),_,T,[I:arg('domain-of',X,Y)|T],N-N,rel:I:X):- !.
974cond2amr(I:role(X,Y,'Holder', -1),_,T,[I:arg('domain-of',X,Y)|T],N-N,rel:I:X):- !.
975cond2amr(I:role(X,Y,'Actor', -1),_,T,[I:arg('ARG0-of',X,Y)|T],N-N,rel:I:X):- !.
976cond2amr(I:role(X,Y,'Theme', -1),_,T,[I:arg('ARG1-of',X,Y)|T],N-N,rel:I:X):- !.
977cond2amr(I:role(X,Y,'Topic', -1),_,T,[I:arg('ARG1-of',X,Y)|T],N-N,rel:I:X):- !.
978cond2amr(I:role(X,Y,'Recipient',-1),_,T,[I:arg('ARG2-of',X,Y)|T],N-N,rel:I:X):- !.
979cond2amr(I:role(X,Y,'Time', -1),_,T,[I:arg('time-of',X,Y)|T],N-N,rel:I:X):- !.
982
983cond2amr(I:X,_,T,T,N-N,unknown:I:_):- warning('cond2amr/3 failed for ~p',[X]).
984
985cond2amr(rel(X,Y,P),_,T,[[]:ins(E,P),[]:arg('op1',E,X),[]:arg('op2',E,Y)|T],N1-N2,rel:[]:E):- !, label(N1,e,E,N2).
986
987
991
992addQuotes(Name,QuotedName):-
993 name(Name,NameCodes),
994 append([34|NameCodes],[34],QuotedCodes),
995 name(QuotedName,QuotedCodes).
996
997
1001
1002getRoot(AMR,E):-
1003 member(_:ins(E,_),AMR),
1004 \+ member(_:arg(_,_,E),AMR).
1005
1006getRoot(AMR,E):-
1007 member(_:arg(_,E,_),AMR),
1008 \+ member(_:ins(E,_), AMR),
1009 \+ member(_:arg(_,_,E),AMR).
1010
1011getRoots(AMR,Roots):-
1012 findall(H,getRoot(AMR,H),Hs),
1013 sort(Hs,Roots).
1014
1015
1019
1020checkInstance(E,AMR1,AMR3):- select(_:ins(E,_),AMR1,AMR2), !, checkInstance(E,AMR2,AMR3).
1021checkInstance(E,AMR1,AMR2):- checkArgs(E,AMR1,AMR2).
1022
1023checkArgs(E,AMR1,AMR4):- select(_:arg(_,E,X),AMR1,AMR2), !, checkInstance(X,AMR2,AMR3), checkArgs(E,AMR3,AMR4).
1024checkArgs(_,AMR,AMR).
1025
1026
1030
1031printAMR(AMR0,Stream):-
1032 sort(AMR0,AMR1),
1033 getRoot(AMR1,Head), !,
1034 printInstance(Head,AMR1,AMR2,5,Stream),
1035 nl(Stream),
1036 ( AMR2=[]; AMR2\=[], warning('parts of AMR not printed: ~p',[AMR2]) ).
1037
1038printAMR(_,Stream):-
1039 warning('cannot print AMR',[]),
1040 BackupAMR=[[]:ins(x,and)],
1041 printAMR(BackupAMR,Stream).
1042
1043
1047
1048printInstance(E,AMR1,AMR4,Level,Stream):-
1049 select(_:ins(E,S),AMR1,AMR2), !,
1050 format(Stream,'(~p / ~p',[E,S]),
1051 sortArgs(AMR2,E,AMR3),
1052 printArgs(E,AMR3,AMR4,Level,Stream).
1053
1054printInstance(E,AMR1,AMR2,_Level,Stream):-
1055 format(Stream,'~p',[E]),
1056 AMR1=AMR2.
1057
1058
1062
1063sortArgs(AMR1,E,[I:arg(wiki,E,X)|AMR3]):-
1064 select(I:arg(wiki,E,X),AMR1,AMR2), !,
1065 sortArgs(AMR2,E,AMR3).
1066
1067sortArgs(AMR1,E,[I:arg(name,E,X)|AMR3]):-
1068 select(I:arg(name,E,X),AMR1,AMR2), !,
1069 sortArgs(AMR2,E,AMR3).
1070
1071sortArgs(A,_,A).
1072
1073
1077
1078printArgs(E,AMR1,AMR4,Level,Stream):-
1079 select(_:arg(S,E,X),AMR1,AMR2), !,
1080 nl(Stream), tab(Stream,Level),
1081 format(Stream,':~p ',[S]),
1082 NewLevel is Level + 5,
1083 printInstance(X,AMR2,AMR3,NewLevel,Stream),
1084 printArgs(E,AMR3,AMR4,Level,Stream).
1085
1086printArgs(_,AMR,AMR,_,Stream):-
1087 write(Stream,')')