2
3:- dynamic sem/3, tok/3, freq/2, ex/4. 4
8
9file_search_path(semlib, 'src/prolog/lib').
10file_search_path(boxer, 'src/prolog/boxer').
11file_search_path(knowledge, 'src/prolog/boxer/knowledge').
12file_search_path(lex, 'src/prolog/boxer/lex').
13
14
18
19:- use_module(boxer(drs2fdrs),[instDrs/1,elimEqDrs/2]). 20:- use_module(boxer(lexicon),[semlex/5,semlex/6]). 21:- use_module(boxer(betaConversionDRT),[betaConvert/2]). 22
23:- use_module(library(lists),[member/2]). 24
25:- use_module(semlib(semlex),[lexcall/6]). 26:- use_module(semlib(drs2fol),[symbol/4]). 27:- use_module(semlib(options),[option/2,parseOptions/2,setOption/3,
28 showOptions/1,setDefaultOptions/1]). 29
30
34
35printTypedVar(V,Stream):- var(V), !, write(Stream,'X').
36printTypedVar(e,Stream):- !, write(Stream,x).
37printTypedVar(type(e,t),Stream):- !, write(Stream,'p').
38printTypedVar(type(type(type(e,t),t),type(type(e,t),t)),Stream):- !, write(Stream,'v').
39printTypedVar(type(type(e,t),t),Stream):- !, write(Stream,'n').
40printTypedVar(_,Stream):- write(Stream,u).
41
42
46
47drs2tex('$VAR'(Id),Type,L-L,Stream):-
48 member('$VAR'(Id):Type,L), !,
49 printTypedVar(Type,Stream),
50 write(Stream,'$_{'),
51 write(Stream,Id),
52 write(Stream,'}$').
53
54drs2tex('$VAR'(Id),_Type,L-L,Stream):- !,
55 write(Stream,'U'),
56 write(Stream,'$_{'),
57 write(Stream,Id),
58 write(Stream,'}$').
59
60drs2tex(smerge(B1,B2),T,L,Stream):- !, drs2tex(merge(B1,B2),T,L,Stream).
61
62drs2tex(alfa(_,B1,B2),t,L1-L3,Stream):- !,
63 write(Stream,'('),
64 drs2tex(B1,t,L1-L2,Stream),
65 write(Stream,'$\\alpha$'),
66 drs2tex(B2,t,L2-L3,Stream),
67 write(Stream,')').
68
69drs2tex(merge(B1,B2),t,L1-L3,Stream):- !,
70 write(Stream,'('),
71 drs2tex(B1,t,L1-L2,Stream),
72 write(Stream,';'),
73 drs2tex(B2,t,L2-L3,Stream),
74 write(Stream,')').
75
76drs2tex(drs(D,C),t,L1-L2,Stream):- !,
77 write(Stream,'\\drs{'),
78 refs2tex(D,L1-L2,Stream),
79 write(Stream,'{'),
80 conds2tex(C,L2,Stream),
81 write(Stream,'}').
82
83drs2tex(lam(X,B),type(TX,T),L1-L2,Stream):- !,
86 write(Stream,'$\\lambda$'),
87 drs2tex(X,TX,[X:TX|L1]-L2,Stream),
88 write(Stream,'.'),
89 drs2tex(B,T,L2-_,Stream).
90
91drs2tex(app(B1,B2),T2,L1-L1,Stream):- !,
94 write(Stream,'('),
95 drs2tex(B1,type(T1,T2),L1-_,Stream),
96 write(Stream,' @ '),
97 drs2tex(B2,T1,L1-_,Stream),
98 write(Stream,')').
99
100drs2tex(X,_Type,L-L,Stream):-
101 write(Stream,unknown(X)).
102
106
107refs2tex([],L-L,Stream):- !,
108 write(Stream,'}').
109
110refs2tex([_:C],L1-L2,Stream):- !,
111 drs2tex(C,e,[C:e|L1]-L2,Stream),
112 write(Stream,'}').
113
114refs2tex([_:C|L],L1-L3,Stream):-
115 drs2tex(C,e,[C:e|L1]-L2,Stream),
116 write(Stream,' '),
117 refs2tex(L,L2-L3,Stream).
118
119
123
124conds2tex([],_,_):- !.
125
126conds2tex([_:C],L,Stream):- !,
127 cond2tex(C,L,Stream,_),
128 write(Stream,'\\\\[-3pt]').
129
130conds2tex([_:C|Cs],L,Stream):-
131 cond2tex(C,L,Stream,N),
132 format(Stream,'\\\\[~ppt]~n',[N]),
133 conds2tex(Cs,L,Stream).
134
135
139
140cond2tex(not(Drs),L,Stream,9):- !,
141 write(Stream,'$\\lnot$'),
142 drs2tex(Drs,t,L-_,Stream).
143
144cond2tex(nec(Drs),L,Stream,9):- !,
145 write(Stream,'$\\Diamond$'),
146 drs2tex(Drs,t,L-_,Stream).
147
148cond2tex(pos(Drs),L,Stream,9):- !,
149 write(Stream,'$\\Box$'),
150 drs2tex(Drs,t,L-_,Stream).
151
152cond2tex(prop(X,Drs),L,Stream,9):- !,
153 drs2tex(X,e,L-_,Stream),
154 write(Stream,':'),
155 drs2tex(Drs,t,L-_,Stream).
156
157cond2tex(or(Drs1,Drs2),L,Stream,9):- !,
158 drs2tex(Drs1,t,L-_,Stream),
159 write(Stream,'$\\lor$'),
160 drs2tex(Drs2,t,L-_,Stream).
161
162cond2tex(imp(Drs1,Drs2),L,Stream,9):- !,
163 drs2tex(Drs1,t,L-L1,Stream),
164 write(Stream,'$\\Rightarrow$'),
165 drs2tex(Drs2,t,L1-_,Stream).
166
167cond2tex(whq(Drs1,Drs2),L,Stream,9):- !,
168 drs2tex(Drs1,t,L-L1,Stream),
169 write(Stream,'?'),
170 drs2tex(Drs2,t,L1-_,Stream).
171
172cond2tex(duplex(_,Drs1,_,Drs2),L,Stream,N):- !,
173 cond2tex(whq(Drs1,Drs2),L,Stream,N).
174
175cond2tex(card(X,C,_),L,Stream,1):- !,
176 write(Stream,'$|$'),
177 drs2tex(X,e,L-_,Stream),
178 write(Stream,'$|$ = '),
179 write(Stream,C).
180
181cond2tex(named(X,C,Type,Sense),L,Stream,1):- !,
182 sym2tex(C,Type,Sense,New), !,
183 write(Stream,'named('),
184 drs2tex(X,e,L-_,Stream),
185 write(Stream,','),
186 write(Stream,New),
187 write(Stream,')').
188
189cond2tex(timex(X,D1),L,Stream,1):- !,
190 sym2tex(D1,t,_Sense,D2),
191 write(Stream,D2),
192 write(Stream,'('),
193 drs2tex(X,e,L-_,Stream),
194 write(Stream,')').
195
196cond2tex(eq(X,Y),L,Stream,1):- !,
197 drs2tex(X,e,L-_,Stream),
198 write(Stream,' = '),
199 drs2tex(Y,e,L-_,Stream).
200
201cond2tex(pred(X,Sym1,Type,Sense),L,Stream,1):-
202 sym2tex(Sym1,Type,Sense,Sym2), !,
203 write(Stream,Sym2),
204 write(Stream,'('),
205 drs2tex(X,e,L-_,Stream),
206 write(Stream,')').
207
208cond2tex(rel(X,Y,Sym1,Sense),L,Stream,1):-
209 sym2tex(Sym1,r,Sense,Sym2), !,
210 write(Stream,Sym2),
211 write(Stream,'('),
212 drs2tex(X,e,L-_,Stream),
213 write(Stream,','),
214 drs2tex(Y,e,L-_,Stream),
215 write(Stream,')').
216
217cond2tex(role(X,Y,Sym1,1),L,Stream,1):-
218 sym2tex(Sym1,r,1,Sym2), !,
219 write(Stream,Sym2),
220 write(Stream,'('),
221 drs2tex(X,e,L-_,Stream),
222 write(Stream,','),
223 drs2tex(Y,e,L-_,Stream),
224 write(Stream,')').
225
226cond2tex(role(X,Y,Sym1,-1),L,Stream,1):-
227 sym2tex(Sym1,r,1,Sym2), !,
228 write(Stream,Sym2),
229 write(Stream,'('),
230 drs2tex(Y,e,L-_,Stream),
231 write(Stream,','),
232 drs2tex(X,e,L-_,Stream),
233 write(Stream,')').
234
235
239
240sym2tex(Sym1,Type,Sense,Sym3):-
241 symbol(Type,Sym1,Sense,Sym2),
242 name(Sym2,Codes2),
243 underscore(Codes2,Codes3),
244 name(Sym3,Codes3).
245
246
250
251underscore([],[]).
252
253underscore([95|L1],[92,95|L2]):- !, underscore(L1,L2).
254
255underscore([X|L1],[X|L2]):- !, underscore(L1,L2).
256
257
261
(Stream):-
263 write(Stream,'\\documentclass[10pt]{article}'), nl(Stream),
264 nl(Stream),
265 write(Stream,'\\usepackage{a4wide}'), nl(Stream),
266 nl(Stream),
267 write(Stream,'\\newcommand{\\drs}[2]'), nl(Stream),
268 write(Stream,'{ '), nl(Stream),
269 write(Stream,' \\begin{tabular}{|l|}'), nl(Stream),
270 write(Stream,' \\hline'), nl(Stream),
271 write(Stream,' #1'), nl(Stream),
272 write(Stream,' \\\\'), nl(Stream),
273 write(Stream,' ~ \\vspace{-2ex} \\\\'), nl(Stream),
274 write(Stream,' \\hline'), nl(Stream),
275 write(Stream,' ~ \\vspace{-2ex} \\\\'), nl(Stream),
276 write(Stream,' #2'), nl(Stream),
277 write(Stream,' \\\\'), nl(Stream),
278 write(Stream,' \\hline'), nl(Stream),
279 write(Stream,' \\end{tabular}'), nl(Stream),
280 write(Stream,'}'), nl(Stream),
281 nl(Stream),
282 write(Stream,'\\parindent 0pt'), nl(Stream),
283 write(Stream,'\\parskip 10pt'), nl(Stream),
284 nl(Stream),
285 write(Stream,'\\makeindex'), nl(Stream),
286 write(Stream,'\\begin{document}'), nl(Stream),
287 nl(Stream).
288
(Stream):-
290 write(Stream,'\\input{synsem.ind}'), nl(Stream),
291 write(Stream,'\\end{document}'), nl(Stream).
292
293
297
298cat2type(t, t):- !.
299cat2type(n, type(e,t)):- !.
300cat2type(n:_, type(e,t)):- !.
301cat2type(pp, type(e,t)):- !.
302cat2type(np, type(type(e,t),t)):- !.
303cat2type(np_exp, type(type(e,t),t)):- !.
304cat2type(np_thr, type(type(e,t),t)):- !.
305cat2type(s:_, type(type(e,t),t)):- !.
306cat2type(Other, 'X'):- atom(Other), !.
307
308cat2type('\\'(A,B), type(BType,AType) ):- cat2type(A,AType), cat2type(B,BType).
309cat2type('/'(A,B), type(BType,AType) ):- cat2type(A,AType), cat2type(B,BType).
310
311
315
316cleanCat('\\'(A1,B1), '\\'(A2,B2) ):- !, cleanCat(A1,A2), cleanCat(B1,B2).
317cleanCat('/'(A1,B1), '/'(A2,B2) ):- !, cleanCat(A1,A2), cleanCat(B1,B2).
318cleanCat(n:_,n):- !.
319cleanCat(X,X).
320
321
325
326getsem(CleanCat,Token,Converted,Start,Tok):-
327 lexcall(Cat,Sym,Lem,Pos:Ner,Start,Tok),
328 semlex(Cat,Sym,Lem,Pos:Ner,[1],Sem),
329 betaConvert(Sem,Converted),
330 cleanCat(Cat,CleanCat),
331 ( member(Pos,['NNP','NNPS']), Token = Sym
332 ; \+ member(Pos,['NNP','NNPS']), downcase_atom(Sym,Token) ).
333
334
338
339getexample(I1,I2,L,Len):- getexample1(I1,I2,L,Len), !.
340getexample(I,_,[],0).
341
342getexample1(I1,I2,[Sym|L],I):-
343 lexcall(_,Sym,_,_,I1,I2), !,
344 I3 is I2 + 1,
345 getexample1(I1,I3,L,I).
346
347getexample1(I1,I2,['.'],I2):-
348 \+ (lexcall(_,_,_,_,I1,I3), I2 < I3), !.
349
350
354
355printCat('\\'(A,B),Stream):- !,
356 write(Stream,'('),
357 printCat(A,Stream),
358 write(Stream,'$\\backslash$'),
359 printCat(B,Stream),
360 write(Stream,')').
361
362printCat('/'(A,B),Stream):- !,
363 write(Stream,'('),
364 printCat(A,Stream),
365 write(Stream,'/'),
366 printCat(B,Stream),
367 write(Stream,')').
368
369printCat(np_thr,Stream):- !,
370 write(Stream,np:thr).
371
372printCat(np_exp,Stream):- !,
373 write(Stream,np:exp).
374
375printCat(Cat:Fea,Stream):-
376 var(Fea), !, Fea = 'X',
377 printCat(Cat:Fea,Stream).
378
379printCat(A,Stream):-
380 write(Stream,A).
381
382
386
387printType(type(A,B),Stream):- !,
388 write(Stream,'$\\langle$'),
389 printType(A,Stream),
390 write(Stream,','),
391 printType(B,Stream),
392 write(Stream,'$\\rangle$').
393
394printType(A,Stream):- write(Stream,A).
395
396
400
401printSentence([],Stream,_,_):- nl(Stream).
402
403printSentence([X|L],Stream,W,W):- !,
404 write(Stream,'\\textbf{'), printTok(X,Stream), write(Stream,'} '),
405 N is W + 1,
406 printSentence(L,Stream,N,W).
407
408printSentence([X|L],Stream,M,W):-
409 printTok(X,Stream), write(Stream,' '),
410 N is M + 1,
411 printSentence(L,Stream,N,W).
412
413
414
415
419
420printTokens(Id,Stream):-
421 findall(t(F,Tok),tok(Id,Tok,F),L),
422 sort(L,Sorted), reverse(Sorted,Ordered),
423 printTok(Ordered,10,Stream).
424
425printTok([t(F,X)|_],1,Stream):- !,
426 printIndex(X,Stream),
427 write(Stream,'\\textit{'), printTok(X,Stream), write(Stream,'} ('),
428 write(Stream,F), write(Stream,').'),
429 nl(Stream).
430
431printTok([t(F,X)],_,Stream):- !,
432 printIndex(X,Stream),
433 write(Stream,'\\textit{'), printTok(X,Stream), write(Stream,'} ('),
434 write(Stream,F), write(Stream,').'),
435 nl(Stream).
436
437printTok([t(F,X)|L],N,Stream):- !,
438 printIndex(X,Stream),
439 write(Stream,'\\textit{'), printTok(X,Stream), write(Stream,'} ('),
440 write(Stream,F), write(Stream,'), '),
441 M is N - 1,
442 printTok(L,M,Stream).
443
444
445printIndex(Tok,_):-
446 atom(Tok),
447 atom_chars(Tok,Chars),
448 special(Special),
449 member(Special,Chars), !.
450
451printIndex(Tok,Stream):-
452 write(Stream,'\\index{'), printTok(Tok,Stream), write(Stream,'}').
453
454
455printTok(Tok,Stream):-
456 atom(Tok),
457 atom_chars(Tok,Chars),
458 special(Special),
459 member(Special,Chars), !,
460 printChars(Chars,Stream).
461
462printTok(Tok,Stream):-
463 write(Stream,Tok).
464
465printChars([],_).
466
467printChars([Char|L],Stream):-
468 special(Char), !,
469 write(Stream,'\\'), write(Stream,Char),
470 printChars(L,Stream).
471
472printChars([X|L],Stream):- !,
473 write(Stream,X),
474 printChars(L,Stream).
475
476
480
481special('$').
482special('%').
483special('&').
484special('}').
485special('{').
486special('#').
487special('_').
488
489
493
494computeF:-
495 sem(_,_,Id),
496 \+ freq(Id,_), !,
497 findall(F,tok(Id,_,F),L),
498 sum(L,0,Sum),
499 assert(freq(Id,Sum)),
500 computeF.
501
502computeF.
503
504sum([],Sum,Sum).
505
506sum([X|L],Acc,Sum):-
507 New is Acc+X,
508 sum(L,New,Sum).
509
510
514
515init:-
516 getsem(Cat,Tok,X,Sen,Pos),
517 add(Cat,Tok,X,Sen,Pos),
518 fail.
519
520init:-
521 computeF.
522
523
527
528add(Cat,_,_,_,_):-
529 member(Cat,[conj,comma,semi]), !.
530
531add(Cat,Tok,X1,Sen,Pos):-
532 sem(Cat,X2,Id),
533 similar(X1,X2), !, 534 getexample(Sen,1,Ex,Len),
535 addExample(Id,Ex,Len,Pos),
536 (
537 tok(Id,Tok,M), !, 538 retract(tok(Id,Tok,M)),
539 N is M + 1,
540 assert(tok(Id,Tok,N))
541 ;
542 assert(tok(Id,Tok,1)) 543 ).
544
545add(Cat,Tok,X,Sen,Pos):- 546 \+ sem(_,_,_), !, 547 assert(sem(Cat,X,1)),
548 getexample(Sen,1,Ex,Len),
549 addExample(1,Ex,Len,Pos),
550 assert(tok(1,Tok,1)).
551
552add(Cat,Tok,X,Sen,Pos):- 553 sem(_,_,I), 554 \+ (sem(_,_,J), J > I), !, 555 N is I + 1,
556 assert(sem(Cat,X,N)),
557 getexample(Sen,1,Ex,Len),
558 addExample(N,Ex,Len,Pos),
559 assert(tok(N,Tok,1)).
560
561
565
566addExample(Id,_,Len,_):- 567 ex(Id,_,Len,_), !. 568
569addExample(Id,_,Len,_):- 570 ex(Id,_,Shorter,_), 571 Shorter < Len, 572 Shorter > 5, !.
573
574addExample(Id,Ex,Len,I):- 575 ex(Id,_,_,_), !,
576 retract(ex(Id,_,_,_)),
577 assert(ex(Id,Ex,Len,I)).
578
579addExample(Id,Ex,Len,I):- 580 assert(ex(Id,Ex,Len,I)).
581
582
586
587similar(X,Y):- var(X), !, var(Y).
588similar(X,Y):- var(Y), !, var(X).
589similar('$VAR'(X),'$VAR'(X)).
590
591similar(lam(_,A), lam(_,B)):- similar(A,B).
592similar(app(A1,A2), app(B1,B2)):- similar(A1,B1), similar(A2,B2).
593similar(smerge(A1,A2), smerge(B1,B2)):- similar(A1,B1), similar(A2,B2).
594similar(merge(A1,A2), merge(B1,B2)):- similar(A1,B1), similar(A2,B2).
595similar(alfa(T,A1,A2), alfa(T,B1,B2)):- similar(A1,B1), similar(A2,B2).
596
597similar(drs(D1,C1), drs(D2,C2)):- length(D1,Len), length(D2,Len), similar(C1,C2).
598
599similar([],[]).
600similar([_:C1|L1],[_:C2|L2]):- similar(C1,C2), similar(L1,L2).
601
602similar(not(A), not(B)):- similar(A,B).
603similar(pos(A), pos(B)):- similar(A,B).
604similar(nec(A), nec(B)):- similar(A,B).
605similar(prop(_,A), prop(_,B)):- similar(A,B).
606
607similar(imp(A1,A2), imp(B1,B2)):- similar(A1,B1), similar(A2,B2).
608similar(or(A1,A2), or(B1,B2)):- similar(A1,B1), similar(A2,B2).
609similar(whq(A1,A2), whq(B1,B2)):- similar(A1,B1), similar(A2,B2).
610similar(duplex(_,A1,_,A2), duplex(_,B1,_,B2)):- similar(A1,B1), similar(A2,B2).
611
612similar(card(_,_,_), card(_,_,_)).
613similar(named(_,_,T,_), named(_,_,T,_)).
614similar(timex(_,_), timex(_,_)).
615similar(eq(_,_), eq(_,_)).
616similar(pred(_,_,T,_), pred(_,_,T,_)).
617similar(rel(_,_,_,_), rel(_,_,_,_)).
618similar(role(_,_,_,_), role(_,_,_,_)).
619
620
624
625body([s(F,Id)|L],Stream):-
626 F > 10, !,
627 sem(Cat,X,Id),
628 cat2type(Cat,Type),
629 write(Stream,'\\clearpage'), nl(Stream),
630 write(Stream,'Category: \\textbf{' ),
631 printCat(Cat,Stream),
632 format(Stream,'} \\hfill F=~p~n~n',[F]),
633 write(Stream,'Type: ' ),
634 printType(Type,Stream), nl(Stream), nl(Stream),
635 write(Stream,'DRS:'), nl(Stream), nl(Stream),
636 numbervars(X,1,_),
637 format(Stream,'%%%~p~n',[X]),
638 drs2tex(X,Type,[]-_,Stream), nl(Stream), nl(Stream),
639 write(Stream,'Entries: '),
640 printTokens(Id,Stream), nl(Stream), nl(Stream),
641 write(Stream,'Example: '), nl(Stream), nl(Stream),
642 ex(Id,Ex,_,W),
643 printSentence(Ex,Stream,1,W), nl(Stream), nl(Stream),
644 body(L,Stream).
645
646body([_|L],Stream):-
647 body(L,Stream).
648
649body([],Stream):-
650 nl(Stream).
651
652
656
657go:-
658 setDefaultOptions(boxer),
659 init,
660 open('working/synsem.tex',write,Stream),
661 printHeader(Stream),
662 findall(s(F,Id),freq(Id,F),All),
663 sort(All,Sorted),
664 reverse(Sorted,Ordered),
665 body(Ordered,Stream),
666 printFooter(Stream),
667 close(Stream).
668
669:- go.