3:- module(drs2fol,[pdrs2fol/2,drs2fol/2,symbol/4]).    4
    5
    6/*========================================================================
    7   Translate DRSs into FOL formulas 
    8========================================================================*/
    9
   10drs2fol(smerge(B1,B2),Form):- !, drs2fol(merge(B1,B2),Form).
   11
   12drs2fol(alfa(_,B1,B2),Form):- !, drs2fol(merge(B1,B2),Form).
   13
   14drs2fol(drs([],[Cond]),Formula):- !, cond2fol(Cond,Formula).
   15
   16drs2fol(drs([],[Cond1,Cond2|Conds]),and(Formula1,Formula2)):- !,
   17   cond2fol(Cond1,Formula1), drs2fol(drs([],[Cond2|Conds]),Formula2).
   18
   19drs2fol(drs([_:X|Referents],Conds),some(X,Formula)):- !,
   20   drs2fol(drs(Referents,Conds),Formula).
   21
   22drs2fol(merge(B1,B2),Form):- !, 
   23   drs2folGap(B1,Gap^Form), drs2fol(B2,Gap).
   24
   25drs2fol(X,_):-
   26   user:option('--warnings',true),
   27   format(user_error,'WARNING: drs2fol/2 failed for:~n~p~n',[X]), fail.
   28
   29
   30/*========================================================================
   31   Translate DRS into FOL formula with "gap"
   32
   33   This is to ensure that discourse referents in the LHS of a merge
   34   bind occurrences of DRSs in the RHS of a merge. 
   35========================================================================*/
   36
   37drs2folGap(smerge(B1,B2),Gap^F):- !, drs2folGap(merge(B1,B2),Gap^F).  
   38
   39drs2folGap(alfa(_,B1,B2),Gap^F):- !, drs2folGap(merge(B1,B2),Gap^F).  
   40
   41drs2folGap(merge(B1,B2),Gap2^F):- !, 
   42   drs2folGap(B1,Gap1^F), drs2folGap(B2,Gap2^Gap1).
   43
   44drs2folGap(drs([_:X|Dom],Conds),Gap^some(X,F)):- !, 
   45   drs2folGap(drs(Dom,Conds),Gap^F).
   46
   47drs2folGap(drs([],Conds),Gap^and(F,Gap)):-
   48   drs2fol(drs([],Conds),F).
   49
   50
   51/*========================================================================
   52   Translate DRS-Conditions into FOL formulas 
   53========================================================================*/
   54
   55cond2fol(_:C,F):- !,
   56   cond2fol(C,F).
   57
   58cond2fol(not(Drs),not(Formula)):- !,
   59   drs2fol(Drs,Formula).
   60 
   61cond2fol(prop(_,Drs),Formula):- !,
   62   drs2fol(Drs,Formula).
   63
   64cond2fol(or(Drs1,Drs2),or(Formula1,Formula2)):- !,
   65   drs2fol(Drs1,Formula1),
   66   drs2fol(Drs2,Formula2).
   67
   68cond2fol(whq(Drs1,Drs2),F):- !, 
   69   cond2fol(imp(Drs1,Drs2),F).
   70
   71cond2fol(whq(_,Drs1,_,Drs2),F):- !, 
   72   cond2fol(imp(Drs1,Drs2),F).
   73
   74cond2fol(imp(drs([],Conds),Drs2),imp(Formula1,Formula2)):- !,
   75   drs2fol(drs([],Conds),Formula1),
   76   drs2fol(Drs2,Formula2).
   77
   78cond2fol(imp(drs([_:X|Referents],Conds),Drs2),all(X,Formula)):- !,
   79   cond2fol(imp(drs(Referents,Conds),Drs2),Formula).
   80
   81%cond2fol(card(X,C1,T),card(X,C2,T)):-
   82%   symbol(C1,c,num,C2), !.
   83
   84cond2fol(card(X,C,_),some(Y,and(card(X,Y),and(F1,F2)))):-
   85   symbol(C,c,num,S1), 
   86   symbol(numeral,n,1,S2),
   87   F1=..[S1,Y],
   88   F2=..[S2,Y], !.
   89
   90cond2fol(named(X,N1,Type,Sense),F):-
   91   symbol(N1,Type,Sense,N2), !,
   92   F=..[N2,X].
   93
   94cond2fol(timex(X,D1),F):-
   95   timex(D1,D2),
   96   F=..[D2,X], !.
   97
   98cond2fol(eq(X,Y),eq(X,Y)):- 
   99   var(X), var(Y), !.
  100
  101cond2fol(pred(X,Sym1,Type,Sense),F):- 
  102   symbol(Sym1,Type,Sense,Sym2), !,
  103   F=..[Sym2,X].
  104
  105cond2fol(rel(X,Y,Sym1,Sense),F):- 
  106   symbol(Sym1,r,Sense,Sym2), !,
  107   F=..[Sym2,X,Y].
  108
  109cond2fol(X,_):-
  110   user:option('--warnings',true),
  111   format(user_error,'WARNING: cond2fol/2 failed for ~p~n',[X]), fail.
  112
  113
  114/*========================================================================
  115   Translate PDRSs into FOL formulas 
  116========================================================================*/
  117
  118pdrs2fol(drs([],[Cond]),Formula):- !,
  119   pcond2fol(Cond,Formula).
  120
  121pdrs2fol(drs([],[Cond1,Cond2|Conds]),and(Formula1,Formula2)):- !,
  122   pcond2fol(Cond1,Formula1),
  123   pdrs2fol(drs([],[Cond2|Conds]),Formula2).
  124
  125pdrs2fol(drs([_:X|Referents],Conds),some(X,and(some(Y,member(Y,X)),Formula))):- !,
  126   pdrs2fol(drs(Referents,Conds),Formula).
  127
  128pdrs2fol(X,_):-
  129   user:option('--warnings',true),
  130   format(user_error,'WARNING: drs2fol/2 failed for ~p~n',[X]), fail.
  131
  132
  133/*========================================================================
  134   Translate DRS-Conditions into FOL formulas 
  135========================================================================*/
  136
  137pcond2fol(_:C,F):- !,
  138   pcond2fol(C,F).
  139
  140pcond2fol(not(Drs),not(Formula)):- !,
  141   pdrs2fol(Drs,Formula).
  142 
  143pcond2fol(prop(_,Drs),Formula):- !,
  144   pdrs2fol(Drs,Formula).
  145
  146pcond2fol(or(Drs1,Drs2),or(Formula1,Formula2)):- !,
  147   pdrs2fol(Drs1,Formula1),
  148   pdrs2fol(Drs2,Formula2).
  149
  150pcond2fol(whq(Drs1,Drs2),F):- !, 
  151   pcond2fol(imp(Drs1,Drs2),F).
  152
  153pcond2fol(whq(_,Drs1,_,Drs2),F):- !, 
  154   pcond2fol(imp(Drs1,Drs2),F).
  155
  156pcond2fol(imp(drs([],Conds),Drs2),imp(Formula1,Formula2)):- !,
  157   pdrs2fol(drs([],Conds),Formula1),
  158   pdrs2fol(Drs2,Formula2).
  159
  160pcond2fol(imp(drs([_:X|Referents],Conds),Drs2),all(X,Formula)):- !,
  161   pcond2fol(imp(drs(Referents,Conds),Drs2),Formula).
  162
  163pcond2fol(card(X,1,eq),some(Y,and(member(Y,X),all(Z,imp(member(Z,X),eq(Z,Y)))))):- !.
  164
  165pcond2fol(card(X,2,ge),some(Y,and(member(Y,X),some(Z,and(member(Z,X),not(eq(Z,Y))))))):- !.
  166
  167pcond2fol(card(X,C1,T),card(X,C2,T)):-
  168   symbol(C1,p,0,C2), !.
  169
  170pcond2fol(named(X,N1,_,_),named(X,N2)):-
  171   symbol(N1,p,0,N2), !.
  172
  173pcond2fol(timex(X,D1),timex(X,D2)):-
  174   timex(D1,D2), !.
  175
  176pcond2fol(eq(X,Y),all(A,all(B,imp(and(member(A,X),member(B,Y)),eq(X,Y))))):- 
  177   var(X), var(Y), !.
  178
  179pcond2fol(pred(X,Sym1,Type,Sense),all(Y,imp(member(Y,X),F))):- 
  180   symbol(Sym1,Type,Sense,Sym2), !,
  181   F=..[Sym2,Y].
  182
  183pcond2fol(rel(X,Y,Sym1,Sense),all(A,all(B,imp(and(member(A,X),member(B,Y)),F)))):- 
  184   symbol(Sym1,r,Sense,Sym2), !,
  185   F=..[Sym2,A,B].
  186
  187pcond2fol(X,_):-
  188   user:option('--warnings',true),
  189   format(user_error,'WARNING: cond2fol/2 failed for ~p~n',[X]), 
  190   fail.
  191
  192
  193
  194/*========================================================================
  195   Ensure F is a number or atom
  196========================================================================*/
  197
  198symbol(F1,Cat,Sense,F2):- 
  199   var(Sense), !,
  200   symbol(F1,Cat,1,F2).
  201
  202symbol(F1,per,Sense,F2):- !,
  203   symbol(F1,p,Sense,F2).
  204
  205symbol(F1,loc,Sense,F2):-
  206   symbol(F1,l,Sense,F2).
  207
  208symbol(F1,org,Sense,F2):-
  209   symbol(F1,o,Sense,F2).
  210
  211symbol(F1,nam,Sense,F2):-
  212   symbol(F1,p,Sense,F2).
  213
  214symbol(F1,ttl,Sense,F2):-
  215   symbol(F1,p,Sense,F2).
  216
  217symbol(D,t,_Sense,F):- !,
  218   timex(D,F).
  219
  220symbol(F1,Type,0,F2):- !,
  221   symbol(F1,Type,1,F2).
  222
  223symbol(F1,Type,Sense,F2):- 
  224   (number(F1);atom(F1)),
  225   name(F1,A1),
  226   sym(A1,A2),
  227   name(Type,[T]),
  228   name(Sense,A3),
  229   append(A2,[95|A3],A4),
  230   name(F2,[T,95|A4]),  
  231   atom(F2), !.
  232
  233
  234sym([],[]).
  235
  236%%% exclamation mark
  237%%%
  238sym([33|L1],[101,120,99,108,97,109,97,116,105,111,110,109,97,114,107|L2]):- !,
  239   sym(L1,L2).
  240
  241%%% double quote
  242%%%
  243sym([34|L1],[100,111,117,98,108,101,113,117,111,116,101|L2]):- !,
  244   sym(L1,L2).
  245
  246%%% hekje
  247%%%
  248sym([35|L1],[104,101,107,106,101|L2]):- !,
  249   sym(L1,L2).
  250
  251%%% dollar
  252%%%
  253sym([36|L1],[100,111,108,108,97,114|L2]):- !,
  254   sym(L1,L2).
  255
  256%%% percent
  257%%%
  258sym([37|L1],[112,101,114,99,101,110,116|L2]):- !,
  259   sym(L1,L2).
  260
  261%%% ampersand
  262%%%
  263sym([38|L1],[97,109,112,101,114,115,97,110,100|L2]):- !,
  264   sym(L1,L2).
  265
  266%%% single quote
  267%%%
  268sym([39|L1],[115,105,110,103,108,101,113,117,111,116,101|L2]):- !,
  269   sym(L1,L2).
  270
  271sym([40|L1],[108,114,98|L2]):- !,
  272   sym(L1,L2).
  273
  274sym([41|L1],[114,114,98|L2]):- !,
  275   sym(L1,L2).
  276
  277%%% times
  278%%%
  279sym([42|L1],[116,105,109,101,115|L2]):- !,
  280   sym(L1,L2).
  281
  282%%% plus
  283%%%
  284sym([43|L1],[112,108,117,115|L2]):- !,
  285   sym(L1,L2).
  286
  287%%% comma
  288%%%
  289sym([44|L1],L2):- !,
  290   sym(L1,L2).
  291
  292%%% hyphen
  293%%%
  294sym([45|L1],[104,121,112,104,101,110|L2]):- !,
  295   sym(L1,L2).
  296
  297%%% full stop
  298%%%
  299sym([46|L1],L2):- !,
  300   sym(L1,L2).
  301
  302%%% forward slash
  303%%%
  304sym([47|L1],L2):- !,
  305   sym(L1,L2).
  306
  307%%% colon
  308%%%
  309sym([58|L1],[99,111,108,111,110|L2]):- !,
  310   sym(L1,L2).
  311
  312%%% semicolon
  313%%%
  314sym([59|L1],[115,101,109,105,99,111,108,111,110|L2]):- !,
  315   sym(L1,L2).
  316
  317%%% @
  318%%%
  319sym([64|L1],[97,116|L2]):- !,
  320   sym(L1,L2).
  321
  322
  323sym([91|L1],[108,114,98|L2]):- !,
  324   sym(L1,L2).
  325
  326%%% backward slash
  327%%%
  328sym([92|L1],L2):- !,
  329   sym(L1,L2).
  330
  331sym([93|L1],[114,114,98|L2]):- !,
  332   sym(L1,L2).
  333
  334sym([123|L1],[108,114,98|L2]):- !,
  335   sym(L1,L2).
  336
  337%%% |
  338%%%
  339sym([124|L1],L2):- !,
  340   sym(L1,L2).
  341
  342sym([125|L1],[114,114,98|L2]):- !,
  343   sym(L1,L2).
  344
  345sym([X|L1],[Y|L2]):- 
  346   X > 64, X < 91, !,
  347   Y is X + 32,
  348  sym(L1,L2).
  349
  350sym([X|L1],[X|L2]):- 
  351  sym(L1,L2).
  352
  353
  354/*========================================================================
  355   Time Expressions
  356========================================================================*/
  357
  358timex(date(_:_,_:Y,_:M,_:D),Timex):- !,
  359   timex(date(Y,M,D),Timex).
  360
  361timex(date(_:Y,_:M,_:D),Timex):- !,
  362   timex(date(Y,M,D),Timex).
  363
  364timex(time(_:H,_:M,_:S),Timex):- !,
  365   timex(time(H,M,S),Timex).
  366
  367timex(date(Y,M,D),Timex):-
  368   year(Y,[Y1,Y2,Y3,Y4]),
  369   month(M,[M1,M2]),
  370   day(D,[D1,D2]),
  371   name(Timex,[116,95,Y1,Y2,Y3,Y4,M1,M2,D1,D2]).
  372
  373timex(time(H,M,S),Timex):-
  374   hour(H,[H1,H2]),
  375   minute(M,[M1,M2]),
  376   second(S,[S1,S2]),
  377   name(Timex,[116,95,H1,H2,M1,M2,S1,S2]).
  378
  379year(Y,C):- var(Y), !, name('XXXX',C).
  380year(Y,C):- name(Y,C).
  381
  382month(Y,C):- var(Y), !, name('XX',C).
  383month(Y,C):- name(Y,C).
  384
  385day(Y,C):- var(Y), !, name('XX',C).
  386day(Y,C):- name(Y,C).
  387
  388hour(A,C):- day(A,C).
  389minute(A,C):- day(A,C).
  390second(A,C):- day(A,C)