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