3 class AbstractInterferes {
4 static public boolean interferes(AbstractRepair ar, Rule r, boolean satisfy) {
6 boolean mayremove=false;
7 switch (ar.getType()) {
8 case AbstractRepair.ADDTOSET:
9 case AbstractRepair.ADDTORELATION:
10 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
14 case AbstractRepair.REMOVEFROMSET:
15 case AbstractRepair.REMOVEFROMRELATION:
16 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
20 case AbstractRepair.MODIFYRELATION:
21 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
23 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
29 throw new Error("Unrecognized Abstract Repair");
33 drule=r.getDNFGuardExpr();
35 drule=r.getDNFNegGuardExpr();
37 for(int i=0;i<drule.size();i++) {
38 RuleConjunction rconj=drule.get(i);
39 for(int j=0;j<rconj.size();j++) {
40 DNFExpr dexpr=rconj.get(j);
41 Expr expr=dexpr.getExpr();
42 if (expr.usesDescriptor(ar.getDescriptor())) {
44 if ((mayadd&&!dexpr.getNegation())||(mayremove&&dexpr.getNegation()))
53 static public boolean interferes(AbstractRepair ar, DNFPredicate dp) {
54 if ((ar.getDescriptor()!=dp.getPredicate().getDescriptor()) &&
55 ((ar.getDescriptor() instanceof SetDescriptor)||
56 !dp.getPredicate().usesDescriptor((RelationDescriptor)ar.getDescriptor())))
59 /* This if handles all the c comparisons in the paper */
60 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
61 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
62 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
63 (dp.getPredicate() instanceof ExprPredicate)&&
64 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
65 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
66 boolean neg1=ar.getPredicate().isNegated();
67 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
68 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).leftsize();
69 boolean neg2=dp.isNegated();
70 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
71 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
72 if ((!neg1&&((op1==Opcode.EQ)||(op1==Opcode.NE)||(op1==Opcode.GT)||op1==Opcode.GE))||
73 (neg1&&((op1==Opcode.EQ)||(op1==Opcode.NE)||(op1==Opcode.LT)||op1==Opcode.LE))) {
76 if((op1==Opcode.EQ)||(op1==Opcode.GE))
78 if((op1==Opcode.GT)||(op1==Opcode.NE))
82 if((op1==Opcode.EQ)||(op1==Opcode.LE))
84 if((op1==Opcode.LT)||(op1==Opcode.NE))
87 if ((!neg2&&(op2==Opcode.EQ)&&(size1a==size2))||
88 (neg2&&(op2==Opcode.EQ)&&(size1a!=size2))||
89 (!neg2&&(op2==Opcode.NE)&&(size1a!=size2))||
90 (neg2&&(op2==Opcode.NE)&&(size1a==size2))||
91 (!neg2&&(op2==Opcode.GE))||
92 (!neg2&&(op2==Opcode.GT))||
93 (neg2&&(op2==Opcode.LE))||
94 (neg2&&(op2==Opcode.LT))||
95 (neg2&&(op2==Opcode.GE)&&(size1a<size2))||
96 (neg2&&(op2==Opcode.GT)&&(size1a<=size2))||
97 (!neg2&&(op2==Opcode.LE)&&(size1a<=size2))||
98 (!neg2&&(op2==Opcode.LT)&&(size1a<size2)))
103 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
104 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
105 (dp.getPredicate() instanceof ExprPredicate)&&
106 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
107 boolean neg2=dp.isNegated();
108 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
109 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
110 if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))||
111 (neg2&&(op2==Opcode.NE)&&(size2==0))||
112 (!neg2&&(op2==Opcode.GE))||
113 (!neg2&&(op2==Opcode.GT))||
114 (neg2&&(op2==Opcode.LE))||
115 (neg2&&(op2==Opcode.LT)))
119 /* This handles all the c comparisons in the paper */
120 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
121 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
122 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
123 (dp.getPredicate() instanceof ExprPredicate)&&
124 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
125 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
126 boolean neg1=ar.getPredicate().isNegated();
127 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
128 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).leftsize();
129 boolean neg2=dp.isNegated();
130 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
131 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
132 if ((!neg1&&((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE))||
133 (neg1&&((op1==Opcode.EQ)||(op1==Opcode.GT)||op1==Opcode.GE)||(op1==Opcode.NE))) {
136 if((op1==Opcode.EQ)||(op1==Opcode.GE))
138 if((op1==Opcode.GT)||(op1==Opcode.NE))
142 if((op1==Opcode.EQ)||(op1==Opcode.LE))
144 if((op1==Opcode.LT)||(op1==Opcode.NE))
147 if ((!neg2&&(op2==Opcode.EQ)&&(size1a==size2))||
148 (neg2&&(op2==Opcode.EQ)&&(size1a!=size2))||
149 (!neg2&&(op2==Opcode.NE)&&(size1a!=size2))||
150 (neg2&&(op2==Opcode.NE)&&(size1a==size2))||
151 (neg2&&(op2==Opcode.GE))||
152 (neg2&&(op2==Opcode.GT))||
153 (!neg2&&(op2==Opcode.LE))||
154 (!neg2&&(op2==Opcode.LT))||
155 (!neg2&&(op2==Opcode.GE)&&(size1a>=size2))||
156 (!neg2&&(op2==Opcode.GT)&&(size1a>size2))||
157 (neg2&&(op2==Opcode.LE)&&(size1a>size2))||
158 (neg2&&(op2==Opcode.LT)&&(size1a>=size2)))
163 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
164 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
165 (dp.getPredicate() instanceof ExprPredicate)&&
166 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
167 boolean neg2=dp.isNegated();
168 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
169 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
170 if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))||
171 (neg2&&(op2==Opcode.NE)&&(size2==0))||
172 (neg2&&(op2==Opcode.GE))||
173 (neg2&&(op2==Opcode.GT))||
174 (!neg2&&(op2==Opcode.LE))||
175 (!neg2&&(op2==Opcode.LT)))
179 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
180 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
181 (dp.getPredicate() instanceof InclusionPredicate)&&
182 (dp.isNegated()==false))
183 return false; /* Could only satisfy this predicate */
185 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
186 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
187 (dp.getPredicate() instanceof InclusionPredicate)&&
188 (dp.isNegated()==true))
189 return false; /* Could only satisfy this predicate */
194 static public boolean interferes(Descriptor des, boolean satisfy, DNFPredicate dp) {
195 if ((des!=dp.getPredicate().getDescriptor()) &&
196 ((des instanceof SetDescriptor)||
197 !dp.getPredicate().usesDescriptor((RelationDescriptor)des)))
200 /* This if handles all the c comparisons in the paper */
201 if (des==dp.getPredicate().getDescriptor()&&
203 (dp.getPredicate() instanceof ExprPredicate)&&
204 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
205 boolean neg2=dp.isNegated();
206 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
207 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
209 if ((!neg2&&(op2==Opcode.GE))||
210 (!neg2&&(op2==Opcode.GT))||
211 (neg2&&(op2==Opcode.EQ)&&(size2==0))||
212 (!neg2&&(op2==Opcode.NE)&&(size2==0))||
213 (neg2&&(op2==Opcode.LE))||
214 (neg2&&(op2==Opcode.LT)))
218 /* This if handles all the c comparisons in the paper */
219 if (des==dp.getPredicate().getDescriptor()&&
221 (dp.getPredicate() instanceof ExprPredicate)&&
222 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
223 boolean neg2=dp.isNegated();
224 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
225 int size2=((ExprPredicate)dp.getPredicate()).leftsize();
227 if ((neg2&&(op2==Opcode.GE))||
228 (neg2&&(op2==Opcode.GT))||
229 (!neg2&&(op2==Opcode.EQ)&&(size2==0))||
230 (neg2&&(op2==Opcode.NE)&&(size2==0))||
231 (!neg2&&(op2==Opcode.LE))||
232 (!neg2&&(op2==Opcode.LT)))
236 if ((des==dp.getPredicate().getDescriptor())&&
238 (dp.getPredicate() instanceof InclusionPredicate)&&
239 (dp.isNegated()==false))
240 return false; /* Could only satisfy this predicate */
242 if ((des==dp.getPredicate().getDescriptor())&&
244 (dp.getPredicate() instanceof InclusionPredicate)&&
245 (dp.isNegated()==true))
246 return false; /* Could only satisfy this predicate */
251 static public boolean interferesquantifier(Descriptor des, boolean satisfy, Quantifiers r, boolean satisfyrule) {
252 for(int i=0;i<r.numQuantifiers();i++) {
253 Quantifier q=r.getQuantifier(i);
254 if (q instanceof RelationQuantifier||q instanceof SetQuantifier) {
255 if (q.getRequiredDescriptors().contains(des)&&(satisfy==satisfyrule))
257 } else if (q instanceof ForQuantifier) {
258 if (q.getRequiredDescriptors().contains(des))
260 } else throw new Error("Unrecognized Quantifier");
265 static public boolean interferes(AbstractRepair ar, Quantifiers q) {
266 if (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)
267 return interferesquantifier(ar.getDescriptor(),true,q,true);
271 static public boolean interferes(Descriptor des, boolean satisfy, Quantifiers q) {
272 return interferesquantifier(des, satisfy, q,true);
275 static public boolean interferes(Descriptor des, boolean satisfy, Rule r, boolean satisfyrule) {
276 if (interferesquantifier(des,satisfy,r,satisfyrule))
279 DNFRule drule=r.getDNFGuardExpr();
280 for(int i=0;i<drule.size();i++) {
281 RuleConjunction rconj=drule.get(i);
282 for(int j=0;j<rconj.size();j++) {
283 DNFExpr dexpr=rconj.get(j);
284 Expr expr=dexpr.getExpr();
285 boolean negated=dexpr.getNegation();
293 boolean satisfiesrule=(satisfy^negated);/*XOR of these */
294 if (satisfiesrule==satisfyrule) {
295 /* Effect is the one being tested for */
296 /* Only expr's to be concerned with are TupleOfExpr and
298 if (expr.getRequiredDescriptors().contains(des)) {
299 if (((expr instanceof ElementOfExpr)||
300 (expr instanceof TupleOfExpr))&&
301 (expr.getRequiredDescriptors().size()==1))
304 throw new Error("Unrecognized EXPR");