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>(not@ %a)@]" (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"), [t1; t2]) ->
fprintf fmt "@[<hov 1>(%a@ =@ %a)@]" env.pp_term t1 env.pp_term t2
| Papp (("neq" | "neq_int"), [t1; t2]) ->
fprintf fmt "@[<hov 1>(%a@ <>@ %a)@]" env.pp_term t1 env.pp_term t2
| Papp ("lt_int", [t1; t2]) ->
fprintf fmt "@[<hov 1>(%a@ <@ %a)@]" env.pp_term t1 env.pp_term t2
| Papp ("le_int", [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 ")@]"
| Pnamed(tag,p) ->
fprintf fmt "@[<hov 0>@[<hov 0>%s:%a@]" tag (epp_pred_named env) p
and epp_pred_named env fmt = function
| Pnamed(tag,p) ->
fprintf fmt "@,%s:" tag ;
epp_pred_named env fmt p
| p ->
fprintf fmt "@]@,%a" (epp_pred_atom env) p