Skip to content

Commit ab8e28b

Browse files
authored
[tactic] Fix type unification in outline
1 parent d8b18a5 commit ab8e28b

File tree

2 files changed

+34
-33
lines changed

2 files changed

+34
-33
lines changed

src/ecUnifyProc.ml

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ type u_value =
2727
type umap = u_value Msym.t
2828

2929
(*---------------------------------------------------------------------------------------*)
30-
let rec unify_exprs umap e1 e2 =
31-
if not (EcTypes.ty_equal e1.e_ty e2.e_ty) then
30+
let rec unify_exprs env umap e1 e2 =
31+
if not (EcReduction.EqTest.for_type env e1.e_ty e2.e_ty) then
3232
raise (UnificationError (UE_TypeMismatch (e1, e2)));
3333

3434
match e1.e_node, e2.e_node with
@@ -59,30 +59,30 @@ let rec unify_exprs umap e1 e2 =
5959
| Eop (p1, _), Eop (p2, _)
6060
when EcPath.p_equal p1 p2 -> umap
6161
| Eapp (f1, a1), Eapp (f2, a2) ->
62-
let umap = unify_exprs umap f1 f2 in
62+
let umap = unify_exprs env umap f1 f2 in
6363
if List.length a1 <> List.length a2 then
6464
raise (UnificationError (UE_ExprNotInLockstep (e1, e2)));
65-
List.fold_left2 (fun umap e1 e2 -> unify_exprs umap e1 e2) umap a1 a2
65+
List.fold_left2 (fun umap e1 e2 -> unify_exprs env umap e1 e2) umap a1 a2
6666
| Equant (q1, b1, e1), Equant (q2, b2, e2) when q1 = q2 ->
6767
if List.length b1 <> List.length b2 then
6868
raise (UnificationError (UE_ExprNotInLockstep (e1, e2)));
69-
unify_exprs umap e1 e2
69+
unify_exprs env umap e1 e2
7070
| Elet (_, e1, u1), Elet (_, e2, u2) ->
71-
let umap = unify_exprs umap e1 e2 in
72-
unify_exprs umap u1 u2
71+
let umap = unify_exprs env umap e1 e2 in
72+
unify_exprs env umap u1 u2
7373
| Etuple t1, Etuple t2 ->
74-
List.fold_left (fun umap (e1, e2) -> unify_exprs umap e1 e2) umap (List.combine t1 t2)
74+
List.fold_left (fun umap (e1, e2) -> unify_exprs env umap e1 e2) umap (List.combine t1 t2)
7575
| Eif (c1, t1, f1), Eif (c2, t2, f2) ->
76-
let umap = unify_exprs umap c1 c2 in
77-
let umap = unify_exprs umap t1 t2 in
78-
unify_exprs umap f1 f2
76+
let umap = unify_exprs env umap c1 c2 in
77+
let umap = unify_exprs env umap t1 t2 in
78+
unify_exprs env umap f1 f2
7979
| Ematch (c1, p1, _), Ematch (c2, p2, _) ->
80-
let umap = unify_exprs umap c1 c2 in
80+
let umap = unify_exprs env umap c1 c2 in
8181
if List.length p1 <> List.length p2 then
8282
raise (UnificationError (UE_ExprNotInLockstep (e1, e2)));
83-
List.fold_left2 (fun umap e1 e2 -> unify_exprs umap e1 e2) umap p1 p2
83+
List.fold_left2 (fun umap e1 e2 -> unify_exprs env umap e1 e2) umap p1 p2
8484
| Eproj (e1, x1), Eproj (e2, x2) when x1 = x2 ->
85-
unify_exprs umap e1 e2
85+
unify_exprs env umap e1 e2
8686
| _ -> raise (UnificationError (UE_ExprNotInLockstep (e1, e2)))
8787

8888
(*---------------------------------------------------------------------------------------*)
@@ -120,12 +120,12 @@ let unify_lv umap lv1 lv2 =
120120
| _, _ -> raise (UnificationError (UE_LvNotInLockstep (lv1, lv2)))
121121

122122
(*---------------------------------------------------------------------------------------*)
123-
let rec unify_instrs umap i1 i2 =
123+
let rec unify_instrs env umap i1 i2 =
124124
match i1.i_node, i2.i_node with
125125
| Sasgn(lv1, e1), Sasgn(lv2, e2)
126126
| Srnd(lv1, e1), Srnd(lv2, e2) ->
127127
let umap = unify_lv umap lv1 lv2 in
128-
unify_exprs umap e1 e2
128+
unify_exprs env umap e1 e2
129129

130130
| Scall(olv1, xp1, args1), Scall(olv2, xp2, args2) when EcPath.x_equal xp1 xp2 ->
131131
let umap =
@@ -151,37 +151,37 @@ let rec unify_instrs umap i1 i2 =
151151
| _, _ -> raise (UnificationError (UE_InstrNotInLockstep (i1, i2)))
152152
in
153153

154-
List.fold_left (fun umap (e1, e2) -> unify_exprs umap e1 e2) umap (List.combine args1 args2)
154+
List.fold_left (fun umap (e1, e2) -> unify_exprs env umap e1 e2) umap (List.combine args1 args2)
155155

156156
| Sif(e1, st1, sf1), Sif(e2, st2, sf2) ->
157-
let umap = unify_exprs umap e1 e2 in
158-
let umap = unify_stmts umap st1 st2 in
159-
unify_stmts umap sf1 sf2
157+
let umap = unify_exprs env umap e1 e2 in
158+
let umap = unify_stmts env umap st1 st2 in
159+
unify_stmts env umap sf1 sf2
160160

161161
| Swhile(e1, s1), Swhile(e2, s2) ->
162-
let umap = unify_exprs umap e1 e2 in
163-
unify_stmts umap s1 s2
162+
let umap = unify_exprs env umap e1 e2 in
163+
unify_stmts env umap s1 s2
164164

165165
| Smatch(e1, bs1), Smatch(e2, bs2) ->
166-
let umap = unify_exprs umap e1 e2 in
166+
let umap = unify_exprs env umap e1 e2 in
167167
List.fold_left2 (fun umap (p1, b1) (p2, b2) ->
168168
if List.length p1 <> List.length p2 then
169169
raise (UnificationError (UE_InstrNotInLockstep (i1, i2)));
170-
unify_stmts umap b1 b2
170+
unify_stmts env umap b1 b2
171171
) umap bs1 bs2
172172

173173
| Sassert e1, Sassert e2 ->
174-
unify_exprs umap e1 e2
174+
unify_exprs env umap e1 e2
175175

176176
| Sabstract x1, Sabstract x2 when EcIdent.id_equal x1 x2 -> umap
177177

178178
| _ -> raise (UnificationError (UE_InstrNotInLockstep (i1, i2)));
179179

180-
and unify_stmts (umap : umap) s1 s2 =
180+
and unify_stmts env (umap : umap) s1 s2 =
181181
let s1n, s2n = s1.s_node, s2.s_node in
182182
if List.length s1n <> List.length s2n then
183183
raise (UnificationError (UE_DifferentProgramLengths (s1, s2)));
184-
List.fold_left2 (fun umap i1 i2 -> unify_instrs umap i1 i2) umap s1n s2n
184+
List.fold_left2 (fun umap i1 i2 -> unify_instrs env umap i1 i2) umap s1n s2n
185185

186186
(*---------------------------------------------------------------------------------------*)
187187
let unify_func env mode fname s =
@@ -209,14 +209,14 @@ let unify_func env mode fname s =
209209

210210
match mode, fdef.f_ret with
211211
| `Exact, None ->
212-
let umap = unify_stmts umap fdef.f_body s in
212+
let umap = unify_stmts env umap fdef.f_body s in
213213
s_call (None, fname, close_args umap args)
214214
| `Exact, Some re -> begin
215215
match EcLowPhlGoal.s_last destr_asgn s with
216216
| None -> raise (UnificationError UE_InvalidRetInstr)
217217
| Some ((lv, e), s) ->
218-
let umap = unify_stmts umap fdef.f_body s in
219-
let umap = unify_exprs umap re e in
218+
let umap = unify_stmts env umap fdef.f_body s in
219+
let umap = unify_exprs env umap re e in
220220
let args = close_args umap args in
221221
s_call (Some lv, fname, args)
222222
end
@@ -225,7 +225,7 @@ let unify_func env mode fname s =
225225
| `Alias, Some e ->
226226
if not (is_tuple_var e || is_var e) then
227227
raise (UnificationError UE_AliasNotPv);
228-
let umap = unify_stmts umap fdef.f_body s in
228+
let umap = unify_stmts env umap fdef.f_body s in
229229
let args = close_args umap args in
230230
let alias =
231231
let pvs = lv_to_ty_list (lv_of_expr e) in

tests/outline.ec

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
require import AllCore.
22

3-
op dint : int distr.
3+
type t = int.
4+
op dint : t distr.
45

56
module M = {
6-
var x : int
7+
var x : t
78

89
proc f1() : unit = {
910
M.x <- 0;

0 commit comments

Comments
 (0)