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 fmt "  " "->" env.pp_pred (collect_imply [] p)
    | Fol.Piff _ -> pp_block fmt "   " "<->" env.pp_pred (collect_iff [] p)
    | Fol.Pforall(x,p) ->
        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) ->
        fprintf fmt "exists %a:%a.@\n" pp_var x env.pp_type (Fol.Var.var_type x) ;
        epp_pred_vbox env fmt p
    |Fol.Pif(t,p,q) ->
        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
    | Fol.Plet(x,t,p) ->
        fprintf fmt "let %a = @[%a@] in@\n" pp_var x env.pp_term t ;
        epp_pred_vbox env fmt p