2:- module(bindingViolation,[bindingViolationDrs/1,
    3                            noBindingViolationDrs/1]).    4
    5:- use_module(library(lists),[member/2]).    6
    7
    8/*========================================================================
    9   Succeeds if there is no binding violation in a DRS
   10========================================================================*/
   11
   12noBindingViolationDrs(B):- bindingViolationDrs(B), !, fail.
   13noBindingViolationDrs(_).
   14
   15
   16/*========================================================================
   17   Succeeds if there is a binding violation in a DRS
   18========================================================================*/
   19
   20bindingViolationDrs(sdrs([B|_],_)):- bindingViolationDrs(B), !.
   21bindingViolationDrs(sdrs([_|L],R)):- !, bindingViolationDrs(sdrs(L,R)).
   22
   23bindingViolationDrs(lab(_,B)):- !, bindingViolationDrs(B).
   24
   25bindingViolationDrs(_:drs(_,C)):- !, bindingViolationConds(C).
   26
   27bindingViolationDrs(merge(B,_)):- bindingViolationDrs(B), !.
   28bindingViolationDrs(merge(_,B)):- !, bindingViolationDrs(B).
   29
   30bindingViolationDrs(sub(B,_)):- bindingViolationDrs(B), !.
   31bindingViolationDrs(sub(_,B)):- !, bindingViolationDrs(B).
   32
   33bindingViolationDrs(alfa(_,B,_)):- bindingViolationDrs(B), !.
   34bindingViolationDrs(alfa(_,_,B)):- !, bindingViolationDrs(B).
   35
   36bindingViolationDrs([B|_]):- bindingViolationDrs(B), !.
   37bindingViolationDrs([_|L]):- !, bindingViolationDrs(L).
   38
   39
   40/*========================================================================
   41   Succeeds if there is a binding violation in a set of DRS condition
   42========================================================================*/
   43
   44bindingViolationConds(Conds):- 
   45   member(_:_:role(E1,X1,Role1,1),Conds),
   46   member(_:_:role(E2,X2,Role2,1),Conds), 
   47   \+ Role1=Role2,
   48   E1==E2, X1==X2, !.
   49
   50bindingViolationConds(Conds):- 
   51   member(_:_:role(X1,E1,Role1,-1),Conds),
   52   member(_:_:role(E2,X2,Role2,1),Conds), 
   53   \+ Role1=Role2,
   54   E1==E2, X1==X2, !.
   55
   56bindingViolationConds(Conds):- 
   57   member(_:_:role(X1,E1,Role1,-1),Conds),
   58   member(_:_:role(X2,E2,Role2,-1),Conds), 
   59   \+ Role1=Role2,
   60   E1==E2, X1==X2, !.
   61
   62bindingViolationConds(Conds):- 
   63   member(_:_:Cond,Conds), 
   64   bindingViolationCond(Cond), !.
   65
   66
   67/*========================================================================
   68   Succeeds if there is a binding violation in a DRS condition
   69========================================================================*/
   70
   71bindingViolationCond(not(drs([],[_:_:eq(X,Y)]))):- !, X==Y.
   72
   73bindingViolationCond(not(B)):- !, bindingViolationDrs(B).
   74bindingViolationCond(nec(B)):- !, bindingViolationDrs(B).
   75bindingViolationCond(pos(B)):- !, bindingViolationDrs(B).
   76
   77bindingViolationCond(prop(_,B)):- !, bindingViolationDrs(B).
   78
   79bindingViolationCond(imp(B,_)):- bindingViolationDrs(B), !.
   80bindingViolationCond(imp(_,B)):- !, bindingViolationDrs(B).
   81
   82bindingViolationCond(or(B,_)):- bindingViolationDrs(B), !.
   83bindingViolationCond(or(_,B)):- !, bindingViolationDrs(B).
   84
   85bindingViolationCond(duplex(_,B,_,_)):- bindingViolationDrs(B), !.
   86bindingViolationCond(duplex(_,_,_,B)):- !, bindingViolationDrs(B).
   87
   88bindingViolationCond(rel(X,Y,_,_)):- !, X==Y.
   89bindingViolationCond(role(X,Y,_,_)):- !, X==Y