Skip to content

Commit 610a0af

Browse files
committed
optional memories for empty map
1 parent a200146 commit 610a0af

6 files changed

Lines changed: 43 additions & 74 deletions

File tree

src/ecAst.ml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,10 @@ type ss_inv = {
292292
inv : form;
293293
}
294294

295-
let map_ss_inv (fn: form list -> form) (invs: ss_inv list): ss_inv =
296-
assert (List.length invs > 0);
297-
let m' = (List.hd invs).m in
295+
let map_ss_inv ?m (fn: form list -> form) (invs: ss_inv list): ss_inv =
296+
let m' = match m with
297+
| Some m -> m
298+
| None -> (List.hd invs).m in
298299
let inv = fn (List.map (fun {inv;m} -> assert (m = m'); inv) invs) in
299300
{ m = m'; inv = inv }
300301

@@ -333,10 +334,13 @@ type ts_inv = {
333334
inv : form;
334335
}
335336

336-
let map_ts_inv (fn: form list -> form) (invs: ts_inv list): ts_inv =
337-
assert (List.length invs > 0);
338-
let ml' = (List.hd invs).ml in
339-
let mr' = (List.hd invs).mr in
337+
let map_ts_inv ?ml ?mr (fn: form list -> form) (invs: ts_inv list): ts_inv =
338+
let ml' = match ml with
339+
| Some m -> m
340+
| None -> (List.hd invs).ml in
341+
let mr' = match mr with
342+
| Some m -> m
343+
| None -> (List.hd invs).mr in
340344
let inv = fn (List.map (fun {inv;ml;mr} -> assert (ml = ml' && mr = mr'); inv) invs) in
341345
{ ml = ml'; mr = mr'; inv = inv }
342346

src/ecAst.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ type ss_inv = {
309309
inv : form;
310310
}
311311

312-
val map_ss_inv : (form list -> form) -> ss_inv list -> ss_inv
312+
val map_ss_inv : ?m:memory -> (form list -> form) -> ss_inv list -> ss_inv
313313
val map_ss_inv1 : (form -> form) -> ss_inv -> ss_inv
314314
val map_ss_inv2 : (form -> form -> form) -> ss_inv -> ss_inv -> ss_inv
315315
val map_ss_inv3 : (form -> form -> form -> form) -> ss_inv -> ss_inv -> ss_inv -> ss_inv
@@ -323,7 +323,7 @@ type ts_inv = {
323323
inv : form;
324324
}
325325

326-
val map_ts_inv : (form list -> form) -> ts_inv list -> ts_inv
326+
val map_ts_inv : ?ml:memory -> ?mr:memory -> (form list -> form) -> ts_inv list -> ts_inv
327327
val map_ts_inv1 : (form -> form) -> ts_inv -> ts_inv
328328
val map_ts_inv2 : (form -> form -> form) -> ts_inv -> ts_inv -> ts_inv
329329
val map_ts_inv3 : (form -> form -> form -> form) -> ts_inv -> ts_inv -> ts_inv -> ts_inv

src/ecCoreFol.ml

Lines changed: 27 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -950,92 +950,57 @@ let equantif_of_quantif (qt : quantif) : equantif =
950950
| Lexists -> `EExists
951951

952952
(* -------------------------------------------------------------------- *)
953-
let rec ss_inv_of_expr m (e : expr) =
953+
954+
let rec form_of_expr_r ?m (e : expr) =
954955
match e.e_node with
955956
| Eint n ->
956-
{m;inv=f_int n}
957+
f_int n
957958

958959
| Elocal id ->
959-
{m;inv=f_local id e.e_ty}
960+
f_local id e.e_ty
960961

961962
| Evar pv ->
962-
f_pvar pv e.e_ty m
963+
begin
964+
match m with
965+
| None -> failwith "expecting memory"
966+
| Some m -> (f_pvar pv e.e_ty m).inv
967+
end
963968

964969
| Eop (op, tys) ->
965-
{m;inv=f_op op tys e.e_ty}
970+
f_op op tys e.e_ty
966971

967972
| Eapp (ef, es) ->
968-
let f_app' f = f_app (List.hd f) (List.tl f) e.e_ty in
969-
map_ss_inv f_app' ((ss_inv_of_expr m ef)::(List.map (ss_inv_of_expr m) es))
973+
f_app (form_of_expr_r ?m ef) (List.map (form_of_expr_r ?m) es) e.e_ty
970974

971975
| Elet (lpt, e1, e2) ->
972-
map_ss_inv2 (f_let lpt) (ss_inv_of_expr m e1) (ss_inv_of_expr m e2)
976+
f_let lpt (form_of_expr_r ?m e1) (form_of_expr_r ?m e2)
973977

974978
| Etuple es ->
975-
map_ss_inv f_tuple (List.map (ss_inv_of_expr m) es)
979+
f_tuple (List.map (form_of_expr_r ?m) es)
976980

977981
| Eproj (e1, i) ->
978-
let f_proj' f = f_proj f i e.e_ty in
979-
map_ss_inv1 f_proj' (ss_inv_of_expr m e1)
982+
f_proj (form_of_expr_r ?m e1) i e.e_ty
980983

981984
| Eif (e1, e2, e3) ->
982-
let e1 = ss_inv_of_expr m e1 in
983-
let e2 = ss_inv_of_expr m e2 in
984-
let e3 = ss_inv_of_expr m e3 in
985-
map_ss_inv3 f_if e1 e2 e3
985+
let e1 = form_of_expr_r ?m e1 in
986+
let e2 = form_of_expr_r ?m e2 in
987+
let e3 = form_of_expr_r ?m e3 in
988+
f_if e1 e2 e3
986989

987990
| Ematch (b, fs, ty) ->
988-
let b' = ss_inv_of_expr m b in
989-
let fs' = List.map (ss_inv_of_expr m) fs in
990-
let f_match' fl = f_match (List.hd fl) (List.tl fl) ty in
991-
map_ss_inv f_match' (b'::fs')
991+
let b' = form_of_expr_r ?m b in
992+
let fs' = List.map (form_of_expr_r ?m) fs in
993+
f_match b' fs' ty
992994

993995
| Equant (qt, b, e) ->
994996
let b = List.map (fun (x, ty) -> (x, GTty ty)) b in
995-
let e = ss_inv_of_expr m e in
996-
map_ss_inv1 (f_quant (quantif_of_equantif qt) b) e
997+
let e = form_of_expr_r ?m e in
998+
f_quant (quantif_of_equantif qt) b e
997999

998-
let rec form_of_expr e =
999-
match e.e_node with
1000-
| Eint n ->
1001-
f_int n
1002-
1003-
| Elocal id ->
1004-
f_local id e.e_ty
1005-
1006-
| Evar _ ->
1007-
failwith "needs memory for program variable"
1008-
1009-
| Eop (op, tys) ->
1010-
f_op op tys e.e_ty
1011-
1012-
| Eapp (ef, es) ->
1013-
f_app (form_of_expr ef) (List.map form_of_expr es) e.e_ty
1014-
1015-
| Elet (lpt, e1, e2) ->
1016-
f_let lpt (form_of_expr e1) (form_of_expr e2)
1017-
1018-
| Etuple es ->
1019-
f_tuple (List.map form_of_expr es)
1020-
1021-
| Eproj (e1, i) ->
1022-
f_proj (form_of_expr e1) i e.e_ty
1023-
1024-
| Eif (e1, e2, e3) ->
1025-
let e1 = form_of_expr e1 in
1026-
let e2 = form_of_expr e2 in
1027-
let e3 = form_of_expr e3 in
1028-
f_if e1 e2 e3
1029-
1030-
| Ematch (b, fs, ty) ->
1031-
let b' = form_of_expr b in
1032-
let fs' = List.map form_of_expr fs in
1033-
f_match b' fs' ty
1034-
1035-
| Equant (qt, b, e) ->
1036-
let b = List.map (fun (x, ty) -> (x, GTty ty)) b in
1037-
let e = form_of_expr e in
1038-
f_quant (quantif_of_equantif qt) b e
1000+
let form_of_expr e = form_of_expr_r e
1001+
1002+
let ss_inv_of_expr m (e : expr) =
1003+
{m;inv=form_of_expr_r ~m e}
10391004

10401005
(* -------------------------------------------------------------------- *)
10411006
exception CannotTranslate

src/ecEnv.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2448,7 +2448,7 @@ module NormMp = struct
24482448
let globs = List.map (fun id -> f_glob id m) globs in
24492449
let pv = List.map (fun (xp, ty) -> f_pvar (pv_glob xp) ty m) pv in
24502450
2451-
map_ss_inv f_tuple (globs @ pv)
2451+
map_ss_inv ~m f_tuple (globs @ pv)
24522452
24532453
let norm_glob env m mp = globals env m mp
24542454

src/phl/ecPhlFun.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ let subst_pre env fs (m : memory) s =
6868
| Some v -> { v_name = v; v_type = ov.ov_type }
6969
in
7070
let v = List.map (fun v -> f_pvloc (fresh v) m) fs.fs_anames in
71-
PVM.add env pv_arg m (map_ss_inv f_tuple v).inv s
71+
PVM.add env pv_arg m (map_ss_inv ~m f_tuple v).inv s
7272

7373
(* ------------------------------------------------------------------ *)
7474
let t_hoareF_fun_def_r tc =

src/phl/ecPhlTrans.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ let t_equivS_trans_eq side s tc =
9898
let xr x ty = ss_inv_generalize_left (f_pvar x ty mr) ml in
9999
let veq = List.map (fun (x,ty) -> map_ts_inv2 f_eq (xl x ty) (xr x ty)) vfv in
100100
let geq = List.map (fun mp -> ts_inv_eqglob mp ml mp mr) gfv in
101-
map_ts_inv f_ands (veq @ geq) in
101+
map_ts_inv ~ml ~mr f_ands (veq @ geq) in
102102
let pre = mk_eqs (EcPV.PV.union (EcPV.PV.union fv_pr fv_po) fv_r) in
103103
let pre = map_ts_inv2 f_and pre (odfl {ml=pre.ml;mr=pre.mr;inv=f_true} mem_pre) in
104104
let post = mk_eqs fv_po in

0 commit comments

Comments
 (0)