Liveness mc1

This file contains a simple liveness proof, also shown in figure 3 in the tool paper submission.

To verify this file, run:

$ ivy_check liveness.ivy
...
OK
include mc_schemata

module signal = {
    action raise

    specification {
        relation now
        after init { now := false; }
        before raise {
            now := true;
            now := false;
        }
    }
}

isolate bar = {
    finite type t
    action step(x:t)
    var last : t        # history variable

    specification {
        relation pending(X:t)
        after init {
            pending(X) := true;
        }
        instance enter : signal

        before step {
            require pending(x);
            call enter.raise;
            pending(x) := false;
            last := x;
        }

        temporal property
            (globally eventually enter.now) ->
            eventually forall X.~pending(X)
        proof {
            tactic l2s_full proof {let L = last}
            showgoals
            tactic mc
            showgoals
        }
    }
}

export bar.step