33
44type TaggedLocNode V = TaggedLoc (Node V) Unit;
55
6- datatype Treiber< V> { Treiber(top: Option (LocNode V), {:linear} nodes: Map (LocNode V) (Node V)) }
6+ datatype Treiber< V> { Treiber(top: Option (LocNode V), {:linear} nodes: Map (One ( LocNode V) ) (Node V)) }
77type LocTreiber V = Loc (Treiber V);
88type TaggedLocTreiber V = TaggedLoc (Treiber V) Unit;
99
1010type X;
1111var ts: Map (LocTreiber X) (Treiber X);
1212
13+ function {:inline} SubsetInv(ts: Map (LocTreiber X) (Treiber X), ref_t: LocTreiber X): bool
14+ {
15+ (var t := Map_At(ts, ref_t);
16+ (var m := t-> nodes;
17+ (forall x: LocNode X:: BetweenSet(m-> val, t-> top, None())[x] ==> Set_Contains(m-> dom, One(x)))))
18+ }
19+
1320procedure YieldInv(ref_t: LocTreiber X)
1421requires Map_Contains(ts, ref_t);
1522requires (var t := Map_At(ts, ref_t); Between(t-> nodes-> val, t-> top, None(), None()));
16- requires ( var t := Map_At( ts, ref_t); ( var m := t- > nodes; IsSubset(BetweenSet(m- > val, t- > top, None()), m- > dom- > val)) );
23+ requires SubsetInv( ts, ref_t);
1724ensures Map_Contains(ts, ref_t);
1825ensures (var t := Map_At(ts, ref_t); Between(t-> nodes-> val, t-> top, None(), None()));
19- ensures ( var t := Map_At( ts, ref_t); ( var m := t- > nodes; IsSubset(BetweenSet(m- > val, t- > top, None()), m- > dom- > val)) );
26+ ensures SubsetInv( ts, ref_t);
2027modifies ts;
2128{
2229 var x: X;
@@ -31,8 +38,8 @@ modifies ts;
3138 var loc_n_opt: Option (LocNode X);
3239 assert Map_Contains(ts, loc_t);
3340 treiber := Map_At(ts, loc_t);
34- assume treiber-> top is Some && Map_Contains(treiber-> nodes, treiber-> top-> t);
35- Node(loc_n_opt, x) := Map_At(treiber-> nodes, treiber-> top-> t);
41+ assume treiber-> top is Some && Map_Contains(treiber-> nodes, One( treiber-> top-> t) );
42+ Node(loc_n_opt, x) := Map_At(treiber-> nodes, One( treiber-> top-> t) );
3643 treiber-> top := loc_n_opt;
3744 ts := Map_Update(ts, loc_t, treiber);
3845}
@@ -44,8 +51,8 @@ modifies ts;
4451 var loc_n: LocNode X;
4552 assert Map_Contains(ts, loc_t);
4653 treiber := Map_At(ts, loc_t);
47- assume ! Map_Contains(treiber-> nodes, loc_n);
48- treiber-> nodes := Map_Update(treiber-> nodes, loc_n, Node(treiber-> top, x));
54+ assume ! Map_Contains(treiber-> nodes, One( loc_n) );
55+ treiber-> nodes := Map_Update(treiber-> nodes, One( loc_n) , Node(treiber-> top, x));
4956 treiber-> top := Some(loc_n);
5057 ts := Map_Update(ts, loc_t, treiber);
5158}
0 commit comments