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