/** * Helper method that returns the constraint that the sig has exactly "n" elements, or at most "n" * elements */ private Formula size(Sig sig, int n, boolean exact) { Expression a = sol.a2k(sig); if (n <= 0) return a.no(); if (n == 1) return exact ? a.one() : a.lone(); Formula f = exact ? Formula.TRUE : null; Decls d = null; Expression sum = null; while (n > 0) { n--; Variable v = Variable.unary(""); kodkod.ast.Decl dd = v.oneOf(a); if (d == null) d = dd; else d = dd.and(d); if (sum == null) sum = v; else { if (f != null) f = v.intersection(sum).no().and(f); sum = v.union(sum); } } if (f != null) return sum.eq(a).and(f).forSome(d); else return a.no().or(sum.eq(a).forSome(d)); }
/** * Computes the bounds for sigs/fields, then construct a BoundsComputer object that you can query. */ private BoundsComputer(A4Reporter rep, A4Solution sol, ScopeComputer sc, Iterable<Sig> sigs) throws Err { this.sc = sc; this.factory = sol.getFactory(); this.rep = rep; this.sol = sol; // Figure out the sig bounds final Universe universe = factory.universe(); final int atomN = universe.size(); final List<Tuple> atoms = new ArrayList<Tuple>(atomN); for (int i = atomN - 1; i >= 0; i--) atoms.add(factory.tuple(universe.atom(i))); for (Sig s : sigs) if (!s.builtin && s.isTopLevel()) computeLowerBound(atoms, (PrimSig) s); for (Sig s : sigs) if (!s.builtin && s.isTopLevel()) computeUpperBound((PrimSig) s); // Bound the sigs for (Sig s : sigs) if (!s.builtin && s.isTopLevel()) allocatePrimSig((PrimSig) s); for (Sig s : sigs) if (s instanceof SubsetSig) allocateSubsetSig((SubsetSig) s); // Bound the fields again: for (Sig s : sigs) { while (s.isOne != null && s.getFieldDecls().size() == 2 && s.getFields().size() == 2 && s.getFacts().size() == 1) { // Let's check whether this is a total ordering on an enum... Expr fact = s.getFacts().get(0).deNOP(), b1 = s.getFieldDecls().get(0).expr.deNOP(), b2 = s.getFieldDecls().get(1).expr.deNOP(), b3; if (!(fact instanceof ExprList) || !(b1 instanceof ExprUnary) || !(b2 instanceof ExprBinary)) break; ExprList list = (ExprList) fact; if (list.op != ExprList.Op.TOTALORDER || list.args.size() != 3) break; if (((ExprUnary) b1).op != ExprUnary.Op.SETOF) break; else b1 = ((ExprUnary) b1).sub.deNOP(); if (((ExprBinary) b2).op != ExprBinary.Op.ARROW) break; else { b3 = ((ExprBinary) b2).right.deNOP(); b2 = ((ExprBinary) b2).left.deNOP(); } if (!(b1 instanceof PrimSig) || b1 != b2 || b1 != b3) break; PrimSig sub = (PrimSig) b1; Field f1 = s.getFields().get(0), f2 = s.getFields().get(1); if (sub.isEnum == null || !list.args.get(0).isSame(sub) || !list.args.get(1).isSame(s.join(f1)) || !list.args.get(2).isSame(s.join(f2))) break; // Now, we've confirmed it is a total ordering on an enum. Let's pre-bind the relations TupleSet me = sol.query(true, sol.a2k(s), false), firstTS = factory.noneOf(2), lastTS = null, nextTS = factory.noneOf(3); if (me.size() != 1 || me.arity() != 1) break; int n = sub.children().size(); for (PrimSig c : sub.children()) { TupleSet TS = sol.query(true, sol.a2k(c), false); if (TS.size() != 1 || TS.arity() != 1) { firstTS = factory.noneOf(2); nextTS = factory.noneOf(3); break; } if (lastTS == null) { firstTS = me.product(TS); lastTS = TS; continue; } nextTS.addAll(me.product(lastTS).product(TS)); lastTS = TS; } if (firstTS.size() != (n > 0 ? 1 : 0) || nextTS.size() != n - 1) break; sol.addField(f1, sol.addRel(s.label + "." + f1.label, firstTS, firstTS)); sol.addField(f2, sol.addRel(s.label + "." + f2.label, nextTS, nextTS)); rep.bound("Field " + s.label + "." + f1.label + " == " + firstTS + "\n"); rep.bound("Field " + s.label + "." + f2.label + " == " + nextTS + "\n"); continue again; } for (Field f : s.getFields()) { boolean isOne = s.isOne != null; if (isOne && f.decl().expr.mult() == ExprUnary.Op.EXACTLYOF) { Expression sim = sim(f.decl().expr); if (sim != null) { rep.bound("Field " + s.label + "." + f.label + " defined to be " + sim + "\n"); sol.addField(f, sol.a2k(s).product(sim)); continue; } } Type t = isOne ? Sig.UNIV.type().join(f.type()) : f.type(); TupleSet ub = factory.noneOf(t.arity()); for (List<PrimSig> p : t.fold()) { TupleSet upper = null; for (PrimSig b : p) { TupleSet tmp = sol.query(true, sol.a2k(b), false); if (upper == null) upper = tmp; else upper = upper.product(tmp); } ub.addAll(upper); } Relation r = sol.addRel(s.label + "." + f.label, null, ub); sol.addField(f, isOne ? sol.a2k(s).product(r) : r); } } // Add any additional SIZE constraints for (Sig s : sigs) if (!s.builtin) { Expression exp = sol.a2k(s); TupleSet upper = sol.query(true, exp, false), lower = sol.query(false, exp, false); final int n = sc.sig2scope(s); if (s.isOne != null && (lower.size() != 1 || upper.size() != 1)) { rep.bound("Sig " + s + " in " + upper + " with size==1\n"); sol.addFormula(exp.one(), s.isOne); continue; } if (s.isSome != null && lower.size() < 1) sol.addFormula(exp.some(), s.isSome); if (s.isLone != null && upper.size() > 1) sol.addFormula(exp.lone(), s.isLone); if (n < 0) continue; // This means no scope was specified if (lower.size() == n && upper.size() == n && sc.isExact(s)) { rep.bound("Sig " + s + " == " + upper + "\n"); } else if (sc.isExact(s)) { rep.bound("Sig " + s + " in " + upper + " with size==" + n + "\n"); sol.addFormula(size(s, n, true), Pos.UNKNOWN); } else if (upper.size() <= n) { rep.bound("Sig " + s + " in " + upper + "\n"); } else { rep.bound("Sig " + s + " in " + upper + " with size<=" + n + "\n"); sol.addFormula(size(s, n, false), Pos.UNKNOWN); } } }
public static void main(String[] args) throws Exception { Relation x0 = Relation.unary("Int/min"); Relation x1 = Relation.unary("Int/zero"); Relation x2 = Relation.unary("Int/max"); Relation x3 = Relation.nary("Int/next", 2); Relation x4 = Relation.unary("seq/Int"); Relation x5 = Relation.unary("String"); Relation x6 = Relation.unary("this/Test"); Relation x7 = Relation.nary("this/Test.weight", 2); Relation x8 = Relation.nary("this/Test.x", 2); Relation x9 = Relation.nary("this/Test.y", 2); List<String> atomlist = Arrays.asList( "-1", "-2", "-3", "-4", "-5", "-6", "-7", "-8", "0", "1", "2", "3", "4", "5", "6", "7", "Test$0", "Test$1", "Test$2"); Universe universe = new Universe(atomlist); TupleFactory factory = universe.factory(); Bounds bounds = new Bounds(universe); TupleSet x0_upper = factory.noneOf(1); x0_upper.add(factory.tuple("-8")); bounds.boundExactly(x0, x0_upper); TupleSet x1_upper = factory.noneOf(1); x1_upper.add(factory.tuple("0")); bounds.boundExactly(x1, x1_upper); TupleSet x2_upper = factory.noneOf(1); x2_upper.add(factory.tuple("7")); bounds.boundExactly(x2, x2_upper); TupleSet x3_upper = factory.noneOf(2); x3_upper.add(factory.tuple("-8").product(factory.tuple("-7"))); x3_upper.add(factory.tuple("-7").product(factory.tuple("-6"))); x3_upper.add(factory.tuple("-6").product(factory.tuple("-5"))); x3_upper.add(factory.tuple("-5").product(factory.tuple("-4"))); x3_upper.add(factory.tuple("-4").product(factory.tuple("-3"))); x3_upper.add(factory.tuple("-3").product(factory.tuple("-2"))); x3_upper.add(factory.tuple("-2").product(factory.tuple("-1"))); x3_upper.add(factory.tuple("-1").product(factory.tuple("0"))); x3_upper.add(factory.tuple("0").product(factory.tuple("1"))); x3_upper.add(factory.tuple("1").product(factory.tuple("2"))); x3_upper.add(factory.tuple("2").product(factory.tuple("3"))); x3_upper.add(factory.tuple("3").product(factory.tuple("4"))); x3_upper.add(factory.tuple("4").product(factory.tuple("5"))); x3_upper.add(factory.tuple("5").product(factory.tuple("6"))); x3_upper.add(factory.tuple("6").product(factory.tuple("7"))); bounds.boundExactly(x3, x3_upper); TupleSet x4_upper = factory.noneOf(1); x4_upper.add(factory.tuple("0")); x4_upper.add(factory.tuple("1")); x4_upper.add(factory.tuple("2")); x4_upper.add(factory.tuple("3")); bounds.boundExactly(x4, x4_upper); TupleSet x5_upper = factory.noneOf(1); bounds.boundExactly(x5, x5_upper); TupleSet x6_upper = factory.noneOf(1); x6_upper.add(factory.tuple("Test$0")); x6_upper.add(factory.tuple("Test$1")); x6_upper.add(factory.tuple("Test$2")); bounds.boundExactly(x6, x6_upper); TupleSet x7_upper = factory.noneOf(2); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-8"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-7"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-6"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-5"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-4"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-3"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-2"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("-1"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("0"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("1"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("2"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("3"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("4"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("5"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("6"))); x7_upper.add(factory.tuple("Test$0").product(factory.tuple("7"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-8"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-7"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-6"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-5"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-4"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-3"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-2"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("-1"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("0"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("1"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("2"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("3"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("4"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("5"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("6"))); x7_upper.add(factory.tuple("Test$1").product(factory.tuple("7"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-8"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-7"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-6"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-5"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-4"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-3"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-2"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("-1"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("0"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("1"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("2"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("3"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("4"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("5"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("6"))); x7_upper.add(factory.tuple("Test$2").product(factory.tuple("7"))); bounds.bound(x7, x7_upper); TupleSet x8_upper = factory.noneOf(2); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-8"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-7"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-6"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-5"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-4"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-3"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-2"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("-1"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("0"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("1"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("2"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("3"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("4"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("5"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("6"))); x8_upper.add(factory.tuple("Test$0").product(factory.tuple("7"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-8"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-7"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-6"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-5"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-4"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-3"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-2"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("-1"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("0"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("1"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("2"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("3"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("4"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("5"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("6"))); x8_upper.add(factory.tuple("Test$1").product(factory.tuple("7"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-8"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-7"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-6"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-5"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-4"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-3"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-2"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("-1"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("0"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("1"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("2"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("3"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("4"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("5"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("6"))); x8_upper.add(factory.tuple("Test$2").product(factory.tuple("7"))); bounds.bound(x8, x8_upper); TupleSet x9_upper = factory.noneOf(2); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-8"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-7"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-6"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-5"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-4"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-3"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-2"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("-1"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("0"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("1"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("2"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("3"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("4"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("5"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("6"))); x9_upper.add(factory.tuple("Test$0").product(factory.tuple("7"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-8"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-7"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-6"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-5"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-4"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-3"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-2"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("-1"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("0"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("1"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("2"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("3"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("4"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("5"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("6"))); x9_upper.add(factory.tuple("Test$1").product(factory.tuple("7"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-8"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-7"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-6"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-5"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-4"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-3"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-2"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("-1"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("0"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("1"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("2"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("3"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("4"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("5"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("6"))); x9_upper.add(factory.tuple("Test$2").product(factory.tuple("7"))); bounds.bound(x9, x9_upper); bounds.boundExactly(-8, factory.range(factory.tuple("-8"), factory.tuple("-8"))); bounds.boundExactly(-7, factory.range(factory.tuple("-7"), factory.tuple("-7"))); bounds.boundExactly(-6, factory.range(factory.tuple("-6"), factory.tuple("-6"))); bounds.boundExactly(-5, factory.range(factory.tuple("-5"), factory.tuple("-5"))); bounds.boundExactly(-4, factory.range(factory.tuple("-4"), factory.tuple("-4"))); bounds.boundExactly(-3, factory.range(factory.tuple("-3"), factory.tuple("-3"))); bounds.boundExactly(-2, factory.range(factory.tuple("-2"), factory.tuple("-2"))); bounds.boundExactly(-1, factory.range(factory.tuple("-1"), factory.tuple("-1"))); bounds.boundExactly(0, factory.range(factory.tuple("0"), factory.tuple("0"))); bounds.boundExactly(1, factory.range(factory.tuple("1"), factory.tuple("1"))); bounds.boundExactly(2, factory.range(factory.tuple("2"), factory.tuple("2"))); bounds.boundExactly(3, factory.range(factory.tuple("3"), factory.tuple("3"))); bounds.boundExactly(4, factory.range(factory.tuple("4"), factory.tuple("4"))); bounds.boundExactly(5, factory.range(factory.tuple("5"), factory.tuple("5"))); bounds.boundExactly(6, factory.range(factory.tuple("6"), factory.tuple("6"))); bounds.boundExactly(7, factory.range(factory.tuple("7"), factory.tuple("7"))); Variable x13 = Variable.unary("this"); Decls x12 = x13.oneOf(x6); Expression x16 = x13.join(x7); Formula x15 = x16.one(); Formula x17 = x16.in(Expression.INTS); Formula x14 = x15.and(x17); Formula x11 = x14.forAll(x12); Expression x20 = x7.join(Expression.UNIV); Formula x19 = x20.in(x6); Variable x24 = Variable.unary("this"); Decls x23 = x24.oneOf(x6); Expression x27 = x24.join(x8); Formula x26 = x27.lone(); Formula x28 = x27.in(Expression.INTS); Formula x25 = x26.and(x28); Formula x22 = x25.forAll(x23); Expression x30 = x8.join(Expression.UNIV); Formula x29 = x30.in(x6); Variable x33 = Variable.unary("this"); Decls x32 = x33.oneOf(x6); Expression x36 = x33.join(x9); Formula x35 = x36.one(); Formula x37 = x36.in(Expression.INTS); Formula x34 = x35.and(x37); Formula x31 = x34.forAll(x32); Expression x39 = x9.join(Expression.UNIV); Formula x38 = x39.in(x6); Variable x42 = Variable.unary("this"); Decls x41 = x42.oneOf(x6); Expression x44 = x42.join(x7); Expression x48 = x42.join(x8); IntExpression x47 = x48.sum(); Expression x50 = x42.join(x9); IntExpression x49 = x50.sum(); IntExpression x46 = x47.plus(x49); Expression x45 = x46.toExpression(); Formula x43 = x44.eq(x45); Formula x40 = x43.forAll(x41); Formula x51 = x0.eq(x0); Formula x52 = x1.eq(x1); Formula x53 = x2.eq(x2); Formula x54 = x3.eq(x3); Formula x55 = x4.eq(x4); Formula x56 = x5.eq(x5); Formula x57 = x6.eq(x6); Formula x58 = x7.eq(x7); Formula x59 = x8.eq(x8); Formula x60 = x9.eq(x9); IntExprReduction ier = new IntExprReduction(); Formula[] formulas = ier.reduceIntExpressions( x11, x19, x22, x29, x31, x38, x40, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60); Formula newFormula = Formula.compose(FormulaOperator.AND, formulas); ier.solve(newFormula, bounds, factory, universe, 32); }