1% lex2tex.pl, by Johan Bos
    2
    3:- dynamic sem/3, tok/3, freq/2, ex/3, inex/3, pos/2.    4
    5/*========================================================================
    6   File Search Paths
    7========================================================================*/
    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
   15/*========================================================================
   16   Load Modules
   17========================================================================*/
   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,append/3,select/3]).   24
   25:- use_module(semlib(der),[der/2]).   26:- use_module(semlib(options),[option/2,parseOptions/2,setOption/3,
   27                               showOptions/1,setDefaultOptions/1]).   28
   29
   30/*========================================================================
   31   Latex Var
   32========================================================================*/
   33
   34printTypedVar(V,Stream):- var(V), !, write(Stream,'X').
   35printTypedVar(e,Stream):- !, write(Stream,x).
   36printTypedVar(t,Stream):- !, write(Stream,'B').
   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
   43/*========================================================================
   44   Add Types
   45========================================================================*/
   46
   47%addTypes(Exp,Type,L-L,_):- write(hey:Exp:Type:L),nl,fail.
   48
   49addTypes('$VAR'(Id),Type,L-L,t(Type,'$VAR'(Id))):-
   50    member('$VAR'(Id):Type,L), !.
   51
   52addTypes(merge(B1,B2),t,L1-L3,merge(C1,C2)):- !, 
   53   addTypes(B1,t,L1-L2,C1),
   54   addTypes(B2,t,L2-L3,C2).
   55
   56addTypes(smerge(B1,B2),t,L1-L3,smerge(C1,C2)):- !, 
   57   addTypes(B1,t,L1-L2,C1),
   58   addTypes(B2,t,L2-L3,C2).
   59
   60addTypes(alfa(Type,B1,B2),t,L1-L3,alfa(Type,C1,C2)):- !, 
   61   addTypes(B1,t,L1-L2,C1),
   62   addTypes(B2,t,L2-L3,C2).
   63
   64addTypes(drs([],C1),t,L-L,drs([],C2)):- !,
   65   addTypesConds(C1,L,C2).
   66
   67addTypes(drs([_:D|D1],C1),t,L1-L2,drs([t(e,D)|D2],C2)):- !,
   68   addTypes(drs(D1,C1),t,[D:e|L1]-L2,drs(D2,C2)).
   69
   70addTypes(lam(X,B1),type(Alfa,Beta),L1-L2,lam(t(Alfa,X),B2)):- !,
   71   addTypes(B1,Beta,[X:Alfa|L1]-L2,B2).
   72
   73addTypes(app(E1,F1),Beta,L-L,app(E2,F2)):- !,
   74   addTypes(E1,type(Alfa,Beta),L-_,E2),
   75   addTypes(F1,Alfa,L-_,F2).
   76
   77addTypes(Exp,Type,L-L,_):- !,
   78   write('%%% unknown (addTypes/4): '), write(Exp), tab(1), write(Type), tab(1), write(L), nl,
   79   fail.
   80
   81addTypesConds([],_,[]):- !.
   82
   83addTypesConds([_:C1|L1],L,[C2|L2]):-
   84   addTypesCond(C1,L,C2),
   85   addTypesConds(L1,L,L2).
   86
   87addTypesCond(pos(B1),L,pos(B2)):- !, addTypes(B1,t,L-_,B2).
   88addTypesCond(nec(B1),L,nec(B2)):- !, addTypes(B1,t,L-_,B2).
   89addTypesCond(not(B1),L,not(B2)):- !, addTypes(B1,t,L-_,B2).
   90addTypesCond(prop(X,B1),L,prop(Y,B2)):- !, addTypeVar(X,L,Y), addTypes(B1,t,L-_,B2).
   91addTypesCond(or(B1,B2),L,or(B3,B4)):- !, addTypes(B1,t,L-_,B3), addTypes(B2,t,L-_,B4).
   92addTypesCond(imp(B1,B2),L,imp(B3,B4)):- !, addTypes(B1,t,L-L1,B3), addTypes(B2,t,L1-_,B4).
   93addTypesCond(whq(B1,B2),L,whq(B3,B4)):- !, addTypes(B1,t,L-L1,B3), addTypes(B2,t,L1-_,B4).
   94addTypesCond(duplex(X,B1,Y,B2),L,duplex(X,B3,Y,B4)):- !, addTypes(B1,t,L-L1,B3), addTypes(B2,t,L1-_,B4).
   95
   96addTypesCond(card(X,A,B),L,card(Y,A,B)):- !, addTypeVar(X,L,Y).
   97addTypesCond(named(X,A,B,C),L,named(Y,A,B,C)):- !, addTypeVar(X,L,Y).
   98addTypesCond(timex(X,A),L,timex(Y,A)):- !, addTypeVar(X,L,Y).
   99addTypesCond(eq(X,Y),L,eq(X1,Y1)):- !, addTypeVar(X,L,X1), addTypeVar(Y,L,Y1).
  100addTypesCond(rel(X,Y,A,B),L,rel(X1,Y1,A,B)):- !, addTypeVar(X,L,X1), addTypeVar(Y,L,Y1).
  101addTypesCond(role(X,Y,A,B),L,role(X1,Y1,A,B)):- !, addTypeVar(X,L,X1), addTypeVar(Y,L,Y1).
  102addTypesCond(pred(X,A,B,C),L,pred(Y,A,B,C)):- !, addTypeVar(X,L,Y).
  103
  104addTypeVar(X,L,t(T,X)):- member(X:T,L), !.
  105addTypeVar(X,_,t(u,X)).
  106
  107
  108/*========================================================================
  109   Latex Lambda Expression (Add Types first)
  110========================================================================*/
  111
  112drs2tex(Drs,Type,Stream):-
  113   addTypes(Drs,Type,[]-_,TypedDrs), !, 
  114   drs2tex(TypedDrs,Stream).
  115
  116drs2tex(X,_,Stream):-
  117   write(Stream,unknown), nl(Stream),
  118   write(Stream,'%%% unknown (drs2tex/3): '), write(Stream,X), nl(Stream).
  119
  120
  121/*========================================================================
  122   Latex DRSs
  123========================================================================*/
  124
  125drs2tex(t(Type,'$VAR'(Id)),Stream):- 
  126   printTypedVar(Type,Stream),
  127   write(Stream,'$_{'), write(Stream,Id), write(Stream,'}$').
  128
  129drs2tex(smerge(B1,B2),Stream):- !, 
  130   drs2tex(merge(B1,B2),Stream).
  131
  132drs2tex(alfa(_,B1,B2),Stream):- !, 
  133   write(Stream,'('), drs2tex(B1,Stream), 
  134   write(Stream,'$\\alpha$'), drs2tex(B2,Stream), write(Stream,')').
  135
  136drs2tex(merge(B1,B2),Stream):- !, 
  137   write(Stream,'('), drs2tex(B1,Stream),
  138   write(Stream,';'), drs2tex(B2,Stream), write(Stream,')').
  139
  140drs2tex(drs(D,C),Stream):- !,
  141   write(Stream,'\\drs{'), refs2tex(D,Stream),
  142   write(Stream,'{'), conds2tex(C,Stream), write(Stream,'}').
  143
  144drs2tex(lam(X,B),Stream):- !, 
  145   write(Stream,'$\\lambda$'), drs2tex(X,Stream),
  146   write(Stream,'.'), drs2tex(B,Stream).
  147
  148drs2tex(app(B1,B2),Stream):- !, 
  149   write(Stream,'('), drs2tex(B1,Stream),
  150   write(Stream,'@'), drs2tex(B2,Stream), write(Stream,')').
  151
  152drs2tex(X,Stream):- !,
  153   write(Stream,unknown), nl(Stream),
  154   write(Stream,'%%% unknown (drs2tex/2): '), write(Stream,X), nl(Stream).
  155
  156
  157/*========================================================================
  158   Tex DRS-referents
  159========================================================================*/
  160
  161refs2tex([],Stream):- !, write(Stream,'}').
  162
  163refs2tex([C],Stream):- !, drs2tex(C,Stream), write(Stream,'}').
  164
  165refs2tex([C|L],Stream):- drs2tex(C,Stream), write(Stream,' '), refs2tex(L,Stream).
  166
  167
  168/*========================================================================
  169   Tex DRS-Conditions
  170========================================================================*/
  171
  172conds2tex([],_):- !.
  173
  174conds2tex([C],Stream):- !,
  175   cond2tex(C,Stream,_), 
  176   write(Stream,'\\\\[-7pt]').
  177
  178conds2tex([C|Cs],Stream):-
  179   cond2tex(C,Stream,N), 
  180   format(Stream,'\\\\[~ppt]~n',[N]),
  181   conds2tex(Cs,Stream).
  182
  183
  184/*========================================================================
  185   Tex DRS-Condition
  186========================================================================*/
  187
  188cond2tex(not(Drs),Stream,9):- !,
  189   write(Stream,'$\\lnot$'),
  190   drs2tex(Drs,Stream).
  191
  192cond2tex(pos(Drs),Stream,9):- !,
  193   write(Stream,'$\\Diamond$'),
  194   drs2tex(Drs,Stream).
  195
  196cond2tex(nec(Drs),Stream,9):- !,
  197   write(Stream,'$\\Box$'),
  198   drs2tex(Drs,Stream).
  199 
  200cond2tex(prop(X,Drs),Stream,9):- !,
  201   drs2tex(X,Stream),
  202   write(Stream,':'),
  203   drs2tex(Drs,Stream).
  204
  205cond2tex(or(Drs1,Drs2),Stream,9):- !,
  206   drs2tex(Drs1,Stream),
  207   write(Stream,'$\\lor$'),
  208   drs2tex(Drs2,Stream).
  209
  210cond2tex(imp(Drs1,Drs2),Stream,9):- !,
  211   drs2tex(Drs1,Stream),
  212   write(Stream,'$\\Rightarrow$'),
  213   drs2tex(Drs2,Stream).
  214
  215cond2tex(whq(Drs1,Drs2),Stream,9):- !,
  216   drs2tex(Drs1,Stream),
  217   write(Stream,'?'),
  218   drs2tex(Drs2,Stream).
  219
  220cond2tex(duplex(_,Drs1,_,Drs2),Stream,N):- !, 
  221   cond2tex(whq(Drs1,Drs2),Stream,N).
  222
  223cond2tex(card(X,C,_),Stream,1):- !,
  224   write(Stream,'$|$'),
  225   drs2tex(X,Stream),
  226   write(Stream,'$|$ = '),
  227   write(Stream,C).
  228
  229cond2tex(named(X,C,_Type,_),Stream,1):- !,
  230   write(Stream,'nam('),
  231   drs2tex(X,Stream),
  232   write(Stream,','),
  233   printTok(C,Stream),
  234%   write(Stream,','),
  235%   write(Stream,Type),
  236   write(Stream,')').
  237
  238cond2tex(timex(X,D1),Stream,1):- !,
  239   timex(D1,D2),
  240   write(Stream,'time('),
  241   drs2tex(X,Stream),
  242   write(Stream,')='),
  243   write(Stream,D2).
  244
  245cond2tex(eq(X,Y),Stream,1):-  !,
  246   drs2tex(X,Stream),
  247   write(Stream,' = '),
  248   drs2tex(Y,Stream).
  249
  250cond2tex(pred(X,Sym,_Type,_Sense),Stream,1):- 
  251   printTok(Sym,Stream),
  252   write(Stream,'('),
  253   drs2tex(X,Stream),
  254   write(Stream,')').
  255
  256cond2tex(rel(X,Y,temp_before,_),Stream,1):- !,
  257   drs2tex(X,Stream), write(Stream,' $<$ '), drs2tex(Y,Stream).
  258
  259cond2tex(rel(X,Y,temp_included,_),Stream,1):- !,
  260   drs2tex(X,Stream), write(Stream,' $\\subseteq$ '), drs2tex(Y,Stream).
  261
  262cond2tex(rel(X,Y,temp_abut,_),Stream,1):- !,
  263   drs2tex(X,Stream), write(Stream,' $\\supset$\\hspace*{-2pt}$\\subset$ '), drs2tex(Y,Stream).
  264
  265cond2tex(rel(X,Y,temp_overlap,_),Stream,1):- !,
  266   drs2tex(X,Stream), write(Stream,' $\\bigcirc$ '), drs2tex(Y,Stream).
  267
  268cond2tex(role(X,Y,Sym,1),Stream,1):- !, cond2tex(rel(X,Y,Sym,1),Stream,1).
  269
  270cond2tex(role(X,Y,Sym,-1),Stream,1):- !, cond2tex(rel(Y,X,Sym,1),Stream,1).
  271
  272cond2tex(rel(X,Y,Sym,_Sense),Stream,1):- !,
  273   printTok(Sym,Stream),
  274   write(Stream,'('),
  275   drs2tex(X,Stream),
  276   write(Stream,','),
  277   drs2tex(Y,Stream),
  278   write(Stream,')').
  279
  280
  281/*========================================================================
  282   Time Expressions
  283========================================================================*/
  284
  285timex(date(_:_,_:Y,_:M,_:D),Timex):- !, timex(date(Y,M,D),Timex).
  286
  287timex(date(_:Y,_:M,_:D),Timex):- !, timex(date(Y,M,D),Timex).
  288
  289timex(time(_:H,_:M,_:S),Timex):- !, timex(time(H,M,S),Timex).
  290
  291timex(date(Y,M,D),Timex):-
  292   year(Y,[Y1,Y2,Y3,Y4]),
  293   month(M,[M1,M2]),
  294   day(D,[D1,D2]),
  295   name(Timex,[Y1,Y2,Y3,Y4,M1,M2,D1,D2]).
  296
  297timex(time(H,M,S),Timex):-
  298   hour(H,[H1,H2]),
  299   minute(M,[M1,M2]),
  300   second(S,[S1,S2]),
  301   name(Timex,[H1,H2,M1,M2,S1,S2]).
  302
  303year(Y,C):- var(Y), !, name('XXXX',C).
  304year(Y,C):- name(Y,C).
  305
  306month(Y,C):- var(Y), !, name('XX',C).
  307month(Y,C):- name(Y,C).
  308
  309day(Y,C):- var(Y), !, name('XX',C).
  310day(Y,C):- name(Y,C).
  311
  312hour(A,C):- day(A,C).
  313minute(A,C):- day(A,C).
  314second(A,C):- day(A,C).
  315
  316
  317/*========================================================================
  318   Header
  319========================================================================*/
  320
  321printHeader(Stream):-
  322   write(Stream,'\\documentclass[10pt]{article}'), nl(Stream),
  323   nl(Stream),
  324   write(Stream,'\\usepackage{a4wide}'),           nl(Stream),
  325   write(Stream,'\\usepackage{rotating}'),         nl(Stream),
  326   write(Stream,'\\usepackage{latexsym}'),         nl(Stream),
  327   write(Stream,'\\usepackage{hyperref}'),         nl(Stream),
  328   nl(Stream),
  329   write(Stream,'\\newcommand{\\drs}[2]'),         nl(Stream),
  330   write(Stream,'{'),                              nl(Stream),
  331   write(Stream,'   \\begin{tabular}{|l|}'),       nl(Stream),
  332   write(Stream,'   \\hline'),                     nl(Stream),
  333   write(Stream,'   #1'),                          nl(Stream),
  334   write(Stream,'   \\\\'),                        nl(Stream),
  335   write(Stream,'   ~ \\vspace{-2ex} \\\\'),       nl(Stream),
  336   write(Stream,'   \\hline'),                     nl(Stream),
  337   write(Stream,'   ~ \\vspace{-2ex} \\\\'),       nl(Stream),
  338   write(Stream,'   #2'),                          nl(Stream),
  339   write(Stream,'   \\\\'),                        nl(Stream),
  340   write(Stream,'   \\hline'),                     nl(Stream),
  341   write(Stream,'   \\end{tabular}'),              nl(Stream),
  342   write(Stream,'}'),                              nl(Stream),
  343   nl(Stream),
  344   write(Stream,'\\parindent 0pt'),                nl(Stream),
  345   write(Stream,'\\parskip 7pt'),                  nl(Stream),
  346   write(Stream,'\\tabcolsep 1pt'),                nl(Stream),
  347   write(Stream,'%\\pdfpageheight 250mm'),         nl(Stream),
  348   write(Stream,'%\\pdfpagewidth  700mm'),         nl(Stream),
  349   write(Stream,'\\textheight 240mm'),             nl(Stream),
  350   write(Stream,'\\textwidth 184mm'),              nl(Stream),
  351   write(Stream,'\\topmargin -12mm'),              nl(Stream),
  352   write(Stream,'\\oddsidemargin -10mm'),          nl(Stream),
  353   write(Stream,'\\evensidemargin -10mm'),         nl(Stream),
  354   write(Stream,'\\pagestyle{myheadings}'),        nl(Stream), nl(Stream),
  355   write(Stream,'\\makeindex  %% makeindex derivation.idx'),   nl(Stream),
  356   write(Stream,'\\title{A large-scale, formal semantic lexicon (appendix)}'), nl(Stream),
  357   write(Stream,'\\author{Johan Bos}'),            nl(Stream),
  358   write(Stream,'\\begin{document}'),              nl(Stream),
  359   write(Stream,'\\maketitle'),                    nl(Stream),   
  360   write(Stream,'\\thispagestyle{empty}'),         nl(Stream),
  361   write(Stream,'%\\tableofcontents'),             nl(Stream),
  362   write(Stream,'\\input{intro}'),                 nl(Stream),
  363   nl(Stream).
  364
  365printFooter(Stream):-
  366   write(Stream,'\\markright{\\rm Appendix: Index \\hfill Page~}'), nl(Stream),
  367   write(Stream,'\\input{derivation.ind}'),        nl(Stream),
  368   write(Stream,'\\end{document}'),                nl(Stream).   
  369
  370
  371/*========================================================================
  372   Cat2Type
  373========================================================================*/
  374
  375cat2type(t:_,    t):- !.
  376cat2type(n,      type(e,t)):- !.
  377cat2type(n:_,    type(e,t)):- !.
  378cat2type(pp,     type(e,t)):- !.
  379cat2type(np,     type(type(e,t),t)):- !.
  380cat2type(np_exp, type(type(e,t),t)):- !.
  381cat2type(np_thr, type(type(e,t),t)):- !.
  382cat2type(s:_,    type(type(e,t),t)):- !.
  383cat2type(comma,  type(t,type(t,t))):- !.
  384cat2type(semi,   type(t,type(t,t))):- !.
  385cat2type(conj,   type(t,type(t,t))):- !.
  386
  387cat2type(conj:app, type(X,type(X,X))):- !, cat2type(np,X).
  388
  389cat2type('\\'(A,B), type(BType,AType) ):- !, cat2type(A,AType), cat2type(B,BType).
  390cat2type('/'(A,B), type(BType,AType) ):- !, cat2type(A,AType), cat2type(B,BType).
  391
  392
  393/*========================================================================
  394   Clean up CCG Cat
  395========================================================================*/
  396
  397cleanCat('\\'(A1,B1), '\\'(A2,B2) ):- !, cleanCat(A1,A2), cleanCat(B1,B2).
  398cleanCat('/'(A1,B1),  '/'(A2,B2)  ):- !, cleanCat(A1,A2), cleanCat(B1,B2).
  399cleanCat(n:_,n):- !.
  400cleanCat(comma,conj):- !.
  401cleanCat(semi,conj):- !.
  402%cleanCat(conj:_,conj):- !.
  403cleanCat(X,X).
  404
  405
  406/*========================================================================
  407   Typeset Category
  408========================================================================*/
  409
  410printCat('\\'(A,B),Stream):- !,
  411   write(Stream,'('),
  412   printCat(A,Stream),
  413   write(Stream,'$\\backslash$'),
  414   printCat(B,Stream),
  415   write(Stream,')').
  416
  417printCat('/'(A,B),Stream):- !,
  418   write(Stream,'('),
  419   printCat(A,Stream),
  420   write(Stream,'/'),
  421   printCat(B,Stream),
  422   write(Stream,')').
  423
  424printCat(np_thr,Stream):- !, write(Stream,'NP[thr]').
  425
  426printCat(np_exp,Stream):- !, write(Stream,'NP[exp]').
  427
  428printCat(comma,Stream):- !, write(Stream,'CONJ').
  429
  430printCat(semi,Stream):- !, write(Stream,'CONJ').
  431
  432printCat(n:_,Stream):- !,
  433   write(Stream,'N').
  434
  435printCat(Cat:Fea,Stream):- 
  436   var(Fea), !, Fea = 'X', 
  437   printCat(Cat:Fea,Stream).
  438
  439printCat(Cat:Fea,Stream):- 
  440   atom(Cat), atom(Fea), !,
  441   upcase_atom(Cat,Up),
  442   write(Stream,Up), write(Stream,'['),
  443   write(Stream,Fea), write(Stream,']').
  444
  445printCat(Cat,Stream):- 
  446   atom(Cat), !,
  447   upcase_atom(Cat,Up),
  448   write(Stream,Up).
  449
  450printCat(Cat,Stream):- 
  451   write(Stream,Cat).
  452
  453
  454/*========================================================================
  455   Typeset Semantic Type
  456========================================================================*/
  457
  458printType(type(A,B),Stream):- !,
  459   write(Stream,'$\\langle$'),
  460   printType(A,Stream),
  461   write(Stream,','),
  462   printType(B,Stream),
  463   write(Stream,'$\\rangle$').
  464
  465printType(A,Stream):- write(Stream,A).
  466
  467
  468/*========================================================================
  469   Typeset Sentence
  470========================================================================*/
  471
  472printExample(Id,Stream,W):-
  473  ex(Id,Ex,_),
  474  write(Stream,'('), write(Stream,Id), write(Stream,') '),
  475  printSentence(Ex,Stream,W).
  476
  477printSentence([W|Words],Stream,W):- !,
  478   write(Stream,'\\textrm{\\underline{'),
  479   printTok(W,Stream), write(Stream,'}'),
  480   printSentence1(Words,Stream,W).
  481
  482printSentence([X|Words],Stream,W):-
  483   write(Stream,'\\textrm{'),
  484   printTok(X,Stream),
  485   printSentence1(Words,Stream,W).
  486
  487printSentence1([],Stream,_):- 
  488   write(Stream,'}'), nl(Stream).
  489
  490printSentence1([W|L],Stream,W):- 
  491   member(W,['.', ',', '?', '\'re', '\'s', '\'ve', 'n\'t', '%']), !,
  492   write(Stream,'\\underline{'), printTok(W,Stream), write(Stream,'}'),
  493   printSentence1(L,Stream,W).
  494
  495printSentence1([W|L],Stream,W):- !,
  496   write(Stream,' \\underline{'), printTok(W,Stream), write(Stream,'}'),
  497   printSentence1(L,Stream,W).
  498
  499printSentence1([X|L],Stream,W):- 
  500   member(X,['.', ',', '?', '\'re', '\'s', '\'ve', 'n\'t', '%']), !,
  501   printTok(X,Stream), 
  502   printSentence1(L,Stream,W).
  503
  504printSentence1([X|L],Stream,W):-
  505   write(Stream,' '),
  506   printTok(X,Stream), 
  507   printSentence1(L,Stream,W).
  508
  509
  510/*========================================================================
  511   Typeset Tokens
  512========================================================================*/
  513
  514printTokens(Id,Stream):-
  515   findall(t(F,Tok),tok(Id,Tok,F),L),
  516   sort(L,Sorted), reverse(Sorted,Ordered),
  517   printTok(Ordered,20,Stream).
  518
  519printTok([t(F,X)|_],1,Stream):- !,
  520   printIndex(X,Stream),
  521   write(Stream,'\\textrm{'), printTok(X,Stream), write(Stream,'}$^{('),
  522   write(Stream,F), write(Stream,')}$.'),
  523   nl(Stream).
  524
  525printTok([t(F,X)],_,Stream):- !,
  526   printIndex(X,Stream),
  527   write(Stream,'\\textrm{'), printTok(X,Stream),  write(Stream,'}$^{('),
  528   write(Stream,F), write(Stream,')}$.'),
  529   nl(Stream).
  530
  531printTok([t(F,X)|L],N,Stream):- !,
  532   printIndex(X,Stream),
  533   write(Stream,'\\textrm{'), printTok(X,Stream),  write(Stream,'}$^{('),
  534   write(Stream,F), write(Stream,')}$, '),
  535   M is N - 1,
  536   printTok(L,M,Stream).
  537
  538
  539printIndex(Tok,_):-
  540   atom(Tok),
  541   atom_chars(Tok,Chars),
  542   special(Special),
  543   member(Special,Chars), !.
  544
  545printIndex(Tok,Stream):-
  546   write(Stream,'\\index{\\textrm{'), printTok(Tok,Stream), write(Stream,'}}').
  547
  548
  549printTok(Tok,Stream):-
  550   atom(Tok),
  551   atom_chars(Tok,Chars),
  552   special(Special),
  553   member(Special,Chars), !,
  554   printChars(Chars,Stream).
  555
  556printTok(Tok,Stream):-
  557   write(Stream,Tok).
  558
  559printToks([],_):- !.
  560printToks([X],Stream):- !, printTok(X,Stream).
  561printToks([X|L],Stream):- !, printTok(X,Stream), write(Stream,' '), printToks(L,Stream).
  562
  563printChars([],_).
  564printChars([Char|L],Stream):- special(Char), !, write(Stream,'\\'), write(Stream,Char), printChars(L,Stream).
  565printChars([X|L],Stream):- !, write(Stream,X), printChars(L,Stream).
  566
  567
  568/*========================================================================
  569   Special Characters (for Latex)
  570========================================================================*/
  571
  572special('$').
  573special('%').
  574special('&').
  575special('}').
  576special('{').
  577special('#').
  578special('_').
  579
  580
  581/*========================================================================
  582   Compute Frequency
  583========================================================================*/
  584
  585computeF:-
  586   sem(_,_,Id),
  587   \+ freq(Id,_), !,
  588   findall(F,tok(Id,_,F),L),
  589   sum(L,0,Sum),
  590   assert(freq(Id,Sum)),
  591   computeF.
  592
  593computeF.
  594
  595sum([],Sum,Sum).
  596
  597sum([X|L],Acc,Sum):-
  598   New is Acc+X,
  599   sum(L,New,Sum).
  600
  601
  602/*========================================================================
  603   Print Derivation
  604========================================================================*/
  605
  606printDer(Comb,Stream,Tok3):- 
  607   ( Comb = fa(Cat,Sem,L,R), !, Rule = '[$>$]'
  608   ; Comb = fc(Cat,Sem,L,R), !, Rule = '[FC]'
  609   ; Comb = gfc(Cat,Sem,L,R), !, Rule = '[GFC]'
  610   ; Comb = gbc(Cat,Sem,L,R), !, Rule = '[GBC]'
  611   ; Comb = bc(Cat,Sem,L,R), !, Rule = '[BC]'
  612   ; Comb = fs(Cat,Sem,L,R), !, Rule = '[FS]'
  613   ; Comb = bs(Cat,Sem,L,R), !, Rule = '[BS]'
  614   ; Comb = conj(Cat,Sem,L,R), !, Rule = '[CONJ]'
  615   ; Comb = bxc(Cat,Sem,L,R), !, Rule = '[BXC]'
  616   ; Comb = fxc(Cat,Sem,L,R), !, Rule = '[FXC]'
  617   ; Comb = gbxc(Cat,Sem,L,R), !, Rule = '[GBXC]'
  618   ; Comb = gfxc(Cat,Sem,L,R), !, Rule = '[GFXC]'
  619   ; Comb = fxs(Cat,Sem,L,R), !, Rule = '[BXS]'
  620   ; Comb = bxs(Cat,Sem,L,R), !, Rule = '[FXS]'
  621   ; Comb = ba(Cat,Sem,L,R), !, Rule = '[$<$]' ), 
  622   write(Stream,'\\begin{tabular}[b]{ll}'), nl(Stream),
  623   printDer(L,Stream,Tok1), write(Stream,'&'),
  624   printDer(R,Stream,Tok2), write(Stream,'\\\\'), nl(Stream),
  625   append(Tok1,Tok2,Tok3),
  626   write(Stream,'\\multicolumn{2}{c}{\\hrulefill '), write(Stream,Rule), write(Stream,'}\\\\'), nl(Stream),
  627   betaConvert(Sem,Red),
  628   cat2type(Cat,Type),
  629   numbervars(Red,1,_),
  630   write(Stream,'\\multicolumn{2}{c}{\\begin{tabular}[b]{l}'),
  631   write(Stream,'\\textbf{'), printToks(Tok3,Stream), write(Stream,'}\\\\'), nl(Stream), 
  632   printCat(Cat,Stream), write(Stream,'\\\\'), nl(Stream), 
  633   printType(Type,Stream), write(Stream,'\\\\'), nl(Stream), 
  634%   format(Stream,'%%%~p~n',[Red]),
  635   drs2tex(Red,Type,Stream), 
  636   !,
  637   write(Stream,'\\end{tabular}}'), nl(Stream),
  638   write(Stream,'\\end{tabular}'), nl(Stream).
  639
  640printDer(Comb,Stream,Tok):- 
  641   ( Comb = tc(Cat,Sem,T), !, Rule = '[TC]'
  642   ; Comb = tr(Cat,Sem,T), !, Rule = '[TR]' ),
  643   write(Stream,'\\begin{tabular}[b]{c}'), nl(Stream),
  644   printDer(T,Stream,Tok), write(Stream,'\\\\'), nl(Stream),
  645   write(Stream,'\\hrulefill '), write(Stream,Rule), write(Stream,'\\\\'), nl(Stream),
  646   betaConvert(Sem,Red),
  647   cat2type(Cat,Type),
  648   numbervars(Red,1,_),
  649   write(Stream,'\\begin{tabular}[b]{l}'), nl(Stream),
  650   write(Stream,'\\textbf{'), printToks(Tok,Stream), write(Stream,'}\\\\'), nl(Stream), 
  651   printCat(Cat,Stream), write(Stream,'\\\\'), nl(Stream), 
  652   printType(Type,Stream), write(Stream,'\\\\'), nl(Stream), 
  653%   format(Stream,'%%%~p~n',[Red]),
  654   drs2tex(Red,Type,Stream), 
  655   write(Stream,'\\\\'), nl(Stream), 
  656   !,
  657   write(Stream,'\\end{tabular}'), nl(Stream),
  658   write(Stream,'\\end{tabular}'), nl(Stream).
  659
  660printDer(t(Sem,Cat,Tok,_Pos),Stream,[Tok]):- 
  661   cat2type(Cat,Type),  
  662   betaConvert(Sem,Red),
  663   numbervars(Red,1,_),
  664   write(Stream,'\\begin{tabular}[b]{l}'), nl(Stream),
  665   write(Stream,'\\textbf{'), printTok(Tok,Stream), write(Stream,'}\\\\'), nl(Stream), 
  666   printCat(Cat,Stream), write(Stream,'\\\\'), nl(Stream), 
  667   printType(Type,Stream), write(Stream,'\\\\'), nl(Stream), 
  668   drs2tex(Red,Type,Stream), 
  669   write(Stream,'\\\\'), nl(Stream), 
  670   !, 
  671   write(Stream,'\\end{tabular}'), nl(Stream).
  672
  673printDer(X,Stream,[]):- !,
  674   write(Stream,unknown), nl(Stream),
  675   write(Stream,'%%% unknown (printDer): '),
  676   write(Stream,X),nl(Stream),nl(Stream).
  677
  678
  679/*========================================================================
  680   Analysis of Derivation
  681========================================================================*/
  682
  683analyse(t(Sem,Cat,Tok,Pos),Index,[Tok|L]-L):- !,
  684   cleanCat(Cat,CleanCat),
  685    (    member(Pos,['NNP','NNPS']), Sym = Tok
  686    ; \+ member(Pos,['NNP','NNPS']), downcase_atom(Tok,Sym) ),
  687   betaConvert(Sem,Converted),
  688   add(CleanCat,Sym,Tok,Pos,Converted,Index).
  689
  690analyse(Tree,I,L1-L3):-
  691   Tree =.. [_Name,_Cat,_Sem,T1,T2], !,
  692   analyse(T1,I,L1-L2),
  693   analyse(T2,I,L2-L3).
  694
  695analyse(Tree,I,L1-L2):-
  696   Tree =.. [_Name,_Cat,_Sem,T], !,
  697   analyse(T,I,L1-L2).
  698
  699analyse(Tree,I,L1-L4):-
  700   Tree =.. [_Name,_Cat,_Sem,T1,T2,T3], !,
  701   analyse(T1,I,L1-L2),
  702   analyse(T2,I,L2-L3),
  703   analyse(T3,I,L3-L4).
  704
  705
  706/*========================================================================
  707   Derivations
  708========================================================================*/
  709
  710derivations:-
  711   der(N,Der), 
  712   analyse(Der,N,S-[]), 
  713   length(S,Len), 
  714   assert(ex(N,S,Len)),
  715   fail.
  716
  717derivations:- 
  718   computeF, !.
  719
  720
  721/*========================================================================
  722   Print Derivations
  723========================================================================*/
  724
  725printDerivations(Stream):-
  726   der(N,Der), 
  727   \+ blocked(N),
  728   minlen(MinLen),
  729   maxlen(MaxLen),
  730   ex(N,S,Len), Len < MaxLen, Len > MinLen,
  731   write(N:Len:S), nl,
  732   write(Stream,'\\clearpage'), nl(Stream),
  733   write(Stream,'\\begin{sidewaystable}\\scriptsize'), nl(Stream),
  734   printDer(Der,Stream,_),
  735   format(Stream,'\\caption{\\label{ex:~p}',[N]),
  736   printToks(S,Stream), format(Stream,' (~p)}~n',[N]),
  737   write(Stream,'\\end{sidewaystable}'), nl(Stream),
  738   fail.
  739
  740printDerivations(Stream):- 
  741   nl(Stream).
  742
  743
  744/*========================================================================
  745   Add to temp database
  746========================================================================*/
  747
  748add(Cat,Sym,Tok,Pos,X1,Sen):-                      
  749   sem(Cat,X2,Id),                       
  750   similar(X1,X2), !,                 % similar sem present
  751   assert(inex(Id,Sen,Tok:Sym)),
  752   (  pos(Id,Pos), !
  753   ;  assert(pos(Id,Pos))
  754   ),
  755   (  tok(Id,Sym,M), !,               % tok already present
  756      retract(tok(Id,Sym,M)),
  757      N is M + 1,
  758      assert(tok(Id,Sym,N)),
  759      ( tok(Id,_,Higher), Higher > N, !
  760      ; retract(sem(Cat,_,Id)),
  761        assert(sem(Cat,X1,Id))
  762      )
  763   ;  assert(tok(Id,Sym,1))           % new tok
  764   ).
  765   
  766add(Cat,Sym,Tok,Pos,X,Sen):-          % sem new, but
  767   \+ sem(_,_,_), !,                  % nothing in database yet
  768   assert(sem(Cat,X,1)),
  769   assert(inex(1,Sen,Tok:Sym)),
  770   assert(pos(1,Pos)),
  771   assert(tok(1,Sym,1)).
  772
  773add(Cat,Sym,Tok,Pos,X,Sen):-          % sem new
  774   sem(_,_,I),                        % get new id
  775   \+ (sem(_,_,J), J > I), !,         % increase highest previous id
  776   N is I + 1,
  777   assert(sem(Cat,X,N)),
  778   assert(inex(N,Sen,Tok:Sym)),
  779   assert(pos(N,Pos)),
  780   assert(tok(N,Sym,1)).
  781
  782
  783/*========================================================================
  784   Similar Semantics
  785========================================================================*/
  786
  787similar(X,Y):- var(X), !, var(Y).
  788similar(X,Y):- var(Y), !, var(X).
  789similar('$VAR'(X),'$VAR'(X)).
  790
  791similar(lam(_,A),      lam(_,B)):-      similar(A,B).
  792similar(app(A1,A2),    app(B1,B2)):-    similar(A1,B1), similar(A2,B2).
  793similar(smerge(A1,A2), smerge(B1,B2)):- similar(A1,B1), similar(A2,B2).
  794similar(merge(A1,A2),  merge(B1,B2)):-  similar(A1,B1), similar(A2,B2).
  795similar(alfa(T,A1,A2), alfa(T,B1,B2)):- similar(A1,B1), similar(A2,B2).
  796
  797similar(drs(D1,C1), drs(D2,C2)):- length(D1,Len), length(D2,Len), similar(C1,C2).
  798
  799similar([],[]).
  800similar([_:C1|L1],[_:C2|L2]):- similar(C1,C2), similar(L1,L2).
  801
  802similar(not(A),    not(B)):-    similar(A,B).
  803similar(pos(A),    pos(B)):-    similar(A,B).
  804similar(nec(A),    nec(B)):-    similar(A,B).
  805similar(prop(_,A), prop(_,B)):- similar(A,B).
  806
  807similar(imp(A1,A2),     imp(B1,B2)):-     similar(A1,B1), similar(A2,B2).
  808similar(or(A1,A2),      or(B1,B2)):-      similar(A1,B1), similar(A2,B2).
  809similar(whq(A1,A2),     whq(B1,B2)):-     similar(A1,B1), similar(A2,B2).
  810similar(duplex(_,A1,_,A2), duplex(_,B1,_,B2)):- similar(A1,B1), similar(A2,B2).
  811
  812similar(card(_,_,_),    card(_,_,_)).
  813similar(timex(_,_),     timex(_,_)).
  814similar(eq(_,_),        eq(_,_)).
  815similar(pred(_,_,T,_),  pred(_,_,T,_)).
  816similar(rel(_,_,_,_),   rel(_,_,_,_)).
  817similar(role(_,_,_,_),  role(_,_,_,_)).
  818similar(named(_,_,_,_), named(_,_,_,_)).
  819
  820
  821
  822/*========================================================================
  823   Blocked examples
  824========================================================================*/
  825
  826blocked(201).
  827blocked(211).
  828blocked(382).
  829blocked(472).
  830blocked(522).
  831blocked(526).
  832blocked(576).
  833blocked(579).
  834blocked(616).
  835blocked(606).
  836blocked(638).
  837blocked(743).
  838blocked(772).
  839blocked(830).
  840blocked(1033).
  841blocked(1036).
  842blocked(1148).
  843blocked(1321).
  844blocked(1328).
  845blocked(1342).
  846blocked(1353).
  847blocked(1424).
  848blocked(1449).
  849blocked(1499).
  850blocked(1532).
  851blocked(1540).
  852blocked(1709).
  853
  854/*========================================================================
  855   Min Length for Example
  856========================================================================*/
  857
  858minlen(3).
  859maxlen(10).
  860
  861/*========================================================================
  862   Get best example
  863========================================================================*/
  864
  865getExample(Id,ExId,Tok,Len):-
  866   minlen(Min),
  867   inex(Id,ExId,Tok:_),
  868   \+ blocked(ExId),
  869   ex(ExId,Ex,Len), Len > Min, 
  870   \+ ( select(Tok,Ex,NewEx), member(Tok,NewEx) ),
  871   \+ ( inex(Id,ExId1,_), \+ blocked(ExId1), ex(ExId1,_,Len1), Len1 > Min, Len1 < Len).
  872
  873getExample(Id,ExId,Tok,Len):-
  874   minlen(Min),
  875   inex(Id,ExId,Tok:_),
  876   \+ blocked(ExId),
  877   ex(ExId,_,Len), Len > Min,
  878   \+ ( inex(Id,ExId1,_), \+ blocked(ExId), ex(ExId1,_,Len1), Len1 > Min, Len1 < Len).
  879
  880getExample(Id,ExId,Tok,Len):-
  881   inex(Id,ExId,Tok:_),
  882   ex(ExId,_,Len),
  883   \+ blocked(ExId),
  884   \+ ( inex(Id,ExId1,_), \+ blocked(ExId), ex(ExId1,_,Len1), Len1 < Len).
  885
  886getExample(Id,ExId,Tok,Len):-
  887   inex(Id,ExId,Tok:_),
  888   ex(ExId,_,Len),
  889   \+ ( inex(Id,ExId1,_), ex(ExId1,_,Len1), Len1 < Len).
  890
  891
  892/*========================================================================
  893   Main
  894========================================================================*/
  895
  896body([],_,Stream):- !, nl(Stream).
  897
  898body([s(F,Id)|L1],N1,Stream):-
  899   F > 0,
  900   sem(Cat,X,Id), 
  901   cat2type(Cat,Type),
  902
  903   Remainder is mod(N1,2),
  904   ( Remainder = 1, write(Stream,'\\clearpage'), nl(Stream)
  905   ; Remainder = 0 ),
  906
  907%   write(Stream,'\\addcontentsline{toc}{subsection}{'),
  908   write(Stream,'\\index{\\textsf{'),
  909   printCat(Cat,Stream),    
  910   write(Stream,'}}'),nl(Stream),
  911
  912   write(Stream,'\\begin{tabular}[t]{rl}'), nl(Stream),
  913   write(Stream,'\\textbf{Category}: & \\textsf{'),
  914   printCat(Cat,Stream),    
  915   write(Stream,'}\\\\[7pt]'), nl(Stream),
  916
  917   write(Stream,'\\textbf{Type}: & '),
  918   printType(Type,Stream),   
  919   write(Stream,'\\\\[7pt]'), nl(Stream), 
  920
  921   write(Stream,'\\textbf{PoS}: & {\\small '),
  922   findall(POS,pos(Id,POS),POSs),
  923   printToks(POSs,Stream),    
  924   write(Stream,'}\\\\[7pt]'), nl(Stream), 
  925
  926   write(Stream,'\\textbf{Semantics}: & \\\\'), nl(Stream),        
  927   format(Stream,'\\end{tabular}\\hfill F=~p~n~n',[F]),
  928
  929   numbervars(X,1,_),
  930   format(Stream,'%%%~p~n',[X]), 
  931   write(Stream,'\\textsf{'), 
  932   drs2tex(X,Type,Stream), 
  933   write(Stream,'}'), nl(Stream), nl(Stream), 
  934
  935   write(Stream,'\\textbf{Most frequent lexical entries}:\\\\[2pt]'), nl(Stream),
  936   printTokens(Id,Stream),      nl(Stream), nl(Stream),        
  937
  938   write(Stream,'\\textbf{Corpus examples}:\\\\[2pt]'),   nl(Stream),
  939   printExample1(Stream,Id,Ex),
  940   printExample2(Stream,Id,Ex),
  941
  942   write(Stream,'\\vfill'),
  943   nl(Stream), nl(Stream), !,
  944
  945   ( select(s(F2,Id2),L1,L2), sem(Cat,_,Id2), !, L3=[s(F2,Id2)|L2] 
  946   ; L3 = L1 ),
  947   N2 is N1 + 1, 
  948   body(L3,N2,Stream).
  949
  950body([_|L],N,Stream):- !,
  951   body(L,N,Stream).
  952
  953
  954/*========================================================================
  955   Print Page Ref
  956========================================================================*/
  957
  958printPageRef(Len,Stream,N):-
  959   \+ blocked(N),
  960   maxlen(MaxLen),
  961   minlen(MinLen),
  962   Len < MaxLen, 
  963   Len > MinLen, !, 
  964   format(Stream,'(see p. \\pageref{ex:~p})~n~n',[N]).
  965
  966printPageRef(_,Stream,_):-
  967   nl(Stream).
  968
  969
  970/*========================================================================
  971   Print Example 1
  972========================================================================*/
  973
  974printExample1(Stream,Id,N):-
  975   tok(Id,Sym,F), 
  976   \+ (tok(Id,_,Higher), Higher > F), 
  977   inex(Id,N,Tok:Sym), 
  978   ex(N,_,Len), Len < 18, Len > 4,
  979   printExample(N,Stream,Tok), !,
  980   printPageRef(Len,Stream,N).
  981
  982printExample1(_,_,0).
  983
  984
  985/*========================================================================
  986   Print Example 2
  987========================================================================*/
  988
  989printExample2(Stream,Id,N):-
  990   getExample(Id,Ex,Tok,Len), \+ Ex=N,
  991   printExample(Ex,Stream,Tok), !,
  992   printPageRef(Len,Stream,Ex).
  993
  994printExample2(Stream,_,_):- 
  995   nl(Stream).
  996
  997
  998/*========================================================================
  999   Start
 1000========================================================================*/
 1001
 1002go:-
 1003   setDefaultOptions(boxer), 
 1004   setOption(boxer,'--warnings',true),
 1005   setOption(boxer,'--roles',verbnet),
 1006
 1007   derivations,
 1008   findall(s(F,Id),freq(Id,F),All),
 1009   sort(All,Sorted),
 1010   reverse(Sorted,Ordered),
 1011
 1012   open('working/doc/derivation.tex',write,Stream),
 1013
 1014   printHeader(Stream),
 1015   write(Stream,'\\markright{\\rm Appendix: Lexicon \\hfill Page~}'),  nl(Stream),
 1016   write(Stream,'\\addcontentsline{toc}{section}{2. Lexicon}'),        nl(Stream),
 1017   body(Ordered,1,Stream),
 1018   write(Stream,'\\clearpage'),   nl(Stream),
 1019   write(Stream,'\\markright{\\rm Appendix: Derivations \\hfill Page~}'), nl(Stream),
 1020   write(Stream,'\\addcontentsline{toc}{section}{3. Derivations}'),       nl(Stream),
 1021   printDerivations(Stream),
 1022   printFooter(Stream),
 1023   close(Stream).
 1024
 1025:- go.