1% lex2tex.pl, by Johan Bos
    2
    3:- dynamic sem/3, tok/3, freq/2, ex/4.    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]).   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
   31/*========================================================================
   32   Latex Var
   33========================================================================*/
   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
   43/*========================================================================
   44   Latex DRSs
   45========================================================================*/
   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):- !, 
   84% write('lam ':L1),nl,
   85% write(type(TX,T):lam(X,B)),nl,nl,
   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):- !, 
   92% write('app ':L1),nl,
   93% write(T2:app(B1,B2)),nl,nl,
   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
  103/*========================================================================
  104   Tex DRS-referents
  105========================================================================*/
  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
  120/*========================================================================
  121   Tex DRS-Conditions
  122========================================================================*/
  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
  136/*========================================================================
  137   Tex DRS-Condition
  138========================================================================*/
  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
  236/*========================================================================
  237   Tex non-logical sym2texs
  238========================================================================*/
  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
  247/*========================================================================
  248   Deal with underscores
  249========================================================================*/
  250
  251underscore([],[]).
  252
  253underscore([95|L1],[92,95|L2]):- !, underscore(L1,L2).
  254
  255underscore([X|L1],[X|L2]):- !, underscore(L1,L2).
  256
  257
  258/*========================================================================
  259   Header
  260========================================================================*/
  261
  262printHeader(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
  289printFooter(Stream):-
  290   write(Stream,'\\input{synsem.ind}'),            nl(Stream),
  291   write(Stream,'\\end{document}'),                nl(Stream).   
  292
  293
  294/*========================================================================
  295   Cat2Type
  296========================================================================*/
  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
  312/*========================================================================
  313   Clean up CCG Cat
  314========================================================================*/
  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
  322/*========================================================================
  323   Generate Semantic Representation
  324========================================================================*/
  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
  335/*========================================================================
  336   Get example sentence
  337========================================================================*/
  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
  351/*========================================================================
  352   Typeset Category
  353========================================================================*/
  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
  383/*========================================================================
  384   Typeset Semantic Type
  385========================================================================*/
  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
  397/*========================================================================
  398   Typeset Sentence
  399========================================================================*/
  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
  416/*========================================================================
  417   Typeset Tokens
  418========================================================================*/
  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
  477/*========================================================================
  478   Special Charachters (for Latex)
  479========================================================================*/
  480
  481special('$').
  482special('%').
  483special('&').
  484special('}').
  485special('{').
  486special('#').
  487special('_').
  488
  489
  490/*========================================================================
  491   Compute Frequency
  492========================================================================*/
  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
  511/*========================================================================
  512   Init
  513========================================================================*/
  514
  515init:-
  516   getsem(Cat,Tok,X,Sen,Pos),
  517   add(Cat,Tok,X,Sen,Pos),
  518   fail.
  519
  520init:-
  521   computeF.
  522
  523
  524/*========================================================================
  525   Add to temp database
  526========================================================================*/
  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), !,                 % similar sem present
  534   getexample(Sen,1,Ex,Len),
  535   addExample(Id,Ex,Len,Pos),
  536   (
  537      tok(Id,Tok,M), !,               % tok already present
  538      retract(tok(Id,Tok,M)),
  539      N is M + 1,
  540      assert(tok(Id,Tok,N))
  541   ;
  542      assert(tok(Id,Tok,1))           % new tok
  543   ).
  544   
  545add(Cat,Tok,X,Sen,Pos):-           % sem new, but
  546   \+ sem(_,_,_), !,                  % nothing in database yet
  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):-                   % sem new
  553   sem(_,_,I),                        % get new id
  554   \+ (sem(_,_,J), J > I), !,         % increase highest previous id
  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
  562/*========================================================================
  563   Add example
  564========================================================================*/
  565
  566addExample(Id,_,Len,_):-          %%% same length, hence
  567   ex(Id,_,Len,_), !.             %%% no need to add
  568
  569addExample(Id,_,Len,_):-          %%% already found shorter example
  570   ex(Id,_,Shorter,_),            %%% hence no need to add
  571   Shorter < Len,                 %%% (but not too short!)
  572   Shorter > 5, !.
  573
  574addExample(Id,Ex,Len,I):-         %%% replace previous example
  575   ex(Id,_,_,_), !, 
  576   retract(ex(Id,_,_,_)), 
  577   assert(ex(Id,Ex,Len,I)).
  578
  579addExample(Id,Ex,Len,I):-         %%% add first example
  580   assert(ex(Id,Ex,Len,I)).
  581
  582
  583/*========================================================================
  584   Similar Semantics
  585========================================================================*/
  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
  621/*========================================================================
  622   Main
  623========================================================================*/
  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
  653/*========================================================================
  654   Start
  655========================================================================*/
  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.