sig
  type 'a symbol =
    'Bdd.Env.symbol = {
    compare : '-> '-> int;
    marshal : '-> string;
    unmarshal : string -> 'a;
    mutable print : Format.formatter -> '-> unit;
  }
  type typ = [ `Int | `Real ]
  type ('a, 'b) typ_of_var = '-> 'b
    constraint 'b = [> Bddapron.Apronexpr.typ ]
  module Lin :
    sig
      type 'a term = Mpqf.t * 'a
      type 'a t = {
        cst : Mpqf.t;
        lterm : 'Bddapron.Apronexpr.Lin.term list;
      }
      val normalize :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val compare_lterm :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.term list ->
        'Bddapron.Apronexpr.Lin.term list -> int
      val compare :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t -> int
      val var : '-> 'Bddapron.Apronexpr.Lin.t
      val zero : 'Bddapron.Apronexpr.Lin.t
      val one : 'Bddapron.Apronexpr.Lin.t
      val cst : Mpqf.t -> 'Bddapron.Apronexpr.Lin.t
      val add :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t ->
        'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val sub :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t ->
        'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val scale :
        Mpqf.t -> 'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val negate : 'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val support :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t -> 'PSette.t
      val substitute_by_var :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Lin.t ->
        ('a, 'a) PMappe.t -> 'Bddapron.Apronexpr.Lin.t
      val normalize_as_constraint :
        'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Lin.t
      val print :
        'Bddapron.Apronexpr.symbol ->
        Format.formatter -> 'Bddapron.Apronexpr.Lin.t -> unit
      val of_linexpr0 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        Apron.Linexpr0.t -> 'Bddapron.Apronexpr.Lin.t
      val of_linexpr1 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Linexpr1.t -> 'Bddapron.Apronexpr.Lin.t
      val to_linexpr0 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Lin.t -> Apron.Linexpr0.t
      val to_linexpr1 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Lin.t -> Apron.Linexpr1.t
    end
  module Poly :
    sig
      type 'a varexp = 'a * int
      type 'a monomial = 'Bddapron.Apronexpr.Poly.varexp list
      type 'a term = Mpqf.t * 'Bddapron.Apronexpr.Poly.monomial
      type 'a t = 'Bddapron.Apronexpr.Poly.term list
      val compare_varexp :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.varexp ->
        'Bddapron.Apronexpr.Poly.varexp -> int
      val compare_monomial :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.monomial ->
        'Bddapron.Apronexpr.Poly.monomial -> int
      val normalize_monomial :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.monomial ->
        'Bddapron.Apronexpr.Poly.monomial
      val normalize :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val normalize_full :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val compare :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t -> int
      val cst : Mpqf.t -> 'Bddapron.Apronexpr.Poly.t
      val var : '-> 'Bddapron.Apronexpr.Poly.t
      val add :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val sub :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val scale :
        'Bddapron.Apronexpr.symbol ->
        Mpqf.t * 'Bddapron.Apronexpr.Poly.monomial ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val mul :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val div :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t ->
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val negate :
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val support :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t -> 'PSette.t
      val substitute_by_var :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Poly.t ->
        ('a, 'a) PMappe.t -> 'Bddapron.Apronexpr.Poly.t
      val normalize_as_constraint :
        'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Poly.t
      val print :
        'Bddapron.Apronexpr.symbol ->
        Format.formatter -> 'Bddapron.Apronexpr.Poly.t -> unit
    end
  module Tree :
    sig
      type unop = Apron.Texpr1.unop = Neg | Cast | Sqrt
      type binop = Apron.Texpr1.binop = Add | Sub | Mul | Div | Mod | Pow
      type typ =
        Apron.Texpr1.typ =
          Real
        | Int
        | Single
        | Double
        | Extended
        | Quad
      type round = Apron.Texpr1.round = Near | Zero | Up | Down | Rnd
      type 'a t =
          Cst of Apron.Coeff.t
        | Var of 'a
        | Unop of Bddapron.Apronexpr.Tree.unop *
            'Bddapron.Apronexpr.Tree.t * Bddapron.Apronexpr.Tree.typ *
            Bddapron.Apronexpr.Tree.round
        | Binop of Bddapron.Apronexpr.Tree.binop *
            'Bddapron.Apronexpr.Tree.t * 'Bddapron.Apronexpr.Tree.t *
            Bddapron.Apronexpr.Tree.typ * Bddapron.Apronexpr.Tree.round
      val support :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Tree.t -> 'PSette.t
      val substitute_by_var :
        'Bddapron.Apronexpr.Tree.t ->
        ('a, 'a) PMappe.t -> 'Bddapron.Apronexpr.Tree.t
      val print :
        'Bddapron.Apronexpr.symbol ->
        Format.formatter -> 'Bddapron.Apronexpr.Tree.t -> unit
      val compare :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Tree.t -> 'Bddapron.Apronexpr.Tree.t -> int
      val of_expr :
        'Bddapron.Apronexpr.symbol ->
        Apron.Texpr1.expr -> 'Bddapron.Apronexpr.Tree.t
      val to_expr :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Tree.t -> Apron.Texpr1.expr
    end
  val lin_of_poly :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Lin.t
  val lin_of_tree :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.Tree.t -> 'Bddapron.Apronexpr.Lin.t
  val poly_of_tree :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.Tree.t -> 'Bddapron.Apronexpr.Poly.t
  val tree_of_lin :
    'Bddapron.Apronexpr.Lin.t -> 'Bddapron.Apronexpr.Tree.t
  val tree_of_poly :
    'Bddapron.Apronexpr.Poly.t -> 'Bddapron.Apronexpr.Tree.t
  type 'a t =
      Lin of 'Bddapron.Apronexpr.Lin.t
    | Poly of 'Bddapron.Apronexpr.Poly.t
    | Tree of 'Bddapron.Apronexpr.Tree.t
  type 'a expr = 'Bddapron.Apronexpr.t
  val var :
    'Bddapron.Apronexpr.symbol ->
    ('a, [> Bddapron.Apronexpr.typ ]) Bddapron.Apronexpr.typ_of_var ->
    '-> 'Bddapron.Apronexpr.t
  val zero : 'Bddapron.Apronexpr.t
  val one : 'Bddapron.Apronexpr.t
  val cst : Apron.Coeff.t -> 'Bddapron.Apronexpr.t
  val add :
    'Bddapron.Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val sub :
    'Bddapron.Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val mul :
    'Bddapron.Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val div :
    'Bddapron.Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val gmod :
    'Bddapron.Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val negate : 'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val cast :
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val sqrt :
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val support :
    'Bddapron.Apronexpr.symbol -> 'Bddapron.Apronexpr.t -> 'PSette.t
  val substitute_by_var :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.t -> ('a, 'a) PMappe.t -> 'Bddapron.Apronexpr.t
  val normalize :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val equal :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t -> bool
  val hash : 'Bddapron.Apronexpr.symbol -> 'Bddapron.Apronexpr.t -> int
  val compare :
    'Bddapron.Apronexpr.symbol ->
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t -> int
  val normalize_as_constraint :
    'Bddapron.Apronexpr.t -> 'Bddapron.Apronexpr.t
  val is_dependent_on_integer_only :
    ('a, [> Bddapron.Apronexpr.typ ]) Bddapron.Apronexpr.typ_of_var ->
    'Bddapron.Apronexpr.t -> bool
  val typ_of_expr :
    ('a, [> Bddapron.Apronexpr.typ ]) Bddapron.Apronexpr.typ_of_var ->
    'Bddapron.Apronexpr.t -> [ `Int | `Real ]
  val print :
    'Bddapron.Apronexpr.symbol ->
    Format.formatter -> 'Bddapron.Apronexpr.t -> unit
  val print_typ : Format.formatter -> [> Bddapron.Apronexpr.typ ] -> unit
  val of_linexpr0 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> Apron.Linexpr0.t -> 'Bddapron.Apronexpr.t
  val of_linexpr1 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Linexpr1.t -> 'Bddapron.Apronexpr.t
  val to_linexpr0 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> 'Bddapron.Apronexpr.t -> Apron.Linexpr0.t
  val to_linexpr1 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> 'Bddapron.Apronexpr.t -> Apron.Linexpr1.t
  val of_texpr0 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> Apron.Texpr0.t -> 'Bddapron.Apronexpr.t
  val of_texpr1 :
    'Bddapron.Apronexpr.symbol -> Apron.Texpr1.t -> 'Bddapron.Apronexpr.t
  val to_texpr0 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> 'Bddapron.Apronexpr.t -> Apron.Texpr0.t
  val to_texpr1 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t -> 'Bddapron.Apronexpr.t -> Apron.Texpr1.t
  val to_apron0 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t ->
    'Bddapron.Apronexpr.t ->
    [ `Lin of Apron.Linexpr0.t | `Tree of Apron.Texpr0.t ]
  val to_apron1 :
    'Bddapron.Apronexpr.symbol ->
    Apron.Environment.t ->
    'Bddapron.Apronexpr.t ->
    [ `Lin of Apron.Linexpr1.t | `Tree of Apron.Texpr1.t ]
  module Condition :
    sig
      type typ =
        Apron.Tcons1.typ =
          EQ
        | SUPEQ
        | SUP
        | DISEQ
        | EQMOD of Apron.Scalar.t
      type 'a t =
          Bddapron.Apronexpr.Condition.typ * 'Bddapron.Apronexpr.expr
      val make :
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        Bddapron.Apronexpr.Condition.typ ->
        'Bddapron.Apronexpr.expr ->
        [ `Bool of bool | `Cond of 'Bddapron.Apronexpr.Condition.t ]
      val negate :
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        'Bddapron.Apronexpr.Condition.t ->
        'Bddapron.Apronexpr.Condition.t
      val support :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Condition.t -> 'PSette.t
      val print :
        'Bddapron.Apronexpr.symbol ->
        Format.formatter -> 'Bddapron.Apronexpr.Condition.t -> unit
      val compare :
        'Bddapron.Apronexpr.symbol ->
        'Bddapron.Apronexpr.Condition.t ->
        'Bddapron.Apronexpr.Condition.t -> int
      val of_lincons0 :
        'Bddapron.Apronexpr.symbol ->
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        Apron.Environment.t ->
        Apron.Lincons0.t ->
        [ `Bool of bool | `Cond of 'Bddapron.Apronexpr.Condition.t ]
      val of_lincons1 :
        'Bddapron.Apronexpr.symbol ->
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        Apron.Lincons1.t ->
        [ `Bool of bool | `Cond of 'Bddapron.Apronexpr.Condition.t ]
      val of_tcons0 :
        'Bddapron.Apronexpr.symbol ->
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        Apron.Environment.t ->
        Apron.Tcons0.t ->
        [ `Bool of bool | `Cond of 'Bddapron.Apronexpr.Condition.t ]
      val of_tcons1 :
        'Bddapron.Apronexpr.symbol ->
        ('a, [> Bddapron.Apronexpr.Condition.typ ])
        Bddapron.Apronexpr.typ_of_var ->
        Apron.Tcons1.t ->
        [ `Bool of bool | `Cond of 'Bddapron.Apronexpr.Condition.t ]
      val to_tcons0 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Condition.t -> Apron.Tcons0.t
      val to_tcons1 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Condition.t -> Apron.Tcons1.t
      val to_apron0 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Condition.t ->
        [ `Lin of Apron.Lincons0.t | `Tree of Apron.Tcons0.t ]
      val to_apron1 :
        'Bddapron.Apronexpr.symbol ->
        Apron.Environment.t ->
        'Bddapron.Apronexpr.Condition.t ->
        [ `Lin of Apron.Lincons1.t | `Tree of Apron.Tcons1.t ]
    end
end