@@ -38,7 +38,8 @@ module GhostBag
3838open FStar.PCM
3939open 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
8283let 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
9288let 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
10298let 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"
159153let 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
198192let 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
238231module GR = Pulse.Lib.GhostPCMReference
239232
240233let 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
246239let 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+
266262ghost
267263fn 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