/** * */ package kodkod.examples.tptp; import static kodkod.ast.Expression.UNIV; import java.util.ArrayList; import java.util.List; import kodkod.ast.Expression; import kodkod.ast.Formula; import kodkod.ast.Relation; import kodkod.ast.Variable; import kodkod.engine.Solution; import kodkod.engine.Solver; import kodkod.engine.satlab.SATFactory; import kodkod.instance.Bounds; import kodkod.instance.TupleFactory; import kodkod.instance.Universe; /** * A KK encoding of SET967+1.p from http://www.cs.miami.edu/~tptp/ * @author Emina Torlak */ public final class SET967 { private final Relation empty; private final Relation subset, in, disjoint, union, singleton; private final Relation intersect2, union2, cartesian2, ordered, unordered; /** * Constructs a new instance of SET967. */ public SET967() { empty = Relation.unary("empty"); subset = Relation.binary("subset"); in = Relation.binary("in"); disjoint = Relation.binary("disjoint"); union = Relation.binary("union"); singleton = Relation.binary("singleton"); intersect2 = Relation.ternary("set_intersection2"); union2 = Relation.ternary("set_union2"); cartesian2 = Relation.ternary("cartesian_product2"); ordered = Relation.ternary("ordered_pair"); unordered = Relation.ternary("unordered_pair"); } /** * Returns set_intersection2[A][B] * @return set_intersection2[A][B] */ final Expression set_intersection2(Expression a, Expression b) { return b.join(a.join(intersect2)); } /** * Returns set_union2[A][B] * @return set_union2[A][B] */ final Expression set_union2(Expression a, Expression b) { return b.join(a.join(union2)); } /** * Returns cartesian_product2[A][B] * @return cartesian_product2[A][B] */ final Expression cartesian_product2(Expression a, Expression b) { return b.join(a.join(cartesian2)); } /** * Returns ordered_pair[A][B] * @return ordered_pair[A][B] */ final Expression ordered_pair(Expression a, Expression b) { return b.join(a.join(ordered)); } /** * Returns unordered_pair[A][B] * @return unordered_pair[A][B] */ final Expression unordered_pair(Expression a, Expression b) { return b.join(a.join(unordered)); } /** * Returns union[a] * @return union[a] */ final Expression union(Expression a) { return a.join(union); } /** * Returns singleton[a] * @return singleton[a] */ final Expression singleton(Expression a) { return a.join(singleton); } /** * Returns a in empty * @return a in empty */ final Formula empty(Expression a) { return a.in(empty); } /** * Returns a->b in subset. * @return a->b in subset. */ final Formula subset(Expression a, Expression b) { return a.product(b).in(subset); } /** * Returns a->b in in. * @return a->b in in */ final Formula in(Expression a, Expression b) { return a.product(b).in(in); } /** * Returns a->b in disjoint. * @return a->b in disjoint */ final Formula disjoint(Expression a, Expression b) { return a.product(b).in(disjoint); } /** * Returns the declarations. * @return declarations */ public final Formula decls() { final Formula f0 = union.function(UNIV, UNIV); final Formula f1 = singleton.function(UNIV, UNIV); final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Formula f2 = set_intersection2(a, b).one(); final Formula f3 = set_union2(a, b).one(); final Formula f4 = cartesian_product2(a,b).one(); final Formula f5 = ordered_pair(a, b).one(); final Formula f6 = unordered_pair(a, b).one(); return f0.and(f1).and(f2.and(f3).and(f4).and(f5).and(f6).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)))); } /** * Returns antisymmetry_r2_hidden axiom. * @return antisymmetry_r2_hidden */ public final Formula antisymmetry_r2_hidden() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return in(a,b).implies(in(b,a).not()).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns commutativity_k2_tarski axiom. * @return commutativity_k2_tarski */ public final Formula commutativity_k2_tarski() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return unordered_pair(a, b).eq(unordered_pair(b, a)).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns commutativity_k2_xboole_0 axiom. * @return commutativity_k2_xboole_0 */ public final Formula commutativity_k2_xboole_0() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return set_union2(a, b).eq(set_union2(b, a)).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns d2_xboole_0 axiom. * @return d2_xboole_0 */ public final Formula d2_xboole_0() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); return c.eq(set_union2(a, b)).iff(in.join(c).eq(in.join(a).union(in.join(b)))). forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)).and(c.oneOf(UNIV))); } /** * Returns d5_tarski axiom. * @return d5_tarski */ public final Formula d5_tarski() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return ordered_pair(a,b).eq(unordered_pair(unordered_pair(a, b), singleton(a))).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns fc1_misc_1 axiom. * @return fc1_misc_1 */ public final Formula fc1_misc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return empty(ordered_pair(a, b)).not().forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns fc2_xboole_0 axiom. * @return fc2_xboole_0 */ public final Formula fc2_xboole_0() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return empty(a).not().implies(empty(set_union2(a, b)).not()).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns fc3_xboole_0 axiom. * @return fc3_xboole_0 */ public final Formula fc3_xboole_0() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return empty(a).not().implies(empty(set_union2(b, a)).not()).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns idempotence_k2_xboole_0 axiom. * @return idempotence_k2_xboole_0 */ public final Formula idempotence_k2_xboole_0() { final Variable a = Variable.unary("A"); return set_union2(a, a).eq(a).forAll(a.oneOf(UNIV)); } /** * Returns 155_zfmisc_1 axiom. * @return 155_zfmisc_1 */ public final Formula a155_zfmisc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); final Variable d = Variable.unary("D"); final Formula f0 = in(ordered_pair(a, b), cartesian_product2(c, d)); final Formula f1 = in(a,c).and(in(b,d)); return f0.iff(f1).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)).and(c.oneOf(UNIV)).and(d.oneOf(UNIV))); } /** * Returns rc1_xboole_0 axiom. * @return rc1_xboole_0 */ public final Formula rc1_xboole_0() { return empty.some(); } /** * Returns rc2_xboole_0 axiom. * @return rc2_xboole_0 */ public final Formula rc2_xboole_0() { return UNIV.difference(empty).some(); } /** * Returns t102_zfmisc_1 axiom. * @return t102_zfmisc_1 */ public final Formula t102_zfmisc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); return in(a,cartesian_product2(b, c)).implies(ordered.join(a).some()). forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)).and(c.oneOf(UNIV))); } /** * Returns t107_zfmisc_1 axiom. * @return t107_zfmisc_1 */ public final Formula t107_zfmisc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); final Variable d = Variable.unary("D"); final Formula f0 = in(ordered_pair(a, b), cartesian_product2(c, d)); final Formula f1 = in(ordered_pair(b, a), cartesian_product2(d, c)); return f0.iff(f1).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)).and(c.oneOf(UNIV)).and(d.oneOf(UNIV))); } /** * Returns t4_xboole_0 axiom. * @return t4_xboole_0 */ public final Formula t4_xboole_0() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); return disjoint(a, b).not().implies(set_intersection2(a, b).some()). and(disjoint(a, b).implies(set_intersection2(a, b).no())). forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns t112_zfmisc_1 axiom. * @return t112_zfmisc_1 */ public final Formula t112_zfmisc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); final Variable d = Variable.unary("D"); final Formula f0 = in(c,a).implies(ordered.join(c).some()).forAll(c.oneOf(UNIV)); final Formula f1 = in(c,b).implies(ordered.join(c).some()).forAll(c.oneOf(UNIV)); final Formula f2 = in(ordered_pair(c,d),a).iff(in(ordered_pair(c,d),b)).forAll(c.oneOf(UNIV).and(d.oneOf(UNIV))); return f0.and(f1).and(f2).implies(a.eq(b)). forAll(a.oneOf(UNIV).and(b.oneOf(UNIV))); } /** * Returns the conjunction of all axioms. * @return conjunction of all axioms. */ public final Formula axioms() { return decls().and(antisymmetry_r2_hidden()).and(commutativity_k2_xboole_0()). and(commutativity_k2_tarski()).and(d2_xboole_0()).and(d5_tarski()). and(fc1_misc_1()).and(fc2_xboole_0()).and(fc3_xboole_0()).and(idempotence_k2_xboole_0()). and(a155_zfmisc_1()).and(rc1_xboole_0()).and(rc2_xboole_0()). and(t102_zfmisc_1()).and(t107_zfmisc_1()).and(t4_xboole_0()). and(t112_zfmisc_1()); } /** * Returns t120_zfmisc_1 conjecture. * @return t120_zfmisc_1 */ public final Formula t120_zfmisc_1() { final Variable a = Variable.unary("A"); final Variable b = Variable.unary("B"); final Variable c = Variable.unary("C"); final Formula f0 = cartesian_product2(set_union2(a, b), c).eq(set_union2(cartesian_product2(a, c), cartesian_product2(b, c))); final Formula f1 = cartesian_product2(c,set_union2(a,b)).eq( set_union2(cartesian_product2(c,a),cartesian_product2(c,b))); return f0.and(f1).forAll(a.oneOf(UNIV).and(b.oneOf(UNIV)).and(c.oneOf(UNIV))); } /** * Returns the conjunction of the axioms and the negation of the hypothesis. * @return axioms() && !t120_zfmisc_1() */ public final Formula checkT120_zfmisc_1() { return axioms().and(t120_zfmisc_1().not()); } /** * Returns bounds for the given scope. * @return bounds for the given scope. */ public final Bounds bounds(int n) { assert n > 0; final List<String> atoms = new ArrayList<String>(n); for(int i = 0; i < n; i++) atoms.add("a"+i); final Universe u = new Universe(atoms); final Bounds b = new Bounds(u); final TupleFactory f = u.factory(); b.bound(empty, f.allOf(1)); b.bound(subset, f.allOf(2)); b.bound(in, f.allOf(2)); b.bound(disjoint, f.allOf(2)); b.bound(union, f.allOf(2)); b.bound(singleton, f.allOf(2)); b.bound(intersect2, f.allOf(3)); b.bound(cartesian2, f.allOf(3)); b.bound(union2, f.allOf(3)); b.bound(ordered, f.allOf(3)); b.bound(unordered, f.allOf(3)); return b; } private static void usage() { System.out.println("java examples.tptp.SET967 [univ size]"); System.exit(1); } /** * Usage: java examples.tptp.SET967 [univ size] */ public static void main(String[] args) { if (args.length < 1) usage(); try { final int n = Integer.parseInt(args[0]); if (n < 1) usage(); final SET967 model = new SET967(); final Solver solver = new Solver(); solver.options().setSolver(SATFactory.MiniSat); // solver.options().setSymmetryBreaking(n*n); // solver.options().setFlatten(false); final Formula f = model.checkT120_zfmisc_1(); final Bounds b = model.bounds(n); System.out.println(f); final Solution sol = solver.solve(f, b); System.out.println(sol); } catch (NumberFormatException nfe) { usage(); } } }