method pp_pred fmt = function
| Ptrue -> self#pp_pred_true fmt
| Pfalse -> self#pp_pred_false fmt
| Prel(r,es) -> self#pp_pred_relation fmt r es
| Pcall(f,es) -> self#pp_pred_call fmt f es
| Pand _ as p -> self#pp_pred_and fmt (collect_and p)
| Por _ as p -> self#pp_pred_or fmt (collect_or p)
| Pnot p -> self#pp_pred_not fmt p
| Piff(p,q) -> self#pp_pred_iff fmt p q
| Pcond(c,p,q) -> self#pp_pred_cond fmt c p q
| Plet(x,a,p) -> self#pp_pred_let fmt x a p
| Pnamed(label,p) ->
let labels,p = collect_labels [label] p in
self#pp_pred_named fmt labels p
| Pimplies _ as p ->
let hs,p = collect_implies p in
self#pp_pred_implies fmt hs p
| Pforall(x,p) ->
let xs,p = collect_forall [x] p in
self#pp_pred_forall fmt xs p
| Pexists(x,p) ->
let xs,p = collect_exists [x] p in
self#pp_pred_exists fmt xs p