let rec epp_pred_atom env fmt p =
  match p with
    | Pand _ | Por _ | Pimplies _ | Piff _ | Pif _
    | Pforall _ | Pexists _ | Plet _ ->
        fprintf fmt "@[<v 1>(%a)@]" (epp_pred_vbox env) p
    | Pnot p ->
        fprintf fmt "@[<hov 2>(~@ %a)@]" (epp_pred_atom env) p
    | Pnamed(tag,p) ->
        fprintf fmt "@[<hov 0>(*%s:*)@,%a@]" tag (epp_pred_atom env) p
    | Ptrue -> pp_print_string fmt "True"
    | Pfalse -> pp_print_string fmt "False"
    | Papp(id,[]) -> pp_print_string fmt id
    | Papp (("eq" | "eq_int" | "eq_real"), [t1; t2]) ->
        fprintf fmt "@[<hov 1>(%a@ =@ %a)@]" env.pp_term t1 env.pp_term t2
    | Papp (("neq" | "neq_int" | "neq_real"), [t1; t2]) ->
        fprintf fmt "@[<hov 1>(%a@ <>@ %a)@]" env.pp_term t1 env.pp_term t2
    | Papp (("lt_int"| "lt_real"), [t1; t2]) ->
        fprintf fmt "@[<hov 1>(%a@ <@ %a)@]" env.pp_term t1 env.pp_term t2
    | Papp (("le_int"| "le_real"), [t1; t2]) ->
        fprintf fmt "@[<hov 1>(%a@ <=@ %a)@]" env.pp_term t1 env.pp_term t2
    | Papp(id,t::ts) ->
        fprintf fmt "@[<hov 2>(%s @,%a" id env.pp_term t ;
        List.iter (fun t -> fprintf fmt "@ %a" env.pp_term t) ts ;
        fprintf fmt ")@]"