let fpp_item predicate pp_tau 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 ->
        fprintf fmt "@[<hv 2>axiom %s:@ %a@]@\n" x predicate p
    | 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