Matching
Randomly construct a permutation over a type t.
type t
relation rel(X:t,Y:t)
isolate prog = {
after init {
rel(X,Y) := X = Y;
}
action swap(a:t,b:t,c:t,d:t) = {
require rel(a,b) & rel(c,d);
rel(a,b) := false;
rel(c,d) := false;
rel(a,d) := true;
rel(c,b) := true;
}
}
isolate forward = {
invariant rel(X,Y) & rel(X,Z) -> Y = Z
invariant exists Y. rel(X,Y)
} with prog
isolate reverse = {
invariant rel(Y,X) & rel(Z,X) -> Y = Z
invariant exists Y. rel(Y,X)
} with prog
export prog.swap