/** * forall a:A & p(a) => exists idx in set dom m & m(idx) = f(a) */ private PExp getForallExp(ASetCompSetExp exp, ILexNameToken finmap, ILexNameToken findex) { AForAllExp forallExp = new AForAllExp(); forallExp.setBindList(exp.clone().getBindings()); forallExp.setPredicate(getImpliesExpression(exp, finmap, findex)); return forallExp; }
/** * p(a,b) => exists idx in set dom m & m(idx) = f(a) */ private PExp getImpliesExpression(ASetCompSetExp exp, ILexNameToken finmap, ILexNameToken findex) { if (exp.getPredicate() == null) // set comprehension has no predicate { return getImpliesExists(exp, finmap, findex); } else { return AstExpressionFactory.newAImpliesBooleanBinaryExp(exp.getPredicate().clone(), getImpliesExists(exp.clone(), finmap, findex)); } }
existsExp.setPredicate(getForallExp(exp.clone(), finmap, findex));