Skip to content

Commit 07e7aa9

Browse files
committed
Fix asynchile rule
1 parent b682e63 commit 07e7aa9

4 files changed

Lines changed: 69 additions & 57 deletions

File tree

examples/async-while.ec

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,24 @@ seq 1 1 : (i{1} = 0 /\ ={glob A, x, i}) => //.
5050
async while
5151
[ (fun r => i%r < k%r * r), (i{2} + 1)%r ]
5252
[ (fun r => i%r < r), (i{2} + 1)%r ]
53-
(i{1} < n * k /\ i{2} < n) (!(i{2} < n))
53+
(!(i{1} < n * k)) (!(i{2} < n))
5454
:
5555
(={glob A, x} /\ i{1} = k * i{2} /\ (0 <= i{1})) => //=.
56-
+ by move=> &1 &2 />; smt(gt0_k).
57-
+ by move=> &1 &2 />; smt(gt0_k).
58-
+ by move=> &2; exfalso=> &1; smt(gt0_k).
59-
+ by move=> &2; exfalso=> &1 ?; smt(gt0_k).
56+
+ move=> &1 &2 />; smt(gt0_k).
6057
+ move=> v1 v2.
6158
rcondt {2} 1; 1: by auto => /> /#.
6259
rcondf{2} 4; 1: by auto; conseq (_: true);auto.
63-
wp;while ( ={glob A, x}
60+
wp;while ( ={glob A, x}
6461
/\ i{1} = k * i{2} + j{2}
6562
/\ v1 = (i{2} + 1)%r
6663
/\ 0 <= i{2} < n
6764
/\ 0 <= j{2} <= k) => /=; last by auto; smt(gt0_k ge0_n).
6865
wp; call (_ : true); skip => &1 &2 /= />.
69-
rewrite -fromintM !lt_fromint => *.
70-
by have := StdOrder.IntOrder.ler_wpmul2l k _ i{2} (n - 1); smt().
71-
+ by while true (n * k - i) => //; auto;1: call llA; auto => /#.
66+
rewrite -fromintM !lt_fromint => *.
67+
by have := StdOrder.IntOrder.ler_wpmul2l k _ i{2} (n - 1); smt().
68+
+ by move=> &2; exfalso=> &1 ? ; smt(gt0_k).
69+
+ by move=> &1; exfalso=> &2 ?; smt(gt0_k).
70+
+ while true (n * k - i) => //; auto;1: call llA; auto => /#.
7271
+ while true (n - i);2: by auto=>/#.
7372
move=> z;wp; while (true) (k - j);auto;1:call llA;auto => /#.
7473
qed.
75-

src/ecPrinting.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ and pp_form_core_r
19741974
let ppepo = PPEnv.create_and_push_mem ppe ~active:true mepo in
19751975
let pm = debug_mode || hf.hf_m.id_symb <> "&hr" in
19761976
let { main = post; exnmap = (poe, d) } = (hf_po hf).hsi_inv in
1977-
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a]@]]"
1977+
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a@]@]]"
19781978
(pp_funname ppe) hf.hf_f
19791979
(pp_pl_mem_binding pm ppe) hf.hf_m
19801980
(pp_form ppepr) (hf_pr hf).inv
@@ -1985,7 +1985,7 @@ and pp_form_core_r
19851985
let ppe = PPEnv.push_mem ppe ~active:true hs.hs_m in
19861986
let { main = post; exnmap = (poe, d); } = (hs_po hs).hsi_inv in
19871987
let pm = debug_mode || (fst hs.hs_m).id_symb <> "&hr" in
1988-
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a]@]]"
1988+
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a@]@]]"
19891989
(pp_stmt_for_form ppe) hs.hs_s
19901990
(pp_pl_mem_binding pm ppe) (fst hs.hs_m)
19911991
(pp_form ppe) (hs_pr hs).inv

src/phl/ecPhlWhile.ml

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -628,39 +628,56 @@ let process_async_while (winfos : EP.async_while_info) tc =
628628
let (er, cr), sr = tc1_last_while tc evs.es_sr in
629629

630630
let inv = TTC.tc1_process_prhl_formula tc inv in
631+
631632
let p0 = TTC.tc1_process_prhl_formula tc p0 in
632633
let p1 = TTC.tc1_process_prhl_formula tc p1 in
634+
633635
let f1 = TTC.tc1_process_prhl_form_opt tc None f1 in
634636
let f2 = TTC.tc1_process_prhl_form_opt tc None f2 in
637+
635638
let t1 = TTC.tc1_process_Xhl_exp tc (Some `Left ) (Some (tfun f1.inv.f_ty tbool)) t1 in
636639
let t2 = TTC.tc1_process_Xhl_exp tc (Some `Right) (Some (tfun f2.inv.f_ty tbool)) t2 in
640+
637641
let ft1 = ss_inv_generalize_right (ss_inv_of_expr ml t1) mr in
638642
let ft2 = ss_inv_generalize_left (ss_inv_of_expr mr t2) ml in
643+
639644
let fe1 = ss_inv_generalize_right (ss_inv_of_expr ml el) mr in
640645
let fe2 = ss_inv_generalize_left (ss_inv_of_expr mr er) ml in
641-
let fe = map_ts_inv2 f_or fe1 fe2 in
646+
642647
let f_app' f = f_app (List.hd f) (List.tl f) tbool in
643648
let f_imps' f = f_imps (List.tl f) (List.hd f) in
644-
let cond1 = EcSubst.f_forall_mems_ts_inv evs.es_ml evs.es_mr
645-
(map_ts_inv f_imps' [map_ts_inv f_ands [fe1; fe2;
646-
map_ts_inv f_app' [ft1; f1];
647-
map_ts_inv f_app' [ft2; f2]];
648-
inv; fe; p0]) in
649-
650-
let cond2 = EcSubst.f_forall_mems_ts_inv evs.es_ml evs.es_mr
651-
(map_ts_inv f_imps' [fe1; inv; fe; map_ts_inv1 f_not p0; p1]) in
652649

653-
let cond3 = EcSubst.f_forall_mems_ts_inv evs.es_ml evs.es_mr
654-
(map_ts_inv f_imps' [fe2; inv; fe; map_ts_inv1 f_not p0; map_ts_inv1 f_not p1]) in
650+
let fe = map_ts_inv2 f_eq fe1 fe2 in
651+
let neg_p0 f = map_ts_inv f_imps' [f; map_ts_inv1 f_not p0] in
652+
let neg_p1 f = map_ts_inv f_imps' [f; map_ts_inv1 f_not p1] in
653+
let fprog =
654+
let ft1 = map_ts_inv f_app' [ft1; f1] in
655+
let ft2 = map_ts_inv f_app' [ft2; f2] in
656+
neg_p0 (neg_p1 (map_ts_inv f_ands [ft1;ft2]))
657+
in
658+
let flock = map_ts_inv f_ands [fe;fprog] in
659+
let fc1 = map_ts_inv f_ands [fe1; p0] in
660+
let fc2 = map_ts_inv f_ands [fe2; p1] in
661+
662+
let cond =
663+
EcSubst.f_forall_mems_ts_inv evs.es_ml evs.es_mr
664+
(map_ts_inv f_imps'
665+
[map_ts_inv f_ors [flock; fc1; fc2]; inv])
666+
in
655667

656668
let xwh =
657669
let v1, v2 = as_seq2 (EcEnv.LDecl.fresh_ids hyps ["v1_"; "v2_"]) in
658670
let fv1 = {ml;mr;inv=f_local v1 f1.inv.f_ty} in
659671
let fv2 = {ml;mr;inv=f_local v2 f2.inv.f_ty} in
660672
let ev1 = e_local v1 f1.inv.f_ty in
661673
let ev2 = e_local v2 f2.inv.f_ty in
674+
let p0 = map_ts_inv f_ands [map_ts_inv1 f_not p0;map_ts_inv1 f_not p1] in
675+
let fe = map_ts_inv f_ands [fe1;fe2] in
676+
let ft1 = map_ts_inv f_app' [ft1; fv1] in
677+
let ft2 = map_ts_inv f_app' [ft2; fv2] in
678+
let fprog = map_ts_inv f_ands [ft1;ft2] in
662679
let eq1 = map_ts_inv2 f_eq fv1 f1 and eq2 = map_ts_inv2 f_eq fv2 f2 in
663-
let pr = map_ts_inv f_ands [inv; fe; p0; eq1; eq2] in
680+
let pr = map_ts_inv f_ands [inv; fe; fprog; p0; eq1; eq2] in
664681
let po = inv in
665682
let wl = s_while (e_and el (e_app t1 [ev1] tbool), cl) in
666683
let wr = s_while (e_and er (e_app t2 [ev2] tbool), cr) in
@@ -670,38 +687,41 @@ let process_async_while (winfos : EP.async_while_info) tc =
670687

671688
let hr1, hr2 =
672689
let hr1 =
673-
let el = ss_inv_generalize_right (ss_inv_of_expr ml el) mr in
674-
let pre = map_ts_inv f_ands [inv; el ; map_ts_inv1 f_not p0; p1] in
690+
let pre = map_ts_inv f_ands [inv; fe1 ; p0] in
675691
EcSubst.f_forall_mems_ss_inv evs.es_mr
676692
(ts_inv_lower_left2
677693
(fun pr po -> f_hoareS (snd evs.es_ml) pr cl (POE.lift po)) pre inv)
678694

679695
and hr2 =
680-
let er = ss_inv_generalize_left (ss_inv_of_expr mr er) ml in
681-
let pre = map_ts_inv f_ands [inv; er; map_ts_inv1 f_not p0; map_ts_inv1 f_not p1] in
696+
let pre = map_ts_inv f_ands [inv; fe2; p1] in
682697
EcSubst.f_forall_mems_ss_inv evs.es_ml
683698
(ts_inv_lower_right2
684699
(fun pr po -> f_hoareS (snd evs.es_mr) pr cr (POE.lift po)) pre inv)
685700

686701
in (hr1, hr2)
687702
in
688703

689-
690704
let (c1, ll1), (c2, ll2) =
691705
try
692706
let ll1 =
693-
let test = f_ands [fe1.inv; f_not p0.inv; p1.inv] in
694-
let test, m = LossLess.form_of_expr env (EcMemory.memory evs.es_mr) ml test in
707+
let test, m = LossLess.form_of_expr env (EcMemory.memory evs.es_mr) ml fe1.inv in
695708
let c = s_while (test, cl) in
709+
let pre = map_ts_inv f_ands [inv; fe1 ; p0] in
696710
LossLess.xhyps evs m
697-
(ts_inv_lower_left3 (fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_ml) inv c f_tr FHeq f_r1) inv {ml;mr;inv=f_true} {ml;mr;inv=f_r1})
711+
(ts_inv_lower_left3
712+
(fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_ml) inv c f_tr FHeq f_r1)
713+
pre {ml;mr;inv=f_true} {ml;mr;inv=f_r1}
714+
)
698715

699716
and ll2 =
700-
let test = f_ands [fe1.inv; f_not p0.inv; f_not p1.inv] in
701-
let test, m = LossLess.form_of_expr env (EcMemory.memory evs.es_ml) mr test in
717+
let test, m = LossLess.form_of_expr env (EcMemory.memory evs.es_ml) mr fe2.inv in
702718
let c = s_while (test, cr) in
719+
let pre = map_ts_inv f_ands [inv; fe2; p1] in
703720
LossLess.xhyps evs m
704-
(ts_inv_lower_right3 (fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_mr) inv c f_tr FHeq f_r1) inv {ml;mr;inv=f_true} {ml;mr;inv=f_r1})
721+
(ts_inv_lower_right3
722+
(fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_mr) inv c f_tr FHeq f_r1)
723+
pre {ml;mr;inv=f_true} {ml;mr;inv=f_r1}
724+
)
705725

706726
in (ll1, ll2)
707727

@@ -719,10 +739,10 @@ let process_async_while (winfos : EP.async_while_info) tc =
719739
f_equivS (snd evs.es_ml) (snd evs.es_mr) (es_pr evs) sl sr (map_ts_inv2 f_and inv post) in
720740

721741
FApi.t_onfsub (function
722-
| 6 -> Some (EcLowGoal.t_intros_n c1)
723-
| 7 -> Some (EcLowGoal.t_intros_n c2)
742+
| 4 -> Some (EcLowGoal.t_intros_n c1)
743+
| 5 -> Some (EcLowGoal.t_intros_n c2)
724744
| _ -> None)
725745

726746
(FApi.xmutate1
727747
tc `AsyncWhile
728-
[cond1; cond2; cond3; hr1; hr2; xwh; ll1; ll2; concl])
748+
[cond; xwh; hr1; hr2; ll1; ll2; concl])

theories/looping/LoopTransform.ec

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,9 @@ proof.
136136
by rcondf{2} ^while; auto => /> /#.
137137
async while [ (fun r => i%r < r), (i{1}+k{2})%r ]
138138
[ (fun r => i%r < r), (i{2} + 1)%r ]
139-
( (i < n){1})
140-
(true) :
139+
( !(i < n){1}) (!(i < n){2}) :
141140
(={t, glob B} /\ (0 <= i <= n){2} /\ 0 < k{2} /\ n{1} = (k * n){2} /\ i{1} = k{2} * i{2}).
142-
+ smt(). + smt (). + done.
143-
+ move=> &m2; exfalso; smt().
144-
+ move=> &m1; exfalso; smt().
141+
+ smt().
145142
+ move=> v1 v2.
146143
rcondt{2} 1; 1: by auto => /> /#.
147144
rcondf{2} 4; 1: by auto; conseq (_: true);auto.
@@ -151,9 +148,11 @@ proof.
151148
+ wp;call (_: true);skip => /> &2 h0i hin h0j hjk.
152149
rewrite !lt_fromint => h1 h2 h3.
153150
have := IntOrder.ler_wpmul2l k{2} _ i{2} (n{2} - 1); smt().
154-
by wp;skip => /> /#.
155-
+ rcondf 1; skip => /#.
156-
+ rcondf 1; skip => /#.
151+
by wp;skip => /> /#.
152+
+ move=> &m2; exfalso => /#.
153+
+ move=> &m1; exfalso => /#.
154+
+ rcondf 1 ; skip => /#.
155+
+ rcondf 1; skip => /#.
157156
auto => /> /#.
158157
qed.
159158

@@ -188,17 +187,10 @@ proof.
188187
seq 2 2: (={glob B, t, n, i}); last by sim;wp;skip.
189188
async while [ (fun r => i%r < r), (i{1} + step * k{2})%r ]
190189
[ (fun r => i%r < r), (i{2} + step * k{2})%r ]
191-
( (i < floor n (step * k0)){1})
192-
(true) :
190+
(!(i < floor n (step * k0)){1})
191+
(!(i + step * k <= n){2}) :
193192
(={t, glob B, i, n} /\ k{2} = k0 /\ 0 < k{2} /\ (step * k0) %| i{1}).
194193
+ move=> />;smt (lt_floorE floor_le step_gt0).
195-
+ move=> /> &2 h1 h2 [[]// | h3].
196-
have h4 := le_floorE (step * k0) (i{2} + step * k0) n{2} _ _.
197-
+ smt (step_gt0). + by apply dvdzD => //; apply dvdzz.
198-
smt (step_gt0).
199-
+ done.
200-
+ by move=> &m2; exfalso => /#.
201-
+ by move=> &m1; exfalso => /#.
202194
+ move=> v1 v2.
203195
rcondt{2} 1.
204196
+ move=> &1;skip => /> *; smt (step_gt0 lt_floorE floor_le).
@@ -216,10 +208,12 @@ proof.
216208
split. smt().
217209
have <- := IntOrder.ltr_pmul2l step step_gt0 (j{2} + 1) k0.
218210
smt (floor_le step_gt0).
219-
wp; skip => &1 &2 [#] 6!->> h1 h2 h3 h4 2!->> /=.
211+
wp; skip => &1 &2 [#] 6!->> h1 h2 h3 h4 ????? 2!->> /=.
220212
rewrite le_fromint lt_fromint h2 h1 -lt_floorE /= 2://; 1:smt (step_gt0).
221213
split; 1: smt(step_gt0).
222-
by move=> /> j_R *; rewrite dvdzD 1:/# (_ : j_R = k0) 1:/# dvdzz.
214+
by move=> /> j_R *; rewrite dvdzD 1:/# (_ : j_R = k0) 1:/# dvdzz.
215+
+ by move=> &m2; exfalso => /#.
216+
+ by move=> &m1; exfalso => /#.
223217
+ rcondf 1; skip => /#.
224218
+ rcondf 1; skip => /#.
225219
by auto.

0 commit comments

Comments
 (0)