let fpp_item predicate pp_tau pp_term fmt x =
  function
    | Formula.Name k ->
        fprintf fmt "Definition %s:name:= mk_name(%d).@\n" x k
    | Formula.Cons k ->
        fprintf fmt "Definition %s:Z:= %d.@\n" x k
    | Formula.Function ([], t) ->
        fprintf fmt "Parameter %s: %a.@\n" x pp_tau t
    | Formula.Function (tl, t) ->
        fprintf fmt "Parameter %s: @[<hov 0>%a -> %a@].@\n" x (pp_typelist pp_tau) tl pp_tau t
    | Formula.Predicate [] ->
        fprintf fmt "Parameter %s: Prop.@\n" x
    | Formula.Predicate tl ->
        fprintf fmt "Parameter %s: @[<hov 0>%a -> Prop.@]@\n" x (pp_typelist pp_tau) tl
    | Formula.Axiom p ->
        begin
          match Fol_norm.coq_normalize p with 
            | Pred p' -> fprintf fmt "@[<hv 2>Axiom %s:@ %a.@\n@]@\n" x predicate p'
            | Conv (defs,p') ->
                fpp_lf_let pp_tau pp_term fmt defs  ;
                fprintf fmt "@[<hv 2>Axiom %s:@ %a.@\n@]@\n" x predicate p'
        end
    | Formula.Type 0 ->
        fprintf fmt "Definition %s:=Set.@\n" x
      | Formula.Type n ->
        fprintf fmt "[<hov 2>Definition %s:=Set" x;
        for k=1 to n do fprintf fmt " -> Set" done ;
        fprintf fmt ".@]@\n"