@@ -226,11 +226,6 @@ val frame_stt
226226 ( e : stt a pre post )
227227: stt a ( pre ** frame ) ( fun x -> post x ** frame )
228228
229- val fork
230- (# pre : slprop )
231- ( f :unit -> stt unit pre ( fun _ -> emp ))
232- : stt unit pre ( fun _ -> emp )
233-
234229val sub_stt (# a :Type u# a )
235230 (# pre1 : slprop )
236231 ( pre2 : slprop )
@@ -441,12 +436,62 @@ val sub_invs_ghost
441436 ( _ : squash ( inames_subset opens1 opens2 ))
442437: stt_ghost a opens2 pre post
443438
439+ ////////////////////////////////////////////////////////////////////
440+ // Locations
441+ ////////////////////////////////////////////////////////////////////
442+
443+ [ @@erasable ] val loc_id : Type0
444+
445+ val process_of : loc_id -> loc_id
446+ val process_of_idem ( l : loc_id ) : Lemma ( process_of ( process_of l ) == process_of l )
447+ [ SMTPat ( process_of ( process_of l ))]
448+
449+ inline_for_extraction instance non_informative_loc_id
450+ : NonInformative. non_informative loc_id
451+ = { reveal = ( fun x -> reveal x ) <: NonInformative. revealer loc_id }
452+
453+ val loc : loc_id -> timeless_slprop
454+
455+ val loc_get () : stt_ghost loc_id emp_inames emp ( fun l -> loc l )
456+ val loc_dup l : stt_ghost unit emp_inames ( loc l ) ( fun _ -> loc l ** loc l )
457+ val loc_gather l # l' : stt_ghost unit emp_inames ( loc l ** loc l' ) ( fun _ -> loc l ** pure ( l == l' ))
458+
459+ val on ( l : loc_id ) ([ @@@mkey ] p : slprop ) : slprop
460+ val on_intro # l p : stt_ghost unit emp_inames ( loc l ** p ) ( fun _ -> loc l ** on l p )
461+ val on_elim # l p : stt_ghost unit emp_inames ( loc l ** on l p ) ( fun _ -> loc l ** p )
462+
463+ val timeless_on ( l : loc_id ) ( p : slprop )
464+ : Lemma
465+ ( requires timeless p )
466+ ( ensures timeless ( on l p ))
467+ [ SMTPat ( timeless ( on l p ))]
468+
469+ [ @@Tactics.Typeclasses. tcclass ; erasable ]
470+ type placeless ( p : slprop ) =
471+ l : loc_id -> l' : loc_id -> stt_ghost unit emp_inames ( on l p ) ( fun _ -> on l' p )
472+
473+ instance val placeless_emp : placeless emp
474+ instance val placeless_star ( a b : slprop ) {| placeless a , placeless b |} : placeless ( a ** b )
475+ instance val placeless_pure ( p : prop ) : placeless ( pure p )
476+ instance val placeless_exists # a ( p : a -> slprop ) {| (( x : a ) -> placeless ( p x )) |} :
477+ placeless ( op_exists_Star p )
478+ instance val placeless_on ( l : loc_id ) ( p : slprop ) : placeless ( on l p )
479+ instance val placeless_inv ( i : iname ) ( p : slprop ) : placeless ( inv i p )
480+
481+ val ghost_impersonate
482+ (#[ T. exact (` emp_inames )] is : inames )
483+ ( l : loc_id ) ( pre post : slprop ) {| placeless pre , placeless post |}
484+ ( f : unit -> stt_ghost unit is ( loc l ** pre ) ( fun _ -> loc l ** post ))
485+ : stt_ghost unit is pre ( fun _ -> post )
486+
444487//////////////////////////////////////////////////////////////////////////
445488// Later
446489//////////////////////////////////////////////////////////////////////////
447490
448491val later_credit ( amt : nat) : slprop
449492
493+ instance val placeless_later_credit amt : placeless ( later_credit amt )
494+
450495val timeless_later_credit ( amt : nat)
451496: Lemma ( timeless ( later_credit amt ))
452497 [ SMTPat ( timeless ( later_credit amt ))]
@@ -471,13 +516,18 @@ val later_star p q : squash (later (p ** q) == later p ** later q)
471516val later_exists (# t : Type) ( f : t -> slprop ) : stt_ghost unit emp_inames ( later ( exists * x . f x )) ( fun _ -> exists * x . later ( f x ))
472517val exists_later (# t : Type) ( f : t -> slprop ) : stt_ghost unit emp_inames ( exists * x . later ( f x )) ( fun _ -> later ( exists * x . f x ))
473518
519+ val later_on l p : stt_ghost unit emp_inames ( later ( on l p )) ( fun _ -> on l ( later p ))
520+ val on_later l p : stt_ghost unit emp_inames ( on l ( later p )) ( fun _ -> later ( on l p ))
521+
474522//////////////////////////////////////////////////////////////////////////
475523// Equivalence
476524//////////////////////////////////////////////////////////////////////////
477525
478526(* Two slprops are equal when approximated to the current heap level. *)
479527val equiv ( a b : slprop ) : slprop
480528
529+ instance val placeless_equiv a b : placeless ( equiv a b )
530+
481531val equiv_dup a b : stt_ghost unit emp_inames ( equiv a b ) fun _ -> equiv a b ** equiv a b
482532val equiv_refl a : stt_ghost unit emp_inames emp fun _ -> equiv a a
483533val equiv_comm a b : stt_ghost unit emp_inames ( equiv a b ) fun _ -> equiv b a
@@ -502,6 +552,8 @@ val null_slprop_ref : slprop_ref
502552
503553val slprop_ref_pts_to ([ @@@mkey ] x : slprop_ref ) ( y : slprop ) : slprop
504554
555+ instance val placeless_slprop_ref_pts_to x y : placeless ( slprop_ref_pts_to x y )
556+
505557val slprop_ref_alloc ( y : slprop )
506558: stt_ghost slprop_ref emp_inames emp fun x -> slprop_ref_pts_to x y
507559
@@ -519,7 +571,7 @@ val slprop_ref_gather (x: slprop_ref) (#y1 #y2: slprop)
519571val dup_inv ( i : iname ) ( p : slprop )
520572 : stt_ghost unit emp_inames ( inv i p ) ( fun _ -> inv i p ** inv i p )
521573
522- val new_invariant ( p : slprop )
574+ val new_invariant ( p : slprop ) {| placeless p |}
523575: stt_ghost iname emp_inames p ( fun i -> inv i p )
524576
525577val fresh_invariant
@@ -575,6 +627,11 @@ let non_info_tac () : T.Tac unit =
575627// Some basic actions and ghost operations
576628//////////////////////////////////////////////////////////////////////////
577629
630+ val fork
631+ ( pre : slprop ) {| placeless pre |} # l
632+ ( f : ( l' : loc_id { process_of l' == process_of l } -> stt unit ( loc l' ** pre ) ( fun _ -> emp )))
633+ : stt unit ( loc l ** pre ) ( fun _ -> emp )
634+
578635val rewrite ( p : slprop ) ( q : slprop ) ( _ : slprop_equiv p q )
579636: stt_ghost unit emp_inames p ( fun _ -> q )
580637
0 commit comments