@@ -97,6 +97,9 @@ let ff_norm env ff mem =
9797 let _, fuses = funs_uses_core env ff.ff_params [ff.ff_xp] in
9898 Uses. to_form env ff.ff_params fuses mem
9999
100+ let ff_norm_ty env ff =
101+ let _, fuses = funs_uses_core env ff.ff_params [ff.ff_xp] in
102+ Uses. to_type env ff.ff_params fuses
100103
101104let funs_uses_mr env params fs =
102105 let env, fuses = funs_uses_core env params fs in
@@ -157,6 +160,54 @@ let rec norm_mem_restr env mr =
157160 | Inter (s1 , s2 ) -> mr_inter (norm_mem_restr env s1) (norm_mem_restr env s2)
158161 | Diff (s1 , s2 ) -> mr_diff (norm_mem_restr env s1) (norm_mem_restr env s2)
159162
163+
164+ let rec norm_globs_restrs env f =
165+ let has_mod b =
166+ List. exists (fun (_ ,gty ) ->
167+ match gty with GTmodty _ -> true | _ -> false ) b in
168+
169+ let norm_bind env (x , gty ) =
170+ match gty with
171+ | GTty ty -> begin
172+ match ty.ty_node with
173+ | Tglob ff -> (x, GTty (ff_norm_ty env ff))
174+ | _ -> (x, gty)
175+ end
176+ | GTmodty (mt , mr ) -> (x, (GTmodty (mt, norm_mem_restr env mr)))
177+ | GTmem _ -> (x, gty)
178+ in
179+
180+ match f.f_node with
181+ | Fquant (q , bd , f ) ->
182+ let env = if has_mod bd then EcEnv.Mod. add_mod_binding bd env else env in
183+ f_quant q (List. map (norm_bind env) bd) (norm_globs_restrs env f)
184+ | Fglob (ff , m ) -> ff_norm env ff m
185+ | Fif (f1 , f2 , f3 ) ->
186+ f_if
187+ (norm_globs_restrs env f1)
188+ (norm_globs_restrs env f2)
189+ (norm_globs_restrs env f3)
190+ | Fmatch (b , fs , ty ) ->
191+ f_match
192+ (norm_globs_restrs env b)
193+ (List. map (norm_globs_restrs env) fs)
194+ ty
195+ | Flet (lv , f1 , f2 ) ->
196+ f_let
197+ lv
198+ (norm_globs_restrs env f1)
199+ (norm_globs_restrs env f2)
200+ | Fapp (e , es ) ->
201+ f_app
202+ (norm_globs_restrs env e)
203+ (List. map (norm_globs_restrs env) es)
204+ f.f_ty
205+ | Ftuple es ->
206+ f_tuple (List. map (norm_globs_restrs env) es)
207+ | Fproj (e , i ) ->
208+ f_proj (norm_globs_restrs env e) i f.f_ty
209+ | _ -> f
210+
160211let sup env ff =
161212 (* The xpath is know to be normalised so it is abstract *)
162213 match (Fun. by_xpath ff.ff_xp env).f_def with
@@ -457,6 +508,16 @@ and process (env : env) (r : mem) (st : local_state) =
457508
458509(* ------------------------------------------------------------------- *)
459510
511+ let rec dump_mem_restr mr =
512+ match mr with
513+ | Empty -> " Empty"
514+ | All -> " All"
515+ | Var x -> Format. sprintf " Var (%s)" (EcPath. x_tostring x)
516+ | GlobFun ff -> Format. sprintf " GlobFun (%s)" (EcPath. x_tostring ff.ff_xp)
517+ | Inter (l , r ) -> Format. sprintf " Inter (%s, %s)" (dump_mem_restr l) (dump_mem_restr r)
518+ | Union (l , r ) -> Format. sprintf " Union (%s, %s)" (dump_mem_restr l) (dump_mem_restr r)
519+ | Diff (l , r ) -> Format. sprintf " Diff (%s, %s)" (dump_mem_restr l) (dump_mem_restr r)
520+
460521(* /!\ Precondition s1 and s2 should have been normalised *)
461522let core_subset env s1 s2 =
462523 (* add clause !(s1 subset s2)
0 commit comments