2:- module(output,[printHeader/4,
    3                  printFooter/1,
    4                  printSem/4,
    5		  printDerList/2,
    6                  printBox/2]).    7
    8:- use_module(boxer(xdrs2xml),[xdrs2xml/2,der2xml/3]).    9:- use_module(boxer(drs2fdrs),[instDrs/1]).   10:- use_module(boxer(printDrs),[printDrs/3]).   11:- use_module(boxer(betaConversionDRT),[betaConvert/2]).   12:- use_module(boxer(tuples),[write_tuples/2]).   13
   14:- use_module(semlib(drs2tex),[drs2tex/2]).   15:- use_module(semlib(drs2tacitus),[printTAC/2]).   16:- use_module(semlib(drs2amr),[printAMR/2]).   17:- use_module(semlib(options),[option/2]).   18:- use_module(semlib(errors),[warning/2]).   19
   20:- use_module(library(lists),[member/2,append/3]).   21
   22/* ------------------------------------------------------------------------
   23   Options
   24------------------------------------------------------------------------ */
   25
   26printOptions([],Stream):- !, 
   27   nl(Stream).
   28
   29printOptions([X|L],Stream):- 
   30   write(Stream,X), tab(Stream,1),
   31   printOptions(L,Stream).
   32
   33 
   34/* ------------------------------------------------------------------------
   35   Print header: --format no
   36------------------------------------------------------------------------ */
   37
   38printHeader(_,_,_,_):-
   39   option('--format',no), !.
   40
   41/* ------------------------------------------------------------------------
   42   Print header: --format prolog
   43------------------------------------------------------------------------ */
   44
   45printHeader(Stream,_,Command,Options):-
   46   option('--semantics',amr), !,
   47   format(Stream,'# This output was generated by the following command:~n',[]),
   48   format(Stream,'# ~p ',[Command]),
   49   printOptions(Options,Stream).
   50
   51printHeader(Stream,_,Command,Options):-
   52   option('--format',prolog), !,
   53   format(Stream,'%%% This output was generated by the following command:~n',[]),
   54   format(Stream,'%%% ~p ',[Command]),
   55   printOptions(Options,Stream),
   56   ( option('--semantics',drs), !,
   57     format(Stream,'~n:- multifile     sem/3, id/2.',[]),
   58     format(Stream,'~n:- discontiguous sem/3, id/2.',[]),
   59     format(Stream,'~n:- dynamic       sem/3, id/2.~n',[])
   60   ; true ).
   61
   62/* ------------------------------------------------------------------------
   63   Print header: --format latex
   64------------------------------------------------------------------------ */
   65
   66printHeader(Stream,_,_,_):-
   67   option('--format',latex), !,
   68   write(Stream,'\\documentclass[10pt]{article}'), nl(Stream),
   69   nl(Stream),
   70   write(Stream,'\\usepackage{a4wide}'),           nl(Stream),
   71   nl(Stream),
   72   write(Stream,'\\newcommand{\\drs}[2]'),         nl(Stream),
   73   write(Stream,'{'),                              nl(Stream),
   74   write(Stream,'   \\begin{tabular}{|l|}'),       nl(Stream),
   75   write(Stream,'   \\hline'),                     nl(Stream),
   76   write(Stream,'   #1'),                          nl(Stream),
   77   write(Stream,'   \\\\'),                        nl(Stream),
   78   write(Stream,'   ~ \\vspace{-2ex} \\\\'),       nl(Stream),
   79   write(Stream,'   \\hline'),                     nl(Stream),
   80   write(Stream,'   ~ \\vspace{-2ex} \\\\'),       nl(Stream),
   81   write(Stream,'   #2'),                          nl(Stream),
   82   write(Stream,'   \\\\'),                        nl(Stream),
   83   write(Stream,'   \\hline'),                     nl(Stream),
   84   write(Stream,'   \\end{tabular}'),              nl(Stream),
   85   write(Stream,'}'),                              nl(Stream),
   86   nl(Stream),
   87   write(Stream,'\\parindent 0pt'),                nl(Stream),
   88   write(Stream,'\\parskip 10pt'),                  nl(Stream),
   89   nl(Stream),
   90   write(Stream,'\\begin{document}'),              nl(Stream),
   91   write(Stream,'\\sf \\tiny'),                    nl(Stream),
   92   nl(Stream).
   93
   94/* ------------------------------------------------------------------------
   95   Print header: --format dot
   96------------------------------------------------------------------------ */
   97
   98printHeader(_,_,_,_):-
   99   option('--format',dot), !.
  100
  101/* ------------------------------------------------------------------------
  102   Print header: --format xml
  103------------------------------------------------------------------------ */
  104
  105printHeader(Stream,Version,_,_):-
  106   option('--format',xml), !,
  107   format(Stream,'<?xml version="1.0" encoding="UTF-8"?>~n',[]),
  108   format(Stream,'<!DOCTYPE xdrs-output SYSTEM "src/data/boxer/xdrs.dtd">~n',[]),
  109   format(Stream,'<xdrs-output version="~p">~n',[Version]).
  110
  111
  112/* ------------------------------------------------------------------------
  113   Print header: failed, generate warning
  114------------------------------------------------------------------------ */
  115
  116printHeader(_,_,_,_):-
  117   option('--format',Format), 
  118   option('--semantics',Semantics), 
  119   warning('unable to output header for --semantics ~p --format ~p',[Semantics,Format]).
  120
  121
  122/* ------------------------------------------------------------------------
  123   Print footer
  124------------------------------------------------------------------------ */
  125
  126printFooter(Stream):-
  127   option('--format',xml), 
  128   format(Stream,'</xdrs-output>~n',[]).
  129
  130printFooter(Stream):-
  131   option('--format',latex), !,
  132   format(Stream,'\\end{document}~n',[]).
  133
  134printFooter(_).
  135
  136
  137/* ========================================================================
  138   Print Utterance +  Semantic Representation
  139======================================================================== */
  140
  141printSem(Stream,_Id,_Index,Ders):-
  142   option('--semantics',der), !,             %%% derivation
  143   printDerList(Stream,Ders).
  144
  145printSem(Stream,Id,Index,XDRS):-
  146   XDRS = xdrs(Tags,_),
  147   printUtterance(Stream,Tags),
  148   printXDRS(Stream,Id,Index,XDRS).
  149
  150
  151/* =======================================================================
  152   Print Derivations
  153========================================================================*/
  154
  155printDerList(_,[]):- !.
  156
  157printDerList(Stream,[der(I,Der)|L]):- 
  158   option('--format',xml), !,
  159   der2xml(Der,I,Stream),
  160   printDerList(Stream,L). 
  161
  162printDerList(Stream,[der(I,Der)|L]):- 
  163   write(Stream,'der( '), write(Stream,I), write(Stream,', '),
  164   printDer(Der,Stream),
  165   write(Stream,' ).'), nl(Stream), !,
  166   printDerList(Stream,L). 
  167
  168printDerList(Stream,[der(I,_)|L]):- 
  169   warning('cannot print derivation ~p',[I]),
  170   printDerList(Stream,L). 
  171
  172
  173/*========================================================================
  174   Print Derivation (bit of a hack right now!)
  175========================================================================*/
  176
  177printDer(Comb,Stream):-
  178   Comb = t(Cat,Tok,Sem,Att,_), !,
  179   betaConvert(Sem,Red),
  180   \+ \+ ( instDrs(Red), 
  181           write_term(Stream,t(Red,Cat,Tok,Att),[numbervars(true),quoted(true)]) ).
  182
  183printDer(Comb,Stream):- 
  184   Comb =.. [Rule,Cat,_,Sem,_,_,T],
  185   member(Rule,[ftr,btr,tc]), !, 
  186   write(Stream,Rule), 
  187   write(Stream,'('),
  188   write(Stream,Cat),
  189   write(Stream,','),
  190   betaConvert(Sem,Red),
  191   \+ \+ ( instDrs(Red), 
  192           write_term(Stream,Red,[numbervars(true),quoted(true)]) ),
  193   write(Stream,','),
  194   printDer(T,Stream),
  195   write(Stream,')').
  196
  197printDer(Comb,Stream):- 
  198   Comb =.. [Rule,Cat,Sem,_,_,L,R], !,
  199   write(Stream,Rule), 
  200   write(Stream,'('),
  201   write(Stream,Cat),
  202   write(Stream,','),
  203   betaConvert(Sem,Red),
  204   \+ \+ ( instDrs(Red), 
  205           write_term(Stream,Red,[numbervars(true),quoted(true)]) ),
  206   write(Stream,','),
  207   printDer(L,Stream),
  208   write(Stream,','),
  209   printDer(R,Stream), 
  210   write(Stream,')').
  211
  212printDer(Comb,Stream):- 
  213   Comb =.. [Rule,Cat,_,Sem,_,_,L,R], !,
  214   write(Stream,Rule), 
  215   write(Stream,'('),
  216   write(Stream,Cat),
  217   write(Stream,','),
  218   betaConvert(Sem,Red),
  219   \+ \+ ( instDrs(Red), 
  220           write_term(Stream,Red,[numbervars(true),quoted(true)]) ),
  221   write(Stream,','),
  222   printDer(L,Stream),
  223   write(Stream,','),
  224   printDer(R,Stream), 
  225   write(Stream,')').
  226
  227printDer(Comb,_):- 
  228   warning('cannot print the derivation ~p',[Comb]).
  229
  230
  231/* ========================================================================
  232   Print DRS
  233======================================================================== */
  234
  235printXDRS(Stream,_,_,XDRS):-
  236   option('--semantics',drs),
  237   option('--format',no), !,
  238   printBox(Stream,XDRS).
  239
  240printXDRS(Stream,Id,_Index,XDRS):-
  241   option('--semantics',drs),
  242   option('--format',xml), !,
  243   format(Stream,'<xdrs xml:id="xdrs~p">~n',[Id]),
  244   xdrs2xml(XDRS,Stream),
  245   format(Stream,'</xdrs>~n',[]).
  246
  247printXDRS(Stream,_Id,_Index,XDRS):-
  248   option('--semantics',drs), 
  249   option('--format',latex), !,  
  250   XDRS = xdrs(_Tags,DRS),
  251   drs2tex(DRS,Stream),
  252   nl(Stream), nl(Stream).
  253
  254printXDRS(Stream,Id,Index,XDRS):-
  255   option('--semantics',drs), !,
  256   XDRS = xdrs(Tags,DRS),
  257   format(Stream,'id(~q,~p).~n',[Id,Index]),
  258   format(Stream,'sem(~p,',[Index]),
  259   printStuff(Tags,Stream,','),
  260   printStuff(DRS,Stream,').'),
  261   printBox(Stream,DRS),
  262   nl(Stream).
  263
  264
  265/* ========================================================================
  266   Print PDRS
  267======================================================================== */
  268
  269printXDRS(Stream,_,_,XDRS):-
  270   option('--semantics',pdrs),
  271   option('--format',no), !,
  272   printBox(Stream,XDRS).
  273
  274printXDRS(Stream,Id,_Index,XDRS):-
  275   option('--semantics',pdrs),
  276   option('--format',xml), !,
  277   format(Stream,'<xdrs xml:id="xdrs~p">~n',[Id]),
  278   xdrs2xml(XDRS,Stream), 
  279   printBox(Stream,XDRS),
  280   format(Stream,'</xdrs>~n',[]).
  281
  282printXDRS(Stream,Id,Index,XDRS):-
  283   option('--semantics',pdrs),
  284   XDRS = xdrs(Tags,DRS),
  285   format(Stream,'id(~q,~p).~n',[Id,Index]),
  286   format(Stream,'sem(~p,',[Index]),
  287   printStuff(Tags,Stream,','),
  288   printStuff(DRS,Stream,').'),
  289   printBox(Stream,XDRS),
  290   nl(Stream).
  291
  292
  293/* ========================================================================
  294   Print DRG
  295======================================================================== */
  296
  297printXDRS(Stream,_Id,_Index,XDRS):-
  298   option('--semantics',drg), !,   
  299   XDRS = xdrs(_,Tuples),
  300   write_tuples(Tuples,Stream),
  301   nl(Stream).
  302
  303
  304/* ========================================================================
  305   Print FOL
  306======================================================================== */
  307
  308printXDRS(Stream,Id,Index,XDRS):-
  309   option('--semantics',fol), !,
  310   format(Stream,'id(~q,~p).~n',[Id,Index]),
  311   XDRS = xdrs(_Tags,FOL),
  312   numbervars(FOL,0,_),
  313   format(Stream,'fol(~p,',[Index]), 
  314   write_term(Stream,FOL,[numbervars(true),quoted(true)]),
  315   write(Stream,').'), nl(Stream).
  316
  317
  318/* ========================================================================
  319   Print Hobbs format
  320======================================================================== */
  321
  322printXDRS(Stream,Id,Index,XDRS):-
  323   option('--semantics',tacitus), !,
  324   format(Stream,'id(~q,~p).~n',[Id,Index]),
  325   XDRS = xdrs(Tags,TAC),
  326   printTags(Tags,Stream,''),
  327   printTAC(TAC,Stream).
  328
  329/* ========================================================================
  330   Print AMR format
  331======================================================================== */
  332
  333printXDRS(Stream,_,_,XDRS):-
  334   option('--semantics',amr), !,
  335   XDRS = xdrs(_,AMR),
  336   printAMR(AMR,Stream),
  337   nl(Stream).
  338
  339
  340/*========================================================================
  341   Print Box
  342========================================================================*/
  343
  344printBox(Stream,XDRS):-
  345   option('--box',true), 
  346   option('--format',xml), !,
  347   format(Stream,'~n<!-- ~n',[]),
  348   leftMargin(Margin),
  349   printDrs(Stream,XDRS,Margin),
  350   format(Stream,'--> ~n~n',[]).
  351
  352printBox(Stream,XDRS):-
  353   option('--box',true), !,
  354   nl(Stream),
  355   leftMargin(Margin), 
  356   printDrs(Stream,XDRS,Margin).
  357
  358printBox(_,_).
  359
  360
  361/* ========================================================================
  362   Left Margin (for DRS printing)
  363======================================================================== */
  364
  365leftMargin(Margin):- option('--format',prolog), !, Margin = '%%% '.
  366leftMargin(Margin):- option('--format',latex),  !, Margin = '%%% '.
  367leftMargin(Margin):- option('--format',dot),    !, Margin = '# '.
  368leftMargin(Margin):- Margin = ''.
  369
  370
  371/*========================================================================
  372   Print Utterance
  373========================================================================*/
  374
  375printUtterance(Stream,Words):-
  376   option('--semantics',amr), !,
  377   format(Stream,'# ',[]),
  378   printWords(Words,Stream),
  379   nl(Stream).
  380
  381printUtterance(Stream,Words):-
  382   option('--format',prolog), !,
  383   format(Stream,'%%% ',[]),
  384   printWords(Words,Stream),
  385   nl(Stream).
  386
  387printUtterance(Stream,Words):-
  388   option('--format',latex), !,
  389   write(Stream,'\\section*{'),
  390   printWords(Words,Stream),
  391   write(Stream,'}'), nl(Stream).
  392
  393printUtterance(Stream,Words):-
  394   option('--format',dot), !,
  395   format(Stream,'# ',[]),
  396   printWords(Words,Stream),
  397   nl(Stream).
  398
  399printUtterance(Stream,Words):-
  400   option('--format',xml), !,
  401   format(Stream,'<!-- ',[]),
  402   printWords(Words,Stream),
  403   format(Stream,'--> ~n~n',[]).
  404
  405printUtterance(Stream,Words):-
  406   option('--format',no), !,
  407   printWords(Words,Stream),
  408   nl(Stream).
  409
  410
  411/*========================================================================
  412   Print Words
  413========================================================================*/
  414
  415printWords([],_):- !.
  416
  417printWords([ID:[tok:Tok|R]|L],Stream):- 
  418   option('--format',xml),
  419   atom_concat('--',Rest,Tok), !,
  420   atom_concat('-',Rest,New),
  421   printWords([ID:[tok:New|R]|L],Stream).
  422
  423printWords([_ID:[tok:Tok|_]|L],Stream):- !,
  424   format(Stream,'~w ',[Tok]),
  425   printWords(L,Stream).
  426
  427printWords([_Unknown|L],Stream):- !,
  428   printWords(L,Stream).
  429
  430
  431/*========================================================================
  432   Print Stuff
  433========================================================================*/
  434
  435printStuff(Stuff,Stream,Closing):-
  436   numbervars(Stuff,1,_),
  437   write_term(Stream,Stuff,[numbervars(true),quoted(true)]),
  438   format(Stream,'~w',[Closing]).
  439
  440
  441/*========================================================================
  442   Print Tags
  443========================================================================*/
  444
  445printTags([],Stream,Ending):- 
  446   write(Stream,Ending). 
  447
  448printTags([ID:[T|Ags]|L],Stream,_):- !,
  449   write(Stream,ID), write(Stream,' '), 
  450   printTags([T|Ags],Stream,'\n'),
  451   printTags(L,Stream,'').
  452
  453printTags([_:V|L],Stream,Ending):- !,
  454   write(Stream,V), write(Stream,' '), 
  455   printTags(L,Stream,Ending)