@@ -20,6 +20,7 @@ module Invariant
2020open Pulse
2121open Pulse.Lib
2222open Pulse.Lib.Box { box , (:=), ( !) }
23+ open Pulse.Lib.BetterInv
2324
2425assume val p : slprop
2526assume 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-
4944atomic
5045fn 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-
6455assume 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 ]]
134118fn 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 ()
166146atomic
167147fn 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
195176atomic
196177fn 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
209191atomic
210192fn 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