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)
  | Tif(c,a,b) -> e_if (e_unfold env c) (e_unfold env a) (e_unfold env b)
  | Tconst _ as t -> t
  | Tdata _ -> assert false