Sht
include collections
ยค
Specification of delegation map
module delegation_map(key,id) = {
action set(lo:key.t,hi:key.t,dst:id)
action get(k:key.t) returns (val:id)
relation map(K:key.t, X:id)
init map(K,X) <-> X = 0
object spec = {
before set {
map(K,X) := (X = dst) & (lo <= K & K <= hi)
| map(K,X) & ~(lo <= K & K <= hi)
}
after get {
assert map(k,val)
}
}
conjecture map(K,V) & map(K,W) -> V = W
object impl = {
function entries(K:key.t) :id
init entries(0) = 0
instance has : ordered_set(key.t)
implement set(lo:key.t,hi:key.t,dst:id) {
if lo <= hi {
if hi ~= key.max {
local nkey:key.t, nid:id {
nkey := key.next(hi);
nid := entries(has.get_glb(nkey));
entries(nkey) := nid;
call has.insert(nkey)
}
};
call has.erase(lo,hi);
entries(lo) := dst;
call has.insert(lo)
}
}
implement get(k:key.t) returns (val:id) {
val := entries(has.get_glb(k))
}
conjecture has.s(K) & has.succ.map(K,L) & K <= M & (L = 0 | L > M) -> map(M,entries(K))
conjecture has.s(0)
}
}