@@ -33,10 +33,10 @@ let ctr (h: heap) : nat = Seq.length h
33
33
let select i h =
34
34
if i < ctr h then Seq. index h i else None
35
35
36
- let empty_heap' n = Seq. create n None
36
+ let empty_heap' n : heap u# a = Seq. create n None
37
37
38
- let select_empty_heap' a n : Lemma ( select a ( empty_heap' n ) == None ) [ SMTPat ( select a ( empty_heap' n ))] =
39
- reveal_opaque (` %select ) ( select a ( empty_heap' n ))
38
+ let select_empty_heap' a n : Lemma ( select a ( empty_heap' u# a n ) == None ) [ SMTPat ( select a ( empty_heap' u# a n ))] =
39
+ reveal_opaque (` %select ) ( select a ( empty_heap' u# a n ))
40
40
41
41
let empty_heap = empty_heap' 0
42
42
@@ -59,11 +59,11 @@ let update_addr' (m:heap) (a:addr { a < ctr m }) (c:option cell)
59
59
: heap
60
60
= Seq. upd m a c
61
61
62
- let select_update_addr' m a b c :
62
+ let select_update_addr' ( m : heap u# a ) a b c :
63
63
Lemma ( select a ( update_addr' m b c ) ==
64
64
( if a = b then c else select a m ))
65
65
[ SMTPat ( select a ( update_addr' m b c ))] =
66
- reveal_opaque (` %select ) ( select a )
66
+ reveal_opaque (` %select ) ( select u# a a )
67
67
68
68
let update_addr ( m : heap ) ( a : addr { a < ctr m }) ( c : cell )
69
69
: heap
@@ -151,7 +151,7 @@ let join (m0:heap) (m1:heap{disjoint m0 m1})
151
151
let ctr_join_def m0 m1 : Lemma ( ctr ( join m0 m1 ) == max ( ctr m0 ) ( ctr m1 )) [ SMTPat ( ctr ( join m0 m1 ))] =
152
152
reveal_opaque (` %join ) ( join m0 m1 )
153
153
154
- let select_join_def a m0 m1 :
154
+ let select_join_def a ( m0 : heap u# a ) m1 :
155
155
Lemma ( select a ( join m0 m1 ) ==
156
156
( match select a m0 , select a m1 with
157
157
| None , None -> None
@@ -160,7 +160,7 @@ let select_join_def a m0 m1 :
160
160
| Some c0 , Some c1 ->
161
161
Some ( join_cells c0 c1 )))
162
162
[ SMTPat ( select a ( join m0 m1 ))] =
163
- reveal_opaque (` %select ) ( select a );
163
+ reveal_opaque (` %select ) ( select u# a a );
164
164
reveal_opaque (` %join ) ( join m0 m1 )
165
165
166
166
let disjoint_join_cells_assoc ( c0 c1 c2 : cell u# h )
@@ -202,14 +202,14 @@ let disjoint_join' (m0 m1 m2:heap u#h)
202
202
let mem_equiv ( m0 m1 : heap ) =
203
203
ctr m0 == ctr m1 /\ forall a . select a m0 == select a m1
204
204
205
- let mem_equiv_eq ( m0 m1 : heap )
205
+ let mem_equiv_eq ( m0 m1 : heap u# a )
206
206
: Lemma
207
207
( requires
208
208
m0 ` mem_equiv ` m1 )
209
209
( ensures
210
210
m0 == m1 )
211
211
[ SMTPat ( m0 ` mem_equiv ` m1 )]
212
- = reveal_opaque (` %select ) select ; assert Seq. equal m0 m1
212
+ = reveal_opaque (` %select ) ( select u# a ) ; assert Seq. equal m0 m1
213
213
214
214
let join_cells_commutative ( c0 : cell u# h ) ( c1 : cell u# h { disjoint_cells c0 c1 })
215
215
: Lemma ( disjoint_cells_sym c0 c1 ; join_cells c0 c1 == join_cells c1 c0 )
@@ -422,24 +422,11 @@ let affine_star p q h = ()
422
422
423
423
let equiv_symmetric ( p1 p2 : slprop u# a ) = ()
424
424
let equiv_extensional_on_star ( p1 p2 p3 : slprop u# a ) = ()
425
- let emp_unit p
426
- = let emp_unit_1 p m
427
- : Lemma
428
- ( requires interp p m )
429
- ( ensures interp ( p ` star ` emp ) m )
430
- [ SMTPat ( interp ( p ` star ` emp ) m )]
431
- = assert ( disjoint empty_heap m );
432
- assert ( interp ( p ` star ` emp ) ( join m empty_heap ));
433
- assert ( mem_equiv m ( join m empty_heap ))
434
- in
435
- let emp_unit_2 p m
436
- : Lemma
437
- ( requires interp ( p ` star ` emp ) m )
438
- ( ensures interp p m )
439
- [ SMTPat ( interp ( p ` star ` emp ) m )]
440
- = affine_star p emp m
441
- in
442
- ()
425
+
426
+ let emp_unit ( p : slprop u# a ) =
427
+ introduce forall ( m : heap u# a ). interp p m <==> interp ( p ` star ` emp ) m with
428
+ ( join_empty m ; affine_star p emp m )
429
+
443
430
444
431
let intro_emp h = ()
445
432
@@ -793,21 +780,17 @@ let sel_action' (#a:_) (#pcm:_)
793
780
= sel_v r v0 h
794
781
795
782
let refined_pre_action (# immut :bool)
796
- (#[ T. exact (` trivial_pre )] pre : heap -> prop )
797
- (#[ T. exact (` trivial_pre )] post : heap -> prop )
798
783
( fp0 : slprop ) ( a :Type) ( fp1 : a -> slprop ) =
799
784
m0 : full_hheap fp0 ->
800
785
Pure ( x : a &
801
786
full_hheap ( fp1 x ))
802
- ( requires pre m0 )
787
+ ( requires True )
803
788
( ensures fun (| x , m1 |) ->
804
- post m1 /\
805
789
( forall frame . frame_related_heaps m0 m1 fp0 ( fp1 x ) frame immut ))
806
790
807
- # restart - solver
808
- let refined_pre_action_as_action # immut # pre # post (# fp0 : slprop ) (# a :Type) (# fp1 : a -> slprop )
809
- ($ f : refined_pre_action # immut # pre # post fp0 a fp1 )
810
- : action # immut # pre # post fp0 a fp1
791
+ let refined_pre_action_as_action # immut (# fp0 : slprop ) (# a :Type) (# fp1 : a -> slprop )
792
+ ($ f : refined_pre_action # immut fp0 a fp1 )
793
+ : action # immut fp0 a fp1
811
794
= let g : pre_action fp0 a fp1 = fun m -> f m in
812
795
g
813
796
@@ -1162,10 +1145,10 @@ let pts_to_not_null_action #a #pcm r v
1162
1145
refined_pre_action_as_action g
1163
1146
1164
1147
////////////////////////////////////////////////////////////////////////////////
1165
- let select_snoc ( h : heap ) ( c : option cell ) a :
1148
+ let select_snoc ( h : heap u# a ) ( c : option cell ) a :
1166
1149
Lemma ( select a ( Seq. snoc h c ) == ( if a = ctr h then c else select a h ))
1167
1150
[ SMTPat ( select a ( Seq. snoc h c ))] =
1168
- reveal_opaque (` %select ) ( select a )
1151
+ reveal_opaque (` %select ) ( select u# a a )
1169
1152
1170
1153
let extend_full_heap_with ( h : full_heap ) ( c : cell { full_cell c }) :
1171
1154
h' : full_heap {
@@ -1220,13 +1203,13 @@ let extend #a #pcm
1220
1203
# push - options " --z3rlimit_factor 4 --max_fuel 1 --max_ifuel 1"
1221
1204
# restart - solver
1222
1205
let frame (# a :Type)
1223
- ( #immut # hpre # hpost : _ )
1206
+ # immut
1224
1207
(# pre : slprop )
1225
1208
(# post : a -> slprop )
1226
1209
( frame : slprop )
1227
1210
($ f : action pre a post )
1228
1211
= let g
1229
- : refined_pre_action # immut # hpre # hpost
1212
+ : refined_pre_action # immut
1230
1213
( pre ` star ` frame ) a ( fun x -> post x ` star ` frame )
1231
1214
= fun h0 ->
1232
1215
assert ( interp ( pre ` star ` frame ) h0 );
@@ -1264,15 +1247,14 @@ let pts_to_evolve (#a:Type u#a) (#pcm:_) (r:ref a pcm) (x y : a) (h:heap)
1264
1247
compatible_trans pcm y x v'
1265
1248
1266
1249
let erase_action_result
1267
- (# pre # post : _ )
1268
1250
(# immut : _ )
1269
1251
(# fp : slprop )
1270
1252
(# a :Type)
1271
1253
(# fp' : a -> slprop )
1272
- ( act : action # immut # pre # post fp a fp' )
1273
- : action # immut # pre # post fp ( erased a ) ( fun x -> fp' x )
1254
+ ( act : action # immut fp a fp' )
1255
+ : action # immut fp ( erased a ) ( fun x -> fp' x )
1274
1256
= let g
1275
- : refined_pre_action # immut # pre # post fp ( erased a ) ( fun x -> fp' x )
1257
+ : refined_pre_action # immut fp ( erased a ) ( fun x -> fp' x )
1276
1258
= fun h ->
1277
1259
let (| x , h1 |) = act h in
1278
1260
let y : erased a = hide x in
@@ -1282,13 +1264,12 @@ let erase_action_result
1282
1264
refined_pre_action_as_action g
1283
1265
1284
1266
let erase_action_result_identity
1285
- (# pre # post : _ )
1286
1267
(# immut : _ )
1287
1268
(# fp : slprop )
1288
1269
(# a :Type)
1289
1270
(# fp' : a -> slprop )
1290
- ( act : action # immut # pre # post fp a fp' )
1291
- ( h : full_hheap fp { pre h } )
1271
+ ( act : action # immut fp a fp' )
1272
+ ( h : full_hheap fp )
1292
1273
: Lemma (
1293
1274
let (| x , h1 |) = act h in
1294
1275
let (| y , h2 |) = erase_action_result act h in
0 commit comments