@@ -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])
0 commit comments