2:- module(bindingViolation,[bindingViolationDrs/1,
3 noBindingViolationDrs/1]). 4
5:- use_module(library(lists),[member/2]). 6
7
11
12noBindingViolationDrs(B):- bindingViolationDrs(B), !, fail.
13noBindingViolationDrs(_).
14
15
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
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
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