let fpp_item predicate pp_tau pp_term fmt x =
function
| Formula.Name k ->
fprintf fmt "function %s (): name = mk_name(%d)@\n" x k
| Formula.Cons k ->
fprintf fmt "function %s (): int = %d@\n" x k
| Formula.Function ([], t) ->
fprintf fmt "logic %s: %a@\n" x pp_tau t
| Formula.Function (tl, t) ->
fprintf fmt "logic %s: @[<hov 0>%a -> %a@]@\n" x
(pp_list pp_tau) tl pp_tau t
| Formula.Predicate [] ->
fprintf fmt "logic %s: prop@\n" x
| Formula.Predicate tl ->
fprintf fmt "logic %s: @[<hov 0>%a -> prop@]@\n" x
(pp_list pp_tau) tl
| Formula.Axiom p ->
begin
match Fol_norm.ergo_normalize p with
| Pred p' -> fprintf fmt "@[<hv 2>axiom %s:@ %a@]@\n" x predicate p'
| Conv (defs,p') ->
fpp_lf_let pp_tau pp_term fmt defs ;
fprintf fmt "@[<hv 2>axiom %s:@ %a@]@\n" x predicate p'
end
| Formula.Type 0 ->
fprintf fmt "type %s@\n" x
| Formula.Type 1 ->
fprintf fmt "type 'a %s@\n" x
| Formula.Type n ->
fprintf fmt "@[<hov 2>type ('a" ;
for k=2 to n do
fprintf fmt ",%c" (char_of_int (int_of_char 'a'+k-1))
done ;
fprintf fmt ") %s@]@\n" x