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