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