let rec epp_pred_vbox env fmt p =
  match p with
    | Fol.Pand _ -> pp_block fmt "and" env.pp_pred (collect_and [] p)
    | Fol.Por _ -> pp_block fmt "or" env.pp_pred (collect_or [] p)
    | Fol.Pimplies _ ->
        pp_block_implies fmt "->" env.pp_pred (collect_imply [] p)
    | Fol.Piff _ -> pp_block fmt "<->" env.pp_pred (collect_iff [] p)
    | Fol.Pforall(x,p) ->
        Format.fprintf fmt "forall %a:%a.@\n" pp_var x env.pp_type (Fol.Var.var_type x) ;
        epp_pred_vbox env fmt p
    | Fol.Pexists(x,p) ->
        Format.fprintf fmt "exists %a:%a.@\n" pp_var x env.pp_type (Fol.Var.var_type x) ;
        epp_pred_vbox env fmt p
    | Fol.Plet(x,t,p) ->
        Format.fprintf fmt "@[<hov 2>let %a =@ %a@ in@]@\n" pp_var x env.pp_term t ;
        epp_pred_vbox env fmt p
    | Fol.Pif(t,p,q) ->
        Format.fprintf fmt "@[<hov 0>if @[<hov 2>%a@]@ then@]@\n  %a@\nelse@\n  %a"
          env.pp_term t env.pp_pred p env.pp_pred q
    | (Fol.Ptrue | Fol.Pfalse | Fol.Papp _ | Fol.Pnot _ | Fol.Pnamed _) ->
        env.pp_pred fmt p