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)