let rec e_closed xs = function
  | Tconst _ -> true
  | Tvar y -> List.exists (Var.equal y) xs
  | Tgetfield(_,r) -> e_closed xs r
  | Tsetfield(_,r,v) -> e_closed xs r && e_closed xs v
  | Taccess(t,i) -> e_closed xs t && e_closed xs i
  | Tupdate(t,i,v) -> e_closed xs t && e_closed xs i && e_closed xs v
  | Tapp(_,ts) -> List.for_all (e_closed xs) ts
  | Tif(a,b,c) -> e_closed xs a && e_closed xs b && e_closed xs c
  | Tlet(x,v,t) -> e_closed xs v && e_closed (x::xs) t