2:- module(pdrs2drs,[pdrs2drs/2]).    3
    4%:- use_module(semlib(errors),[warning/2]).
    5%:- use_module(semlib(options),[option/2]).
    6:- use_module(library(lists),[select/3,append/3]).    7
    8
    9/* ========================================================================
   10    Main Predicate
   11======================================================================== */
   12
   13pdrs2drs(PDRS,DRS):-
   14   pdrs2drs(PDRS,[dom(g):[]-D,con(g):[]-C],Projected,B),
   15   G = drs(D,C),
   16   accommodate(Projected),
   17   ( G = drs([],[]), !, DRS = B; DRS = merge(G,B) ).
   18
   19
   20/* ========================================================================
   21   Accommodation
   22======================================================================== */
   23
   24accommodate([]):- !.
   25accommodate([dom(_):X-X|L]):- !, accommodate(L).
   26accommodate([con(_):X-X|L]):- !, accommodate(L).
   27
   28
   29/* ========================================================================
   30   Translate PDRSs into DRSs
   31======================================================================== */
   32
   33pdrs2drs(lab(X,B1),G1,G2,lab(X,B2)):- !,
   34   pdrs2drs(B1,G1,G2,B2).
   35
   36pdrs2drs(sub(B1,B2),G1,G3,sub(B3,B4)):- !,
   37   pdrs2drs(B1,G1,G2,B3),
   38   pdrs2drs(B2,G2,G3,B4).
   39
   40pdrs2drs(merge(B1,B2),G1,G3,merge(B3,B4)):- !,
   41   pdrs2drs(B1,G1,G2,B3),
   42   pdrs2drs(B2,G2,G3,B4).
   43
   44pdrs2drs(alfa(T,B1,B2),G1,G3,alfa(T,B3,B4)):- !,
   45   pdrs2drs(B1,G1,G2,B3),
   46   pdrs2drs(B2,G2,G3,B4).
   47
   48pdrs2drs(B:drs(D1,C1),G1,G3,drs(D2,C2)):- !,
   49   dom2drs(D1,[dom(B):[]-D2|G1],G2),
   50   cons2drs(C1,[con(B):[]-C2|G2],G3).
   51
   52pdrs2drs(sdrs(S1,C),G1,G2,sdrs(S2,C)):- !,
   53   pdrs2drs(S1,G1,G2,S2).
   54
   55pdrs2drs([B1|L1],G1,G3,[B2|L2]):- !,
   56   pdrs2drs(B1,G1,G2,B2),
   57   pdrs2drs(L1,G2,G3,L2).
   58
   59pdrs2drs([],G,G,[]):- !.
   60
   61
   62/* ========================================================================
   63   Project Domains
   64======================================================================== */
   65
   66dom2drs([],G,G).
   67
   68dom2drs([B1:Ind1:Ref1|L],G1,G3):-                 
   69   select(dom(B1),G1,G2,dom(B2):D1-D2),
   70   select(Ind2:Ref2,D1,D3), Ref1 == Ref2, !,
   71   append(Ind1,Ind2,Ind),
   72   dom2drs(L,[dom(B2):[Ind:Ref1|D3]-D2|G2],G3).  
   73
   74dom2drs([B1:Ind:Ref|L],G1,G3):-                 
   75   select(dom(B1),G1,G2,dom(B2):D1-D2),
   76   dom2drs(L,[dom(B2):[Ind:Ref|D1]-D2|G2],G3).  
   77
   78
   79/* ========================================================================
   80   Project Conditions
   81======================================================================== */
   82
   83cons2drs([],G,G).
   84
   85cons2drs([B1:Ind1:Con1|L],G1,G4):-        
   86   con2drs(Con1,G1,G2,Con2),
   87   select(con(B1),G2,G3,con(B2):C1-C2), 
   88   select(Ind2:Con3,C1,C3), Con2 == Con3, !,
   89   append(Ind1,Ind2,Ind),
   90   cons2drs(L,[con(B2):[Ind:Con2|C3]-C2|G3],G4).  
   91
   92cons2drs([B1:Ind:Con1|L],G1,G4):-        
   93   con2drs(Con1,G1,G2,Con2),
   94   select(con(B1),G2,G3,con(B2):C1-C2), 
   95   cons2drs(L,[con(B2):[Ind:Con2|C1]-C2|G3],G4).  
   96
   97
   98/* ========================================================================
   99   Project Condition
  100======================================================================== */ 
  101
  102con2drs(not(B1),G1,G2,not(B2)):- !,
  103   pdrs2drs(B1,G1,G2,B2).
  104
  105con2drs(pos(B1),G1,G2,pos(B2)):- !,
  106   pdrs2drs(B1,G1,G2,B2).
  107
  108con2drs(nec(B1),G1,G2,nec(B2)):- !,
  109   pdrs2drs(B1,G1,G2,B2).
  110 
  111con2drs(prop(X,B1),G1,G2,prop(X,B2)):- !,
  112   pdrs2drs(B1,G1,G2,B2).
  113
  114con2drs(or(B1,B2),G1,G3,or(B3,B4)):- !,
  115   pdrs2drs(B1,G1,G2,B3),
  116   pdrs2drs(B2,G2,G3,B4).
  117
  118con2drs(imp(B1,B2),G1,G3,imp(B3,B4)):- !,
  119   pdrs2drs(B1,G1,G2,B3),
  120   pdrs2drs(B2,G2,G3,B4).
  121
  122con2drs(whq(B1,B2),G1,G3,whq(B3,B4)):- !,
  123   pdrs2drs(B1,G1,G2,B3),
  124   pdrs2drs(B2,G2,G3,B4).
  125
  126con2drs(duplex(X,B1,Y,B2),G1,G3,duplex(X,B3,Y,B4)):- !,
  127   pdrs2drs(B1,G1,G2,B3),
  128   pdrs2drs(B2,G2,G3,B4).
  129
  130con2drs(role(X,Y,Rel,1),G,G,rel(X,Y,Rel,0)):- !.
  131
  132con2drs(role(X,Y,Rel,-1),G,G,rel(Y,X,Rel,0)):- !.
  133
  134con2drs(C,G,G,C).
  135
  136
  137/* ========================================================================
  138   Select Domain
  139======================================================================== */
  140
  141select(dom(B1),G1,G2,dom(B1):C1-C2):- 
  142   select(dom(B2):C1-C2,G1,G2), B1==B2, !. 
  143
  144select(dom(_),G1,G2,dom(g):C1-C2):- 
  145   select(dom(B):C1-C2,G1,G2), B==g, !.
  146
  147
  148/* ========================================================================
  149   Select Conditions
  150======================================================================== */
  151
  152select(con(B1),G1,G2,con(B1):C1-C2):- 
  153   select(con(B2):C1-C2,G1,G2), B1==B2, !. 
  154
  155select(con(_),G1,G2,con(g):C1-C2):- 
  156   select(con(B):C1-C2,G1,G2), B==g, !