Skip to content

Commit c05d222

Browse files
committed
wip
1 parent caf1a37 commit c05d222

File tree

1 file changed

+21
-53
lines changed

1 file changed

+21
-53
lines changed

share/pulse/examples/Invariant.fst

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module Invariant
2020
open Pulse
2121
open Pulse.Lib
2222
open Pulse.Lib.Box { box, (:=), (!) }
23+
open Pulse.Lib.BetterInv
2324

2425
assume val p : slprop
2526
assume val q : slprop
@@ -34,33 +35,23 @@ fn g (i:iname)
3435
ensures r ** inv i p
3536
opens [i]
3637
{
37-
with_invariants i {
38-
later_elim _;
38+
with_inv_atomic unit emp_inames i p q (fun _ -> r) fn _ {
3939
f ();
40-
later_intro p;
4140
}
4241
}
4342

4443

45-
#push-options "--fuel 0"
46-
(* Does it work without fuel? Requires the iname_list coercion
47-
to normalize away. *)
48-
4944
atomic
5045
fn g2 (i:iname)
5146
requires inv i p ** q ** later_credit 1
5247
ensures r ** inv i p
5348
opens [i]
5449
{
55-
with_invariants i {
56-
later_elim _;
50+
with_inv_atomic unit emp_inames i p q (fun _ -> r) fn _ {
5751
f ();
58-
later_intro p;
5952
}
6053
}
6154

62-
#pop-options
63-
6455
assume val f_ghost () : stt_ghost unit emp_inames (p ** q) (fun _ -> p ** r)
6556

6657

@@ -70,10 +61,8 @@ fn g_ghost (i:iname)
7061
ensures (r ** inv i p)
7162
opens [i]
7263
{
73-
with_invariants i {
74-
later_elim _;
64+
with_inv_g unit emp_inames i p q (fun _ -> r) fn _ {
7565
f_ghost ();
76-
later_intro p;
7766
}
7867
}
7968

@@ -116,33 +105,24 @@ fn test2 ()
116105
{
117106
let r = Box.alloc #int 0;
118107
let i = new_invariant (exists* v. Box.pts_to r v);
119-
with_invariants i
120-
returns _:unit
121-
ensures later (exists* v. pts_to r v)
122-
opens [i] {
123-
later_elim_timeless _;
124-
atomic_write_int r 1;
125-
later_intro (exists* v. pts_to r v);
108+
with_inv_stt unit emp_inames i (exists* v. Box.pts_to r v) emp (fun _ -> emp) fn _ {
109+
atomic_write_int r 1;
126110
};
127111
drop_ (inv i _)
128112
}
129113

130114

131115
// Fails as the with_invariants block is not atomic/ghost
132-
[@@expect_failure]
133116

117+
[@@expect_failure [228]]
134118
fn test3 ()
135119
requires emp
136120
ensures emp
137121
{
138-
let r = alloc #int 0;
122+
let r = Box.alloc 0;
139123
let i = new_invariant (exists* v. pts_to r v);
140-
with_invariants i
141-
returns _:unit
142-
ensures later (exists* v. pts_to r v) {
143-
later_elim_storable _;
144-
r := 1;
145-
later_intro (exists* v. pts_to r v);
124+
with_inv_stt unit emp_inames i (exists* v. pts_to r v) emp (fun _ -> emp) fn _ {
125+
r := 1;
146126
};
147127
drop_ (inv i _)
148128
}
@@ -166,10 +146,11 @@ fn test3 ()
166146
atomic
167147
fn t0 () (i:iname)
168148
requires inv i emp
149+
requires later_credit 1
169150
ensures inv i emp
170151
opens [i]
171152
{
172-
with_invariants i {
153+
with_inv_atomic unit emp_inames i emp emp (fun _ -> emp) fn _ {
173154
()
174155
}
175156
}
@@ -190,15 +171,16 @@ fn basic_ghost ()
190171

191172

192173
(* Using invariants while claiming not to. *)
193-
[@@expect_failure]
174+
[@@expect_failure [19]]
194175

195176
atomic
196177
fn t1 ()
178+
requires later_credit 1
197179
requires inv i emp
198180
ensures inv i emp
199181
opens []
200182
{
201-
with_invariants i {
183+
with_inv_atomic unit emp_inames i emp emp (fun _ -> emp) fn _ {
202184
()
203185
}
204186
}
@@ -208,11 +190,12 @@ fn t1 ()
208190

209191
atomic
210192
fn t3 ()
193+
requires later_credit 1
211194
requires inv i emp
212195
ensures inv i emp
213196
opens [i; i2]
214197
{
215-
with_invariants i {
198+
with_inv_atomic unit emp_inames i emp emp (fun _ -> emp) fn _ {
216199
()
217200
}
218201
}
@@ -226,9 +209,7 @@ fn t2 ()
226209
ensures emp
227210
{
228211
let j = new_invariant emp;
229-
with_invariants j
230-
returns _:unit
231-
ensures later emp {
212+
with_inv_stt unit emp_inames j emp emp (fun _ -> emp) fn _ {
232213
()
233214
};
234215
drop_ (inv j _);
@@ -249,16 +230,11 @@ fn test_returns0 (i:iname) (b:bool)
249230
opens [i]
250231
{
251232
unfold folded_inv i;
252-
with_invariants i
253-
returns _:unit
254-
ensures later p ** q {
255-
later_elim _;
233+
with_inv_atomic unit emp_inames i p emp (fun _ -> q) fn _ {
256234
if b {
257235
p_to_q ();
258-
later_intro p;
259236
} else {
260237
ghost_p_to_q ();
261-
later_intro p;
262238
}
263239
};
264240
fold folded_inv i
@@ -273,12 +249,8 @@ fn test_returns1 (i:iname)
273249
opens [i]
274250
{
275251
unfold folded_inv i;
276-
with_invariants i
277-
returns _:unit
278-
ensures later p ** q {
279-
later_elim _;
252+
with_inv_g unit emp_inames i p emp (fun _ -> q) fn _ {
280253
ghost_p_to_q ();
281-
later_intro p;
282254
};
283255
fold folded_inv i
284256
}
@@ -298,12 +270,8 @@ fn test_returns2 (i:iname)
298270
opens [i]
299271
{
300272
unfold folded_inv i;
301-
with_invariants i
302-
returns _:unit
303-
ensures later pp ** q {
304-
later_elim _;
273+
with_inv_g unit emp_inames i p emp (fun _ -> q) fn _ {
305274
ghost_p_to_q ();
306-
later_intro pp;
307275
};
308276
fold folded_inv i
309277
}

0 commit comments

Comments
 (0)