Counter example
module counter(t) = {
individual val : t
init val = 0
action up = {
val := val + 1
}
action down = {
val := val - 1
}
action is_zero returns(z : bool) = {
z := (val = 0)
}
}
type foo
instance d : counter(foo)
type bar
instance c(X:bar) : counter(foo)
}
module counter_prop(c) = {
relation was_up
init ~was_up
action up = {
was_up := true
}
execute up after c.up
action down = {
was_up := false
}
execute down after c.down
action is_zero returns (z:bool) = {
assert was_up -> ~z
}
execute is_zero after c.is_zero
}
instance cp : counter_prop(d)
export d.up
export d.down
export d.is_zero