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