@@ -629,39 +629,56 @@ let process_async_while (winfos : EP.async_while_info) tc =
629629 let (er, cr), sr = tc1_last_while tc evs.es_sr in
630630
631631 let inv = TTC. tc1_process_prhl_formula tc inv in
632+
632633 let p0 = TTC. tc1_process_prhl_formula tc p0 in
633634 let p1 = TTC. tc1_process_prhl_formula tc p1 in
635+
634636 let f1 = TTC. tc1_process_prhl_form_opt tc None f1 in
635637 let f2 = TTC. tc1_process_prhl_form_opt tc None f2 in
638+
636639 let t1 = TTC. tc1_process_Xhl_exp tc (Some `Left ) (Some (tfun f1.inv.f_ty tbool)) t1 in
637640 let t2 = TTC. tc1_process_Xhl_exp tc (Some `Right ) (Some (tfun f2.inv.f_ty tbool)) t2 in
641+
638642 let ft1 = ss_inv_generalize_right (ss_inv_of_expr ml t1) mr in
639643 let ft2 = ss_inv_generalize_left (ss_inv_of_expr mr t2) ml in
644+
640645 let fe1 = ss_inv_generalize_right (ss_inv_of_expr ml el) mr in
641646 let fe2 = ss_inv_generalize_left (ss_inv_of_expr mr er) ml in
642- let fe = map_ts_inv2 f_or fe1 fe2 in
647+
643648 let f_app' f = f_app (List. hd f) (List. tl f) tbool in
644649 let f_imps' f = f_imps (List. tl f) (List. hd f) in
645- let cond1 = EcSubst. f_forall_mems_ts_inv evs.es_ml evs.es_mr
646- (map_ts_inv f_imps' [map_ts_inv f_ands [fe1; fe2;
647- map_ts_inv f_app' [ft1; f1];
648- map_ts_inv f_app' [ft2; f2]];
649- inv; fe; p0]) in
650-
651- let cond2 = EcSubst. f_forall_mems_ts_inv evs.es_ml evs.es_mr
652- (map_ts_inv f_imps' [fe1; inv; fe; map_ts_inv1 f_not p0; p1]) in
653650
654- let cond3 = EcSubst. f_forall_mems_ts_inv evs.es_ml evs.es_mr
655- (map_ts_inv f_imps' [fe2; inv; fe; map_ts_inv1 f_not p0; map_ts_inv1 f_not p1]) in
651+ let fe = map_ts_inv2 f_eq fe1 fe2 in
652+ let neg_p0 f = map_ts_inv f_imps' [f; map_ts_inv1 f_not p0] in
653+ let neg_p1 f = map_ts_inv f_imps' [f; map_ts_inv1 f_not p1] in
654+ let fprog =
655+ let ft1 = map_ts_inv f_app' [ft1; f1] in
656+ let ft2 = map_ts_inv f_app' [ft2; f2] in
657+ neg_p0 (neg_p1 (map_ts_inv f_ands [ft1;ft2]))
658+ in
659+ let flock = map_ts_inv f_ands [fe;fprog] in
660+ let fc1 = map_ts_inv f_ands [fe1; p0] in
661+ let fc2 = map_ts_inv f_ands [fe2; p1] in
662+
663+ let cond =
664+ EcSubst. f_forall_mems_ts_inv evs.es_ml evs.es_mr
665+ (map_ts_inv f_imps'
666+ [map_ts_inv f_ors [flock; fc1; fc2]; inv])
667+ in
656668
657669 let xwh =
658670 let v1, v2 = as_seq2 (EcEnv.LDecl. fresh_ids hyps [" v1_" ; " v2_" ]) in
659671 let fv1 = {ml;mr;inv= f_local v1 f1.inv.f_ty} in
660672 let fv2 = {ml;mr;inv= f_local v2 f2.inv.f_ty} in
661673 let ev1 = e_local v1 f1.inv.f_ty in
662674 let ev2 = e_local v2 f2.inv.f_ty in
675+ let p0 = map_ts_inv f_ands [map_ts_inv1 f_not p0;map_ts_inv1 f_not p1] in
676+ let fe = map_ts_inv f_ands [fe1;fe2] in
677+ let ft1 = map_ts_inv f_app' [ft1; fv1] in
678+ let ft2 = map_ts_inv f_app' [ft2; fv2] in
679+ let fprog = map_ts_inv f_ands [ft1;ft2] in
663680 let eq1 = map_ts_inv2 f_eq fv1 f1 and eq2 = map_ts_inv2 f_eq fv2 f2 in
664- let pr = map_ts_inv f_ands [inv; fe; p0; eq1; eq2] in
681+ let pr = map_ts_inv f_ands [inv; fe; fprog; p0; eq1; eq2] in
665682 let po = inv in
666683 let wl = s_while (e_and el (e_app t1 [ev1] tbool), cl) in
667684 let wr = s_while (e_and er (e_app t2 [ev2] tbool), cr) in
@@ -671,38 +688,41 @@ let process_async_while (winfos : EP.async_while_info) tc =
671688
672689 let hr1, hr2 =
673690 let hr1 =
674- let el = ss_inv_generalize_right (ss_inv_of_expr ml el) mr in
675- let pre = map_ts_inv f_ands [inv; el ; map_ts_inv1 f_not p0; p1] in
691+ let pre = map_ts_inv f_ands [inv; fe1 ; p0] in
676692 EcSubst. f_forall_mems_ss_inv evs.es_mr
677693 (ts_inv_lower_left2
678694 (fun pr po -> f_hoareS (snd evs.es_ml) pr cl (POE. lift po)) pre inv)
679695
680696 and hr2 =
681- let er = ss_inv_generalize_left (ss_inv_of_expr mr er) ml in
682- let pre = map_ts_inv f_ands [inv; er; map_ts_inv1 f_not p0; map_ts_inv1 f_not p1] in
697+ let pre = map_ts_inv f_ands [inv; fe2; p1] in
683698 EcSubst. f_forall_mems_ss_inv evs.es_ml
684699 (ts_inv_lower_right2
685700 (fun pr po -> f_hoareS (snd evs.es_mr) pr cr (POE. lift po)) pre inv)
686701
687702 in (hr1, hr2)
688703 in
689704
690-
691705 let (c1, ll1), (c2, ll2) =
692706 try
693707 let ll1 =
694- let test = f_ands [fe1.inv; f_not p0.inv; p1.inv] in
695- let test, m = LossLess. form_of_expr env (EcMemory. memory evs.es_mr) ml test in
708+ let test, m = LossLess. form_of_expr env (EcMemory. memory evs.es_mr) ml fe1.inv in
696709 let c = s_while (test, cl) in
710+ let pre = map_ts_inv f_ands [inv; fe1 ; p0] in
697711 LossLess. xhyps evs m
698- (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})
712+ (ts_inv_lower_left3
713+ (fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_ml) inv c f_tr FHeq f_r1)
714+ pre {ml;mr;inv= f_true} {ml;mr;inv= f_r1}
715+ )
699716
700717 and ll2 =
701- let test = f_ands [fe1.inv; f_not p0.inv; f_not p1.inv] in
702- let test, m = LossLess. form_of_expr env (EcMemory. memory evs.es_ml) mr test in
718+ let test, m = LossLess. form_of_expr env (EcMemory. memory evs.es_ml) mr fe2.inv in
703719 let c = s_while (test, cr) in
720+ let pre = map_ts_inv f_ands [inv; fe2; p1] in
704721 LossLess. xhyps evs m
705- (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})
722+ (ts_inv_lower_right3
723+ (fun inv f_tr f_r1 -> f_bdHoareS (snd evs.es_mr) inv c f_tr FHeq f_r1)
724+ pre {ml;mr;inv= f_true} {ml;mr;inv= f_r1}
725+ )
706726
707727 in (ll1, ll2)
708728
@@ -720,10 +740,10 @@ let process_async_while (winfos : EP.async_while_info) tc =
720740 f_equivS (snd evs.es_ml) (snd evs.es_mr) (es_pr evs) sl sr (map_ts_inv2 f_and inv post) in
721741
722742 FApi. t_onfsub (function
723- | 6 -> Some (EcLowGoal. t_intros_n c1)
724- | 7 -> Some (EcLowGoal. t_intros_n c2)
743+ | 4 -> Some (EcLowGoal. t_intros_n c1)
744+ | 5 -> Some (EcLowGoal. t_intros_n c2)
725745 | _ -> None )
726746
727747 (FApi. xmutate1
728748 tc `AsyncWhile
729- [cond1; cond2; cond3; hr1; hr2; xwh ; ll1; ll2; concl])
749+ [cond; xwh; hr1; hr2; ll1; ll2; concl])
0 commit comments