2:- module(ccg2drs,[ccg2drs/2,base/4,gen/4]). 3
4:- use_module(library(lists),[member/2,select/3,append/3]). 5
6:- use_module(boxer(slashes)). 7:- use_module(boxer(betaConversionDRT),[betaConvert/2]). 8:- use_module(boxer(resolveDRT),[resolveDRS/2]). 10:- use_module(boxer(transform),[preprocess/6,topcat/2,topatt/2,topsem/2,topstr/2]). 11:- use_module(boxer(relation),[resolve_relations/2]). 12:- use_module(boxer(closure),[closure/3]). 13:- use_module(boxer(lexicon),[semlex/5]). 14:- use_module(boxer(coordination),[coordMacro/2,argCard/2]). 15:- use_module(boxer(typechange),[typechange/5]). 16:- use_module(boxer(evaluation),[incCompleted/0,incAttempted/0]). 17:- use_module(boxer(input),[preferred/2]). 18:- use_module(boxer(sdrt),[mergeSDRS/2]). 19:- use_module(boxer(drs2fdrs),[instDrs/1,instDrs/2]). 20:- use_module(boxer(tuples),[tuples/4]). 21:- use_module(boxer(categories),[att/3]). 22
23:- use_module(semlib(drs2tacitus),[drs2tac/4]). 24:- use_module(semlib(drs2amr),[drs2amr/4]). 25:- use_module(semlib(pdrs2drs),[pdrs2drs/2]). 26:- use_module(semlib(drs2fol),[drs2fol/2]). 27:- use_module(semlib(options),[option/2]). 28:- use_module(semlib(errors),[error/2,warning/2]). 29
30
31
35
36ccg2drs(L,Ders):-
37 option('--semantics',der), !,
38 ccg2ders(L,Ders,1).
39
40ccg2drs([CCG|L],XDRS):-
41 build(CCG,DRS,Tags,1,Index), !,
42 incAttempted, incCompleted,
43 ccg2drss(L,Tags,DRS,XDRS,Index).
44
45ccg2drs([CCG|L],XDRS):-
46 incAttempted,
47 noanalysis(CCG),
48 ccg2drs(L,XDRS).
49
50
54
([],Tags-[],PDRS,xdrs(Tags,Sem),_):-
56 resolveDRS(PDRS,Tags-[]), !,
57 semantics(PDRS,Tags,Sem).
58
59ccg2drss([CCG|L],Tags1-Tags2,PrevDRS,XDRS,Index):-
60 build(CCG,DRS,Tags2-Tags3,Index,NewIndex),
61 insertDRS(PrevDRS,DRS,NewDRS), !,
62 incAttempted, incCompleted,
63 ccg2drss(L,Tags1-Tags3,NewDRS,XDRS,NewIndex).
64
65ccg2drss([CCG|L],Tags,PDRS,XDRS,Index):-
66 incAttempted,
67 noanalysis(CCG),
68 ccg2drss(L,Tags,PDRS,XDRS,Index).
69
70
74
75ccg2ders([],[],_):- !.
76
77ccg2ders([C|L],[Der|Ders],Index):-
78 ccg2der(C,Der,Index,NewIndex), !,
79 incAttempted,
80 incCompleted,
81 ccg2ders(L,Ders,NewIndex).
82
83ccg2ders([C|L],Ders,Index):-
84 incAttempted,
85 noanalysis(C),
86 ccg2ders(L,Ders,Index).
87
88
92
93ccg2der(N,der(N,Der),Start,End):-
94 preferred(N,CCG0),
95 preprocess(N,CCG0,CCG1,_Tags,Start,End),
96 resolve_relations(CCG1,CCG2),
97 interpretDer(CCG2,Der).
98
99interpretDer(CCG,Copy):-
100 interpret(CCG,Der),
101 copy_term(Der,Copy), !.
102
103interpretDer(CCG,CCG).
104
105
109
110insertDRS(merge(B1,B2),New,Merge):-
111 option('--theory',drt), !,
112 insertDRS(B2,New,B3),
113 Merge = merge(B1,B3).
114
115insertDRS(Old,New,Merge):-
116 option('--theory',drt), !,
117 Merge = merge(Old,New).
118
119insertDRS(Old,New,SDRS):-
120 option('--theory',sdrt), !,
121 Rel = continuation,
123 mergeSDRS(smerge(Old,New,Rel,[]),SDRS).
124
125
129
130build(N,UDRS,Tags,Start,End):-
131 preferred(N,CCG0),
132 preprocess(N,CCG0,CCG1,Tags,Start,End),
133 resolve_relations(CCG1,CCG2),
134 interpret(CCG2,Der),
135 topsem(Der,Sem),
136 topcat(Der,Cat),
138 closure(Cat,Sem,Closed),
139 betaConvert(Closed,UDRS), !.
140
141
145
146noanalysis(N):-
147 preferred(N,_), !,
148 warning('no semantics for sentence ~p',[N]).
149
150noanalysis(N):-
151 warning('no syntax for sentence ~p',[N]).
152
153
157
158addEquivClass(I,X,E1-E3):-
159 select(X:C1,E1,E2), !,
160 append(I,C1,C2),
161 E3 = [X:C2|E2].
162
163addEquivClass(I,X,E1-E2):-
164 E2 = [X:I|E1].
165
166
170
171equivalenceClasses(sdrs([],_),E-E):- !.
172
173equivalenceClasses(sdrs([B|L],C),E1-E3):- !,
174 equivalenceClasses(B,E1-E2),
175 equivalenceClasses(sdrs(L,C),E2-E3).
176
177equivalenceClasses(merge(B1,B2),E1-E3):- !,
178 equivalenceClasses(B1,E1-E2),
179 equivalenceClasses(B2,E2-E3).
180
181equivalenceClasses(lab(_,B),E1-E2):- !,
182 equivalenceClasses(B,E1-E2).
183
184equivalenceClasses(sub(B1,B2),E1-E3):- !,
185 equivalenceClasses(B1,E1-E2),
186 equivalenceClasses(B2,E2-E3).
187
188equivalenceClasses(_:drs([],[]),E-E):- !.
189
190equivalenceClasses(B:drs([],[_:I:pred(X,_,_,_)|C]),E1-E3):- !,
191 addEquivClass(I,X,E1-E2),
192 equivalenceClasses(B:drs([],C),E2-E3).
193
194equivalenceClasses(B:drs([],[_:I:named(X,_,_,_)|C]),E1-E3):- !,
195 addEquivClass(I,X,E1-E2),
196 equivalenceClasses(B:drs([],C),E2-E3).
197
198equivalenceClasses(B:drs([],[_:I:timex(X,_)|C]),E1-E3):- !,
199 addEquivClass(I,X,E1-E2),
200 equivalenceClasses(B:drs([],C),E2-E3).
201
202equivalenceClasses(B:drs([],[_:I:card(X,_,_)|C]),E1-E3):- !,
203 addEquivClass(I,X,E1-E2),
204 equivalenceClasses(B:drs([],C),E2-E3).
205
206equivalenceClasses(B:drs([],[_:_:rel(_,_,_,_)|C]),E1-E2):- !,
207 equivalenceClasses(B:drs([],C),E1-E2).
208
209equivalenceClasses(B:drs([],[_:_:role(_,_,_,_)|C]),E1-E2):- !,
210 equivalenceClasses(B:drs([],C),E1-E2).
211
212equivalenceClasses(B:drs([],[_:_:eq(_,_)|C]),E1-E2):- !,
213 equivalenceClasses(B:drs([],C),E1-E2).
214
215equivalenceClasses(B:drs([],[_:_:not(DRS)|C]),E1-E3):- !,
216 equivalenceClasses(DRS,E1-E2),
217 equivalenceClasses(B:drs([],C),E2-E3).
218
219equivalenceClasses(B:drs([],[_:_:pos(DRS)|C]),E1-E3):- !,
220 equivalenceClasses(DRS,E1-E2),
221 equivalenceClasses(B:drs([],C),E2-E3).
222
223equivalenceClasses(B:drs([],[_:_:nec(DRS)|C]),E1-E3):- !,
224 equivalenceClasses(DRS,E1-E2),
225 equivalenceClasses(B:drs([],C),E2-E3).
226
227equivalenceClasses(B:drs([],[_:_:prop(_,DRS)|C]),E1-E3):- !,
228 equivalenceClasses(DRS,E1-E2),
229 equivalenceClasses(B:drs([],C),E2-E3).
230
231equivalenceClasses(B:drs([],[_:_:imp(DRS1,DRS2)|C]),E1-E4):- !,
232 equivalenceClasses(DRS1,E1-E2),
233 equivalenceClasses(DRS2,E2-E3),
234 equivalenceClasses(B:drs([],C),E3-E4).
235
236equivalenceClasses(B:drs([],[_:_:or(DRS1,DRS2)|C]),E1-E4):- !,
237 equivalenceClasses(DRS1,E1-E2),
238 equivalenceClasses(DRS2,E2-E3),
239 equivalenceClasses(B:drs([],C),E3-E4).
240
241equivalenceClasses(B:drs([],[_:_:duplex(_,DRS1,_,DRS2)|C]),E1-E4):- !,
242 equivalenceClasses(DRS1,E1-E2),
243 equivalenceClasses(DRS2,E2-E3),
244 equivalenceClasses(B:drs([],C),E3-E4).
245
246equivalenceClasses(B:drs([],[C|Conds]),E1-E2):- !,
247 warning('condition not known in equivalenceClasses/2: ~p',[C]),
248 equivalenceClasses(B:drs([],Conds),E1-E2).
249
250equivalenceClasses(B:drs([_:I:X|D],C),E1-E3):- !,
251 addEquivClass(I,X,E1-E2),
252 equivalenceClasses(B:drs(D,C),E2-E3).
253
254equivalenceClasses(B,E-E):-
255 warning('expression not known in equivalenceClasses/2: ~p',[B]).
256
257
261
262cleanEquivClasses([],[]).
263
264cleanEquivClasses([_:[]|L1],L2):- !,
265 cleanEquivClasses(L1,L2).
266
267cleanEquivClasses([_:[_]|L1],L2):- !,
268 cleanEquivClasses(L1,L2).
269
270cleanEquivClasses([X:C1|L1],[X:C2|L2]):- !,
271 sort(C1,C2),
272 cleanEquivClasses(L1,L2).
273
274
278
279writeECs([],_):- nl.
280writeECs([I:X|L],T):-
281 write(I), write(': ['), writeEC(X,T), write('] '),
282 writeECs(L,T).
283
284writeEC([],_).
285writeEC([X|L],T):-
286 member(X:F,T), member(tok:Tok,F), !,
287 write(Tok),
288 (L=[];L=[_|_],write(',')),
289 writeEC(L,T).
290writeEC([_|L],T):-
291 writeEC(L,T).
292
293
294evaluate(Es,_Tags):-
296 setof(ant(A,B),R^(resolveDRT:antecedent([A|R],B)),L), !,
297 evaluate(L,Es,0,0,0).
298
299evaluate(_,_).
300
301evaluate([],_,Correct,_TotalAttempted,Total):-
302 Correct < Total, !,
303 warning('not all gold standard antecedents found, but only: ~p/~p',[Correct,Total]),
304 true.
307
308
309evaluate([],_,_Correct,_TotalAttempted,_Total):- !,
310 true.
313
314evaluate([ant(A,B)|L],Es,C1,TA1,TT1):-
315 member(_:E,Es),
316 member(A,E),
317 member(B,E), !,
318 C2 is C1 + 1,
319 TA2 is TA1 + 1,
320 TT2 is TT1 + 1,
321 evaluate(L,Es,C2,TA2,TT2).
322
323evaluate([ant(A,_)|L],Es,C,TA1,TT1):-
324 member(_:E,Es),
325 member(A,E), !,
326 TA2 is TA1 + 1,
327 TT2 is TT1 + 1,
328 evaluate(L,Es,C,TA2,TT2).
329
330evaluate([_|L],Es,C,TA,TT1):-
331 TT2 is TT1 + 1,
332 evaluate(L,Es,C,TA,TT2).
333
334
338
339semantics(X,Tags,Y):-
340 option('--instantiate',true),
341 option('--semantics', pdrs),
342 option('--resolve', true), !,
343 instDrs(X), Y=X,
344 equivalenceClasses(Y,[]-E1),
345 cleanEquivClasses(E1,E2),
346 evaluate(E2,Tags).
347
348semantics(X,_,Y):-
349 option('--instantiate',true),
350 option('--semantics',pdrs), !,
351 instDrs(X), Y=X.
352
353semantics(X,_,Y):-
354 option('--semantics',pdrs), !,
355 Y=X.
356
357semantics(X,Tags,Y):-
358 option('--semantics',drg), !,
359 instDrs(X,N), tuples(Tags,X,N,Y).
360
361semantics(A,_,B):-
362 option('--instantiate',true), option('--semantics',drs), !,
363 instDrs(A), pdrs2drs(A,B).
364
365semantics(A,_,B):-
366 option('--semantics',drs), !,
367 pdrs2drs(A,B).
368
369semantics(A,_,C):-
370 option('--semantics',fol), !,
371 pdrs2drs(A,B), drs2fol(B,C).
372
373semantics(A,Tags,C):-
374 option('--semantics',tacitus), !,
375 instDrs(A,N), pdrs2drs(A,B), drs2tac(B,Tags,N,C).
376
377semantics(A,Tags,C):-
378 option('--semantics',amr), !,
380 instDrs(A,N), drs2amr(A,Tags,N,C).
381
382
386
387interpret(fa(Cat,_,Att,W,F1,A1),fa(Cat,Sem,Att,W,D1,D2)):- !,
388 interpret(F1,D1), topsem(D1,F2),
389 interpret(A1,D2), topsem(D2,A2),
390 Sem=app(F2,A2).
391
392
396
397interpret(ba(Cat,_,Att,W,A1,F1),ba(Cat,Sem,Att,W,D1,D2)):- !,
398 interpret(A1,D1), topsem(D1,A2),
399 interpret(F1,D2), topsem(D2,F2),
400 Sem=app(F2,A2).
401
402
406
407interpret(fc(Cat,_,Att,W,F1,A1),fc(Cat,Sem,Att,W,D1,D2)):- !,
408 interpret(F1,D1), topsem(D1,F2),
409 interpret(A1,D2), topsem(D2,A2),
410 Sem=lam(X,app(F2,app(A2,X))).
411
412
416
417interpret(bc(Cat,_,Att,W,A1,F1),bc(Cat,Sem,Att,W,D1,D2)):- !,
418 interpret(A1,D1), topsem(D1,A2),
419 interpret(F1,D2), topsem(D2,F2),
420 Sem=lam(X,app(F2,app(A2,X))).
421
422
426
427interpret(fxc(Cat,_,Att,W,F1,A1),fxc(Cat,Sem,Att,W,D1,D2)):- !,
428 interpret(F1,D1), topsem(D1,F2),
429 interpret(A1,D2), topsem(D2,A2),
430 Sem=lam(X,app(F2,app(A2,X))).
431
432
436
437interpret(bxc(Cat,_,Att,W,A1,F1),bxc(Cat,Sem,Att,W,D1,D2)):- !,
438 interpret(A1,D1), topsem(D1,A2),
439 interpret(F1,D2), topsem(D2,F2),
440 Sem=lam(X,app(F2,app(A2,X))).
441
442
446
447interpret(fs(Cat,_,Att,W,F1,A1),fs(Cat,Sem,Att,W,D1,D2)):- !,
448 interpret(F1,D1), topsem(D1,F2),
449 interpret(A1,D2), topsem(D2,A2),
450 Sem=lam(X,app(app(F2,X),app(A2,X))).
451
452
456
457interpret(bs(Cat,_,Att,W,A1,F1),bs(Cat,Sem,Att,W,D1,D2)):- !,
458 interpret(A1,D1), topsem(D1,A2),
459 interpret(F1,D2), topsem(F2,F2),
460 Sem=lam(X,app(app(F2,X),app(A2,X))).
461
462
466
467interpret(fxs(Cat,_,Att,W,F1,A1),fxs(Cat,Sem,Att,W,D1,D2)):- !,
468 interpret(F1,D1), topsem(D1,F2),
469 interpret(A1,D2), topsem(D2,A2),
470 Sem=lam(X,app(app(F2,X),app(A2,X))).
471
472
476
477interpret(bxs(Cat,_,Att,W,A1,F1),bxs(Cat,Sem,Att,W,D1,D2)):- !,
478 interpret(A1,D1), topsem(D1,A2),
479 interpret(F1,D2), topsem(D2,F2),
480 Sem=lam(X,app(app(F2,X),app(A2,X))).
481
482
486
487interpret(gfc(Cat,N,_,Att,W,F1,A1),gfc(Cat,Sem,Att,W,D1,D2)):- !,
488 interpret(F1,D1), topsem(D1,F2),
489 interpret(A1,D2), topsem(D2,A2),
490 gen(N,F2,A2,Sem).
491
492interpret(gfc(Cat,S,A,W,F1,A1),Der):-
493 topcat(F1,S1/S2),
494 topcat(A1,ACat),
495 base(ACat,S2/S3,Dollar,N),
496 base(Cat,S1/S3,Dollar,N), !,
497 interpret(gfc(Cat,N,S,A,W,F1,A1),Der).
498
499
503
504interpret(gbc(Cat,N,_,Att,W,A1,F1),gbc(Cat,Sem,Att,W,D1,D2)):- !,
505 interpret(A1,D1), topsem(D1,A2),
506 interpret(F1,D2), topsem(D2,F2),
507 gen(N,F2,A2,Sem).
508
509interpret(gbc(Cat,S,A,A1,W,F1),Der):-
510 topcat(F1,S1\S2),
511 topcat(A1,ACat),
512 base(ACat,S2\S3,Dollar,N),
513 base(Cat,S1\S3,Dollar,N), !,
514 interpret(gbc(Cat,N,S,A,A1,W,F1),Der).
515
516
520
521interpret(gfxc(Cat,N,_,Att,W,F1,A1),gfxc(Cat,Sem,Att,W,D1,D2)):- !,
522 interpret(F1,D1), topsem(D1,F2),
523 interpret(A1,D2), topsem(D2,A2),
524 gen(N,F2,A2,Sem).
525
526interpret(gfxc(Cat,S,A,W,F1,A1),Der):-
527 topcat(F1,S1/S2),
528 topcat(A1,ACat),
529 base(ACat,S2\S3,Dollar,N),
530 base(Cat,S1\S3,Dollar,N), !,
531 interpret(gfxc(Cat,N,S,A,W,F1,A1),Der).
532
533
537
538interpret(gbxc(Cat,N,_,Att,W,A1,F1),gbxc(Cat,Sem,Att,W,D1,D2)):- !,
539 interpret(A1,D1), topsem(D1,A2),
540 interpret(F1,D2), topsem(D2,F2),
541 gen(N,F2,A2,Sem).
542
543interpret(gbxc(Cat,S,A,W,A1,F1),Der):-
544 topcat(F1,S1\S2),
545 topcat(A1,ACat),
546 base(ACat,S2/S3,Dollar,N),
547 base(Cat,S1/S3,Dollar,N), !,
548 interpret(gbxc(Cat,N,S,A,W,A1,F1),Der).
549
553
554
555interpret(t(Cat,Word,_,Att1,I),t(Cat,Word,Sem,Att2,I)):-
557 att(Att1,lemma,Lemma),
558 downcase_atom(Lemma,Symbol),
559 semlex(Cat,Symbol,[I],Att1-Att2,Sem), !.
560
561
565
566interpret(tc(NewCat,OldCat,_,Att,W,A1),tc(NewCat,OldCat,A3,Att,W,D)):- !,
567 interpret(A1,D), topsem(D,A2),
568 typechange(OldCat,A2,Att,NewCat,A3).
569
570
574
575interpret(ftr(NewCat,OldCat,_,Att,W,A1),ftr(NewCat,OldCat,Sem,Att,W,D)):- !,
576 interpret(A1,D), topsem(D,A2),
577 Sem = lam(X,app(X,A2)).
578
579interpret(btr(NewCat,OldCat,_,Att,W,A1),btr(NewCat,OldCat,Sem,Att,W,D)):- !,
580 interpret(A1,D), topsem(D,A2),
581 Sem = lam(X,app(X,A2)).
582
583
587
588interpret(coord(Cat,_,Att,W,L1,C1,R1),coord(Cat,Sem,Att,W,D1,D2,D3)):- !,
589 argCard(Cat,N),
590 coordMacro(N,Coord),
591 interpret(L1,D1), topsem(D1,L2),
592 interpret(C1,D2), topsem(D2,C2),
593 interpret(R1,D3), topsem(D3,R2),
594 Sem = app(app(app(Coord,C2),R2),L2).
595
596
600
601interpret(conj(Cat,np,_,Att,W,C1,R1),conj(Cat,np,Sem,Att,W,D1,D2)):-
602 topcat(C1,conj:app),
603 topcat(R1,np),
604 interpret(C1,D1), topsem(D1,C2),
605 interpret(R1,D2), !, topsem(D2,R2),
606 Sem = app(C2,R2).
607
608
612
613interpret(conj(Cat,CCat,_,Att,W,C1,R1),conj(Cat,CCat,Sem,Att,W,D1,D2)):-
614 topcat(C1,conj:CCat),
615 topcat(R1,CCat),
616 interpret(C1,D1), topsem(D1,C2),
617 interpret(R1,D2), !, topsem(D2,R2),
618 Sem = app(C2,R2).
619
620
624
625interpret(conj(Cat,CCat,_,Att,W,C1,R1),conj(Cat,CCat,Sem,Att,W,D1,D2)):- !,
626 argCard(CCat,N),
627 coordMacro(N,Coord),
628 interpret(C1,D1), topsem(D1,C2), 629 interpret(R1,D2), topsem(D2,R2), 630 Sem = app(app(Coord,C2),R2).
631
632
636
637interpret(Input,_,_):-
638 Input = t(Cat,Word,_,Att,Index),
639 error('no lexical semantics for cat ~p (token: ~p), (attributes: ~p) (index: ~p)',[Cat,Word,Att,Index]),
640 !, fail.
641
642interpret(Input,_,_):-
643 error('no interpretation rule for ~p',[Input]),
644 !, fail.
645
646
650
651gen(1,F,A,lam(X1,app(F,app(A,X1)))).
652gen(2,F,A,lam(X1,lam(X2,app(F,app(app(A,X1),X2))))).
653gen(3,F,A,lam(X1,lam(X2,lam(X3,app(F,app(app(app(A,X1),X2),X3)))))).
654gen(4,F,A,lam(X1,lam(X2,lam(X3,lam(X4,app(F,app(app(app(app(A,X1),X2),X3),X4))))))).
655
656
660
661base(Cat,Cat,[],1):- !.
662
663base(Cat/Riht,Base,[riht(Riht)|A],N):- !,
664 base(Cat,Base,A,M), N is M + 1.
665
666base(Cat\Left,Base,[left(Left)|A],N):- !,
667 base(Cat,Base,A,M), N is M + 1.
668
669