continue;
for(Iterator fit=functions.iterator();fit.hasNext();) {
Function f=(Function)fit.next();
- if (rulesensurefunction(f))
+ if (rulesensurefunction(state,f,false))
continue; //no constraint needed to ensure
- Set s=providesfunction(f);
+ Set s=providesfunction(state,f);
if (s.size()==0) {
System.out.println("Warning: No constraint ensures that [forall v in "+f.getSet()+"], size(v."+(f.isInverse()?"~":"")+f.getRelation()+")=1");
continue;
}
}
- private boolean rulesensurefunction(Function f) {
+ /** This method determines whether the model definition rules
+ * ensure that the relation and evaluation domain descriped by f
+ * is either a function (if isPartial=false) or a partial function
+ * (if isPartial=true). */
+
+ static private boolean rulesensurefunction(State state,Function f, boolean isPartial) {
boolean foundrule=false;
for(int i=0;i<state.vRules.size();i++) {
Rule r=(Rule)state.vRules.get(i);
SetDescriptor sd=e.getSet();
if (sd==null)
return false;
- if (!(sd.isSubset(f.getSet())||f.getSet().isSubset(sd)))
+ if (state.setanalysis.noIntersection(f.getSet(),sd))
continue; /* This rule doesn't effect the function */
if (foundrule) /* two different rules are a problem */
return false;
SetQuantifier sq=(SetQuantifier)q;
if (ve.getVar()!=sq.getVar())
return false;
- if (!sq.getSet().isSubset(f.getSet()))
- return false;
- if (!((r.getGuardExpr() instanceof BooleanLiteralExpr)&&
- ((BooleanLiteralExpr)r.getGuardExpr()).getValue()==true))
- return false;
+ if (!isPartial) {
+ if (!sq.getSet().isSubset(f.getSet()))
+ return false;
+ if (!((r.getGuardExpr() instanceof BooleanLiteralExpr)&&
+ ((BooleanLiteralExpr)r.getGuardExpr()).getValue()==true))
+ return false;
+ }
Expr e2=f.isInverse()?ri.getLeftExpr():ri.getRightExpr();
- if (e2.isSafe())
+ if (isPartial||e2.isSafe())
foundrule=true;
else
return false;
return foundrule;
}
- private Set providesfunction(Function f) {
+ static private Set providesfunction(State state, Function f) {
+ return providesfunction(state,f,false);
+ }
+
+ static private Set providesfunction(State state, Function f, boolean isPartial) {
HashSet set=new HashSet();
for(int i=0;i<state.vConstraints.size();i++) {
Constraint c=(Constraint)state.vConstraints.get(i);
ExprPredicate ep=(ExprPredicate)dpred.getPredicate();
if (ep.isRightInt()&&
ep.rightSize()==1&&
- ep.getOp()==Opcode.EQ&&
+ (ep.getOp()==Opcode.EQ||(ep.getOp()==Opcode.LE&&isPartial))&&
ep.inverted()==f.isInverse()&&
ep.getDescriptor()==f.getRelation()) {
ImageSetExpr se=(ImageSetExpr) ((SizeofExpr) ((OpExpr)ep.expr).left).getSetExpr();
return set;
}
+
+ /** This method determines whether the model definition rules
+ * ensure that the relation r (or inverse relation if inverse is
+ * true) evaluated on the domain sd is either a function (if
+ * isPartial=false) or a partial function (if isPartial=true). */
+
+ static public boolean rulesensurefunction(State state,RelationDescriptor r, SetDescriptor sd,boolean inverse, boolean isPartial) {
+ return rulesensurefunction(state, new Function(r,sd,inverse,null),isPartial);
+ }
+
+ /** This method determines whether the model constraints ensure
+ * that the relation r (or inverse relation if inverse is true)
+ * evaluated on the domain sd is either a function (if
+ * isPartial=false) or a partial function (if isPartial=true). */
+
+ static public boolean constraintsensurefunction(State state,RelationDescriptor r, SetDescriptor sd,boolean inverse,boolean isPartial) {
+ Set constraints=providesfunction(state, new Function(r,sd,inverse,null),isPartial);
+ return (!constraints.isEmpty());
+ }
+
public static class Function {
private RelationDescriptor rd;
private SetDescriptor sd;