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