Search in sources :

Example 1 with Decls

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

the class OverflowTheoremTest method testCardinality2.

/**
 * all s, t : set univ | #(s + t) >= #s && #(s + t) >= #t
 */
@Test
public void testCardinality2() {
    Variable s = Variable.unary("s");
    Variable t = Variable.unary("t");
    IntExpression sutCnt = s.union(t).count();
    Decls dcls = s.setOf(Expression.UNIV).and(t.setOf(Expression.UNIV));
    Formula f = sutCnt.gte(s.count()).and(sutCnt.gte(t.count())).forAll(dcls);
    checkTrue(f);
}
Also used : Formula(kodkod.ast.Formula) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) IntExpression(kodkod.ast.IntExpression) Test(org.junit.Test)

Example 2 with Decls

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

the class OverflowTheoremTest method testCardinality3.

/**
 * all a, b: set univ | a in b => #a <= #b
 */
@Test
public void testCardinality3() {
    Variable a = Variable.unary("a");
    Variable b = Variable.unary("b");
    Decls dcls = a.setOf(Expression.UNIV).and(b.setOf(Expression.UNIV));
    Formula pre = a.in(b);
    Formula post = a.count().lte(b.count());
    checkTrue(pre, post, dcls);
}
Also used : Formula(kodkod.ast.Formula) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) Test(org.junit.Test)

Example 3 with Decls

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

the class Dijkstra method grabOrRelease.

/**
 * Returns the GrabOrRelease predicate.
 *
 * @return
 *
 *         <pre>
 * pred GrabOrRelease () {
 *    Initial(so/first()) &&
 *    (
 *    all pre: State - so/last () | let post = so/next (pre) |
 *       (post.holds = pre.holds && post.waits = pre.waits)
 *        ||
 *       (some p: Process, m: Mutex | pre::GrabMutex (p, m, post))
 *        ||
 *       (some p: Process, m: Mutex | pre::ReleaseMutex (p, m, post))
 *
 *    )
 * }
 *         </pre>
 */
public Formula grabOrRelease() {
    final Variable pre = Variable.unary("pre");
    final Expression post = pre.join(sord);
    final Formula f1 = post.join(holds).eq(pre.join(holds));
    final Formula f2 = post.join(waits).eq(pre.join(waits));
    final Variable p = Variable.unary("p");
    final Variable m = Variable.unary("m");
    final Decls d = p.oneOf(Process).and(m.oneOf(Mutex));
    final Formula f3 = grabMutex(pre, post, p, m).forSome(d);
    final Formula f4 = releaseMutex(pre, post, p, m).forSome(d);
    return initial(sfirst).and(((f1.and(f2)).or(f3).or(f4)).forAll(pre.oneOf(State.difference(slast))));
}
Also used : Formula(kodkod.ast.Formula) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) Expression(kodkod.ast.Expression)

Example 4 with Decls

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

the class BoundsComputer method size.

// ==============================================================================================================//
/**
 * 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("v" + Integer.toString(TranslateAlloyToKodkod.cnt++));
        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));
}
Also used : Formula(kodkod.ast.Formula) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) Expression(kodkod.ast.Expression)

Example 5 with Decls

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

the class TranslateAlloyToKodkod method isInBinary.

/**
 * Helper method that translates the formula "r in (a ?->? b)" into a Kodkod
 * formula.
 */
private Formula isInBinary(Expression r, ExprBinary ab) throws Err {
    final Expression a = cset(ab.left), b = cset(ab.right);
    Decls d = null, d2 = null;
    Formula ans1, ans2;
    // "R in A ->op B" means for each tuple a in A, there are "op" tuples in
    // r that begins with a.
    Expression atuple = null, ar = r;
    for (int i = a.arity(); i > 0; i--) {
        Variable v = Variable.unary("v" + Integer.toString(cnt++));
        if (!am) {
            if (a.arity() == 1)
                d = v.oneOf(a);
            else if (d == null)
                d = v.oneOf(Expression.UNIV);
            else
                d = v.oneOf(Expression.UNIV).and(d);
        } else {
            d = am(a, d, i, v);
        }
        ar = v.join(ar);
        if (atuple == null)
            atuple = v;
        else
            atuple = atuple.product(v);
    }
    ans1 = isIn(ar, ab.right);
    switch(ab.op) {
        case ISSEQ_ARROW_LONE:
        case ANY_ARROW_LONE:
        case SOME_ARROW_LONE:
        case ONE_ARROW_LONE:
        case LONE_ARROW_LONE:
            ans1 = ar.lone().and(ans1);
            break;
        case ANY_ARROW_ONE:
        case SOME_ARROW_ONE:
        case ONE_ARROW_ONE:
        case LONE_ARROW_ONE:
            ans1 = ar.one().and(ans1);
            break;
        case ANY_ARROW_SOME:
        case SOME_ARROW_SOME:
        case ONE_ARROW_SOME:
        case LONE_ARROW_SOME:
            ans1 = ar.some().and(ans1);
            break;
    }
    if (a.arity() > 1) {
        Formula tmp = isIn(atuple, ab.left);
        if (tmp != Formula.TRUE)
            ans1 = tmp.implies(ans1);
    }
    ans1 = ans1.forAll(d);
    // "R in A op-> B" means for each tuple b in B, there are "op" tuples in
    // r that end with b.
    Expression btuple = null, rb = r;
    for (int i = b.arity(); i > 0; i--) {
        Variable v = Variable.unary("v" + Integer.toString(cnt++));
        if (!am) {
            if (b.arity() == 1)
                d2 = v.oneOf(b);
            else if (d2 == null)
                d2 = v.oneOf(Expression.UNIV);
            else
                d2 = v.oneOf(Expression.UNIV).and(d2);
        } else {
            d2 = am(b, d2, i, v);
        }
        rb = rb.join(v);
        if (btuple == null)
            btuple = v;
        else
            btuple = v.product(btuple);
    }
    ans2 = isIn(rb, ab.left);
    switch(ab.op) {
        case LONE_ARROW_ANY:
        case LONE_ARROW_SOME:
        case LONE_ARROW_ONE:
        case LONE_ARROW_LONE:
            ans2 = rb.lone().and(ans2);
            break;
        case ONE_ARROW_ANY:
        case ONE_ARROW_SOME:
        case ONE_ARROW_ONE:
        case ONE_ARROW_LONE:
            ans2 = rb.one().and(ans2);
            break;
        case SOME_ARROW_ANY:
        case SOME_ARROW_SOME:
        case SOME_ARROW_ONE:
        case SOME_ARROW_LONE:
            ans2 = rb.some().and(ans2);
            break;
    }
    if (b.arity() > 1) {
        Formula tmp = isIn(btuple, ab.right);
        if (tmp != Formula.TRUE)
            ans2 = tmp.implies(ans2);
    }
    ans2 = ans2.forAll(d2);
    // Now, put everything together
    Formula ans = r.in(a.product(b)).and(ans1).and(ans2);
    if (ab.op == ExprBinary.Op.ISSEQ_ARROW_LONE) {
        Expression rr = r;
        while (rr.arity() > 1) rr = rr.join(Expression.UNIV);
        ans = rr.difference(rr.join(A4Solution.KK_NEXT)).in(A4Solution.KK_ZERO).and(ans);
    }
    return ans;
}
Also used : QuantifiedFormula(kodkod.ast.QuantifiedFormula) Formula(kodkod.ast.Formula) Variable(kodkod.ast.Variable) Decls(kodkod.ast.Decls) Expression(kodkod.ast.Expression) BinaryExpression(kodkod.ast.BinaryExpression) IntExpression(kodkod.ast.IntExpression)

Aggregations

Decls (kodkod.ast.Decls)33 Formula (kodkod.ast.Formula)25 Variable (kodkod.ast.Variable)24 Expression (kodkod.ast.Expression)22 IntExpression (kodkod.ast.IntExpression)20 Relation (kodkod.ast.Relation)13 Solution (kodkod.engine.Solution)11 Solver (kodkod.engine.Solver)11 Bounds (kodkod.instance.Bounds)11 TupleFactory (kodkod.instance.TupleFactory)11 Universe (kodkod.instance.Universe)11 TupleSet (kodkod.instance.TupleSet)10 QuantifiedFormula (kodkod.ast.QuantifiedFormula)8 Decl (kodkod.ast.Decl)7 BinaryFormula (kodkod.ast.BinaryFormula)6 ComparisonFormula (kodkod.ast.ComparisonFormula)6 IntComparisonFormula (kodkod.ast.IntComparisonFormula)6 MultiplicityFormula (kodkod.ast.MultiplicityFormula)6 NaryFormula (kodkod.ast.NaryFormula)6 NotFormula (kodkod.ast.NotFormula)6