4 class AbstractInterferes {
6 /** Does performing the AbstractRepair ar satisfy (or falsify if satisfy=false)
8 static public boolean interferes(AbstractRepair ar, Rule r, boolean satisfy) {
10 boolean mayremove=false;
11 switch (ar.getType()) {
12 case AbstractRepair.ADDTOSET:
13 case AbstractRepair.ADDTORELATION:
14 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
18 case AbstractRepair.REMOVEFROMSET:
19 case AbstractRepair.REMOVEFROMRELATION:
20 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
24 case AbstractRepair.MODIFYRELATION:
25 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
27 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
33 throw new Error("Unrecognized Abstract Repair");
37 drule=r.getDNFGuardExpr();
39 drule=r.getDNFNegGuardExpr();
41 for(int i=0;i<drule.size();i++) {
42 RuleConjunction rconj=drule.get(i);
43 for(int j=0;j<rconj.size();j++) {
44 DNFExpr dexpr=rconj.get(j);
45 Expr expr=dexpr.getExpr();
46 if (expr.usesDescriptor(ar.getDescriptor())) {
48 if ((mayadd&&!dexpr.getNegation())||(mayremove&&dexpr.getNegation()))
56 /** Does performing the AbstractRepair ar falsify the predicate dp */
58 static public boolean interferes(AbstractRepair ar, DNFPredicate dp) {
59 if ((ar.getDescriptor()!=dp.getPredicate().getDescriptor()) &&
60 ((ar.getDescriptor() instanceof SetDescriptor)||
61 !dp.getPredicate().usesDescriptor((RelationDescriptor)ar.getDescriptor())))
64 /* This if handles all the c comparisons in the paper */
65 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
66 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
67 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
68 (dp.getPredicate() instanceof ExprPredicate)&&
69 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
70 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
71 boolean neg1=ar.getPredicate().isNegated();
72 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
73 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).rightSize();
74 boolean neg2=dp.isNegated();
75 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
76 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
77 if ((!neg1&&((op1==Opcode.EQ)||(op1==Opcode.NE)||(op1==Opcode.GT)||op1==Opcode.GE))||
78 (neg1&&((op1==Opcode.EQ)||(op1==Opcode.NE)||(op1==Opcode.LT)||op1==Opcode.LE))) {
81 if((op1==Opcode.EQ)||(op1==Opcode.GE))
83 if((op1==Opcode.GT)||(op1==Opcode.NE))
87 if((op1==Opcode.EQ)||(op1==Opcode.LE))
89 if((op1==Opcode.LT)||(op1==Opcode.NE))
92 if ((!neg2&&(op2==Opcode.EQ)&&(size1a==size2))||
93 (neg2&&(op2==Opcode.EQ)&&(size1a!=size2))||
94 (!neg2&&(op2==Opcode.NE)&&(size1a!=size2))||
95 (neg2&&(op2==Opcode.NE)&&(size1a==size2))||
96 (!neg2&&(op2==Opcode.GE))||
97 (!neg2&&(op2==Opcode.GT))||
98 (neg2&&(op2==Opcode.LE))||
99 (neg2&&(op2==Opcode.LT))||
100 (neg2&&(op2==Opcode.GE)&&(size1a<size2))||
101 (neg2&&(op2==Opcode.GT)&&(size1a<=size2))||
102 (!neg2&&(op2==Opcode.LE)&&(size1a<=size2))||
103 (!neg2&&(op2==Opcode.LT)&&(size1a<size2)))
108 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
109 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
110 (dp.getPredicate() instanceof ExprPredicate)&&
111 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
112 boolean neg2=dp.isNegated();
113 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
114 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
116 op2=translateOpcode(neg2,op2);
118 if (((op2==Opcode.EQ)&&(size2==0))||
124 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
126 (ar.getType()==AbstractRepair.MODIFYRELATION)&&
127 (dp.getPredicate() instanceof ExprPredicate)&&
128 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
129 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.COMPARISON)) {
131 boolean neg1=ar.getPredicate().isNegated();
132 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
133 boolean isInt1=((ExprPredicate)ar.getPredicate().getPredicate()).isRightInt();
134 int size1=isInt1?((ExprPredicate)ar.getPredicate().getPredicate()).rightSize():0;
135 Expr expr1=((OpExpr)((ExprPredicate)ar.getPredicate().getPredicate()).expr).right;
138 boolean neg2=dp.isNegated();
139 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
140 boolean isInt2=((ExprPredicate)dp.getPredicate()).isRightInt();
141 int size2=isInt2?((ExprPredicate)dp.getPredicate()).rightSize():0;
142 Expr expr2=((OpExpr)((ExprPredicate)ar.getPredicate().getPredicate()).expr).right;
144 /* Translate the opcodes */
145 op1=translateOpcode(neg1,op1);
146 op2=translateOpcode(neg2,op2);
148 /* Obvious cases which can't interfere */
149 if (((op1==Opcode.GT)||
155 if (((op1==Opcode.LT)||
161 if (isInt1&&isInt2) {
162 if (((op1==Opcode.EQ)||(op1==Opcode.GE)||(op1==Opcode.LE))&&
163 ((op2==Opcode.EQ)||(op2==Opcode.GE)||(op2==Opcode.LE))&&
173 size1a++; /*FLAGNE this is current behavior for NE repairs */
180 if (((op1==Opcode.GE)||(op1==Opcode.GT))&&
181 ((op2==Opcode.LE)||(op2==Opcode.EQ)||(op2==Opcode.LT))&&
185 if (((op1==Opcode.LE)||(op1==Opcode.LT))&&
186 ((op2==Opcode.GE)||(op2==Opcode.EQ)||(op2==Opcode.GT))&&
190 if ((op1==Opcode.EQ)&&(op2==Opcode.EQ)&&
194 if ((op1==Opcode.EQ)&&
195 ((op2==Opcode.LE)||(op2==Opcode.LT))&&
199 if ((op1==Opcode.EQ)&&
200 ((op2==Opcode.GE)||(op2==Opcode.GT))&&
204 if (op2==Opcode.NE) /*FLAGNE this is current behavior for NE repairs */
208 if ((op1==Opcode.NE)&&
213 if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */
214 ((op2==Opcode.GT)||(op2==Opcode.GE))&&
218 if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */
219 ((op2==Opcode.LT)||(op2==Opcode.LE))&&
225 /* This handles all the c comparisons in the paper */
226 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
227 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
228 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
229 (dp.getPredicate() instanceof ExprPredicate)&&
230 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
231 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
232 boolean neg1=ar.getPredicate().isNegated();
233 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
234 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).rightSize();
235 boolean neg2=dp.isNegated();
236 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
237 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
238 /* Translate the opcodes */
239 op1=translateOpcode(neg1,op1);
240 op2=translateOpcode(neg2,op2);
242 if (((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE)) {
245 if((op1==Opcode.EQ)||(op1==Opcode.LE))
247 if((op1==Opcode.LT)||(op1==Opcode.NE))
250 if (((op2==Opcode.EQ)&&(size1a==size2))||
251 ((op2==Opcode.NE)&&(size1a!=size2))||
254 ((op2==Opcode.GE)&&(size1a>=size2))||
255 ((op2==Opcode.GT)&&(size1a>size2)))
260 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
261 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
262 (dp.getPredicate() instanceof ExprPredicate)&&
263 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
264 boolean neg2=dp.isNegated();
265 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
266 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
267 if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))||
268 (neg2&&(op2==Opcode.NE)&&(size2==0))||
269 (neg2&&(op2==Opcode.GE))||
270 (neg2&&(op2==Opcode.GT))||
271 (!neg2&&(op2==Opcode.LE))||
272 (!neg2&&(op2==Opcode.LT)))
276 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
277 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
278 (dp.getPredicate() instanceof InclusionPredicate)&&
279 (dp.isNegated()==false))
280 return false; /* Could only satisfy this predicate */
282 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
283 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
284 (dp.getPredicate() instanceof InclusionPredicate)&&
285 (dp.isNegated()==true))
286 return false; /* Could only satisfy this predicate */
291 static private Opcode translateOpcode(boolean neg, Opcode op) {
293 /* remove negation through opcode translation */
296 else if (op==Opcode.GE)
298 else if (op==Opcode.EQ)
300 else if (op==Opcode.NE)
302 else if (op==Opcode.LT)
304 else if (op==Opcode.LE)
311 /** Does the increase (or decrease) in scope of a model defintion rule represented by sn
312 * falsify the predicate dp */
314 static public boolean interferes(ScopeNode sn, DNFPredicate dp) {
315 if (!sn.getSatisfy()&&(sn.getDescriptor() instanceof SetDescriptor)) {
317 Set target=r.getInclusion().getTargetDescriptors();
319 for(int i=0;i<r.numQuantifiers();i++) {
320 Quantifier q=r.getQuantifier(i);
321 if (q instanceof SetQuantifier) {
322 SetQuantifier sq=(SetQuantifier) q;
323 if (target.contains(sq.getSet())) {
330 sn.getDescriptor()==dp.getPredicate().getDescriptor()&&
331 (dp.getPredicate() instanceof ExprPredicate)&&
332 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
333 boolean neg=dp.isNegated();
334 Opcode op=((ExprPredicate)dp.getPredicate()).getOp();
335 int size=((ExprPredicate)dp.getPredicate()).rightSize();
337 /* remove negation through opcode translation */
340 else if (op==Opcode.GE)
342 else if (op==Opcode.EQ)
344 else if (op==Opcode.NE)
346 else if (op==Opcode.LT)
348 else if (op==Opcode.LE)
351 if ((op==Opcode.GE)&&
352 ((size==0)||(size==1)))
354 if ((op==Opcode.GT)&&
359 return interferes(sn.getDescriptor(), sn.getSatisfy(),dp);
362 /** Does increasing (or decreasing if satisfy=false) the size of the set or relation des
363 * falsify the predicate dp */
365 static public boolean interferes(Descriptor des, boolean satisfy, DNFPredicate dp) {
366 if ((des!=dp.getPredicate().getDescriptor()) &&
367 ((des instanceof SetDescriptor)||
368 !dp.getPredicate().usesDescriptor((RelationDescriptor)des)))
371 /* This if handles all the c comparisons in the paper */
372 if (des==dp.getPredicate().getDescriptor()&&
374 (dp.getPredicate() instanceof ExprPredicate)&&
375 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
376 boolean neg2=dp.isNegated();
377 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
378 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
380 if ((!neg2&&(op2==Opcode.GE))||
381 (!neg2&&(op2==Opcode.GT))||
382 (neg2&&(op2==Opcode.EQ)&&(size2==0))||
383 (!neg2&&(op2==Opcode.NE)&&(size2==0))||
384 (neg2&&(op2==Opcode.LE))||
385 (neg2&&(op2==Opcode.LT)))
389 /* This if handles all the c comparisons in the paper */
390 if (des==dp.getPredicate().getDescriptor()&&
392 (dp.getPredicate() instanceof ExprPredicate)&&
393 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
394 boolean neg2=dp.isNegated();
395 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
396 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
398 if ((neg2&&(op2==Opcode.GE))||
399 (neg2&&(op2==Opcode.GT))||
400 (!neg2&&(op2==Opcode.EQ)&&(size2==0))||
401 (neg2&&(op2==Opcode.NE)&&(size2==0))||
402 (!neg2&&(op2==Opcode.LE))||
403 (!neg2&&(op2==Opcode.LT)))
407 if ((des==dp.getPredicate().getDescriptor())&&
409 (dp.getPredicate() instanceof InclusionPredicate)&&
410 (dp.isNegated()==false))
411 return false; /* Could only satisfy this predicate */
413 if ((des==dp.getPredicate().getDescriptor())&&
415 (dp.getPredicate() instanceof InclusionPredicate)&&
416 (dp.isNegated()==true))
417 return false; /* Could only satisfy this predicate */
422 static public boolean interferesquantifier(Descriptor des, boolean satisfy, Quantifiers r, boolean satisfyrule) {
423 for(int i=0;i<r.numQuantifiers();i++) {
424 Quantifier q=r.getQuantifier(i);
425 if (q instanceof RelationQuantifier||q instanceof SetQuantifier) {
426 if (q.getRequiredDescriptors().contains(des)&&(satisfy==satisfyrule))
428 } else if (q instanceof ForQuantifier) {
429 if (q.getRequiredDescriptors().contains(des))
431 } else throw new Error("Unrecognized Quantifier");
436 static public boolean interferes(AbstractRepair ar, Quantifiers q) {
437 if (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)
438 return interferesquantifier(ar.getDescriptor(),true,q,true);
442 static public boolean interferes(Descriptor des, boolean satisfy, Quantifiers q) {
443 return interferesquantifier(des, satisfy, q,true);
446 static public boolean interferes(Descriptor des, boolean satisfy, Rule r, boolean satisfyrule) {
447 if (interferesquantifier(des,satisfy,r,satisfyrule))
450 DNFRule drule=r.getDNFGuardExpr();
451 for(int i=0;i<drule.size();i++) {
452 RuleConjunction rconj=drule.get(i);
453 for(int j=0;j<rconj.size();j++) {
454 DNFExpr dexpr=rconj.get(j);
455 Expr expr=dexpr.getExpr();
456 boolean negated=dexpr.getNegation();
464 boolean satisfiesrule=(satisfy^negated);/*XOR of these */
465 if (satisfiesrule==satisfyrule) {
466 /* Effect is the one being tested for */
467 /* Only expr's to be concerned with are TupleOfExpr and
469 if (expr.getRequiredDescriptors().contains(des)) {
470 if (((expr instanceof ElementOfExpr)||
471 (expr instanceof TupleOfExpr))&&
472 (expr.getRequiredDescriptors().size()==1))
475 throw new Error("Unrecognized EXPR");