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