11(* -------------------------------------------------------------------- *)
22open EcUtils
3- open EcParsetree
43open EcPath
54open EcAst
65open EcTypes
@@ -309,7 +308,9 @@ let t_equivF_abs = FApi.t_low1 "equiv-fun-abs" t_equivF_abs_r
309308(* -------------------------------------------------------------------- *)
310309module UpToLow = struct
311310 (* ------------------------------------------------------------------ *)
312- let equivF_abs_upto pf env fl fr (bad : ss_inv ) (invP : ts_inv ) (invQ : ts_inv ) =
311+ let equivF_abs_upto pf env weakened_pre fl fr (bad : ss_inv ) (invP : ts_inv ) (invQ : ts_inv ) =
312+ let weakened_pre = Option. value ~default: false weakened_pre in
313+
313314 let (topl, _fl, oil, sigl), (topr, _fr, oir, sigr) =
314315 EcLowPhlGoal. abstract_info2 env fl fr
315316 in
@@ -345,23 +346,38 @@ module UpToLow = struct
345346 let pre = map_ts_inv EcFol. f_ands [map_ts_inv1 EcFol. f_not bad2; eq_params; invP] in
346347 let post = map_ts_inv3 EcFol. f_if_simpl bad2 invQ (map_ts_inv2 f_and eq_res invP) in
347348 let cond1 = f_equivF pre o_l o_r post in
348- let cond2 =
349- let f_r1 = {m= invQ.ml; inv= f_r1} in
350- let concl = ts_inv_lower_left1 (fun bq -> (f_bdHoareF bq o_l bq FHeq f_r1)) invQ in
351- f_forall_mems_ss_inv (mr, abstract_mt)
352- (map_ss_inv2 f_imp bad concl) in
353- let cond3 =
354- let f_r1 = {m= invQ.mr; inv= f_r1} in
355- let bq = map_ts_inv2 f_and bad2 invQ in
356- f_forall_mems_ss_inv (ml, abstract_mt) (ts_inv_lower_right1 (fun bq -> f_bdHoareF bq o_r bq FHeq f_r1) bq) in
357-
358- [cond1; cond2; cond3]
349+ if not weakened_pre then
350+ let cond2 =
351+ let f_r1 = {m= invQ.ml; inv= f_r1} in
352+ let concl = ts_inv_lower_left1 (fun bq -> (f_bdHoareF bq o_l bq FHeq f_r1)) invQ in
353+ f_forall_mems_ss_inv (mr, abstract_mt)
354+ (map_ss_inv2 f_imp bad concl) in
355+ let cond3 =
356+ let f_r1 = {m= invQ.mr; inv= f_r1} in
357+ let bq = map_ts_inv2 f_and bad2 invQ in
358+ f_forall_mems_ss_inv (ml, abstract_mt) (ts_inv_lower_right1 (fun bq -> f_bdHoareF bq o_r bq FHeq f_r1) bq) in
359+
360+ [cond1; cond2; cond3]
361+ else
362+ let cond2 =
363+ let concl = ts_inv_lower_left1 (fun bq -> (f_hoareF bq o_l (POE. lift bq))) invQ in
364+ f_forall_mems_ss_inv (mr, abstract_mt)
365+ (map_ss_inv2 f_imp bad concl) in
366+ let cond3 =
367+ let bq = map_ts_inv2 f_and bad2 invQ in
368+ f_forall_mems_ss_inv (ml, abstract_mt) (ts_inv_lower_right1 (fun bq -> f_hoareF bq o_r (POE. lift bq)) bq) in
369+
370+ [cond1; cond2; cond3]
359371 in
360372
361373 let sg = List. map2 ospec (OI. allowed oil) (OI. allowed oir) in
362374 let sg = List. flatten sg in
363- let lossless_a = lossless_hyps env topl fl.x_sub in
364- let sg = lossless_a :: sg in
375+ let lossless_a = if not weakened_pre then
376+ [ lossless_hyps env topl fl.x_sub ]
377+ else
378+ [ f_losslessF fl; f_losslessF fr ]
379+ in
380+ let sg = lossless_a @ sg in
365381
366382 let eq_params =
367383 ts_inv_eqparams
@@ -378,17 +394,17 @@ module UpToLow = struct
378394end
379395
380396(* -------------------------------------------------------------------- *)
381- let t_equivF_abs_upto_r bad invP invQ tc =
397+ let t_equivF_abs_upto_r weakened_pre bad invP invQ tc =
382398 let env = FApi. tc1_env tc in
383399 let ef = tc1_as_equivF tc in
384400 let pre, post, sg =
385- UpToLow. equivF_abs_upto !! tc env ef.ef_fl ef.ef_fr bad invP invQ
401+ UpToLow. equivF_abs_upto !! tc env weakened_pre ef.ef_fl ef.ef_fr bad invP invQ
386402 in
387403
388404 let tactic tc = FApi. xmutate1 tc `FunUpto sg in
389405 FApi. t_last tactic (EcPhlConseq. t_equivF_conseq pre post tc)
390406
391- let t_equivF_abs_upto = FApi. t_low3 " equiv-fun-abs-upto " t_equivF_abs_upto_r
407+ let t_equivF_abs_upto = t_equivF_abs_upto_r
392408
393409(* -------------------------------------------------------------------- *)
394410module ToCodeLow = struct
@@ -594,9 +610,6 @@ let t_fun_r (inv: inv) tc =
594610
595611let t_fun = FApi. t_low1 " fun" t_fun_r
596612
597- (* -------------------------------------------------------------------- *)
598- type p_upto_info = pformula * pformula * (pformula option )
599-
600613(* -------------------------------------------------------------------- *)
601614let process_fun_def tc =
602615 let t_cont tcenv =
@@ -610,23 +623,24 @@ let process_fun_to_code tc =
610623 t_fun_to_code_r tc
611624
612625(* -------------------------------------------------------------------- *)
613- let process_fun_upto_info (bad , p , q ) tc =
626+ let process_fun_upto_info info tc =
627+ let open EcParsetree in
614628 let hyps = FApi. tc1_hyps tc in
615- let ml, mr = EcIdent. create " &1" , EcIdent. create " &2" in
629+ let ml, mr = ( EcIdent. create " &1" , EcIdent. create " &2" ) in
616630 let env' = LDecl. inv_memenv ml mr hyps in
617- let p = TTC. pf_process_form !! tc env' tbool p in
618- let q = q |> omap (TTC. pf_process_form !! tc env' tbool) |> odfl f_true in
631+ let p = TTC. pf_process_form !! tc env' tbool info.fui_pre in
632+ let q = info.fui_pos |> omap (TTC. pf_process_form !! tc env' tbool) |> odfl f_true in
619633 let m = EcIdent. create " &hr" in
620- let bad =
634+ let bad =
621635 let env' = LDecl. push_active_ss (EcMemory. abstract m) hyps in
622- TTC. pf_process_form !! tc env' tbool bad
636+ TTC. pf_process_form !! tc env' tbool info.fui_bad
623637 in
624- ({ inv= bad;m }, {inv= p; ml;mr }, {inv= q; ml;mr })
638+ (info.fui_is_ll_variant, { inv = bad; m }, { inv = p; ml; mr }, { inv = q; ml; mr })
625639
626640(* -------------------------------------------------------------------- *)
627641let process_fun_upto info g =
628- let (bad, p, q) = process_fun_upto_info info g in
629- t_equivF_abs_upto bad p q g
642+ let (weakened_pre, bad, p, q) = process_fun_upto_info info g in
643+ t_equivF_abs_upto weakened_pre bad p q g
630644
631645(* -------------------------------------------------------------------- *)
632646let process_fun_abs inv tc =
0 commit comments