let rec free_term xs = function
| Tconst _ -> xs
| Tvar x -> Vset.add x xs
| Tapp(_,ts) -> List.fold_left free_term xs ts
| Tgetfield(_,t) -> free_term xs t
| Tsetfield(_,t,t') | Taccess(t,t') -> free_term (free_term xs t) t'
| Tupdate(t1,t2,t3) | Tif(t1,t2,t3) -> free_term (free_term (free_term xs t1) t2) t3
| Tlet(x,a,b) ->
if Vset.mem x xs then
free_term (free_term xs b) a
else
free_term (Vset.remove x (free_term xs b)) a