sig
  module Hlib :
    sig
      val addr : D1.name -> D1.pointer
      val shift_pointer :
        D1.pointer -> Formula.integer D1.F.term -> D1.pointer
      val shift_field : D1.pointer -> D1.name -> D1.pointer
      val shift_ufield : D1.pointer -> D1.name -> D1.pointer
      val shift_index : D1.pointer -> Formula.integer D1.F.term -> D1.pointer
      val havoc_index : D1.array -> Formula.integer D1.F.term -> D1.array
      val havoc_field : D1.record -> D1.name -> D1.record
      val havoc_ufield : D1.urecord -> D1.name -> D1.urecord
      val base : D1.pointer -> D1.pointer
      val block_length : D1.pointer -> Formula.integer D1.F.term
      val valid_pointer : D1.pointer -> D1.F.pred
      val valid_range : D1.pointer -> D1.set -> D1.F.pred
      val separated : D1.pointer -> D1.pointer -> D1.F.pred
      val array_length : D1.pointer -> Formula.integer D1.F.term
    end
  val get_array_length : Cil_types.typ -> Formula.integer D1.F.term option
  val mk_v_array_length :
    D1.pointer -> Formula.integer D1.F.term -> D1.F.pred
  module Globals :
    sig
      type t = Cil_types.varinfo
      val define : t -> unit
      val get_definition : t -> D1.F.pred Formula.declaration
      val on_definition :
        (t -> D1.F.pred Formula.declaration -> unit) -> unit
    end
end