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);
}
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);
}
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))));
}
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));
}
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;
}
Aggregations