let fpp_pred predicate tau_of_ctype_logic fmt p =
match p with
| Fol.Ptrue -> fprintf fmt "true"
| Fol.Pfalse -> fprintf fmt "false"
| Fol.Papp (id, [])-> fprintf fmt "%s" id
| Fol.Papp ("eq", [t1; t2]) -> fprintf fmt "(%a =@ %a)" fpp_term t1 fpp_term t2
| Fol.Papp ("neq", [t1; t2]) -> fprintf fmt "(%a <>@ %a)" fpp_term t1 fpp_term t2
| Fol.Papp (id, l) -> fprintf fmt "@[%s(%a)@]" id (pp_list fpp_term) l
| Fol.Pimplies (a, b) -> fprintf fmt "(@[%a ->@ %a@])" predicate a predicate b
| Fol.Piff (a, b) -> fprintf fmt "(@[%a <->@ %a@])" predicate a predicate b
| Fol.Pand (a, b) -> fprintf fmt "(@[%a and@ %a@])" predicate a predicate b
| Fol.Por (a, b) -> fprintf fmt "(@[%a or@ %a@])" predicate a predicate b
| Fol.Pnot a -> fprintf fmt "(not %a)" predicate a
| Fol.Pif (a, b, c) ->
fprintf fmt "(@[if %a then@ %a else@ %a@])"
fpp_term a predicate b predicate c
| Fol.Pforall (v,p) ->
fprintf fmt "@[<hov 0>(forall %a:%a.@ %a@])"
pp_var v (export_tau tau_of_ctype_logic) (Fol.Var.var_type v) predicate p
| Fol.Pexists (v,p) ->
fprintf fmt "@[<hov 0>(exists %a:%a.@ %a@])"
pp_var v(export_tau tau_of_ctype_logic) (Fol.Var.var_type v) predicate p
| Fol.Plet (x,v,p) ->
fprintf fmt "@[<hov 0>(let %a=%a in@ %a@])"
pp_var x fpp_term v predicate p
| Fol.Pnamed (n, p) ->
fprintf fmt "@[%s: %a@]" (tag_named n) predicate p