2:- module(sdrt,[mergeSDRS/2]).    3
    4:- use_module(library(lists),[member/2,append/3]).    5 
    6
    7/* =========================================================================
    8   Subordinate SDRT relations
    9========================================================================= */
   10
   11subordinate(elaboration).
   12subordinate(instance).
   13subordinate(topic).
   14subordinate(explanation).
   15subordinate(precondition).
   16subordinate(commentary).
   17subordinate(correction).
   18
   19
   20/* =========================================================================
   21   Coordinate SDRT relations
   22========================================================================= */
   23
   24coordinate(continuation).
   25coordinate(narration).
   26coordinate(background).
   27coordinate(result).
   28
   29
   30/* =========================================================================
   31   Insert DRS into SDRS
   32========================================================================= */
   33
   34mergeSDRS(smerge(S1,S2,Rel,_Pops),S3):-
   35   subordinate(Rel), !,
   36   subDRS(S1,Rel,S2,S3).
   37
   38mergeSDRS(smerge(S1,S2,Rel,_Pops),S3):-
   39   coordinate(Rel), !,
   40   cooDRS(S1,Rel,S2,S3).
   41
   42
   43/* =========================================================================
   44   Insert subordinate DRS into SDRS
   45========================================================================= */
   46
   47% DRS + (S)DRS
   48%
   49subDRS(DRS,Rel,B2,SDRS):-
   50   member(DRS,[_:drs(_,_),alfa(_,_,_),merge(_,_)]), !,
   51   SDRS = sdrs([sub(lab(K1,DRS),lab(K2,B2))],[[]:rel(K1,K2,Rel)]).
   52
   53% SUB + (S)DRS
   54%
   55subDRS(sdrs([sub(L1,lab(L2,S1))],R),Rel,B,sdrs([sub(L1,lab(L2,S2))],R)):- !,
   56   subDRS(S1,Rel,B,S2).
   57
   58% Non-SUB + (S)DRS
   59%
   60subDRS(sdrs([lab(K1,B1)],R),Rel,B2,SDRS):- !,
   61   SDRS = sdrs([sub(lab(K1,B1),lab(K2,B2))],[[]:rel(K1,K2,Rel)|R]).
   62
   63% Recurse down to last label of first argument  
   64%
   65subDRS(sdrs([X|L1],R1),Rel,New,sdrs([X|L2],R2)):-
   66   subDRS(sdrs(L1,R1),Rel,New,sdrs(L2,R2)).
   67
   68
   69/* =========================================================================
   70   Insert coordinate DRS into SDRS
   71========================================================================= */
   72
   73% Make SDRSs of both DRSs (if needed)
   74%
   75cooDRS(B1,Rel,B2,S):- 
   76   member(B1,[_:_,merge(_,_),alfa(_,_,_)]), !, 
   77   cooDRS(sdrs([lab(_,B1)],[]),Rel,B2,S).
   78
   79cooDRS(B1,Rel,B2,S):- 
   80   member(B2,[_:_,merge(_,_),alfa(_,_,_)]), !, 
   81   cooDRS(B1,Rel,sdrs([lab(_,B2)],[]),S).
   82
   83% Non-SUB + Non-SUB
   84%
   85cooDRS(sdrs([lab(K1,B1)],R1),Rel,sdrs([lab(K2,B2)|L],R2),SDRS):- !,
   86   append(R1,[[]:rel(K1,K2,Rel)|R2],R3),
   87   SDRS = sdrs([lab(K1,B1),lab(K2,B2)|L],R3).
   88
   89% SUB (no pop)
   90%
   91cooDRS(sdrs([sub(B1,lab(K3,B3))],R),Rel,B2,sdrs([sub(B1,lab(K3,SDRS))],R)):- !,
   92   cooDRS(B3,Rel,B2,SDRS).
   93
   94% SUB (pop) + Non-SUB
   95%
   96cooDRS(sdrs([sub(lab(K1,B1),B3)],R1),Rel,sdrs([lab(K2,B2)|L],R2),SDRS):- !,
   97   append(R1,[[]:rel(K1,K2,Rel)|R2],R3),
   98   SDRS = sdrs([sub(lab(K1,B1),B3),lab(K2,B2)|L],R3).
   99
  100% SUB (pop) + SUB
  101%
  102cooDRS(sdrs([sub(lab(K1,B1),B3)],R1),Rel,sdrs([sub(lab(K2,B2),B4)|L],R2),SDRS):- !,
  103   append(R1,[[]:rel(K1,K2,Rel)|R2],R3),
  104   SDRS = sdrs([sub(lab(K1,B1),B3),sub(lab(K2,B2),B4)|L],R3).
  105
  106% Non-SUB + SUB
  107%
  108cooDRS(sdrs([lab(K1,B1)],R1),Rel,sdrs([sub(lab(K2,B2),B4)|L],R2),SDRS):- !,
  109   append(R1,[[]:rel(K1,K2,Rel)|R2],R3),
  110   SDRS = sdrs([lab(K1,B1),sub(lab(K2,B2),B4)|L],R3).
  111
  112% Recurse down to last label of first argument  
  113%
  114cooDRS(sdrs([X|L1],R1),Rel,New,sdrs([X|L2],R2)):- !,
  115   cooDRS(sdrs(L1,R1),Rel,New,sdrs(L2,R2))