@@ -27,8 +27,8 @@ type u_value =
27
27
type umap = u_value Msym .t
28
28
29
29
(* ---------------------------------------------------------------------------------------*)
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
32
32
raise (UnificationError (UE_TypeMismatch (e1, e2)));
33
33
34
34
match e1.e_node, e2.e_node with
@@ -59,30 +59,30 @@ let rec unify_exprs umap e1 e2 =
59
59
| Eop (p1, _), Eop (p2, _)
60
60
when EcPath. p_equal p1 p2 -> umap
61
61
| 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
63
63
if List. length a1 <> List. length a2 then
64
64
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
66
66
| Equant (q1 , b1 , e1 ), Equant (q2 , b2 , e2 ) when q1 = q2 ->
67
67
if List. length b1 <> List. length b2 then
68
68
raise (UnificationError (UE_ExprNotInLockstep (e1, e2)));
69
- unify_exprs umap e1 e2
69
+ unify_exprs env umap e1 e2
70
70
| 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
73
73
| 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)
75
75
| 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
79
79
| 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
81
81
if List. length p1 <> List. length p2 then
82
82
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
84
84
| Eproj (e1 , x1 ), Eproj (e2 , x2 ) when x1 = x2 ->
85
- unify_exprs umap e1 e2
85
+ unify_exprs env umap e1 e2
86
86
| _ -> raise (UnificationError (UE_ExprNotInLockstep (e1, e2)))
87
87
88
88
(* ---------------------------------------------------------------------------------------*)
@@ -120,12 +120,12 @@ let unify_lv umap lv1 lv2 =
120
120
| _ , _ -> raise (UnificationError (UE_LvNotInLockstep (lv1, lv2)))
121
121
122
122
(* ---------------------------------------------------------------------------------------*)
123
- let rec unify_instrs umap i1 i2 =
123
+ let rec unify_instrs env umap i1 i2 =
124
124
match i1.i_node, i2.i_node with
125
125
| Sasgn (lv1, e1), Sasgn (lv2, e2)
126
126
| Srnd (lv1 , e1 ), Srnd (lv2 , e2 ) ->
127
127
let umap = unify_lv umap lv1 lv2 in
128
- unify_exprs umap e1 e2
128
+ unify_exprs env umap e1 e2
129
129
130
130
| Scall (olv1 , xp1 , args1 ), Scall (olv2 , xp2 , args2 ) when EcPath. x_equal xp1 xp2 ->
131
131
let umap =
@@ -151,37 +151,37 @@ let rec unify_instrs umap i1 i2 =
151
151
| _ , _ -> raise (UnificationError (UE_InstrNotInLockstep (i1, i2)))
152
152
in
153
153
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)
155
155
156
156
| 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
160
160
161
161
| 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
164
164
165
165
| 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
167
167
List. fold_left2 (fun umap (p1 , b1 ) (p2 , b2 ) ->
168
168
if List. length p1 <> List. length p2 then
169
169
raise (UnificationError (UE_InstrNotInLockstep (i1, i2)));
170
- unify_stmts umap b1 b2
170
+ unify_stmts env umap b1 b2
171
171
) umap bs1 bs2
172
172
173
173
| Sassert e1 , Sassert e2 ->
174
- unify_exprs umap e1 e2
174
+ unify_exprs env umap e1 e2
175
175
176
176
| Sabstract x1 , Sabstract x2 when EcIdent. id_equal x1 x2 -> umap
177
177
178
178
| _ -> raise (UnificationError (UE_InstrNotInLockstep (i1, i2)));
179
179
180
- and unify_stmts (umap : umap ) s1 s2 =
180
+ and unify_stmts env (umap : umap ) s1 s2 =
181
181
let s1n, s2n = s1.s_node, s2.s_node in
182
182
if List. length s1n <> List. length s2n then
183
183
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
185
185
186
186
(* ---------------------------------------------------------------------------------------*)
187
187
let unify_func env mode fname s =
@@ -209,14 +209,14 @@ let unify_func env mode fname s =
209
209
210
210
match mode, fdef.f_ret with
211
211
| `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
213
213
s_call (None , fname, close_args umap args)
214
214
| `Exact , Some re -> begin
215
215
match EcLowPhlGoal. s_last destr_asgn s with
216
216
| None -> raise (UnificationError UE_InvalidRetInstr )
217
217
| 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
220
220
let args = close_args umap args in
221
221
s_call (Some lv, fname, args)
222
222
end
@@ -225,7 +225,7 @@ let unify_func env mode fname s =
225
225
| `Alias , Some e ->
226
226
if not (is_tuple_var e || is_var e) then
227
227
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
229
229
let args = close_args umap args in
230
230
let alias =
231
231
let pvs = lv_to_ty_list (lv_of_expr e) in
0 commit comments