Skip to content

Commit 82f712b

Browse files
authored
Merge pull request #518 from mtzguido/ghostbag
GhostBag: remove use of option type, use 0.0R for None
2 parents dd02467 + 92d86b7 commit 82f712b

File tree

1 file changed

+50
-54
lines changed

1 file changed

+50
-54
lines changed

share/pulse/examples/GhostBag.fst

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ module GhostBag
3838
open FStar.PCM
3939
open Pulse.Lib.Pervasives
4040

41-
type map (a:eqtype) = m:Map.t a (option perm) { forall (x:a). Map.contains m x }
41+
let perm0 = r:real{r >=. 0.0R}
42+
type map (a:eqtype) = m:Map.t a perm0 { forall (x:a). Map.contains m x }
4243

4344
//
4445
// P represents the partial knowledge of the set membership
@@ -67,26 +68,21 @@ let gbag_pcm_composable #a : symrel (gbag_pcm_carrier a) =
6768
match x, y with
6869
| P m1, P m2 ->
6970
forall (x:a).
70-
(Map.sel m1 x == None) \/
71-
(Map.sel m2 x == None) \/
72-
((Some?.v (Map.sel m1 x)) +. (Some?.v ((Map.sel m2 x)))) <=. 1.0R
73-
71+
(Map.sel m1 x == 0.0R) \/
72+
(Map.sel m2 x == 0.0R) \/
73+
(Map.sel m1 x +. Map.sel m2 x) <=. 1.0R
74+
7475
| F m1, P m2
7576
| P m2, F m1 ->
7677
forall (x:a).
77-
(Map.sel m2 x == None) \/
78-
(Some? (Map.sel m1 x) /\ ((Some?.v (Map.sel m1 x)) +. (Some?.v ((Map.sel m2 x)))) <=. 1.0R)
78+
(Map.sel m2 x == 0.0R) \/
79+
(Map.sel m1 x >. 0.0R /\ Map.sel m1 x +. Map.sel m2 x <=. 1.0R)
7980

8081
| _ -> False
8182

8283
let op_maps #a (m1:map a) (m2:map a) : map a =
83-
Map.map_literal #a #(option perm) (fun x ->
84-
match Map.sel m1 x, Map.sel m2 x with
85-
| None, None -> None
86-
| Some p, None -> Some p
87-
| None, Some p -> Some p
88-
| Some p1, Some p2 ->
89-
Some (p1 +. p2)
84+
Map.map_literal #a #perm0 (fun x ->
85+
Map.sel m1 x +. Map.sel m2 x
9086
)
9187

9288
let gbag_pcm_op #a (x:gbag_pcm_carrier a) (y:gbag_pcm_carrier a { gbag_pcm_composable x y })
@@ -97,7 +93,7 @@ let gbag_pcm_op #a (x:gbag_pcm_carrier a) (y:gbag_pcm_carrier a { gbag_pcm_compo
9793
| F m1, P m2
9894
| P m1, F m2 -> F (op_maps m1 m2)
9995

100-
let gbag_pcm_one #a : gbag_pcm_carrier a = P (Map.const None)
96+
let gbag_pcm_one #a : gbag_pcm_carrier a = P (Map.const 0.0R)
10197

10298
let gbag_pcm' a : pcm' (gbag_pcm_carrier a) =
10399
{
@@ -154,41 +150,39 @@ let gbag_pcm a : pcm (gbag_pcm_carrier a) = {
154150
refine = (fun _ -> True)
155151
}
156152

157-
#restart-solver
158-
#push-options "--z3rlimit_factor 4 --fuel 0 --ifuel 1 --split_queries no --warn_error -271"
159153
let fp_upd_add #a
160154
(m:map a)
161-
(x:a { Map.sel m x == None })
162-
: frame_preserving_upd (gbag_pcm a) (F m) (F (Map.upd m x (Some 1.0R))) =
155+
(x:a { Map.sel m x == 0.0R })
156+
: frame_preserving_upd (gbag_pcm a) (F m) (F (Map.upd m x 1.0R)) =
163157

164158
fun v ->
165159
let F mv = v in
166-
let v_new = F (Map.upd mv x (Some 1.0R)) in
160+
let v_new = F (Map.upd mv x 1.0R) in
167161

168162
eliminate exists (frame:gbag_pcm_carrier a). composable (gbag_pcm a) (F m) frame /\
169163
op (gbag_pcm a) frame (F m) == v
170-
returns compatible (gbag_pcm a) (F (Map.upd m x (Some 1.0R))) v_new
164+
returns compatible (gbag_pcm a) (F (Map.upd m x 1.0R)) v_new
171165
with _. (match frame with
172166
| P m_frame
173167
| F m_frame ->
174-
assert (Map.equal (op_maps m_frame (Map.upd m x (Some 1.0R)))
175-
(Map.upd mv x (Some 1.0R))));
168+
assert (Map.equal (op_maps m_frame (Map.upd m x 1.0R))
169+
(Map.upd mv x 1.0R)));
176170

177171
let aux (frame:gbag_pcm_carrier a)
178172
: Lemma
179173
(requires
180174
gbag_pcm_composable (F m) frame /\
181175
gbag_pcm_op (F m) frame == v)
182176
(ensures
183-
gbag_pcm_composable (F (Map.upd m x (Some 1.0R))) frame /\
184-
gbag_pcm_op (F (Map.upd m x (Some 1.0R))) frame == v_new)
177+
gbag_pcm_composable (F (Map.upd m x 1.0R)) frame /\
178+
gbag_pcm_op (F (Map.upd m x 1.0R)) frame == v_new)
185179
[SMTPat ()] =
186180

187181
match frame with
188182
| P m_frame
189183
| F m_frame ->
190-
assert (Map.equal (op_maps (Map.upd m x (Some 1.0R)) m_frame)
191-
(Map.upd mv x (Some 1.0R)));
184+
assert (Map.equal (op_maps (Map.upd m x 1.0R) m_frame)
185+
(Map.upd mv x 1.0R));
192186
()
193187
in
194188

@@ -197,54 +191,53 @@ let fp_upd_add #a
197191

198192
let fp_upd_rem #a
199193
(m:map a)
200-
(x:a { Map.sel m x == Some 1.0R })
201-
: frame_preserving_upd (gbag_pcm a) (F m) (F (Map.upd m x None)) =
194+
(x:a { Map.sel m x == 1.0R })
195+
: frame_preserving_upd (gbag_pcm a) (F m) (F (Map.upd m x 0.0R)) =
202196

203197
fun v ->
204198
let F mv = v in
205-
let v_new = F (Map.upd mv x None) in
199+
let v_new = F (Map.upd mv x 0.0R) in
206200

207201
eliminate exists (frame:gbag_pcm_carrier a). composable (gbag_pcm a) (F m) frame /\
208202
op (gbag_pcm a) frame (F m) == v
209-
returns compatible (gbag_pcm a) (F (Map.upd m x None)) v_new
203+
returns compatible (gbag_pcm a) (F (Map.upd m x 0.0R)) v_new
210204
with _. (match frame with
211205
| P m_frame
212206
| F m_frame ->
213-
assert (Map.equal (op_maps m_frame (Map.upd m x None))
214-
(Map.upd mv x None));
215-
assert (composable (gbag_pcm a) (F (Map.upd m x None)) frame));
207+
assert (Map.equal (op_maps m_frame (Map.upd m x 0.0R))
208+
(Map.upd mv x 0.0R));
209+
assert (composable (gbag_pcm a) (F (Map.upd m x 0.0R)) frame));
216210

217211
let aux (frame:gbag_pcm_carrier a)
218212
: Lemma
219213
(requires
220214
gbag_pcm_composable (F m) frame /\
221215
gbag_pcm_op (F m) frame == v)
222216
(ensures
223-
gbag_pcm_composable (F (Map.upd m x None)) frame /\
224-
gbag_pcm_op (F (Map.upd m x None)) frame == v_new)
217+
gbag_pcm_composable (F (Map.upd m x 0.0R)) frame /\
218+
gbag_pcm_op (F (Map.upd m x 0.0R)) frame == v_new)
225219
[SMTPat ()] =
226220

227221
match frame with
228222
| P m_frame
229223
| F m_frame ->
230-
assert (Map.equal (op_maps (Map.upd m x None) m_frame)
231-
(Map.upd mv x None));
224+
assert (Map.equal (op_maps (Map.upd m x 0.0R) m_frame)
225+
(Map.upd mv x 0.0R));
232226
()
233227
in
234228

235229
v_new
236-
#pop-options
237230

238231
module GR = Pulse.Lib.GhostPCMReference
239232

240233
let gbag #a (r:GR.gref (gbag_pcm a)) (s:Set.set a) : slprop =
241234
exists* (m:map a).
242235
GR.pts_to r (F m) **
243-
(pure (forall (x:a). (~ (Set.mem x s)) ==> Map.sel m x == None)) **
244-
(pure (forall (x:a). Set.mem x s ==> Map.sel m x == Some 0.5R))
236+
(pure (forall (x:a). (~ (Set.mem x s)) ==> Map.sel m x == 0.0R)) **
237+
(pure (forall (x:a). Set.mem x s ==> Map.sel m x == 0.5R))
245238

246239
let gbagh #a (r:GR.gref (gbag_pcm a)) (x:a) : slprop =
247-
GR.pts_to r (P (Map.upd (Map.const None) x (Some 0.5R)))
240+
GR.pts_to r (P (Map.upd (Map.const 0.0R) x 0.5R))
248241

249242

250243

@@ -254,7 +247,7 @@ fn gbag_create (a:eqtype)
254247
returns r:GR.gref (gbag_pcm a)
255248
ensures gbag r Set.empty
256249
{
257-
let r = GR.alloc #_ #(gbag_pcm a) (F (Map.const None));
250+
let r = GR.alloc #_ #(gbag_pcm a) (F (Map.const 0.0R));
258251
with _m. rewrite (GR.pts_to r (Ghost.reveal (Ghost.hide _m))) as
259252
(GR.pts_to r _m);
260253
fold (gbag r Set.empty);
@@ -263,6 +256,9 @@ fn gbag_create (a:eqtype)
263256

264257

265258

259+
#set-options "--split_queries always --debug SMTFail"
260+
261+
266262
ghost
267263
fn gbag_add #a (r:GR.gref (gbag_pcm a)) (s:Set.set a) (x:a)
268264
requires gbag r s **
@@ -272,16 +268,16 @@ fn gbag_add #a (r:GR.gref (gbag_pcm a)) (s:Set.set a) (x:a)
272268
{
273269
unfold gbag;
274270
with mf. assert (GR.pts_to r (F mf));
275-
GR.write r (F mf) (F (Map.upd mf x (Some 1.0R))) (fp_upd_add mf x);
276-
assert (pure (Map.equal (Map.upd mf x (Some 1.0R))
277-
(op_maps (Map.upd mf x (Some 0.5R))
278-
(Map.upd (Map.const None) x (Some 0.5R)))));
279-
rewrite (GR.pts_to r (F (Map.upd mf x (Some 1.0R)))) as
271+
GR.write r (F mf) (F (Map.upd mf x 1.0R)) (fp_upd_add mf x);
272+
assert (pure (Map.equal (Map.upd mf x 1.0R)
273+
(op_maps (Map.upd mf x 0.5R)
274+
(Map.upd (Map.const #a #perm0 0.0R) x 0.5R))));
275+
rewrite (GR.pts_to r (F (Map.upd mf x 1.0R))) as
280276
(GR.pts_to r (op (gbag_pcm a)
281-
(F (Map.upd mf x (Some 0.5R)))
282-
(P (Map.upd (Map.const None) x (Some 0.5R)))));
283-
GR.share r (F (Map.upd mf x (Some 0.5R)))
284-
(P (Map.upd (Map.const None) x (Some 0.5R)));
277+
(F (Map.upd mf x 0.5R))
278+
(P (Map.upd (Map.const #a #perm0 0.0R) x 0.5R))));
279+
GR.share r (F (Map.upd mf x 0.5R))
280+
(P (Map.upd (Map.const #a #perm0 0.0R) x 0.5R));
285281
fold (gbag r (Set.add x s));
286282
with _v. rewrite (GR.pts_to r (Ghost.reveal (Ghost.hide _v))) as
287283
(gbagh r x)
@@ -299,13 +295,13 @@ fn gbag_remove #a (r:GR.gref (gbag_pcm a)) (s:Set.set a) (x:a)
299295
unfold gbag;
300296
with mf. assert (GR.pts_to r (F mf));
301297
unfold gbagh;
302-
let mp = Map.upd (Map.const #_ #(option perm) None) x (Some 0.5R);
298+
let mp = Map.upd (Map.const #_ #perm0 0.0R) x 0.5R;
303299
with _m. rewrite (GR.pts_to r (P _m)) as
304300
(GR.pts_to r (P mp));
305301
GR.gather r (F mf) (P mp);
306302
assert (pure (x `Set.mem` s));
307303
let mop = op_maps mf mp;
308-
GR.write r (F mop) (F (Map.upd mop x None)) (fp_upd_rem mop x);
304+
GR.write r (F mop) (F (Map.upd mop x 0.0R)) (fp_upd_rem mop x);
309305
fold (gbag r (Set.remove x s))
310306
}
311307

0 commit comments

Comments
 (0)