Skip to content

Commit 90602ac

Browse files
Gustavo2622strub
andcommitted
Add support for cfold of symbolic assignments
Co-authored-by: Pierre-Yves Strub <pierre-yves.strub@pqshield.com>
1 parent bdb93fb commit 90602ac

4 files changed

Lines changed: 40 additions & 17 deletions

File tree

src/ecPV.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ module Mpv = struct
111111
check_glob env mp m;
112112
raise Not_found
113113

114+
let pvs { s_pv } = s_pv
115+
114116
type esubst = (expr, unit) t
115117

116118
let rec esubst env (s : esubst) e =

src/ecPV.mli

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ module Mpv : sig
5353

5454
val find_glob : env -> mpath -> ('a,'b) t -> 'b
5555

56-
val esubst : env -> (expr, unit) t -> expr -> expr
56+
val pvs : ('a,'b) t -> 'a Mnpv.t
57+
58+
val esubst : env -> (expr, unit) t -> expr -> expr
5759
val issubst : env -> (expr, unit) t -> instr list -> instr list
58-
val isubst : env -> (expr, unit) t -> instr -> instr
59-
val ssubst : env -> (expr, unit) t -> stmt -> stmt
60+
val isubst : env -> (expr, unit) t -> instr -> instr
61+
val ssubst : env -> (expr, unit) t -> stmt -> stmt
6062
end
6163

6264
(* -------------------------------------------------------------------- *)

src/phl/ecPhlCodeTx.ml

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,23 @@ let cfold_stmt ?(simplify = true) (pf, hyps) (me : memenv) (olen : int option) (
196196
e
197197
) else identity in
198198

199-
let is_const_expression (e : expr) =
200-
PV.is_empty (e_read env e) in
201-
202199
let for_instruction ((subst as subst0) : (expr, unit) Mpv.t) (i : instr) =
203200
let wr = EcPV.i_write env i in
204201
let i = Mpv.isubst env subst i in
205202

206203
let (subst, asgn) =
207-
List.fold_left_map (fun subst ((pv, _) as pvty) ->
208-
match Mpv.find env pv subst with
209-
| e -> Mpv.remove env pv subst, Some (pvty, e)
210-
| exception Not_found -> subst, None
211-
) subst (fst (PV.elements wr)) in
204+
List.fold_left_map (fun subst (pv, e) ->
205+
let exception Remove in
206+
207+
try
208+
if PV.mem_pv env pv wr then raise Remove;
209+
let rd = EcPV.e_read env e in
210+
if PV.mem_pv env pv rd then raise Remove;
211+
subst, None
212+
213+
with Remove ->
214+
Mpv.remove env pv subst, Some ((pv, e.e_ty), e)
215+
) subst (EcPV.Mnpv.bindings (Mpv.pvs subst)) in
212216

213217
let asgn = List.filter_map identity asgn in
214218

@@ -227,7 +231,7 @@ let cfold_stmt ?(simplify = true) (pf, hyps) (me : memenv) (olen : int option) (
227231
try
228232
match i.i_node with
229233
| Sasgn (lv, e) ->
230-
(* We already removed the variables of `lv` from the substitution *)
234+
(* We already removed the variables of `lv` & the rhs from the substitution *)
231235
(* We are only interested in the variables of `lv` that are in `wr` *)
232236
let es =
233237
match simplify e, lv with
@@ -237,8 +241,8 @@ let cfold_stmt ?(simplify = true) (pf, hyps) (me : memenv) (olen : int option) (
237241

238242
let lv = lv_to_ty_list lv in
239243

240-
let tosubst, asgn2 = List.partition (fun ((pv, _), e) ->
241-
Mpv.mem env pv subst0 && is_const_expression e
244+
let tosubst, asgn2 = List.partition (fun ((pv, _), _) ->
245+
Mpv.mem env pv subst0
242246
) (List.combine lv es) in
243247

244248
let subst =
@@ -292,9 +296,6 @@ let cfold_stmt ?(simplify = true) (pf, hyps) (me : memenv) (olen : int option) (
292296
| e, _ -> [e] in
293297
let lv = lv_to_ty_list lv in
294298

295-
if not (List.for_all is_const_expression es) then
296-
tc_error pf "right-values are not closed expressions";
297-
298299
if not (List.for_all (is_loc -| fst) lv) then
299300
tc_error pf "left-values must be made of local variables only";
300301

tests/cfold.ec

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,21 @@ theory CfoldWhileUnroll.
111111
by auto => />.
112112
qed.
113113
end CfoldWhileUnroll.
114+
115+
module CfoldSymbolic = {
116+
proc f(a : int) = {
117+
var x, y : int;
118+
119+
x <- a + 1;
120+
y <- 2 * x;
121+
x <- 3 * y;
122+
123+
return x;
124+
}
125+
}.
126+
127+
lemma L : hoare[CfoldSymbolic.f : witness a ==> witness res].
128+
proof.
129+
proc.
130+
cfold 1.
131+
abort.

0 commit comments

Comments
 (0)