4 class AbstractInterferes {
5 Termination termination;
7 public AbstractInterferes(Termination t) {
11 /** Does performing the AbstractRepair ar satisfy (or falsify if satisfy=false)
13 static public boolean interferes(AbstractRepair ar, Rule r, boolean satisfy) {
15 boolean mayremove=false;
16 switch (ar.getType()) {
17 case AbstractRepair.ADDTOSET:
18 case AbstractRepair.ADDTORELATION:
19 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
23 case AbstractRepair.REMOVEFROMSET:
24 case AbstractRepair.REMOVEFROMRELATION:
25 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
29 case AbstractRepair.MODIFYRELATION:
30 if (interferesquantifier(ar.getDescriptor(), true, r, satisfy))
32 if (interferesquantifier(ar.getDescriptor(), false, r, satisfy))
38 throw new Error("Unrecognized Abstract Repair");
42 drule=r.getDNFGuardExpr();
44 drule=r.getDNFNegGuardExpr();
46 for(int i=0;i<drule.size();i++) {
47 RuleConjunction rconj=drule.get(i);
48 for(int j=0;j<rconj.size();j++) {
49 DNFExpr dexpr=rconj.get(j);
50 Expr expr=dexpr.getExpr();
51 if (expr.usesDescriptor(ar.getDescriptor())) {
53 if ((mayadd&&!dexpr.getNegation())||(mayremove&&dexpr.getNegation()))
61 /** Does performing the AbstractRepair ar falsify the predicate dp */
63 public boolean interferes(AbstractRepair ar, DNFPredicate dp) {
64 if ((ar.getDescriptor()!=dp.getPredicate().getDescriptor()) &&
65 ((ar.getDescriptor() instanceof SetDescriptor)||
66 !dp.getPredicate().usesDescriptor((RelationDescriptor)ar.getDescriptor())))
69 /* This if handles all the c comparisons in the paper */
70 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
71 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
72 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
73 (dp.getPredicate() instanceof ExprPredicate)&&
74 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
75 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
76 boolean neg1=ar.getPredicate().isNegated();
77 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
78 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).rightSize();
79 boolean neg2=dp.isNegated();
80 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
81 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
82 op1=Opcode.translateOpcode(neg1,op1);
83 op2=Opcode.translateOpcode(neg2,op2);
85 if ((op1==Opcode.EQ)||(op1==Opcode.NE)||(op1==Opcode.GT)||op1==Opcode.GE) {
87 if((op1==Opcode.EQ)||(op1==Opcode.GE))
89 if((op1==Opcode.GT)||(op1==Opcode.NE))
92 if (((op2==Opcode.EQ)&&(size1a==size2))||
93 ((op2==Opcode.NE)&&(size1a!=size2))||
96 ((op2==Opcode.LE)&&(size1a<=size2))||
97 ((op2==Opcode.LT)&&(size1a<size2)))
102 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
103 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
104 (dp.getPredicate() instanceof ExprPredicate)&&
105 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
106 boolean neg2=dp.isNegated();
107 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
108 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
110 op2=Opcode.translateOpcode(neg2,op2);
112 int maxsize=termination.maxsize.getsize(dp.getPredicate().getDescriptor());
115 ((op2==Opcode.LT&&size2>maxsize)||
116 (op2==Opcode.LE&&size2>=maxsize)||
117 (op2==Opcode.EQ&&size2>=maxsize)))
120 if (((op2==Opcode.NE)&&(size2==0))||
126 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
127 (ar.getType()==AbstractRepair.MODIFYRELATION)&&
128 (dp.getPredicate() instanceof ExprPredicate)&&
129 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
130 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.COMPARISON)) {
132 boolean neg1=ar.getPredicate().isNegated();
133 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
134 boolean isInt1=((ExprPredicate)ar.getPredicate().getPredicate()).isRightInt();
135 int size1=isInt1?((ExprPredicate)ar.getPredicate().getPredicate()).rightSize():0;
136 Expr expr1=((OpExpr)((ExprPredicate)ar.getPredicate().getPredicate()).expr).right;
139 boolean neg2=dp.isNegated();
140 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
141 boolean isInt2=((ExprPredicate)dp.getPredicate()).isRightInt();
142 int size2=isInt2?((ExprPredicate)dp.getPredicate()).rightSize():0;
143 Expr expr2=((OpExpr)((ExprPredicate)ar.getPredicate().getPredicate()).expr).right;
145 /* Translate the opcodes */
146 op1=Opcode.translateOpcode(neg1,op1);
147 op2=Opcode.translateOpcode(neg2,op2);
149 /* Obvious cases which can't interfere */
150 if (((op1==Opcode.GT)||
156 if (((op1==Opcode.LT)||
162 if (((op1==Opcode.EQ)||(op1==Opcode.GE)||(op1==Opcode.LE))&&
163 ((op2==Opcode.EQ)||(op2==Opcode.GE)||(op2==Opcode.LE))&&
164 expr1.equals(null,expr2)) {
168 if (isInt1&&isInt2) {
169 if (((op1==Opcode.EQ)||(op1==Opcode.GE)||(op1==Opcode.LE))&&
170 ((op2==Opcode.EQ)||(op2==Opcode.GE)||(op2==Opcode.LE))&&
180 size1a++; /*FLAGNE this is current behavior for NE repairs */
187 if (((op1==Opcode.GE)||(op1==Opcode.GT))&&
188 ((op2==Opcode.LE)||(op2==Opcode.EQ)||(op2==Opcode.LT))&&
192 if (((op1==Opcode.LE)||(op1==Opcode.LT))&&
193 ((op2==Opcode.GE)||(op2==Opcode.EQ)||(op2==Opcode.GT))&&
197 if ((op1==Opcode.EQ)&&(op2==Opcode.EQ)&&
201 if ((op1==Opcode.EQ)&&
202 ((op2==Opcode.LE)||(op2==Opcode.LT))&&
206 if ((op1==Opcode.EQ)&&
207 ((op2==Opcode.GE)||(op2==Opcode.GT))&&
211 if (op2==Opcode.NE) /*FLAGNE this is current behavior for NE repairs */
215 if ((op1==Opcode.NE)&&
220 if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */
221 ((op2==Opcode.GT)||(op2==Opcode.GE))&&
225 if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */
226 ((op2==Opcode.LT)||(op2==Opcode.LE))&&
232 /* This handles all the c comparisons in the paper */
233 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
234 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
235 (ar.getPredicate().getPredicate() instanceof ExprPredicate)&&
236 (dp.getPredicate() instanceof ExprPredicate)&&
237 (dp.getPredicate().inverted()==ar.getPredicate().getPredicate().inverted())&&
238 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
239 boolean neg1=ar.getPredicate().isNegated();
240 Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp();
241 int size1=((ExprPredicate)ar.getPredicate().getPredicate()).rightSize();
242 boolean neg2=dp.isNegated();
243 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
244 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
245 /* Translate the opcodes */
246 op1=Opcode.translateOpcode(neg1,op1);
247 op2=Opcode.translateOpcode(neg2,op2);
249 if (((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE)) {
252 if((op1==Opcode.EQ)||(op1==Opcode.LE))
254 if((op1==Opcode.LT)||(op1==Opcode.NE))
257 if (((op2==Opcode.EQ)&&(size1a==size2))||
258 ((op2==Opcode.NE)&&(size1a!=size2))||
261 ((op2==Opcode.GE)&&(size1a>=size2))||
262 ((op2==Opcode.GT)&&(size1a>size2)))
267 if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&&
268 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
269 (dp.getPredicate() instanceof ExprPredicate)&&
270 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
271 boolean neg2=dp.isNegated();
272 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
273 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
274 op2=Opcode.translateOpcode(neg2,op2);
276 if (((op2==Opcode.EQ)&&(size2==0))||
282 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
283 (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&&
284 (dp.getPredicate() instanceof InclusionPredicate)&&
285 (dp.isNegated()==false))
286 return false; /* Could only satisfy this predicate */
288 if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&&
289 (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&&
290 (dp.getPredicate() instanceof InclusionPredicate)&&
291 (dp.isNegated()==true))
292 return false; /* Could only satisfy this predicate */
297 /** Does the increase (or decrease) in scope of a model defintion rule represented by sn
298 * falsify the predicate dp */
300 public boolean interferes(ScopeNode sn, DNFPredicate dp) {
301 if (!sn.getSatisfy()&&(sn.getDescriptor() instanceof SetDescriptor)) {
303 Set target=r.getInclusion().getTargetDescriptors();
305 for(int i=0;i<r.numQuantifiers();i++) {
306 Quantifier q=r.getQuantifier(i);
307 if (q instanceof SetQuantifier) {
308 SetQuantifier sq=(SetQuantifier) q;
309 if (target.contains(sq.getSet())) {
316 sn.getDescriptor()==dp.getPredicate().getDescriptor()&&
317 (dp.getPredicate() instanceof ExprPredicate)&&
318 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
319 boolean neg=dp.isNegated();
320 Opcode op=((ExprPredicate)dp.getPredicate()).getOp();
321 int size=((ExprPredicate)dp.getPredicate()).rightSize();
322 op=Opcode.translateOpcode(neg,op);
324 if ((op==Opcode.GE)&&
325 ((size==0)||(size==1)))
327 if ((op==Opcode.GT)&&
332 return interferes(sn.getDescriptor(), sn.getSatisfy(),dp);
335 /** Does increasing (or decreasing if satisfy=false) the size of the set or relation des
336 * falsify the predicate dp */
338 public boolean interferes(Descriptor des, boolean satisfy, DNFPredicate dp) {
339 if ((des!=dp.getPredicate().getDescriptor()) &&
340 ((des instanceof SetDescriptor)||
341 !dp.getPredicate().usesDescriptor((RelationDescriptor)des)))
344 /* This if handles all the c comparisons in the paper */
345 if (des==dp.getPredicate().getDescriptor()&&
347 (dp.getPredicate() instanceof ExprPredicate)&&
348 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
349 boolean neg2=dp.isNegated();
350 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
351 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
352 op2=Opcode.translateOpcode(neg2,op2);
355 int maxsize=termination.maxsize.getsize(dp.getPredicate().getDescriptor());
358 ((op2==Opcode.LT&&size2>maxsize)||
359 (op2==Opcode.LE&&size2>=maxsize)||
360 (op2==Opcode.EQ&&size2>=maxsize)))
363 if ((op2==Opcode.GE)||
365 (op2==Opcode.NE)&&(size2==0))
369 /* This if handles all the c comparisons in the paper */
370 if (des==dp.getPredicate().getDescriptor()&&
372 (dp.getPredicate() instanceof ExprPredicate)&&
373 (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) {
374 boolean neg2=dp.isNegated();
375 Opcode op2=((ExprPredicate)dp.getPredicate()).getOp();
376 int size2=((ExprPredicate)dp.getPredicate()).rightSize();
377 op2=Opcode.translateOpcode(neg2,op2);
379 if (((op2==Opcode.EQ)&&(size2==0))||
385 if ((des==dp.getPredicate().getDescriptor())&&
387 (dp.getPredicate() instanceof InclusionPredicate)&&
388 (dp.isNegated()==false))
389 return false; /* Could only satisfy this predicate */
391 if ((des==dp.getPredicate().getDescriptor())&&
393 (dp.getPredicate() instanceof InclusionPredicate)&&
394 (dp.isNegated()==true))
395 return false; /* Could only satisfy this predicate */
400 static public boolean interferesquantifier(Descriptor des, boolean satisfy, Quantifiers r, boolean satisfyrule) {
401 for(int i=0;i<r.numQuantifiers();i++) {
402 Quantifier q=r.getQuantifier(i);
403 if (q instanceof RelationQuantifier||q instanceof SetQuantifier) {
404 if (q.getRequiredDescriptors().contains(des)&&(satisfy==satisfyrule))
406 } else if (q instanceof ForQuantifier) {
407 if (q.getRequiredDescriptors().contains(des))
409 } else throw new Error("Unrecognized Quantifier");
414 static public boolean interferes(AbstractRepair ar, Quantifiers q) {
415 if (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)
416 return interferesquantifier(ar.getDescriptor(),true,q,true);
420 static public boolean interferes(Descriptor des, boolean satisfy, Quantifiers q) {
421 return interferesquantifier(des, satisfy, q,true);
424 static public boolean interferes(Descriptor des, boolean satisfy, Rule r, boolean satisfyrule) {
425 if (interferesquantifier(des,satisfy,r,satisfyrule))
428 DNFRule drule=r.getDNFGuardExpr();
429 for(int i=0;i<drule.size();i++) {
430 RuleConjunction rconj=drule.get(i);
431 for(int j=0;j<rconj.size();j++) {
432 DNFExpr dexpr=rconj.get(j);
433 Expr expr=dexpr.getExpr();
434 boolean negated=dexpr.getNegation();
442 boolean satisfiesrule=(satisfy^negated);/*XOR of these */
443 if (satisfiesrule==satisfyrule) {
444 /* Effect is the one being tested for */
445 /* Only expr's to be concerned with are TupleOfExpr and
447 if (expr.getRequiredDescriptors().contains(des)) {
448 if (((expr instanceof ElementOfExpr)||
449 (expr instanceof TupleOfExpr))&&
450 (expr.getRequiredDescriptors().size()==1))
453 throw new Error("Unrecognized EXPR");