Skip to content

Commit 8c3a059

Browse files
committed
wip
1 parent d175338 commit 8c3a059

File tree

77 files changed

+1763
-676
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+1763
-676
lines changed

lib/common/Pulse.Lib.Core.Refs.fsti

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ val timeless_pcm_pts_to
5656
: Lemma (timeless (pcm_pts_to r v))
5757
[SMTPat (timeless (pcm_pts_to r v))]
5858

59+
instance val placeless_pcm_pts_to #a #p r v : placeless (pcm_pts_to #a #p r v)
60+
5961
let pcm_ref_null
6062
(#a:Type)
6163
(p:FStar.PCM.pcm a)
@@ -159,6 +161,9 @@ val timeless_ghost_pcm_pts_to
159161
: Lemma (timeless (ghost_pcm_pts_to r v))
160162
[SMTPat (timeless (ghost_pcm_pts_to r v))]
161163

164+
instance val placeless_ghost_pcm_pts_to #a #p r v :
165+
placeless (ghost_pcm_pts_to #a #p r v)
166+
162167
val ghost_pts_to_not_null
163168
(#a:Type)
164169
(#p:pcm a)

lib/common/Pulse.Lib.Core.fsti

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
234229
val 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

448491
val later_credit (amt: nat) : slprop
449492

493+
instance val placeless_later_credit amt : placeless (later_credit amt)
494+
450495
val 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)
471516
val later_exists (#t: Type) (f:t->slprop) : stt_ghost unit emp_inames (later (exists* x. f x)) (fun _ -> exists* x. later (f x))
472517
val 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. *)
479527
val equiv (a b: slprop) : slprop
480528

529+
instance val placeless_equiv a b : placeless (equiv a b)
530+
481531
val equiv_dup a b : stt_ghost unit emp_inames (equiv a b) fun _ -> equiv a b ** equiv a b
482532
val equiv_refl a : stt_ghost unit emp_inames emp fun _ -> equiv a a
483533
val 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

503553
val 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+
505557
val 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)
519571
val 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

525577
val 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+
578635
val rewrite (p:slprop) (q:slprop) (_:slprop_equiv p q)
579636
: stt_ghost unit emp_inames p (fun _ -> q)
580637

lib/core/Pulse.Lib.Core.Refs.fst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ let is_null_core_pcm_ref r = PulseCore.Action.is_core_ref_null r
3535
let pcm_pts_to #a (#p:pcm a) (r:pcm_ref p) (v:a) =
3636
PulseCore.Action.pts_to #a #p r v
3737
let timeless_pcm_pts_to #a #p r v = PulseCore.Action.timeless_pts_to #a #p r v
38+
let placeless_pcm_pts_to #a #p r v = admit ()
3839
let pts_to_not_null #a #p r v = A.pts_to_not_null #a #p r v
3940

4041
let alloc
@@ -82,6 +83,7 @@ let null_core_ghost_pcm_ref = PulseCore.Action.core_ghost_ref_null
8283

8384
let ghost_pcm_pts_to #a #p r v = PulseCore.Action.ghost_pts_to #a #p r v
8485
let timeless_ghost_pcm_pts_to #a #p r v = PulseCore.Action.timeless_ghost_pts_to #a #p r v
86+
let placeless_ghost_pcm_pts_to #a #p r v = admit ()
8587
let ghost_pts_to_not_null #a #p r v = A.ghost_pts_to_not_null #a #p r v
8688
let ghost_alloc = A.ghost_alloc
8789
let ghost_read = A.ghost_read

lib/core/Pulse.Lib.Core.fst

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ let stt = I.stt
150150
let return_stt_noeq = I.return
151151
let bind_stt = I.bind
152152
let frame_stt = I.frame
153-
let fork f = I.fork (f ())
154153
let sub_stt = I.sub
155154
let conv_stt pf1 pf2 = I.conv #_ _ _ _ _ pf1 pf2
156155
let hide_div = I.hide_div
@@ -181,11 +180,39 @@ let frame_ghost = A.frame_ghost
181180
let sub_ghost = A.sub_ghost
182181
let sub_invs_ghost = A.sub_invs_stt_ghost
183182

183+
////////////////////////////////////////////////////////////////////
184+
// Locations
185+
////////////////////////////////////////////////////////////////////
186+
187+
let loc_id = unit
188+
let process_of = id
189+
let process_of_idem l = ()
190+
let loc l = emp
191+
let loc_get () = admit ()
192+
let loc_dup l = admit ()
193+
let loc_gather l = admit ()
194+
195+
let on l p = p
196+
let on_intro p = admit ()
197+
let on_elim p = admit ()
198+
199+
let timeless_on = admit ()
200+
201+
let placeless_emp = admit ()
202+
let placeless_star _ _ = admit ()
203+
let placeless_pure _ = admit ()
204+
let placeless_exists _ = admit ()
205+
let placeless_on _ _ = admit ()
206+
let placeless_inv _ _ = admit ()
207+
208+
let ghost_impersonate l pre post f = admit ()
209+
184210
//////////////////////////////////////////////////////////////////////////
185211
// Later
186212
//////////////////////////////////////////////////////////////////////////
187213

188214
let later_credit = later_credit
215+
let placeless_later_credit amt = admit ()
189216
let timeless_later_credit amt = Sep.timeless_later_credit amt
190217
let later_credit_zero _ = PulseCore.InstantiatedSemantics.later_credit_zero ()
191218
let later_credit_add a b = PulseCore.InstantiatedSemantics.later_credit_add a b
@@ -216,6 +243,9 @@ let exists_later #t f =
216243
let h: squash ((exists* x. later (f x)) `implies` later (exists* x. f x)) = h in
217244
A.implies_elim _ _
218245

246+
let later_on = admit ()
247+
let on_later = admit ()
248+
219249
//////////////////////////////////////////////////////////////////////////
220250
// Equivalence
221251
//////////////////////////////////////////////////////////////////////////
@@ -224,6 +254,7 @@ let rewrite_eq p q (pf:squash (p == q))
224254
= slprop_equiv_elim p q;
225255
A.noop q
226256
let equiv = I.equiv
257+
let placeless_equiv a b = admit ()
227258
let equiv_dup a b = A.equiv_dup a b
228259
let equiv_refl a = A.equiv_refl a
229260
let equiv_comm a b = rewrite_eq (equiv a b) (equiv b a) (Sep.equiv_comm a b)
@@ -241,6 +272,7 @@ let later_equiv = Sep.later_equiv
241272
let slprop_ref = PulseCore.Action.slprop_ref
242273
let null_slprop_ref = PulseCore.Action.null_slprop_ref
243274
let slprop_ref_pts_to x y = PulseCore.Action.slprop_ref_pts_to x y
275+
let placeless_slprop_ref_pts_to = admit ()
244276
let slprop_ref_alloc x = A.slprop_ref_alloc x
245277
let slprop_ref_share x #y = A.slprop_ref_share x y
246278
let slprop_ref_gather x #y1 #y2 = A.slprop_ref_gather x y1 y2
@@ -249,7 +281,7 @@ let slprop_ref_gather x #y1 #y2 = A.slprop_ref_gather x y1 y2
249281
// Invariants
250282
////////////////////////////////////////////////////////////////////
251283
let dup_inv = A.dup_inv
252-
let new_invariant = A.new_invariant
284+
let new_invariant p #_ = A.new_invariant p
253285
let fresh_invariant = A.fresh_invariant
254286
let inames_live_inv = A.inames_live_inv
255287
let inames_live_empty _ = rewrite_eq emp (inames_live emp_inames) (Sep.inames_live_empty ())
@@ -263,6 +295,8 @@ let invariant_name_identifies_invariant #p #q i j = A.invariant_name_identifies_
263295
// Some basic actions and ghost operations
264296
//////////////////////////////////////////////////////////////////////////
265297

298+
let fork pre #_ #l f = I.fork (f l)
299+
266300
let rewrite p q (pf:slprop_equiv p q)
267301
: stt_ghost unit emp_inames p (fun _ -> q)
268302
= slprop_equiv_elim p q;

lib/pulse/lib/Pulse.Lib.AnchoredReference.fst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ let pts_to_full
5858
: p:slprop { timeless p }
5959
= core_pts_to r #q n true
6060

61+
let placeless_pts_to_full r n = Tactics.Typeclasses.solve
62+
6163
let pts_to
6264
(#a:Type) (#p:preorder a) (#anc:anchor_rel p)
6365
(r:ref a p anc)
@@ -66,6 +68,8 @@ let pts_to
6668
: p:slprop { timeless p }
6769
= core_pts_to r #q n false
6870

71+
let placeless_pts_to r n = Tactics.Typeclasses.solve
72+
6973
let anchored
7074
(#a:Type)
7175
(#p:_)
@@ -77,12 +81,16 @@ let anchored
7781
GPR.pts_to r k **
7882
pure (owns_only_anchor n k)
7983

84+
let placeless_anchored r n = Tactics.Typeclasses.solve
85+
8086
let snapshot (#a:Type) (#p:_) (#anc:_) (r : ref a p anc) (n:a)
8187
: p:slprop { timeless p }
8288
= exists* (k:FRAP.knowledge anc) .
8389
GPR.pts_to r k **
8490
pure (snapshot_pred n k)
8591

92+
let placeless_snapshot r n = Tactics.Typeclasses.solve
93+
8694
let init_val (#a:Type) (#p:_) (anc:anchor_rel p) (x:a { anc x x })
8795
: v:FRAP.knowledge anc { fractional_ownership_maybe_with_anchor 1.0R x true true v }
8896
= let perm = (Some 1.0R, (Some x)) in

lib/pulse/lib/Pulse.Lib.AnchoredReference.fsti

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,19 @@ val pts_to_full
3737
(n:a)
3838
: p:slprop { timeless p }
3939

40+
instance val placeless_pts_to_full #a #p #anc r #pr n :
41+
placeless (pts_to_full #a #p #anc r #pr n)
42+
4043
val pts_to
4144
(#a:Type) (#p:_) (#anc:_)
4245
([@@@mkey]r:ref a p anc)
4346
(#[T.exact (`1.0R)] p:perm)
4447
(n:a)
4548
: p:slprop { timeless p }
4649

50+
instance val placeless_pts_to #a #p #anc r #pr n :
51+
placeless (pts_to #a #p #anc r #pr n)
52+
4753
val anchored
4854
(#a:Type)
4955
(#p:_)
@@ -52,9 +58,14 @@ val anchored
5258
(n:a)
5359
: p:slprop{ timeless p }
5460

61+
instance val placeless_anchored #a #p #anc r n :
62+
placeless (anchored #a #p #anc r n)
63+
5564
val snapshot (#a:Type) (#p:_) (#anc:_) (r : ref a p anc) (v:a)
5665
: p:slprop { timeless p }
5766

67+
instance val placeless_snapshot #a #p #anc r n :
68+
placeless (snapshot #a #p #anc r n)
5869

5970
ghost
6071
fn alloc (#a:Type) (x:a) (#p:_) (#anc:anchor_rel p)

0 commit comments

Comments
 (0)