@@ -17,7 +17,8 @@ type mod_extra = {
1717(* -------------------------------------------------------------------- *)
1818type f_subst = {
1919 fs_freshen : bool ; (* true means freshen locals *)
20- fs_u : etyarg Muid .t ;
20+ fs_u : ty Muid .t ;
21+ fs_utc : tcwitness Muid .t ;
2122 fs_v : etyarg Mid .t ;
2223 fs_mod : EcPath .mpath Mid .t ;
2324 fs_modex : mod_extra Mid .t ;
@@ -47,22 +48,36 @@ let fv_Mid (type a)
4748=
4849 Mid. fold (fun _ t s -> fv_union s (fv t)) m s
4950
51+ (* -------------------------------------------------------------------- *)
52+ type unisubst = {
53+ uvars : ty Muid .t ;
54+ utcvars : tcwitness Muid .t ;
55+ }
56+
57+ (* -------------------------------------------------------------------- *)
58+ let unisubst0 : unisubst = {
59+ uvars = Muid. empty; utcvars = Muid. empty;
60+ }
61+
5062(* -------------------------------------------------------------------- *)
5163let f_subst_init
52- ?(freshen =false )
53- ?(tu =Muid. empty)
54- ?(tv =Mid. empty)
55- ?(esloc =Mid. empty)
56- () =
64+ ?(freshen = false )
65+ ?(tu = unisubst0)
66+ ?(tv = Mid. empty)
67+ ?(esloc = Mid. empty)
68+ ()
69+ =
5770
5871 let fv = Mid. empty in
59- let fv = Muid. fold (fun _ t s -> fv_union s (etyarg_fv t)) tu fv in
72+ let fv = Muid. fold (fun _ t s -> fv_union s (ty_fv t)) tu.uvars fv in
73+ let fv = Muid. fold (fun _ t s -> fv_union s (tcw_fv t)) tu.utcvars fv in
6074 let fv = fv_Mid etyarg_fv tv fv in
6175 let fv = fv_Mid e_fv esloc fv in
6276
6377 {
6478 fs_freshen = freshen;
65- fs_u = tu;
79+ fs_u = tu.uvars;
80+ fs_utc = tu.utcvars;
6681 fs_v = tv;
6782 fs_mod = Mid. empty;
6883 fs_modex = Mid. empty;
@@ -166,7 +181,7 @@ let rec ty_subst (s : f_subst) (ty : ty) : ty =
166181
167182 | Tunivar id ->
168183 Muid. find_opt id s.fs_u
169- |> Option. map (fun ( ty , _ ) -> ty_subst s ty )
184+ |> Option. map (ty_subst s)
170185 |> Option. value ~default: ty
171186
172187 | Tvar id ->
@@ -190,7 +205,11 @@ let rec ty_subst (s : f_subst) (ty : ty) : ty =
190205(* -------------------------------------------------------------------- *)
191206and tcw_subst (s : f_subst ) (tcw : tcwitness ) : tcwitness =
192207 match tcw with
193- | TCIConcrete ({ etyargs = etyargs0 } as rtcw ) ->
208+ | TCIUni uid ->
209+ Muid. find_opt uid s.fs_utc
210+ |> Option. value ~default: tcw
211+
212+ | TCIConcrete ({ etyargs = etyargs0 } as rtcw ) ->
194213 let etyargs = List.Smart. map (etyarg_subst s) etyargs0 in
195214 if etyargs == (* phy*) etyargs0 then
196215 tcw
@@ -201,11 +220,6 @@ and tcw_subst (s : f_subst) (tcw : tcwitness) : tcwitness =
201220 |> Option. map (fun (_ , tcws ) -> List. nth tcws offset)
202221 |> Option. value ~default: tcw
203222
204- | TCIAbstract { support = `Univar uni ; offset } ->
205- Muid. find_opt uni s.fs_u
206- |> Option. map (fun (_ , tcws ) -> List. nth tcws offset)
207- |> Option. value ~default: tcw
208-
209223 | TCIAbstract { support = `Abs _ } ->
210224 tcw
211225
@@ -768,13 +782,13 @@ end
768782
769783(* -------------------------------------------------------------------- *)
770784module Tuni = struct
771- let subst (uidmap : etyarg Muid.t ) : f_subst =
785+ let subst (uidmap : unisubst ) : f_subst =
772786 f_subst_init ~tu: uidmap ()
773787
774- let subst1 ((id , t ) : uid * etyarg ) : f_subst =
775- subst ( Muid. singleton id t)
788+ let subst1 ((id , t ) : uid * ty ) : f_subst =
789+ subst { unisubst0 with uvars = Muid. singleton id t }
776790
777- let subst_dom (uidmap : etyarg Muid.t ) (dom : dom ) : dom =
791+ let subst_dom (uidmap : unisubst ) (dom : dom ) : dom =
778792 List. map (ty_subst (subst uidmap)) dom
779793
780794 let occurs (u : uid ) : ty -> bool =
0 commit comments