let rec fold_exp_in_pred do_exp acc p =
  let fold = fold_exp_in_pred do_exp in
  match p with
  | Ptrue | Pfalse | Pvar _ -> acc
  | Pif (t,p1,p2) -> 
      let acc = do_exp acc t in
      let acc = fold acc p1 in
      let acc = fold acc p2 in
        acc
  | Pnot p -> fold acc p
  | Pforall (_v,p') | Pexists (_v,p') -> 
        fold_exp_in_pred do_exp acc p'
  | Plet (_x,e,p) ->
      let acc = do_exp acc e in
      fold_exp_in_pred do_exp acc p         
  | Pnamed (_n,p) -> fold acc p
  | Pimplies (p1,p2) | Pand (p1,p2) | Por (p1,p2) | Pxor(p1,p2) | Piff (p1,p2)
    -> fold (fold acc p1) p2
  | Papp (_n,t) -> List.fold_left do_exp acc t