let rec free_pred xs = function
| Papp(_,ts) -> List.fold_left free_term xs ts
| Ptrue | Pfalse -> xs
| Pimplies(p,q) | Pand(p,q) | Por(p,q) | Piff(p,q) -> free_pred (free_pred xs p) q
| Pnot p | Pnamed(_,p) -> free_pred xs p
| Pif(a,p,q) -> free_pred (free_pred (free_term xs a) p) q
| Plet(x,t,p) ->
if Vset.mem x xs then
free_term (free_pred xs p) t
else
free_term (Vset.remove x (free_pred xs p)) t
| Pexists(x,p) | Pforall(x,p) ->
if Vset.mem x xs then
free_pred xs p
else
Vset.remove x (free_pred xs p)