sig
  type boolean
  type integer
  type real
  type abstract
  type m_name
  type m_format
  type m_pointer
  type m_array
  type m_record
  type m_urecord
  type m_set
  type m_zone
  type tau =
      Integer
    | Real
    | Boolean
    | Pointer
    | Set of Formula.tau
    | Record of Cil_types.compinfo
    | Array of Ctypes.arrayinfo
    | ADT of string * Formula.tau list
  type kind =
      Model of Formula.tau
    | Acsl of Formula.tau * Cil_types.logic_type
  type integer_op = Iadd | Isub | Imul | Idiv | Imod
  type real_op = Radd | Rsub | Rmul | Rdiv
  type cmp_op = Ceq | Cneq | Clt | Cleq
  type section = S_name | S_typedef | S_userdef | S_goals
  type 'a item =
      Type of int
    | Name of int
    | Cons of int
    | Function of Formula.tau list * Formula.tau
    | Predicate of Formula.tau list
    | Axiom of 'a
  type 'a declaration = {
    d_section : Formula.section;
    d_name : string;
    d_title : Format.formatter -> unit;
    d_descr : Format.formatter -> unit;
    d_source : Log.source option;
    d_item : 'Formula.item;
  }
  module type Vernacular =
    sig
      type 'a term
      type pred
      val e_int : int -> Formula.integer Formula.Vernacular.term
      val e_call :
        string ->
        Formula.abstract Formula.Vernacular.term list ->
        Formula.abstract Formula.Vernacular.term
      val p_call :
        string ->
        Formula.abstract Formula.Vernacular.term list ->
        Formula.Vernacular.pred
      val wrap :
        'Formula.Vernacular.term ->
        Formula.abstract Formula.Vernacular.term
      val unwrap :
        Formula.abstract Formula.Vernacular.term ->
        'Formula.Vernacular.term
    end
  module type S =
    sig
      type 'a term
      type pred
      val e_int : int -> integer term
      val e_call : string -> abstract term list -> abstract term
      val p_call : string -> abstract term list -> pred
      val wrap : 'a term -> abstract term
      val unwrap : abstract term -> 'a term
      val e_true : Formula.boolean term
      val e_false : Formula.boolean term
      val e_int : int -> Formula.integer term
      val e_float : float -> Formula.real term
      val e_icst : string -> Formula.integer term
      val e_rcst : string -> Formula.real term
      val e_int64 : int64 -> Formula.integer term
      val e_ineg : Formula.integer term -> Formula.integer term
      val e_rneg : Formula.real term -> Formula.real term
      val e_iop :
        Formula.integer_op ->
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val e_rop :
        Formula.real_op ->
        Formula.real term -> Formula.real term -> Formula.real term
      val e_icmp :
        Formula.cmp_op ->
        Formula.integer term -> Formula.integer term -> Formula.boolean term
      val e_rcmp :
        Formula.cmp_op ->
        Formula.real term -> Formula.real term -> Formula.boolean term
      val p_icmp :
        Formula.cmp_op ->
        Formula.integer term -> Formula.integer term -> pred
      val p_rcmp :
        Formula.cmp_op -> Formula.real term -> Formula.real term -> pred
      val e_bnot : Formula.integer term -> Formula.integer term
      val e_band :
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val e_bor :
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val e_bxor :
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val e_lshift :
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val e_rshift :
        Formula.integer term -> Formula.integer term -> Formula.integer term
      val integer_of_real : Formula.real term -> Formula.integer term
      val real_of_integer : Formula.integer term -> Formula.real term
      val e_bool : Formula.boolean term -> Formula.integer term
      val e_not : Formula.boolean term -> Formula.boolean term
      val e_and :
        Formula.boolean term -> Formula.boolean term -> Formula.boolean term
      val e_or :
        Formula.boolean term -> Formula.boolean term -> Formula.boolean term
      val e_cond : Formula.boolean term -> 'a term -> 'a term -> 'a term
      val p_cond : Formula.boolean term -> pred -> pred -> pred
      val p_true : pred
      val p_false : pred
      val p_bool : Formula.boolean term -> pred
      val p_and : pred -> pred -> pred
      val p_or : pred -> pred -> pred
      val p_xor : pred -> pred -> pred
      val p_not : pred -> pred
      val p_implies : pred -> pred -> pred
      val p_iff : pred -> pred -> pred
      val p_eq : 'a term -> 'a term -> pred
      val p_neq : 'a term -> 'a term -> pred
      val p_conj : pred list -> pred
      val p_disj : pred list -> pred
      val p_named : string -> pred -> pred
      val is_true : pred -> bool
      val is_false : pred -> bool
      val huge_term : int -> 'a term -> bool
      val huge_pred : int -> pred -> bool
      type var
      type pool
      val pool : unit -> Formula.S.pool
      val fresh : Formula.S.pool -> string -> Formula.kind -> Formula.S.var
      val freshen : Formula.S.pool -> Formula.S.var -> Formula.S.var
      val var : Formula.S.var -> 'a term
      val eq_var : Formula.S.var -> Formula.S.var -> bool
      val name_of_var : Formula.S.var -> string
      val tau_of_var : Formula.S.var -> Formula.tau
      val kind_of_var : Formula.S.var -> Formula.kind
      val term_has_var : Formula.S.var list -> 'a term -> bool
      val pred_has_var : Formula.S.var list -> pred -> bool
      val term_closed : 'a term -> bool
      val pred_closed : pred -> bool
      val p_forall : Formula.S.var list -> pred -> pred
      val p_exists : Formula.S.var list -> pred -> pred
      val p_subst :
        (Formula.S.var -> Formula.S.var option) ->
        Formula.S.var -> 'a term -> pred -> pred
      val e_subst :
        (Formula.S.var -> Formula.S.var option) ->
        Formula.S.var -> 'a term -> 'b term -> 'b term
      val e_rename :
        (Formula.S.var * Formula.S.var) list -> 'a term -> 'a term
      val equal_terms : 'a term -> 'a term -> bool
      type alpha
      val empty_alpha : Formula.S.alpha
      val fold_alpha :
        (Formula.S.var -> Formula.S.var -> '-> 'a) ->
        Formula.S.alpha -> '-> 'a
      val p_more_alpha_cv : Formula.S.alpha -> pred -> Formula.S.alpha * pred
      val p_alpha_cv : pred -> Formula.S.var list * pred
      val pp_var : Format.formatter -> Formula.S.var -> unit
      val pp_term : Format.formatter -> 'a term -> unit
      val pp_pred : Format.formatter -> pred -> unit
      val pp_decl : Format.formatter -> pred Formula.declaration -> unit
      val pp_goal : Format.formatter -> string -> pred -> unit
    end
end