let rec e_closed f xs = function
  | Tconst _ -> true
  | Tvar y -> List.exists (Var.equal y) xs
  | Tdata d -> f xs d
  | Tapp(_,ts) -> List.for_all (e_closed f xs) ts
  | Tif(a,b,c) -> e_closed f xs a && e_closed f xs b && e_closed f xs c
  | Tlet(x,v,t) -> e_closed f xs v && e_closed f (x::xs) t