Search in sources :

Example 46 with Relation

use of kodkod.ast.Relation in project org.alloytools.alloy by AlloyTools.

the class Simplifier method simplify_in.

/**
 * Simplify the bounds based on the fact that "a is subset of b"; return false
 * if we discover the formula is unsat.
 */
private final boolean simplify_in(Expression a, Expression b) {
    a = condense(a);
    b = condense(b);
    if (a instanceof Relation) {
        try {
            Relation r = (Relation) a;
            TupleSet ub = sol.query(true, r, false), lb = sol.query(false, r, false), t = sol.approximate(b);
            t.retainAll(ub);
            if (!t.containsAll(lb)) {
                rep.debug("Comment: Simplify " + a + " " + ub.size() + "->false\n");
                return false;
            }
            // This means the upperbound is shrunk BELOW the lowerbound.
            if (t.size() < ub.size()) {
                rep.debug("Comment: Simplify " + a + " " + ub.size() + "->" + t.size() + "\n");
                sol.shrink(r, lb, t);
            }
        } catch (Throwable ex) {
            // Not
            rep.debug("Comment: Simplify " + a + " exception: " + ex + "\n" + MailBug.dump(ex).trim() + "\n");
        // fatal;
        // let's
        // report
        // it
        // to
        // the
        // debug()
        // reporter
        }
    }
    return true;
}
Also used : TupleSet(kodkod.instance.TupleSet) Relation(kodkod.ast.Relation)

Example 47 with Relation

use of kodkod.ast.Relation in project org.alloytools.alloy by AlloyTools.

the class Test method main.

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/Null");
    Relation x7 = Relation.unary("this/Str");
    Relation x8 = Relation.unary("this/N0");
    Relation x9 = Relation.unary("this/N1");
    Relation x10 = Relation.unary("this/N2");
    Relation x11 = Relation.unary("this/Node remainder");
    Relation x12 = Relation.unary("this/This");
    Relation x13 = Relation.unary("this/List remainder");
    Relation x14 = Relation.unary("this/far0");
    Relation x15 = Relation.unary("this/far1");
    Relation x16 = Relation.unary("this/mid0");
    Relation x17 = Relation.unary("this/mid1");
    Relation x18 = Relation.unary("this/near0");
    Relation x19 = Relation.unary("this/near1");
    Relation x20 = Relation.nary("this/Node.data", 2);
    Relation x21 = Relation.nary("this/Node.next", 2);
    Relation x22 = Relation.nary("this/Node.next0", 2);
    Relation x23 = Relation.nary("this/Node.next1", 2);
    Relation x24 = Relation.nary("this/Node.next3", 2);
    Relation x25 = Relation.nary("this/List.head", 2);
    Relation x26 = Relation.nary("this/List.head0", 2);
    List<String> atomlist = Arrays.asList("-1", "-2", "-3", "-4", "-5", "-6", "-7", "-8", "0", "1", "2", "3", "4", "5", "6", "7", "N0$0", "N1$0", "N2$0", "Null$0", "Str$0", "Str$1", "Str$2", "This$0");
    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("Null$0"));
    bounds.boundExactly(x6, x6_upper);
    TupleSet x7_upper = factory.noneOf(1);
    x7_upper.add(factory.tuple("Str$0"));
    x7_upper.add(factory.tuple("Str$1"));
    x7_upper.add(factory.tuple("Str$2"));
    bounds.bound(x7, x7_upper);
    TupleSet x8_upper = factory.noneOf(1);
    x8_upper.add(factory.tuple("N0$0"));
    bounds.boundExactly(x8, x8_upper);
    TupleSet x9_upper = factory.noneOf(1);
    x9_upper.add(factory.tuple("N1$0"));
    bounds.boundExactly(x9, x9_upper);
    TupleSet x10_upper = factory.noneOf(1);
    x10_upper.add(factory.tuple("N2$0"));
    bounds.boundExactly(x10, x10_upper);
    TupleSet x11_upper = factory.noneOf(1);
    bounds.boundExactly(x11, x11_upper);
    TupleSet x12_upper = factory.noneOf(1);
    x12_upper.add(factory.tuple("This$0"));
    bounds.boundExactly(x12, x12_upper);
    TupleSet x13_upper = factory.noneOf(1);
    bounds.boundExactly(x13, x13_upper);
    TupleSet x14_upper = factory.noneOf(1);
    x14_upper.add(factory.tuple("N2$0"));
    bounds.bound(x14, x14_upper);
    TupleSet x15_upper = factory.noneOf(1);
    x15_upper.add(factory.tuple("Null$0"));
    bounds.bound(x15, x15_upper);
    TupleSet x16_upper = factory.noneOf(1);
    x16_upper.add(factory.tuple("N1$0"));
    bounds.bound(x16, x16_upper);
    TupleSet x17_upper = factory.noneOf(1);
    x17_upper.add(factory.tuple("N2$0"));
    bounds.bound(x17, x17_upper);
    TupleSet x18_upper = factory.noneOf(1);
    x18_upper.add(factory.tuple("N0$0"));
    bounds.bound(x18, x18_upper);
    TupleSet x19_upper = factory.noneOf(1);
    x19_upper.add(factory.tuple("N1$0"));
    bounds.bound(x19, x19_upper);
    TupleSet x20_upper = factory.noneOf(2);
    x20_upper.add(factory.tuple("N0$0").product(factory.tuple("Null$0")));
    x20_upper.add(factory.tuple("N0$0").product(factory.tuple("Str$0")));
    x20_upper.add(factory.tuple("N0$0").product(factory.tuple("Str$1")));
    x20_upper.add(factory.tuple("N0$0").product(factory.tuple("Str$2")));
    x20_upper.add(factory.tuple("N1$0").product(factory.tuple("Null$0")));
    x20_upper.add(factory.tuple("N1$0").product(factory.tuple("Str$0")));
    x20_upper.add(factory.tuple("N1$0").product(factory.tuple("Str$1")));
    x20_upper.add(factory.tuple("N1$0").product(factory.tuple("Str$2")));
    x20_upper.add(factory.tuple("N2$0").product(factory.tuple("Null$0")));
    x20_upper.add(factory.tuple("N2$0").product(factory.tuple("Str$0")));
    x20_upper.add(factory.tuple("N2$0").product(factory.tuple("Str$1")));
    x20_upper.add(factory.tuple("N2$0").product(factory.tuple("Str$2")));
    bounds.bound(x20, x20_upper);
    TupleSet x21_upper = factory.noneOf(2);
    x21_upper.add(factory.tuple("N0$0").product(factory.tuple("N1$0")));
    x21_upper.add(factory.tuple("N1$0").product(factory.tuple("N2$0")));
    x21_upper.add(factory.tuple("N2$0").product(factory.tuple("Null$0")));
    bounds.bound(x21, x21_upper);
    TupleSet x22_upper = factory.noneOf(2);
    x22_upper.add(factory.tuple("N0$0").product(factory.tuple("N1$0")));
    x22_upper.add(factory.tuple("N0$0").product(factory.tuple("N2$0")));
    x22_upper.add(factory.tuple("N1$0").product(factory.tuple("N2$0")));
    x22_upper.add(factory.tuple("N2$0").product(factory.tuple("Null$0")));
    bounds.bound(x22, x22_upper);
    TupleSet x23_upper = factory.noneOf(2);
    x23_upper.add(factory.tuple("N0$0").product(factory.tuple("N1$0")));
    x23_upper.add(factory.tuple("N0$0").product(factory.tuple("N2$0")));
    x23_upper.add(factory.tuple("N1$0").product(factory.tuple("N0$0")));
    x23_upper.add(factory.tuple("N1$0").product(factory.tuple("N2$0")));
    x23_upper.add(factory.tuple("N2$0").product(factory.tuple("Null$0")));
    bounds.bound(x23, x23_upper);
    TupleSet x24_upper = factory.noneOf(2);
    x24_upper.add(factory.tuple("N0$0").product(factory.tuple("N1$0")));
    x24_upper.add(factory.tuple("N1$0").product(factory.tuple("N0$0")));
    x24_upper.add(factory.tuple("N1$0").product(factory.tuple("N2$0")));
    x24_upper.add(factory.tuple("N2$0").product(factory.tuple("Null$0")));
    x24_upper.add(factory.tuple("N2$0").product(factory.tuple("N1$0")));
    bounds.bound(x24, x24_upper);
    TupleSet x25_upper = factory.noneOf(2);
    x25_upper.add(factory.tuple("This$0").product(factory.tuple("N0$0")));
    bounds.bound(x25, x25_upper);
    TupleSet x26_upper = factory.noneOf(2);
    x26_upper.add(factory.tuple("This$0").product(factory.tuple("N0$0")));
    x26_upper.add(factory.tuple("This$0").product(factory.tuple("N1$0")));
    x26_upper.add(factory.tuple("This$0").product(factory.tuple("N2$0")));
    bounds.bound(x26, x26_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")));
    Expression x29 = x8.intersection(x9);
    Formula x28 = x29.no();
    Expression x32 = x8.union(x9);
    Expression x31 = x32.intersection(x10);
    Formula x30 = x31.no();
    Expression x36 = x32.union(x10);
    Expression x35 = x36.union(x11);
    Expression x34 = x35.union(x6);
    Formula x33 = x14.in(x34);
    Expression x38 = x35.union(x6);
    Formula x37 = x15.in(x38);
    Expression x40 = x35.union(x6);
    Formula x39 = x16.in(x40);
    Expression x42 = x35.union(x6);
    Formula x41 = x17.in(x42);
    Expression x44 = x35.union(x6);
    Formula x43 = x18.in(x44);
    Expression x46 = x35.union(x6);
    Formula x45 = x19.in(x46);
    Formula x47 = x14.one();
    Formula x48 = x15.one();
    Formula x49 = x16.one();
    Formula x50 = x17.one();
    Formula x51 = x18.one();
    Formula x52 = x19.one();
    Variable x55 = Variable.unary("this");
    Decls x54 = x55.oneOf(x35);
    Expression x58 = x55.join(x20);
    Formula x57 = x58.one();
    Expression x60 = x7.union(x6);
    Formula x59 = x58.in(x60);
    Formula x56 = x57.and(x59);
    Formula x53 = x56.forAll(x54);
    Expression x62 = x20.join(Expression.UNIV);
    Formula x61 = x62.in(x35);
    Variable x66 = Variable.unary("this");
    Decls x65 = x66.oneOf(x35);
    Expression x69 = x66.join(x21);
    Formula x68 = x69.one();
    Expression x71 = x35.union(x6);
    Formula x70 = x69.in(x71);
    Formula x67 = x68.and(x70);
    Formula x64 = x67.forAll(x65);
    Expression x73 = x21.join(Expression.UNIV);
    Formula x72 = x73.in(x35);
    Variable x76 = Variable.unary("this");
    Decls x75 = x76.oneOf(x35);
    Expression x79 = x76.join(x22);
    Formula x78 = x79.one();
    Expression x81 = x35.union(x6);
    Formula x80 = x79.in(x81);
    Formula x77 = x78.and(x80);
    Formula x74 = x77.forAll(x75);
    Expression x83 = x22.join(Expression.UNIV);
    Formula x82 = x83.in(x35);
    Variable x86 = Variable.unary("this");
    Decls x85 = x86.oneOf(x35);
    Expression x89 = x86.join(x23);
    Formula x88 = x89.one();
    Expression x91 = x35.union(x6);
    Formula x90 = x89.in(x91);
    Formula x87 = x88.and(x90);
    Formula x84 = x87.forAll(x85);
    Expression x93 = x23.join(Expression.UNIV);
    Formula x92 = x93.in(x35);
    Variable x96 = Variable.unary("this");
    Decls x95 = x96.oneOf(x35);
    Expression x99 = x96.join(x24);
    Formula x98 = x99.one();
    Expression x101 = x35.union(x6);
    Formula x100 = x99.in(x101);
    Formula x97 = x98.and(x100);
    Formula x94 = x97.forAll(x95);
    Expression x103 = x24.join(Expression.UNIV);
    Formula x102 = x103.in(x35);
    Variable x106 = Variable.unary("this");
    Expression x107 = x12.union(x13);
    Decls x105 = x106.oneOf(x107);
    Expression x110 = x106.join(x25);
    Formula x109 = x110.one();
    Expression x112 = x35.union(x6);
    Formula x111 = x110.in(x112);
    Formula x108 = x109.and(x111);
    Formula x104 = x108.forAll(x105);
    Expression x114 = x25.join(Expression.UNIV);
    Formula x113 = x114.in(x107);
    Variable x117 = Variable.unary("this");
    Decls x116 = x117.oneOf(x107);
    Expression x120 = x117.join(x26);
    Formula x119 = x120.one();
    Expression x122 = x35.union(x6);
    Formula x121 = x120.in(x122);
    Formula x118 = x119.and(x121);
    Formula x115 = x118.forAll(x116);
    Expression x124 = x26.join(Expression.UNIV);
    Formula x123 = x124.in(x107);
    Expression x126 = x12.product(x8);
    Formula x125 = x25.eq(x126);
    Expression x130 = x8.product(x9);
    Expression x131 = x9.product(x10);
    Expression x129 = x130.union(x131);
    Expression x132 = x10.product(x6);
    Expression x128 = x129.union(x132);
    Formula x127 = x21.eq(x128);
    Expression x134 = x12.join(x25);
    Formula x133 = x18.eq(x134);
    Expression x136 = x18.join(x21);
    Formula x135 = x16.eq(x136);
    Expression x138 = x16.join(x21);
    Formula x137 = x14.eq(x138);
    Expression x141 = x18.product(x14);
    Expression x140 = x21.override(x141);
    Formula x139 = x22.eq(x140);
    Expression x144 = x16.product(x18);
    Expression x143 = x22.override(x144);
    Formula x142 = x23.eq(x143);
    Formula x145 = x19.eq(x16);
    Formula x146 = x17.eq(x14);
    Expression x148 = x14.join(x23);
    Formula x147 = x15.eq(x148);
    Formula x153 = x14.eq(x6);
    Formula x152 = x153.not();
    Expression x151 = x152.thenElse(x23, x22);
    Expression x155 = x152.thenElse(x17, x16);
    Expression x156 = x152.thenElse(x19, x18);
    Expression x154 = x155.product(x156);
    Expression x150 = x151.override(x154);
    Formula x149 = x24.eq(x150);
    Expression x159 = x12.product(x155);
    Expression x158 = x25.override(x159);
    Formula x157 = x26.eq(x158);
    Expression x161 = x152.thenElse(x15, x14);
    Formula x160 = x161.eq(x6);
    Expression x164 = x21.closure();
    Expression x172 = Expression.INTS.union(x5);
    Expression x171 = x172.union(x6);
    Expression x170 = x171.union(x7);
    Expression x169 = x170.union(x35);
    Expression x168 = x169.union(x107);
    Expression x167 = x168.product(Expression.UNIV);
    Expression x165 = Expression.IDEN.intersection(x167);
    Expression x163 = x164.intersection(x165);
    Formula x162 = x163.no();
    Expression x177 = x12.join(x25);
    Formula x176 = x177.eq(x6);
    Formula x175 = x176.not();
    Expression x181 = x12.join(x25);
    Expression x180 = x181.join(x21);
    Formula x179 = x180.eq(x6);
    Formula x178 = x179.not();
    Formula x174 = x175.and(x178);
    Expression x184 = x24.closure();
    Expression x186 = x168.product(Expression.UNIV);
    Expression x185 = Expression.IDEN.intersection(x186);
    Expression x183 = x184.intersection(x185);
    Formula x182 = x183.no();
    Expression x190 = x12.join(x26);
    Expression x192 = x24.closure();
    Expression x194 = x168.product(Expression.UNIV);
    Expression x193 = Expression.IDEN.intersection(x194);
    Expression x191 = x192.union(x193);
    Expression x189 = x190.join(x191);
    Expression x196 = x12.join(x25);
    Expression x198 = x21.closure();
    Expression x200 = x168.product(Expression.UNIV);
    Expression x199 = Expression.IDEN.intersection(x200);
    Expression x197 = x198.union(x199);
    Expression x195 = x196.join(x197);
    Formula x188 = x189.eq(x195);
    Expression x209 = x12.join(x25);
    Expression x211 = x21.closure();
    Expression x213 = x168.product(Expression.UNIV);
    Expression x212 = Expression.IDEN.intersection(x213);
    Expression x210 = x211.union(x212);
    Expression x208 = x209.join(x210);
    Expression x207 = x208.difference(x6);
    Expression x206 = x207.product(x207);
    Expression x205 = x21.intersection(x206);
    Expression x204 = x205.transpose();
    Expression x203 = x21.override(x204);
    Expression x215 = x12.join(x25);
    Expression x214 = x215.product(x6);
    Expression x202 = x203.override(x214);
    Formula x201 = x24.eq(x202);
    Formula x187 = x188.and(x201);
    Formula x216 = x0.eq(x0);
    Formula x217 = x1.eq(x1);
    Formula x218 = x2.eq(x2);
    Formula x219 = x3.eq(x3);
    Formula x220 = x4.eq(x4);
    Formula x221 = x5.eq(x5);
    Formula x222 = x6.eq(x6);
    Formula x223 = x7.eq(x7);
    Formula x224 = x8.eq(x8);
    Formula x225 = x9.eq(x9);
    Formula x226 = x10.eq(x10);
    Formula x227 = x11.eq(x11);
    Formula x228 = x12.eq(x12);
    Formula x229 = x13.eq(x13);
    Formula x230 = x14.eq(x14);
    Formula x231 = x15.eq(x15);
    Formula x232 = x16.eq(x16);
    Formula x233 = x17.eq(x17);
    Formula x234 = x18.eq(x18);
    Formula x235 = x19.eq(x19);
    Formula x236 = x20.eq(x20);
    Formula x237 = x21.eq(x21);
    Formula x238 = x22.eq(x22);
    Formula x239 = x23.eq(x23);
    Formula x240 = x24.eq(x24);
    Formula x241 = x25.eq(x25);
    Formula x242 = x26.eq(x26);
    Formula x27 = Formula.compose(FormulaOperator.AND, x28, x30, x33, x37, x39, x41, x43, x45, x47, x48, x49, x50, x51, x52, x53, x61, x64, x72, x74, x82, x84, x92, x94, x102, x104, x113, x115, x123, x125, x127, x133, x135, x137, x139, x142, x145, x146, x147, x149, x157, x160, x162, x174, x182, x187, x216, x217, x218, x219, x220, x221, x222, x223, x224, x225, x226, x227, x228, x229, x230, x231, x232, x233, x234, x235, x236, x237, x238, x239, x240, x241, x242);
    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();
    System.out.println(bounds);
    Solution sol = solver.solve(x27, bounds);
    System.out.println(sol.toString());
}
Also used : TupleSet(kodkod.instance.TupleSet) Solver(kodkod.engine.Solver) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) Bounds(kodkod.instance.Bounds) TupleFactory(kodkod.instance.TupleFactory) Universe(kodkod.instance.Universe) Formula(kodkod.ast.Formula) Relation(kodkod.ast.Relation) Expression(kodkod.ast.Expression) Solution(kodkod.engine.Solution)

Example 48 with Relation

use of kodkod.ast.Relation in project org.alloytools.alloy by AlloyTools.

the class ALG195_1 method ax3and6.

/**
 * Parametrization of axioms 3 and 6.
 *
 * @requires s is unary, op is ternary
 */
private static Formula ax3and6(Relation[] e, Relation op) {
    Formula f = Formula.TRUE;
    for (Relation x : e) {
        for (Relation y : e) {
            // op(y,x)
            Expression expr0 = x.join(y.join(op));
            // op(op(y,x),y)
            Expression expr1 = y.join(expr0.join(op));
            // op(op(op(y,x),y),y)
            Expression expr2 = y.join(expr1.join(op));
            f = f.and(expr2.eq(x));
        }
    }
    return f;
}
Also used : Formula(kodkod.ast.Formula) Relation(kodkod.ast.Relation) Expression(kodkod.ast.Expression)

Example 49 with Relation

use of kodkod.ast.Relation in project org.alloytools.alloy by AlloyTools.

the class AnnotatedNode method relations.

/**
 * Returns the set of all relations at the leaves of this annotated node.
 *
 * @return Relation & this.node.*components
 */
public final Set<Relation> relations() {
    final Set<Relation> relations = new IdentityHashSet<Relation>();
    final AbstractVoidVisitor visitor = new AbstractVoidVisitor() {

        private final Set<Node> visited = new IdentityHashSet<Node>(sharedNodes.size());

        @Override
        protected boolean visited(Node n) {
            return sharedNodes.contains(n) && !visited.add(n);
        }

        @Override
        public void visit(Relation relation) {
            relations.add(relation);
        }
    };
    node.accept(visitor);
    return relations;
}
Also used : IdentityHashSet(kodkod.util.collections.IdentityHashSet) AbstractVoidVisitor(kodkod.ast.visitor.AbstractVoidVisitor) Relation(kodkod.ast.Relation) Set(java.util.Set) IdentityHashSet(kodkod.util.collections.IdentityHashSet) Node(kodkod.ast.Node)

Example 50 with Relation

use of kodkod.ast.Relation in project org.alloytools.alloy by AlloyTools.

the class Quasigroups7 method decls.

/**
 * 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);
}
Also used : Formula(kodkod.ast.Formula) Relation(kodkod.ast.Relation) ArrayList(java.util.ArrayList)

Aggregations

Relation (kodkod.ast.Relation)87 Bounds (kodkod.instance.Bounds)49 Formula (kodkod.ast.Formula)45 TupleFactory (kodkod.instance.TupleFactory)45 Universe (kodkod.instance.Universe)45 TupleSet (kodkod.instance.TupleSet)43 Solution (kodkod.engine.Solution)30 Expression (kodkod.ast.Expression)26 IntExpression (kodkod.ast.IntExpression)24 Solver (kodkod.engine.Solver)24 ArrayList (java.util.ArrayList)23 Variable (kodkod.ast.Variable)23 Instance (kodkod.instance.Instance)15 Decls (kodkod.ast.Decls)13 Evaluator (kodkod.engine.Evaluator)9 Tuple (kodkod.instance.Tuple)8 IntSet (kodkod.util.ints.IntSet)7 BinaryExpression (kodkod.ast.BinaryExpression)6 Decl (kodkod.ast.Decl)6 LinkedHashSet (java.util.LinkedHashSet)4