2:- module(mergeDRT,[mergeDrs/2]).    3
    4:- use_module(library(lists),[member/2,append/3]).    5:- use_module(boxer(noncomp),[noncomp/3]).    6
    7
    8/* ========================================================================
    9   Merge reduction
   10======================================================================== */
   11
   12mergeDrs(Var,Var):- var(Var), !.
   13
   14mergeDrs(lab(K,B),lab(K,R)):- !,
   15   mergeDrs(B,R).
   16
   17mergeDrs(sdrs([],C),sdrs([],C)):- !.
   18
   19mergeDrs(sdrs([sub(B1,B2)|L1],C1),sdrs([sub(R1,R2)|L2],C2)):- !,
   20   mergeDrs(B1,R1),
   21   mergeDrs(B2,R2),
   22   mergeDrs(sdrs(L1,C1),sdrs(L2,C2)).
   23
   24mergeDrs(sdrs([lab(K2,sdrs([sub(lab(K2,B2),B3)],C1))|L],C2),R):- !,
   25   append(C1,C2,C3),
   26   mergeDrs(sdrs([sub(lab(K2,B2),B3)|L],C3),R).
   27
   28mergeDrs(sdrs([lab(K2,sdrs([lab(K2,B2)],C1))|L],C2),R):- !,
   29   append(C1,C2,C3),
   30   mergeDrs(sdrs([lab(K2,B2)|L],C3),R).
   31
   32mergeDrs(sdrs([lab(K,B)|L1],C1),sdrs([lab(K,R)|L2],C2)):- !,
   33   mergeDrs(B,R),
   34   mergeDrs(sdrs(L1,C1),sdrs(L2,C2)).
   35
   36mergeDrs(B,R):- 
   37   pnf(B,P), 
   38   reduceMerge(P,R).
   39
   40
   41/* ========================================================================
   42   Merge reduction
   43======================================================================== */
   44
   45% Cannot reduce a variable
   46%
   47reduceMerge(Var,Var):- var(Var), !.
   48
   49% Cannot reduce if one the arguments is a variable
   50%
   51reduceMerge(merge(Var,B),merge(Var,R)):- var(Var), !, reduceMerge(B,R). 
   52reduceMerge(merge(B,Var),merge(R,Var)):- var(Var), !, reduceMerge(B,R). 
   53reduceMerge(alfa(T,Var,B),alfa(T,Var,R)):- var(Var), !, reduceMerge(B,R). 
   54reduceMerge(alfa(T,B,Var),alfa(T,R,Var)):- var(Var), !, reduceMerge(B,R). 
   55
   56% Reduce if both are basic DRSs
   57%
   58reduceMerge(merge(B:B1,B:B2),B:B3):- !,
   59   merge(B1,B2,B3).
   60
   61reduceMerge(alfa(_,_:B1,B:B2),B:B3):-  !,
   62   merge(B1,B2,B3).
   63
   64% Reduce if basic DRS and SDRS
   65%
   66reduceMerge(merge(K1:B1,sdrs([lab(K,B2)|L],R)),SDRS):- !,
   67   mergeDrs(sdrs([lab(K,merge(K1:B1,B2))|L],R),SDRS).
   68
   69reduceMerge(merge(K1:B1,sdrs([sub(lab(K,B2),B3)|L],R)),SDRS):- !,
   70   mergeDrs(sdrs([sub(lab(K,merge(K1:B1,B2)),B3)|L],R),SDRS).
   71
   72reduceMerge(merge(sdrs([lab(K,K1)],R),B2),SDRS):- !,
   73   mergeDrs(sdrs([lab(K,merge(K1,B2))],R),SDRS).
   74
   75reduceMerge(merge(sdrs([sub(lab(K,K1),B3)],R),B2),SDRS):- !,
   76   mergeDrs(sdrs([sub(lab(K,merge(K1,B2)),B3)],R),SDRS).
   77
   78reduceMerge(merge(sdrs([X|L1],R1),B),sdrs([X|L2],R2)):- !,
   79   reduceMerge(merge(sdrs(L1,R1),B),sdrs(L2,R2)).
   80
   81reduceMerge(alfa(T,K1:B1,sdrs([lab(K,B2)|L],R)),SDRS):- !,
   82   mergeDrs(sdrs([lab(K,alfa(T,K1:B1,B2))|L],R),SDRS).
   83
   84reduceMerge(alfa(T,K1:B1,sdrs([sub(lab(K,B2),B3)|L],R)),SDRS):- !,
   85   mergeDrs(sdrs([sub(lab(K,alfa(T,K1:B1,B2)),B3)|L],R),SDRS).
   86
   87reduceMerge(alfa(T,sdrs([lab(K,K1:B1)],R),B2),SDRS):- !,
   88   mergeDrs(sdrs([lab(K,alfa(T,K1:B1,B2))],R),SDRS).
   89
   90reduceMerge(alfa(T,sdrs([sub(lab(K,K1),B3)],R),B2),SDRS):- !,
   91   mergeDrs(sdrs([sub(lab(K,alfa(T,K1,B2)),B3)],R),SDRS).
   92
   93% Recursive case 
   94%
   95reduceMerge(merge(B:B1,merge(B:B2,K)),Reduced):- !,
   96   merge(B1,B2,B3),
   97   reduceMerge(merge(B:B3,K),Reduced).
   98
   99reduceMerge(alfa(_,_:B1,merge(B:B2,K)),Reduced):- !,
  100   merge(B1,B2,B3),
  101   reduceMerge(merge(B:B3,K),Reduced).
  102
  103reduceMerge(merge(B:B1,alfa(_,_:B2,K)),Reduced):- !,
  104   merge(B1,B2,B3),
  105   reduceMerge(merge(B:B3,K),Reduced).
  106
  107reduceMerge(alfa(_,_:B1,alfa(T,B:B2,K)),Reduced):- !,
  108   merge(B1,B2,B3),
  109   reduceMerge(alfa(T,B:B3,K),Reduced).
  110
  111reduceMerge(merge(B:B1,merge(sdrs([lab(K,B:B2)|L],R),M)),Reduced):- !,
  112   merge(B1,B2,B3),
  113   reduceMerge(merge(sdrs([lab(K,B:B3)|L],R),M),Reduced).
  114
  115reduceMerge(alfa(_,_:B1,merge(sdrs([lab(K,B:B2)|L],R),M)),Reduced):- !,
  116   merge(B1,B2,B3),
  117   reduceMerge(merge(sdrs([lab(K,B:B3)|L],R),M),Reduced).
  118
  119reduceMerge(alfa(_,_:B1,alfa(T,sdrs([lab(K,B:B2)|L],R),M)),Reduced):- !,
  120   merge(B1,B2,B3),
  121   reduceMerge(alfa(T,sdrs([lab(K,B:B3)|L],R),M),Reduced).
  122
  123reduceMerge(merge(B:B1,merge(sdrs([sub(lab(K,B:B2),B4)|L],R),M)),Reduced):- !,
  124   merge(B1,B2,B3),
  125   reduceMerge(merge(sdrs([sub(lab(K,B:B3),B4)|L],R),M),Reduced).
  126
  127reduceMerge(alfa(_,_:B1,merge(sdrs([sub(lab(K,B:B2),B4)|L],R),M)),Reduced):- !,
  128   merge(B1,B2,B3),
  129   reduceMerge(merge(sdrs([sub(lab(K,B:B3),B4)|L],R),M),Reduced).
  130
  131reduceMerge(alfa(_,_:B1,alfa(T,sdrs([sub(lab(K,B:B2),B4)|L],R),M)),Reduced):- !,
  132   merge(B1,B2,B3),
  133   reduceMerge(alfa(T,sdrs([sub(lab(K,B:B3),B4)|L],R),M),Reduced).
  134
  135reduceMerge(B:drs(D,C1),B:drs(D,C2)):- !, mergeConds(C1,C2).
  136
  137reduceMerge(M,M).
  138
  139
  140/* ========================================================================
  141   Projection Normal Form
  142======================================================================== */
  143
  144pnf(Var,Var):- var(Var), !.
  145pnf(alfa(T1,alfa(T2,B1,B2),B3),alfa(T2,N1,N2)):- !, pnf(B1,N1), pnf(alfa(T1,B2,B3),N2).
  146pnf(merge(Var,B),merge(Var,B)):- var(Var), !.
  147pnf(alfa(T,Var,B),alfa(T,Var,B)):- var(Var), !.
  148pnf(merge(merge(B1,B2),B3),merge(N1,N2)):- !, pnf(B1,N1), pnf(merge(B2,B3),N2).
  149pnf(merge(alfa(T,B1,B2),B3),alfa(T,N1,N2)):- !, pnf(B1,N1), pnf(merge(B2,B3),N2).
  150pnf(merge(B1,B2),merge(B1,R2)):- !, pnf(B2,R2).
  151pnf(alfa(T,B1,B2),alfa(T,R1,R2)):- !, pnf(B1,R1), pnf(B2,R2).
  152pnf(B,B).
  153
  154
  155/*========================================================================
  156   DRS-merge (Conditions)
  157========================================================================*/
  158
  159mergeConds([B:F:Cond1|C1],[B:F:Cond2|C2]):- !,
  160   mergeConds([Cond1|C1],[Cond2|C2]).
  161
  162mergeConds([F:Cond1|C1],[F:Cond2|C2]):- !,
  163   mergeConds([Cond1|C1],[Cond2|C2]).
  164
  165mergeConds([imp(B1,B2)|C1],[imp(B3,B4)|C2]):- !,
  166   mergeDrs(B1,B3),
  167   mergeDrs(B2,B4),
  168   mergeConds(C1,C2).
  169
  170mergeConds([duplex(Type,B1,Var,B2)|C1],[duplex(Type,B3,Var,B4)|C2]):- !,
  171   mergeDrs(B1,B3),
  172   mergeDrs(B2,B4),
  173   mergeConds(C1,C2).
  174
  175mergeConds([or(B1,B2)|C1],[or(B3,B4)|C2]):- !,
  176   mergeDrs(B1,B3),
  177   mergeDrs(B2,B4),
  178   mergeConds(C1,C2).
  179
  180mergeConds([not(B1)|C1],[not(B2)|C2]):- !,
  181   mergeDrs(B1,B2),
  182   mergeConds(C1,C2).
  183
  184mergeConds([nec(B1)|C1],[nec(B2)|C2]):- !,
  185   mergeDrs(B1,B2),
  186   mergeConds(C1,C2).
  187
  188mergeConds([pos(B1)|C1],[pos(B2)|C2]):- !,
  189   mergeDrs(B1,B2),
  190   mergeConds(C1,C2).
  191
  192mergeConds([prop(X,B1)|C1],[prop(X,B2)|C2]):- !,
  193   mergeDrs(B1,B2),
  194   mergeConds(C1,C2).
  195
  196mergeConds([pred(A,B,C,D)|C1],[pred(A,B,C,D)|C2]):- !,
  197   mergeConds(C1,C2).
  198
  199mergeConds([rel(A,B,C,D)|C1],[rel(A,B,C,D)|C2]):- !,
  200   mergeConds(C1,C2).
  201
  202mergeConds([role(A,B,C,D)|C1],[role(A,B,C,D)|C2]):- !,
  203   mergeConds(C1,C2).
  204
  205mergeConds([card(A,S,T)|C1],[card(A,S,T)|C2]):- !,
  206   mergeConds(C1,C2).
  207
  208mergeConds([named(A,S,T,U)|C1],[named(A,S,T,U)|C2]):- !,
  209   mergeConds(C1,C2).
  210
  211mergeConds([timex(A,S)|C1],[timex(A,S)|C2]):- !,
  212   mergeConds(C1,C2).
  213
  214mergeConds([eq(X,Y)|C1],[eq(X,Y)|C2]):- !,
  215   mergeConds(C1,C2).
  216
  217mergeConds([],[]).
  218
  219
  220/* ========================================================================
  221   Merge
  222======================================================================== */
  223
  224merge(drs([],[C1]),drs(D,[C2|L]),drs(D,[C3|L])):- noncomp(C1,C2,C3), !.
  225merge(drs(D1,C1),drs(D2,C2),drs(D3,C3)):- !, merge(D1,D2,D3), merge(C1,C2,C3).
  226merge([],L,L):- !.
  227merge([X|L1],L2,L3):- member(Y,L2), X==Y, !, merge(L1,L2,L3).
  228merge([X|L1],L2,[X|L3]):- merge(L1,L2,L3)