Skip to content

Commit c4bdfcb

Browse files
oskgostrub
authored andcommitted
make casts from existing single sided formulas to two sided ones use a more robust pattern
1 parent 01d4e41 commit c4bdfcb

File tree

3 files changed

+49
-34
lines changed

3 files changed

+49
-34
lines changed

src/phl/ecPhlApp.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,13 @@ let t_equiv_app_onesided side i pre post tc =
124124
let (ml, mr) = fst es.es_ml, fst es.es_mr in
125125
let s, s', p', q' =
126126
match side with
127-
| `Left ->
128-
let p' = ss_inv_generalize_right (EcSubst.ss_inv_rebind pre ml) mr in
129-
let q' = ss_inv_generalize_right (EcSubst.ss_inv_rebind post ml) mr in
127+
| `Left ->
128+
let p' = ss_inv_generalize_as_left pre ml mr in
129+
let q' = ss_inv_generalize_as_left post ml mr in
130130
es.es_sl, es.es_sr, p', q'
131-
| `Right ->
132-
let p' = ss_inv_generalize_left (EcSubst.ss_inv_rebind pre mr) ml in
133-
let q' = ss_inv_generalize_left (EcSubst.ss_inv_rebind post mr) ml in
131+
| `Right ->
132+
let p' = ss_inv_generalize_as_right pre ml mr in
133+
let q' = ss_inv_generalize_as_right post ml mr in
134134
es.es_sr, es.es_sl, p', q'
135135
in
136136
let generalize_mod_side= sideif side generalize_mod_left generalize_mod_right in

src/phl/ecPhlConseq.ml

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -719,10 +719,10 @@ let t_equivS_conseq_conj pre1 post1 pre2 post2 pre' post' tc =
719719
let (_, hyps, _) = FApi.tc1_eflat tc in
720720
let es = tc1_as_equivS tc in
721721
let (ml, mtl), (mr, mtr) = es.es_ml, es.es_mr in
722-
let pre1' = ss_inv_generalize_right (ss_inv_rebind pre1 ml) mr in
723-
let post1' = ss_inv_generalize_right (ss_inv_rebind post1 ml) mr in
724-
let pre2' = ss_inv_generalize_left (ss_inv_rebind pre2 mr) ml in
725-
let post2' = ss_inv_generalize_left (ss_inv_rebind post2 mr) ml in
722+
let pre1' = ss_inv_generalize_as_left pre1 ml mr in
723+
let post1' = ss_inv_generalize_as_left post1 ml mr in
724+
let pre2' = ss_inv_generalize_as_right pre2 ml mr in
725+
let post2' = ss_inv_generalize_as_right post2 ml mr in
726726
if not (ts_inv_alpha_eq hyps (es_pr es) (map_ts_inv f_ands [pre';pre1';pre2'])) then
727727
tc_error !!tc "invalid pre-condition";
728728
if not (ts_inv_alpha_eq hyps (es_po es) (map_ts_inv f_ands [post';post1';post2'])) then
@@ -737,15 +737,17 @@ let t_equivF_conseq_conj pre1 post1 pre2 post2 pre' post' tc =
737737
let (_, hyps, _) = FApi.tc1_eflat tc in
738738
let ef = tc1_as_equivF tc in
739739
let ml, mr = ef.ef_ml, ef.ef_mr in
740-
let pre1' = ss_inv_generalize_right (ss_inv_rebind pre1 ml) mr in
741-
let post1' = ss_inv_generalize_right (ss_inv_rebind post1 ml) mr in
742-
let pre2' = ss_inv_generalize_left (ss_inv_rebind pre2 mr) ml in
743-
let post2' = ss_inv_generalize_left (ss_inv_rebind post2 mr) ml in
744-
let pre'' = map_ts_inv f_ands [pre'; pre1'; pre2'] in
745-
let post'' = map_ts_inv f_ands [post'; post1'; post2'] in
746-
if not (ts_inv_alpha_eq hyps (ef_pr ef) pre'')
740+
let pre1' = ss_inv_generalize_as_left pre1 ml mr in
741+
let post1' = ss_inv_generalize_as_left post1 ml mr in
742+
let pre2' = ss_inv_generalize_as_right pre2 ml mr in
743+
let post2' = ss_inv_generalize_as_right post2 ml mr in
744+
let pre'' = ts_inv_rebind pre' ml mr in
745+
let pre_and = map_ts_inv f_ands [pre''; pre1'; pre2'] in
746+
let post'' = ts_inv_rebind post' ml mr in
747+
let post_and = map_ts_inv f_ands [post''; post1'; post2'] in
748+
if not (ts_inv_alpha_eq hyps (ef_pr ef) pre_and)
747749
then tc_error !!tc "invalid pre-condition";
748-
if not (ts_inv_alpha_eq hyps (ef_po ef) post'')
750+
if not (ts_inv_alpha_eq hyps (ef_po ef) post_and)
749751
then tc_error !!tc "invalid post-condition";
750752
let concl1 = f_hoareF pre1 ef.ef_fl post1 in
751753
let concl2 = f_hoareF pre2 ef.ef_fr post2 in
@@ -760,12 +762,12 @@ let t_equivS_conseq_bd side pr po tc =
760762
let m,s,s',prs,pos =
761763
match side with
762764
| `Left ->
763-
let pos = ss_inv_generalize_right (ss_inv_rebind po ml) mr in
764-
let prs = ss_inv_generalize_right (ss_inv_rebind pr ml) mr in
765+
let pos = ss_inv_generalize_as_left po ml mr in
766+
let prs = ss_inv_generalize_as_left pr ml mr in
765767
es.es_ml, es.es_sl, es.es_sr, prs, pos
766768
| `Right ->
767-
let pos = ss_inv_generalize_left (ss_inv_rebind po mr) ml in
768-
let prs = ss_inv_generalize_left (ss_inv_rebind pr mr) ml in
769+
let pos = ss_inv_generalize_as_right po ml mr in
770+
let prs = ss_inv_generalize_as_right pr ml mr in
769771
es.es_mr, es.es_sr, es.es_sl, prs, pos
770772
in
771773
if not (List.is_empty s'.s_node) then begin
@@ -1180,10 +1182,10 @@ let rec t_hi_conseq notmod f1 f2 f3 tc =
11801182
let hs2 = pf_as_hoareS !!tc f2 in
11811183
let hs3 = pf_as_hoareS !!tc f3 in
11821184
let (ml, mr) = (fst es.es_ml, fst es.es_mr) in
1183-
let hs2_pr = ss_inv_generalize_right (ss_inv_rebind (hs_pr hs2) ml) mr in
1184-
let hs2_po = ss_inv_generalize_right (ss_inv_rebind (hs_po hs2) ml) mr in
1185-
let hs3_pr = ss_inv_generalize_left (ss_inv_rebind (hs_pr hs3) mr) ml in
1186-
let hs3_po = ss_inv_generalize_left (ss_inv_rebind (hs_po hs3) mr) ml in
1185+
let hs2_pr = ss_inv_generalize_as_left (hs_pr hs2) ml mr in
1186+
let hs2_po = ss_inv_generalize_as_left (hs_po hs2) ml mr in
1187+
let hs3_pr = ss_inv_generalize_as_right (hs_pr hs3) ml mr in
1188+
let hs3_po = ss_inv_generalize_as_right (hs_po hs3) ml mr in
11871189
let pre = map_ts_inv f_ands [es_pr es; hs2_pr; hs3_pr] in
11881190
let post = map_ts_inv f_ands [es_po es; hs2_po; hs3_po] in
11891191
let tac = if notmod then t_equivS_conseq_nm else t_equivS_conseq in
@@ -1238,8 +1240,8 @@ let rec t_hi_conseq notmod f1 f2 f3 tc =
12381240
| FequivS es, None, Some ((_, f2) as nf2), None ->
12391241
let hs = pf_as_bdhoareS !!tc f2 in
12401242
let (ml, mr) = (fst es.es_ml, fst es.es_mr) in
1241-
let pre = ss_inv_generalize_right (ss_inv_rebind (bhs_pr hs) ml) mr in
1242-
let post = ss_inv_generalize_right (ss_inv_rebind (bhs_po hs) ml) mr in
1243+
let pre = ss_inv_generalize_as_left (bhs_pr hs) ml mr in
1244+
let post = ss_inv_generalize_as_left (bhs_po hs) ml mr in
12431245
let tac = if notmod then t_equivS_conseq_nm else t_equivS_conseq in
12441246

12451247
check_is_detbound `Second (bhs_bd hs).inv;
@@ -1256,8 +1258,8 @@ let rec t_hi_conseq notmod f1 f2 f3 tc =
12561258
| FequivS es, None, None, Some ((_, f3) as nf3) ->
12571259
let hs = pf_as_bdhoareS !!tc f3 in
12581260
let (ml, mr) = (fst es.es_ml, fst es.es_mr) in
1259-
let pre = ss_inv_generalize_left (ss_inv_rebind (bhs_pr hs) mr) ml in
1260-
let post = ss_inv_generalize_left (ss_inv_rebind (bhs_po hs) mr) ml in
1261+
let pre = ss_inv_generalize_as_right (bhs_pr hs) ml mr in
1262+
let post = ss_inv_generalize_as_right (bhs_po hs) ml mr in
12611263
let tac = if notmod then t_equivS_conseq_nm else t_equivS_conseq in
12621264

12631265
check_is_detbound `Third (bhs_bd hs).inv;
@@ -1285,11 +1287,11 @@ let rec t_hi_conseq notmod f1 f2 f3 tc =
12851287
let hs2 = pf_as_hoareF !!tc f2 in
12861288
let hs3 = pf_as_hoareF !!tc f3 in
12871289
let (ml, mr) = (ef.ef_ml, ef.ef_mr) in
1288-
let hs2_pr = ss_inv_generalize_right (ss_inv_rebind (hf_pr hs2) ml) mr in
1289-
let hs3_pr = ss_inv_generalize_left (ss_inv_rebind (hf_pr hs3) mr) ml in
1290+
let hs2_pr = ss_inv_generalize_as_left (hf_pr hs2) ml mr in
1291+
let hs3_pr = ss_inv_generalize_as_right (hf_pr hs3) ml mr in
12901292
let pre = map_ts_inv f_ands [ef_pr ef; hs2_pr; hs3_pr] in
1291-
let hs2_po = ss_inv_generalize_right (ss_inv_rebind (hf_po hs2) ml) mr in
1292-
let hs3_po = ss_inv_generalize_left (ss_inv_rebind (hf_po hs3) mr) ml in
1293+
let hs2_po = ss_inv_generalize_as_left (hf_po hs2) ml mr in
1294+
let hs3_po = ss_inv_generalize_as_right (hf_po hs3) ml mr in
12931295
let post = map_ts_inv f_ands [ef_po ef; hs2_po; hs3_po] in
12941296
let tac = if notmod then t_equivF_conseq_nm else t_equivF_conseq in
12951297
t_on1seq 2
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Foo = {
2+
proc foo(i : int) = {
3+
}
4+
}.
5+
6+
lemma foo_corr : hoare [ Foo.foo : true ==> true] by proc;auto.
7+
8+
lemma foo_eq : equiv [ Foo.foo ~ Foo.foo : ={arg} ==> true ] by sim.
9+
10+
lemma foo_eq_corr:
11+
equiv [ Foo.foo ~ Foo.foo : ={arg} ==> ={res} ].
12+
conseq foo_eq foo_corr.
13+
qed.

0 commit comments

Comments
 (0)