sig
  type vkind = Vmodel of Formula.tau | Vacsl of Cil_types.logic_type
  type kind =
      Kcint of Ctypes.c_int
    | Kint
    | Kreal
    | Kbool
    | Kptr of Cil_types.typ
    | Kset of Mdata.kind
    | Kstruct of Cil_types.compinfo
    | Karray of Ctypes.arrayinfo
    | Kadt of string * Mdata.kind list
  module type Addr =
    sig
      module F : Formula.S
      type addr
      val equal : Mdata.Addr.addr -> Mdata.Addr.addr -> F.pred
      val closed : Mdata.Addr.addr -> bool
      val fresh : F.pool -> F.var * Mdata.Addr.addr
      val pp_addr : Format.formatter -> Mdata.Addr.addr -> unit
    end
  module type S =
    sig
      module F : Formula.S
      type format = Formula.m_format F.term
      type abstract = Formula.abstract F.term
      type integer = Formula.integer F.term
      type real = Formula.real F.term
      type boolean = Formula.boolean F.term
      type record = Formula.m_array F.term
      type urecord = Formula.m_array F.term
      type array = Formula.m_array F.term
      type set = Formula.m_set F.term
      type name = Formula.integer F.term
      type pointer = Formula.m_pointer F.term
      val pp_kind : Format.formatter -> Mdata.kind -> unit
      type interval = {
        inf : Mdata.S.integer option;
        sup : Mdata.S.integer option;
      }
      type 'a assigned =
          Aloc of Ctypes.c_object * 'a
        | Arange of Ctypes.c_object * 'a * Mdata.S.interval
      val pp_interval : Format.formatter -> Mdata.S.interval -> unit
      val e_app0 : string -> 'F.term
      val e_app1 : string -> 'F.term -> 'F.term
      val e_app2 : string -> 'F.term -> 'F.term -> 'F.term
      val e_app3 : string -> 'F.term -> 'F.term -> 'F.term -> 'F.term
      val e_app4 :
        string ->
        'F.term -> 'F.term -> 'F.term -> 'F.term -> 'F.term
      val e_app5 :
        string ->
        'F.term ->
        'F.term -> 'F.term -> 'F.term -> 'F.term -> 'F.term
      val p_app0 : string -> F.pred
      val p_app1 : string -> 'F.term -> F.pred
      val p_app2 : string -> 'F.term -> 'F.term -> F.pred
      val p_app3 : string -> 'F.term -> 'F.term -> 'F.term -> F.pred
      val p_app4 :
        string -> 'F.term -> 'F.term -> 'F.term -> 'F.term -> F.pred
      val p_app5 :
        string ->
        'F.term ->
        'F.term -> 'F.term -> 'F.term -> 'F.term -> F.pred
      val tau_of_logic_type : Cil_types.logic_type -> Formula.tau
      type context
      type bindings
      class type hint =
        object
          method capture : F.var list -> unit
          method has_var : F.var list -> bool
          method pretty : Format.formatter -> unit
          method subst : F.var -> Formula.abstract F.term -> unit
        end
      val closed : Mdata.S.bindings
      val close : Mdata.S.bindings -> F.pred -> F.pred
      val capture : Mdata.S.hint list -> Mdata.S.bindings -> unit
      val push :
        string ->
        F.pool -> Mdata.S.bindings -> Mdata.S.hint list -> Mdata.S.context
      val pop : string -> Mdata.S.context -> Mdata.S.bindings
      val kill : string -> Mdata.S.context -> unit
      val flush : string -> Mdata.S.context -> F.pred -> F.pred
      val term_such_that : Formula.tau -> ('F.term -> F.pred) -> 'F.term
      val forall : F.var list -> F.pred -> F.pred
      val exists : F.var list -> F.pred -> F.pred
      val subst : F.var -> 'F.term -> F.pred -> F.pred
      val fresh : string -> Mdata.vkind -> F.var
      val alpha : F.var -> F.var option
      val pool : unit -> F.pool
      val vkind_of_var : F.var -> Mdata.vkind
      val has_vars : F.var list -> F.pred -> bool
      type substitution
      val apply : Mdata.S.substitution -> 'F.term -> 'F.term
      type havoc =
          Fresh of F.var
        | Update of F.var * (Mdata.S.substitution -> Formula.abstract F.term)
      val havoc_static : Mdata.S.havoc list -> F.pred -> F.pred
      val havoc_inductive : Mdata.S.havoc list -> F.pred -> F.pred
      val clear : unit -> unit
      val on_clear : (unit -> unit) -> unit
      val fresh_name : string -> string -> string
      val add_declaration : F.pred Formula.declaration -> unit
      val iter :
        Formula.section -> (F.pred Formula.declaration -> unit) -> unit
      val iter_all : (F.pred Formula.declaration -> unit) -> unit
      val dummy : unit -> F.pred
      module type Identifiable =
        sig
          type t
          module H : Hashtbl.S
          val index : Mdata.S.Identifiable.t -> H.key
          val prefix : string
          val basename : Mdata.S.Identifiable.t -> string
          val location : Mdata.S.Identifiable.t -> Log.source option
          val pp_title : Format.formatter -> Mdata.S.Identifiable.t -> unit
          val pp_descr : Format.formatter -> Mdata.S.Identifiable.t -> unit
        end
      module type Registry =
        sig
          type t
          val define : Mdata.S.Registry.t -> unit
          val get_definition :
            Mdata.S.Registry.t -> F.pred Formula.declaration
          val on_definition :
            (Mdata.S.Registry.t -> F.pred Formula.declaration -> unit) ->
            unit
        end
      module type Declarator =
        sig
          type t
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
          val clear : unit -> unit
          val section : Formula.section
          val declare : t -> string -> F.pred Formula.item
        end
      module Register :
        functor (D : Declarator->
          sig
            type t = D.t
            val define : t -> unit
            val get_definition : t -> F.pred Formula.declaration
            val on_definition :
              (t -> F.pred Formula.declaration -> unit) -> unit
          end
      module Varinfo :
        sig
          type t = Cil_types.varinfo
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module Varaddr :
        sig
          type t = Cil_types.varinfo
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module Fieldinfo :
        sig
          type t = Cil_types.fieldinfo
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module Compinfo :
        sig
          type t = Cil_types.compinfo
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module Arrayinfo :
        sig
          type t = Ctypes.arrayinfo
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module Logicvar :
        sig
          type t = Cil_types.logic_var
          module H : Hashtbl.S
          val index : t -> H.key
          val prefix : string
          val basename : t -> string
          val location : t -> Log.source option
          val pp_title : Format.formatter -> t -> unit
          val pp_descr : Format.formatter -> t -> unit
        end
      module type Indexed =
        sig
          type t
          val define : t -> unit
          val get_definition : t -> F.pred Formula.declaration
          val on_definition :
            (t -> F.pred Formula.declaration -> unit) -> unit
          val get_ind : t -> Mdata.S.integer
        end
      module Dindex :
        functor (I : Identifiable->
          sig
            type t = I.t
            val define : t -> unit
            val get_definition : t -> F.pred Formula.declaration
            val on_definition :
              (t -> F.pred Formula.declaration -> unit) -> unit
            val get_ind : t -> integer
          end
      module Findex :
        sig
          type t = Cil_types.fieldinfo
          val define : t -> unit
          val get_definition : t -> F.pred Formula.declaration
          val on_definition :
            (t -> F.pred Formula.declaration -> unit) -> unit
          val get_ind : t -> integer
        end
      module Xindex :
        sig
          type t = Cil_types.varinfo
          val define : t -> unit
          val get_definition : t -> F.pred Formula.declaration
          val on_definition :
            (t -> F.pred Formula.declaration -> unit) -> unit
          val get_ind : t -> integer
        end
      module Aindex :
        sig
          type t = Cil_types.varinfo
          val define : t -> unit
          val get_definition : t -> F.pred Formula.declaration
          val on_definition :
            (t -> F.pred Formula.declaration -> unit) -> unit
          val get_ind : t -> integer
        end
      module Tindex :
        sig
          type t = Cil_types.compinfo
          val define : t -> unit
          val get_definition : t -> F.pred Formula.declaration
          val on_definition :
            (t -> F.pred Formula.declaration -> unit) -> unit
          val get_ind : t -> integer
        end
      val modulo : Ctypes.c_int -> Mdata.S.integer -> Mdata.S.integer
      val guard : Ctypes.c_int -> Mdata.S.integer -> F.pred
      val i_convert :
        Ctypes.c_int -> Ctypes.c_int -> Mdata.S.integer -> Mdata.S.integer
      val round : Ctypes.c_float -> Mdata.S.real -> Mdata.S.real
      val f_guard : Ctypes.c_float -> Mdata.S.real -> F.pred
      val f_convert :
        Ctypes.c_float -> Ctypes.c_float -> Mdata.S.real -> Mdata.S.real
      val has_type : Mdata.S.abstract -> Cil_types.logic_type -> F.pred
      val get_range_index :
        Mdata.S.array -> Mdata.S.interval -> Mdata.S.abstract
      val set_range_index :
        Mdata.S.array -> Mdata.S.interval -> Mdata.S.array
      val empty : Mdata.S.set
      val singleton : Mdata.S.abstract -> Mdata.S.set
      val union : Mdata.S.set -> Mdata.S.set -> Mdata.S.set
      val unions : Mdata.S.set list -> Mdata.S.set
      val inter : Mdata.S.set -> Mdata.S.set -> Mdata.S.set
      val remove : Mdata.S.set -> Mdata.S.set -> Mdata.S.set
      val set_of_list : Mdata.S.abstract list -> Mdata.S.set
      val add_set : Mdata.S.set -> Mdata.S.set -> Mdata.S.set
      val mult_set : Mdata.S.set -> Mdata.S.set -> Mdata.S.set
      val neg_set : Mdata.S.set -> Mdata.S.set
      val interval : Mdata.S.interval -> Mdata.S.set
      val equal_pointer_bool :
        Mdata.S.pointer -> Mdata.S.pointer -> Mdata.S.boolean
      val lt_pointer_bool :
        Mdata.S.pointer -> Mdata.S.pointer -> Mdata.S.boolean
      val le_pointer_bool :
        Mdata.S.pointer -> Mdata.S.pointer -> Mdata.S.boolean
      val lt_pointer : Mdata.S.pointer -> Mdata.S.pointer -> F.pred
      val le_pointer : Mdata.S.pointer -> Mdata.S.pointer -> F.pred
      val minus_pointer :
        Mdata.S.pointer -> Mdata.S.pointer -> Mdata.S.integer
      val is_null : Mdata.S.pointer -> Mdata.S.boolean
      val null : Mdata.S.pointer
      val tau_of_object : Ctypes.c_object -> Formula.tau
      val tau_of_ctype : Cil_types.typ -> Formula.tau
      val int_format : Mdata.S.format
      val real_format : Mdata.S.format
      val pointer_format : Mdata.S.format
      val record_format : Mdata.S.format
      val urecord_format : Mdata.S.format
      val array_format : Mdata.S.format -> Mdata.S.format
      val format_of_object : Ctypes.c_object -> Mdata.S.format
      val decode : Mdata.S.format -> Mdata.S.abstract -> 'F.term
      val encode : Mdata.S.format -> 'F.term -> Mdata.S.abstract
      val acc_field :
        Mdata.S.record -> Cil_types.fieldinfo -> Mdata.S.abstract
      val upd_field :
        Mdata.S.record ->
        Cil_types.fieldinfo -> Mdata.S.abstract -> Mdata.S.record
      val acc_index : Mdata.S.array -> Mdata.S.integer -> Mdata.S.abstract
      val upd_index :
        Mdata.S.array -> Mdata.S.integer -> Mdata.S.abstract -> Mdata.S.array
      val equal :
        Ctypes.c_object -> Mdata.S.abstract -> Mdata.S.abstract -> F.pred
      val eq_array :
        Ctypes.arrayinfo -> Mdata.S.array -> Mdata.S.array -> F.pred
      val eq_record :
        Cil_types.compinfo -> Mdata.S.record -> Mdata.S.record -> F.pred
    end
end