sig
  exception Can_not_subdiv
  module F :
    sig
      type t
      val of_float : float -> Ival.F.t
      val to_float : Ival.F.t -> float
      exception Nan_or_infinite
    end
  module Float_abstract :
    sig
      type t
      type integer = Abstract_interp.Int.t
      exception Nan_or_infinite
      exception Bottom
      type rounding_mode = Any | Nearest_Even
      val inject : Ival.F.t -> Ival.F.t -> Ival.Float_abstract.t
      val inject_r : Ival.F.t -> Ival.F.t -> bool * Ival.Float_abstract.t
      val min_and_max_float : Ival.Float_abstract.t -> Ival.F.t * Ival.F.t
      val top : Ival.Float_abstract.t
      val add_float :
        Ival.Float_abstract.rounding_mode ->
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> bool * Ival.Float_abstract.t
      val sub_float :
        Ival.Float_abstract.rounding_mode ->
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> bool * Ival.Float_abstract.t
      val mult_float :
        Ival.Float_abstract.rounding_mode ->
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> bool * Ival.Float_abstract.t
      val div_float :
        Ival.Float_abstract.rounding_mode ->
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> bool * Ival.Float_abstract.t
      val contains_zero : Ival.Float_abstract.t -> bool
      val compare : Ival.Float_abstract.t -> Ival.Float_abstract.t -> int
      val pretty : Format.formatter -> Ival.Float_abstract.t -> unit
      val hash : Ival.Float_abstract.t -> int
      val zero : Ival.Float_abstract.t
      val is_included :
        Ival.Float_abstract.t -> Ival.Float_abstract.t -> bool
      val join :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val meet :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val contains_a_zero : Ival.Float_abstract.t -> bool
      val is_zero : Ival.Float_abstract.t -> bool
      val is_singleton : Ival.Float_abstract.t -> bool
      val neg_float : Ival.Float_abstract.t -> Ival.Float_abstract.t
      val sqrt_float :
        Ival.Float_abstract.rounding_mode ->
        Ival.Float_abstract.t -> bool * Ival.Float_abstract.t
      val minus_one_one : Ival.Float_abstract.t
      val cos_float : Ival.Float_abstract.t -> Ival.Float_abstract.t
      val widen :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val equal_float_ieee :
        Ival.Float_abstract.t -> Ival.Float_abstract.t -> bool * bool
      val maybe_le_ieee_float :
        Ival.Float_abstract.t -> Ival.Float_abstract.t -> bool
      val maybe_lt_ieee_float :
        Ival.Float_abstract.t -> Ival.Float_abstract.t -> bool
      val diff :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val filter_le :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val filter_ge :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val filter_lt :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
      val filter_gt :
        Ival.Float_abstract.t ->
        Ival.Float_abstract.t -> Ival.Float_abstract.t
    end
  module O :
    sig
      type elt = Abstract_interp.Int.t
      type t
      val empty : Ival.O.t
      val is_empty : Ival.O.t -> bool
      val mem : Ival.O.elt -> Ival.O.t -> bool
      val add : Ival.O.elt -> Ival.O.t -> Ival.O.t
      val singleton : Ival.O.elt -> Ival.O.t
      val remove : Ival.O.elt -> Ival.O.t -> Ival.O.t
      val union : Ival.O.t -> Ival.O.t -> Ival.O.t
      val inter : Ival.O.t -> Ival.O.t -> Ival.O.t
      val diff : Ival.O.t -> Ival.O.t -> Ival.O.t
      val compare : Ival.O.t -> Ival.O.t -> int
      val equal : Ival.O.t -> Ival.O.t -> bool
      val subset : Ival.O.t -> Ival.O.t -> bool
      val iter : (Ival.O.elt -> unit) -> Ival.O.t -> unit
      val fold : (Ival.O.elt -> '-> 'a) -> Ival.O.t -> '-> 'a
      val for_all : (Ival.O.elt -> bool) -> Ival.O.t -> bool
      val exists : (Ival.O.elt -> bool) -> Ival.O.t -> bool
      val filter : (Ival.O.elt -> bool) -> Ival.O.t -> Ival.O.t
      val partition : (Ival.O.elt -> bool) -> Ival.O.t -> Ival.O.t * Ival.O.t
      val cardinal : Ival.O.t -> int
      val elements : Ival.O.t -> Ival.O.elt list
      val min_elt : Ival.O.t -> Ival.O.elt
      val max_elt : Ival.O.t -> Ival.O.elt
      val choose : Ival.O.t -> Ival.O.elt
      val split : Ival.O.elt -> Ival.O.t -> Ival.O.t * bool * Ival.O.t
    end
  type tt =
      Set of Ival.O.t
    | Float of Ival.Float_abstract.t
    | Top of Abstract_interp.Int.t option * Abstract_interp.Int.t option *
        Abstract_interp.Int.t * Abstract_interp.Int.t
  module Widen_Hints :
    sig
      module V :
        sig
          type t = Abstract_interp.Int.t
          val pretty : Format.formatter -> Ival.Widen_Hints.V.t -> unit
          val compare : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> int
          val hash : Ival.Widen_Hints.V.t -> int
          module Datatype :
            sig
              type t = t
              val descr : Unmarshal.t
              val copy : t -> t
              val name : string
              val register_comparable :
                ?compare:(t -> t -> int) ->
                ?equal:(t -> t -> bool) -> ?hash:(t -> int) -> unit -> unit
              val is_comparable_set : unit -> bool
              val hash : t -> int
              val equal : t -> t -> bool
              val compare : t -> t -> int
              val mem_project :
                ((Project.project -> bool) -> t -> bool) option ref
            end
          val gt : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val le : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val ge : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val lt : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val eq : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val add :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val sub :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val mul :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val native_div :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val rem :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val pos_div :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val c_div :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val c_rem :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val cast :
            size:Ival.Widen_Hints.V.t ->
            signed:bool -> value:Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val abs : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val zero : Ival.Widen_Hints.V.t
          val one : Ival.Widen_Hints.V.t
          val two : Ival.Widen_Hints.V.t
          val four : Ival.Widen_Hints.V.t
          val minus_one : Ival.Widen_Hints.V.t
          val is_zero : Ival.Widen_Hints.V.t -> bool
          val is_one : Ival.Widen_Hints.V.t -> bool
          val equal : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t -> bool
          val pgcd :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val ppcm :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val min :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val max :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val length :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val of_int : int -> Ival.Widen_Hints.V.t
          val of_float : float -> Ival.Widen_Hints.V.t
          val of_int64 : Int64.t -> Ival.Widen_Hints.V.t
          val to_int : Ival.Widen_Hints.V.t -> int
          val to_float : Ival.Widen_Hints.V.t -> float
          val neg : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val succ : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val pred : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val round_up_to_r :
            min:Ival.Widen_Hints.V.t ->
            r:Ival.Widen_Hints.V.t ->
            modu:Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val round_down_to_r :
            max:Ival.Widen_Hints.V.t ->
            r:Ival.Widen_Hints.V.t ->
            modu:Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val pos_rem :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val shift_left :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val shift_right :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val fold :
            (Ival.Widen_Hints.V.t -> '-> 'a) ->
            inf:Ival.Widen_Hints.V.t ->
            sup:Ival.Widen_Hints.V.t -> step:Ival.Widen_Hints.V.t -> '-> 'a
          val logand :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val logor :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val logxor :
            Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val lognot : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val power_two : int -> Ival.Widen_Hints.V.t
          val two_power : Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
          val extract_bits :
            with_alarms:CilE.warn_mode ->
            start:Ival.Widen_Hints.V.t ->
            stop:Ival.Widen_Hints.V.t ->
            Ival.Widen_Hints.V.t -> Ival.Widen_Hints.V.t
        end
      type elt = Ival.Widen_Hints.V.t
      type t
      val empty : Ival.Widen_Hints.t
      val is_empty : Ival.Widen_Hints.t -> bool
      val mem : Ival.Widen_Hints.elt -> Ival.Widen_Hints.t -> bool
      val add :
        Ival.Widen_Hints.elt -> Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val singleton : Ival.Widen_Hints.elt -> Ival.Widen_Hints.t
      val remove :
        Ival.Widen_Hints.elt -> Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val union :
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val inter :
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val diff :
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val compare : Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> int
      val equal : Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> bool
      val subset : Ival.Widen_Hints.t -> Ival.Widen_Hints.t -> bool
      val iter : (Ival.Widen_Hints.elt -> unit) -> Ival.Widen_Hints.t -> unit
      val fold :
        (Ival.Widen_Hints.elt -> '-> 'a) -> Ival.Widen_Hints.t -> '-> 'a
      val for_all :
        (Ival.Widen_Hints.elt -> bool) -> Ival.Widen_Hints.t -> bool
      val exists :
        (Ival.Widen_Hints.elt -> bool) -> Ival.Widen_Hints.t -> bool
      val filter :
        (Ival.Widen_Hints.elt -> bool) ->
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t
      val partition :
        (Ival.Widen_Hints.elt -> bool) ->
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t * Ival.Widen_Hints.t
      val cardinal : Ival.Widen_Hints.t -> int
      val elements : Ival.Widen_Hints.t -> Ival.Widen_Hints.elt list
      val min_elt : Ival.Widen_Hints.t -> Ival.Widen_Hints.elt
      val max_elt : Ival.Widen_Hints.t -> Ival.Widen_Hints.elt
      val choose : Ival.Widen_Hints.t -> Ival.Widen_Hints.elt
      val split :
        Ival.Widen_Hints.elt ->
        Ival.Widen_Hints.t -> Ival.Widen_Hints.t * bool * Ival.Widen_Hints.t
      val nearest_elt_le :
        Ival.Widen_Hints.elt -> Ival.Widen_Hints.t -> Ival.Widen_Hints.elt
      val nearest_elt_ge :
        Ival.Widen_Hints.elt -> Ival.Widen_Hints.t -> Ival.Widen_Hints.elt
      val default_widen_hints : Ival.Widen_Hints.t
    end
  exception Error_Top
  exception Error_Bottom
  type t = Ival.tt
  type widen_hint = Ival.Widen_Hints.t
  val join : Ival.t -> Ival.t -> Ival.t
  val link : Ival.t -> Ival.t -> Ival.t
  val meet : Ival.t -> Ival.t -> Ival.t
  val narrow : Ival.t -> Ival.t -> Ival.t
  val bottom : Ival.t
  val top : Ival.t
  val is_included : Ival.t -> Ival.t -> bool
  val is_included_exn : Ival.t -> Ival.t -> unit
  val intersects : Ival.t -> Ival.t -> bool
  val pretty : Format.formatter -> Ival.t -> unit
  val widen : Ival.widen_hint -> Ival.t -> Ival.t -> Ival.t
  module Datatype :
    sig
      type t = t
      val descr : Unmarshal.t
      val copy : t -> t
      val name : string
      val register_comparable :
        ?compare:(t -> t -> int) ->
        ?equal:(t -> t -> bool) -> ?hash:(t -> int) -> unit -> unit
      val is_comparable_set : unit -> bool
      val hash : t -> int
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val mem_project : ((Project.project -> bool) -> t -> bool) option ref
    end
  val hash : Ival.t -> int
  val equal : Ival.t -> Ival.t -> bool
  val fold_enum :
    split_non_enumerable:int -> (Ival.t -> '-> 'a) -> Ival.t -> '-> 'a
  val diff : Ival.t -> Ival.t -> Ival.t
  val diff_if_one : Ival.t -> Ival.t -> Ival.t
  val add : Ival.t -> Ival.t -> Ival.t
  val neg : Ival.t -> Ival.t
  val sub : Ival.t -> Ival.t -> Ival.t
  val min_int : Ival.t -> Abstract_interp.Int.t option
  val max_int : Ival.t -> Abstract_interp.Int.t option
  val min_and_max :
    Ival.t -> Abstract_interp.Int.t option * Abstract_interp.Int.t option
  val bitwise_and : size:int -> Ival.t -> Ival.t -> Ival.t
  val bitwise_or : size:int -> Ival.t -> Ival.t -> Ival.t
  val inject_range :
    Abstract_interp.Int.t option -> Abstract_interp.Int.t option -> Ival.t
  val all_positives : Abstract_interp.Int.t option -> bool
  val all_negatives : Abstract_interp.Int.t option -> bool
  val cardinal_zero_or_one : Ival.t -> bool
  val is_singleton_int : Ival.t -> bool
  val inject_singleton : Abstract_interp.Int.t -> Ival.t
  val zero : Ival.t
  val one : Ival.t
  val compare_min_float : Ival.t -> Ival.t -> int
  val compare_max_float : Ival.t -> Ival.t -> int
  val compare_min_int : Ival.t -> Ival.t -> int
  val compare_max_int : Ival.t -> Ival.t -> int
  val is_zero : Ival.t -> bool
  val is_one : Ival.t -> bool
  val inject_float : Ival.Float_abstract.t -> Ival.t
  val top_float : Ival.t
  val project_float : Ival.t -> Ival.Float_abstract.t
  val in_interval :
    Abstract_interp.Int.t ->
    Abstract_interp.Int.t option ->
    Abstract_interp.Int.t option ->
    Abstract_interp.Int.t -> Abstract_interp.Int.t -> bool
  val contains_zero : Ival.t -> bool
  exception Not_Singleton_Int
  val project_int : Ival.t -> Abstract_interp.Int.t
  val cardinal_less_than : Ival.t -> int -> int
  val splitting_cardinal_less_than :
    split_non_enumerable:int -> Ival.t -> int -> int
  val inject_top :
    Abstract_interp.Int.t option ->
    Abstract_interp.Int.t option ->
    Abstract_interp.Int.t -> Abstract_interp.Int.t -> Ival.t
  val fold : (Abstract_interp.Int.t -> '-> 'a) -> Ival.t -> '-> 'a
  exception Apply_Set_Exn of exn
  val apply_set :
    string ->
    (Abstract_interp.Int.t -> Abstract_interp.Int.t -> Abstract_interp.Int.t) ->
    Ival.t -> Ival.t -> Ival.t
  val apply_set_unary :
    '->
    (Abstract_interp.Int.t -> Abstract_interp.Int.t) -> Ival.t -> Ival.t
  val singleton_zero : Ival.t
  val singleton_one : Ival.t
  val zero_or_one : Ival.t
  val contains_non_zero : Ival.t -> bool
  val subdiv_float_interval : Ival.t -> Ival.t * Ival.t
  val scale : Abstract_interp.Int.t -> Ival.t -> Ival.t
  val scale_div : pos:bool -> Abstract_interp.Int.t -> Ival.t -> Ival.t
  val negative : Ival.t
  val div : Ival.t -> Ival.t -> Ival.t
  val scale_rem : pos:bool -> Abstract_interp.Int.t -> Ival.t -> Ival.t
  val c_rem : Ival.t -> Ival.t -> Ival.t
  val mul : Ival.t -> Ival.t -> Ival.t
  val shift_left : size:Abstract_interp.Int.t -> Ival.t -> Ival.t -> Ival.t
  val shift_right : size:Abstract_interp.Int.t -> Ival.t -> Ival.t -> Ival.t
  val interp_boolean : contains_zero:bool -> contains_non_zero:bool -> Ival.t
  val filter_set :
    (int -> bool) -> Abstract_interp.Int.t -> Ival.O.t -> Ival.t
  val extract_bits :
    with_alarms:CilE.warn_mode ->
    start:Abstract_interp.Int.t ->
    stop:Abstract_interp.Int.t -> Ival.t -> Ival.t
  val create_all_values :
    modu:Abstract_interp.Int.t -> signed:bool -> size:int -> Ival.t
  val all_values : size:Abstract_interp.Int.t -> Ival.t -> bool
  val filter_le_int : Abstract_interp.Int.t option -> Ival.t -> Ival.t
  val filter_ge_int : Abstract_interp.Int.t option -> Ival.t -> Ival.t
  val filter_lt_int : Abstract_interp.Int.t option -> Ival.t -> Ival.t
  val filter_gt_int : Abstract_interp.Int.t option -> Ival.t -> Ival.t
  val filter_le : Ival.t -> Ival.t -> Ival.t
  val filter_ge : Ival.t -> Ival.t -> Ival.t
  val filter_lt : Ival.t -> Ival.t -> Ival.t
  val filter_gt : Ival.t -> Ival.t -> Ival.t
  val filter_le_float : Ival.t -> Ival.t -> Ival.t
  val filter_ge_float : Ival.t -> Ival.t -> Ival.t
  val filter_lt_float : Ival.t -> Ival.t -> Ival.t
  val filter_gt_float : Ival.t -> Ival.t -> Ival.t
  val compare_C :
    (Abstract_interp.Int.t option ->
     Abstract_interp.Int.t option ->
     Abstract_interp.Int.t option -> Abstract_interp.Int.t option -> 'a) ->
    Ival.t -> Ival.t -> 'a
  val max_max :
    Abstract_interp.Int.t option ->
    Abstract_interp.Int.t option -> Abstract_interp.Int.t option
  val scale_int64base : Int_Base.tt -> Ival.t -> Ival.t
  val cast_float_to_int : Ival.Float_abstract.t -> Ival.t
  val of_int : int -> Ival.t
  val of_int64 : int64 -> Ival.t
  val cast_int_to_float :
    Ival.Float_abstract.rounding_mode -> Ival.t -> bool * Ival.t
  val cast :
    size:Abstract_interp.Int.t -> signed:bool -> value:Ival.t -> Ival.t
  val tag : Ival.t -> int
  val pretty_debug : Format.formatter -> Ival.t -> unit
  val name : string
end