package tmp;
import java.util.Arrays;
import java.util.List;
import kodkod.ast.*;
import kodkod.ast.operator.*;
import kodkod.instance.*;
import kodkod.engine.*;
import kodkod.engine.satlab.SATFactory;
import kodkod.engine.config.Options;
/*
==================================================
kodkod formula:
==================================================
#(this/A) = (#(this/B) + 1) &&
Int/min = Int/min &&
Int/zero = Int/zero &&
Int/max = Int/max &&
Int/next = Int/next &&
seq/Int = seq/Int &&
String = String &&
this/A = this/A &&
this/B = this/B
==================================================
*/
public final class Test {
public static void main(String[] args) throws Exception {
Relation x5 = Relation.unary("String");
Relation x6 = Relation.unary("this/A");
Relation x7 = Relation.unary("this/B");
List<String> atomlist = Arrays.asList("A$0", "unused0", "unused1", "unused2", "unused3", "unused4", "unused5", "unused6",
"unused7", "unused8");
Universe universe = new Universe(atomlist);
TupleFactory factory = universe.factory();
Bounds bounds = new Bounds(universe);
TupleSet x5_upper = factory.noneOf(1);
bounds.boundExactly(x5, x5_upper);
TupleSet x6_upper = factory.noneOf(1);
x6_upper.add(factory.tuple("unused0"));
x6_upper.add(factory.tuple("unused1"));
x6_upper.add(factory.tuple("unused2"));
x6_upper.add(factory.tuple("unused3"));
x6_upper.add(factory.tuple("A$0"));
bounds.bound(x6, x6_upper);
TupleSet x7_upper = factory.noneOf(1);
x7_upper.add(factory.tuple("unused4"));
x7_upper.add(factory.tuple("unused5"));
x7_upper.add(factory.tuple("unused6"));
x7_upper.add(factory.tuple("unused7"));
x7_upper.add(factory.tuple("unused8"));
bounds.bound(x7, x7_upper);
IntExpression x10 = x6.count();
IntExpression x12 = x7.count();
IntExpression x13 = IntConstant.constant(1);
IntExpression x11 = x12.plus(x13);
Formula x9 = x10.eq(x11);
Formula x19 = x5.eq(x5);
Formula x20 = x6.eq(x6);
Formula x21 = x7.eq(x7);
Formula x8 = Formula.compose(FormulaOperator.AND, x9, x19, x20, x21);
Solver solver = new Solver();
solver.options().setSolver(SATFactory.DefaultSAT4J);
solver.options().setBitwidth(4);
solver.options().setFlatten(false);
solver.options().setIntEncoding(Options.IntEncoding.TWOSCOMPLEMENT);
solver.options().setSymmetryBreaking(20);
solver.options().setSkolemDepth(0);
System.out.println("Solving...");
System.out.flush();
Solution sol = solver.solve(x8, bounds);
System.out.println(sol.toString());
}
}