package kodkod.examples.tptp; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import kodkod.ast.Expression; import kodkod.ast.Formula; import kodkod.ast.Relation; import kodkod.ast.Variable; import kodkod.instance.Bounds; import kodkod.instance.Instance; import kodkod.instance.Tuple; import kodkod.instance.TupleFactory; import kodkod.instance.TupleSet; import kodkod.instance.Universe; /** * Contains the relations/axioms common to the problems ALG195+1.p and ALG197+1.p from * from http://www.cs.miami.edu/~tptp/ * * @author Emina Torlak */ public abstract class Quasigroups7 { final Relation[] e1, e2, h; final Relation op1, op2, s1, s2; /** * Constructs a new instance of Quasigroups7. */ Quasigroups7() { op1 = Relation.ternary("op1"); op2 = Relation.ternary("op2"); s1 = Relation.unary("e1"); s2 = Relation.unary("e2"); e1 = new Relation[7]; e2 = new Relation[7]; h = new Relation[7]; for(int i = 0; i < 7; i++) { e1[i] = Relation.unary("e1"+i); e2[i] = Relation.unary("e2"+i); h[i] = Relation.binary("h"+(i+1)); } } private static Formula function(Relation s, Relation op) { final Variable x = Variable.unary("x"), y = Variable.unary("y"); return y.join(x.join(op)).one().forAll(x.oneOf(s).and(y.oneOf(s))); } /** * Returns the relation constraints. * @returns the relation constraints. */ public final Formula decls() { final List<Formula> formulas = new ArrayList<Formula>(2+h.length); formulas.add(function(s1, op1)); formulas.add(function(s2, op2)); for(Relation x: h) { formulas.add(x.function(s1, s2)); } return Formula.and(formulas); } private Expression op1(Expression arg1, Expression arg2) { return arg1.join(arg2.join(op1)); } private Expression op2(Expression arg1, Expression arg2) { return arg1.join(arg2.join(op2)); } /** * Returns axioms 2 and 7. * @return ax2 and ax7 */ public final Formula ax2ax7() { final Variable x = Variable.unary("x"); return s1.eq(op1(x,s1)).and(s1.eq(op1(s1,x))).forAll(x.oneOf(s1)); } /** * Returns axiom 3. * @return ax3 */ public final Formula ax3() { final Variable x = Variable.unary("x"), y = Variable.unary("y"); return x.eq(op1(op1(op1(y,x),y),y)).forAll(x.oneOf(s1).and(y.oneOf(s1))); } /** * Returns axioms 5 and 8. * @return ax5 and ax8 */ public final Formula ax5ax8() { final Variable x = Variable.unary("x"); return s2.eq(op2(x,s2)).and(s2.eq(op2(s2,x))).forAll(x.oneOf(s2)); } /** * Returns axiom 6. * @return ax6 */ public final Formula ax6() { final Variable x = Variable.unary("x"), y = Variable.unary("y"); return x.eq(op2(op2(op2(y,x),y),y)).forAll(x.oneOf(s2).and(y.oneOf(s2))); } /** * Parametrization of axioms 12 and 13. * @requires e's are unary, op is ternary */ abstract Formula ax12and13(Relation[] e, Relation op); /** * Returns axiom 12. * @return ax12 */ public final Formula ax12() { return ax12and13(e1, op1); } /** * Returns axiom 13. * @return ax13 */ public final Formula ax13() { return ax12and13(e2, op2); } /** * Parametrization of axioms 14 and 15. * @requires e's are unary, op is ternary */ abstract Formula ax14and15(Relation[] e, Relation op); /** * Returns lines 1 and 3-6 of axiom 14. * @return ax14 */ public final Formula ax14() { return ax14and15(e1, op1); } /** * Returns lines 1 and 3-6 of axiom 15. * @return ax15 */ public final Formula ax15() { return ax14and15(e2, op2); } /** * Parametrization of axioms 16-22. * @requires e is unary, h is binary */ abstract Formula ax16_22(Relation e, Relation h); /** * Returns lines 2-7 of axioms 16-22. * @return lines 2-7 of axioms 16-22. */ public final Formula ax16_22() { final List<Formula> formulas = new ArrayList<Formula>(); for(int i = 0; i < 7; i++) { formulas.add(ax16_22(e2[i], h[i])); } return Formula.and(formulas); } /** * Returns the conjunction of all axioms and implicit constraints (decls()). * @return the conjunction of all axioms and implicit constraints */ public final Formula axioms() { final List<Formula> formulas = new ArrayList<Formula>(); formulas.add(decls()); formulas.add(ax2ax7()); formulas.add(ax3()); formulas.add(ax5ax8()); formulas.add(ax6()); formulas.add(ax12()); formulas.add(ax13()); formulas.add(ax14()); formulas.add(ax15()); formulas.add(ax16_22()); return Formula.and(formulas); } /** * Returns the part of the conjecture 1 that applies to the given h. * @return the part of the conjecture 1 that applies to the given h. */ private final Formula co1h(Relation h) { final Variable x = Variable.unary("x"), y = Variable.unary("y"); return op1(x,y).join(h).eq(op2(x.join(h),y.join(h))).forAll(x.oneOf(s1).and(y.oneOf(s1))); } /** * Returns conjecture 1. * @return co1 */ public final Formula co1() { final List<Formula> formulas = new ArrayList<Formula>(); for(int i = 0; i < 7; i++) { formulas.add(co1h(h[i])); } return Formula.or(formulas); } /** * Returns the partial bounds the problem (axioms 1, 4, 9-11). * @return the partial bounds for the problem */ public Bounds bounds() { final List<String> atoms = new ArrayList<String>(14); for(int i = 0; i < 7; i++) atoms.add("e1"+i); for(int i = 0; i < 7; i++) atoms.add("e2"+i); final Universe u = new Universe(atoms); final Bounds b = new Bounds(u); final TupleFactory f = u.factory(); b.boundExactly(s1, f.range(f.tuple("e10"), f.tuple("e16"))); b.boundExactly(s2, f.range(f.tuple("e20"), f.tuple("e26"))); // axioms 9, 10, 11 for(int i = 0; i < 7; i++) { b.boundExactly(e1[i], f.setOf("e1"+i)); b.boundExactly(e2[i], f.setOf("e2"+i)); } // axom 1 final TupleSet op1h = f.area(f.tuple("e10", "e10", "e10"), f.tuple("e16", "e16", "e16")); // axiom 4 final TupleSet op2h = f.area(f.tuple("e20", "e20", "e20"), f.tuple("e26", "e26", "e26")); b.bound(op1, op1h); b.bound(op2, op2h); return b; } private static void displayOp(Instance instance, Relation op) { System.out.println("\n"+op+":"); final Iterator<Tuple> iter = instance.tuples(op).iterator(); for(int i = 0; i < 7; i++) { for(int j = 0; j < 7; j++) { System.out.print(iter.next().atom(2)); System.out.print("\t"); } System.out.println(); } } /** * Prints the values of the op1, op2, and h1-h7 relations * to standard out. */ void display(Instance instance) { displayOp(instance, op1); displayOp(instance, op2); for(int i = 0; i < 7; i++) { System.out.println("\n"+h[i]+":"); System.out.println(instance.tuples(h[i])); } } }