let rec e_unfold env = function
| Tvar x as t -> (try Env.find x env with Not_found -> t)
| Tlet(x,a,b) ->
let a0 = e_unfold env a in
if is_zone a0
then e_unfold (Env.add x a0 env) b
else e_let x a0 (e_unfold (Env.remove x env) b)
| Tapp(f,xs) -> e_app f (List.map (e_unfold env) xs)
| Taccess(t,i) -> e_access (e_unfold env t) (e_unfold env i)
| Tupdate(t,i,v) -> e_update (e_unfold env t) ( e_unfold env i) (e_unfold env v)
| Tgetfield(f,r) -> e_getfield f (e_unfold env r)
| Tsetfield(f,r,v) -> e_setfield f (e_unfold env r) (e_unfold env v)
| Tif(c,a,b) -> e_if (e_unfold env c) (e_unfold env a) (e_unfold env b)
| Tconst _ as t -> t