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 = '-> 'constraint 'b = [> Apronexpr.typ ]
  module Lin :
    sig
      type 'a term = Mpqf.t * 'a
      type 'a t = { cst : Mpqf.t; lterm : 'Apronexpr.Lin.term list; }
      val normalize :
        'Apronexpr.symbol -> 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val compare_lterm :
        'Apronexpr.symbol ->
        'Apronexpr.Lin.term list -> 'Apronexpr.Lin.term list -> int
      val compare :
        'Apronexpr.symbol ->
        'Apronexpr.Lin.t -> 'Apronexpr.Lin.t -> int
      val var : '-> 'Apronexpr.Lin.t
      val zero : 'Apronexpr.Lin.t
      val one : 'Apronexpr.Lin.t
      val cst : Mpqf.t -> 'Apronexpr.Lin.t
      val add :
        'Apronexpr.symbol ->
        'Apronexpr.Lin.t -> 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val sub :
        'Apronexpr.symbol ->
        'Apronexpr.Lin.t -> 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val scale : Mpqf.t -> 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val negate : 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val support : 'Apronexpr.symbol -> 'Apronexpr.Lin.t -> 'PSette.t
      val substitute_by_var :
        'Apronexpr.symbol ->
        'Apronexpr.Lin.t -> ('a, 'a) PMappe.t -> 'Apronexpr.Lin.t
      val normalize_as_constraint : 'Apronexpr.Lin.t -> 'Apronexpr.Lin.t
      val print :
        'Apronexpr.symbol -> Format.formatter -> 'Apronexpr.Lin.t -> unit
      val to_linexpr1 :
        'Apronexpr.symbol ->
        Apron.Environment.t -> 'Apronexpr.Lin.t -> Apron.Linexpr1.t
    end
  module Poly :
    sig
      type 'a varexp = 'a * int
      type 'a monomial = 'Apronexpr.Poly.varexp list
      type 'a term = Mpqf.t * 'Apronexpr.Poly.monomial
      type 'a t = 'Apronexpr.Poly.term list
      val compare_varexp :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.varexp -> 'Apronexpr.Poly.varexp -> int
      val compare_monomial :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.monomial -> 'Apronexpr.Poly.monomial -> int
      val normalize_monomial :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.monomial -> 'Apronexpr.Poly.monomial
      val normalize :
        'Apronexpr.symbol -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val normalize_full :
        'Apronexpr.symbol -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val compare :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t -> int
      val cst : Mpqf.t -> 'Apronexpr.Poly.t
      val var : '-> 'Apronexpr.Poly.t
      val add :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val sub :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val scale :
        'Apronexpr.symbol ->
        Mpqf.t * 'Apronexpr.Poly.monomial ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val mul :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val div :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val negate : 'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val support : 'Apronexpr.symbol -> 'Apronexpr.Poly.t -> 'PSette.t
      val substitute_by_var :
        'Apronexpr.symbol ->
        'Apronexpr.Poly.t -> ('a, 'a) PMappe.t -> 'Apronexpr.Poly.t
      val normalize_as_constraint :
        'Apronexpr.Poly.t -> 'Apronexpr.Poly.t
      val print :
        'Apronexpr.symbol ->
        Format.formatter -> '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
      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 Apronexpr.Tree.unop * 'Apronexpr.Tree.t *
            Apronexpr.Tree.typ * Apronexpr.Tree.round
        | Binop of Apronexpr.Tree.binop * 'Apronexpr.Tree.t *
            'Apronexpr.Tree.t * Apronexpr.Tree.typ * Apronexpr.Tree.round
      val support : 'Apronexpr.symbol -> 'Apronexpr.Tree.t -> 'PSette.t
      val substitute_by_var :
        'Apronexpr.Tree.t -> ('a, 'a) PMappe.t -> 'Apronexpr.Tree.t
      val print :
        'Apronexpr.symbol ->
        Format.formatter -> 'Apronexpr.Tree.t -> unit
      val compare :
        'Apronexpr.symbol ->
        'Apronexpr.Tree.t -> 'Apronexpr.Tree.t -> int
    end
  val lin_of_poly :
    'Apronexpr.symbol -> 'Apronexpr.Poly.t -> 'Apronexpr.Lin.t
  val lin_of_tree :
    'Apronexpr.symbol -> 'Apronexpr.Tree.t -> 'Apronexpr.Lin.t
  val poly_of_tree :
    'Apronexpr.symbol -> 'Apronexpr.Tree.t -> 'Apronexpr.Poly.t
  val tree_of_lin : 'Apronexpr.Lin.t -> 'Apronexpr.Tree.t
  val tree_of_poly : 'Apronexpr.Poly.t -> 'Apronexpr.Tree.t
  type 'a t =
      Lin of 'Apronexpr.Lin.t
    | Poly of 'Apronexpr.Poly.t
    | Tree of 'Apronexpr.Tree.t
  type 'a expr = 'Apronexpr.t
  val var :
    'Apronexpr.symbol ->
    ('a, [> Apronexpr.typ ]) Apronexpr.typ_of_var -> '-> 'Apronexpr.t
  val zero : 'Apronexpr.t
  val one : 'Apronexpr.t
  val cst : Apron.Coeff.t -> 'Apronexpr.t
  val add :
    'Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Apronexpr.t -> 'Apronexpr.t -> 'Apronexpr.t
  val sub :
    'Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Apronexpr.t -> 'Apronexpr.t -> 'Apronexpr.t
  val mul :
    'Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Apronexpr.t -> 'Apronexpr.t -> 'Apronexpr.t
  val div :
    'Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Apronexpr.t -> 'Apronexpr.t -> 'Apronexpr.t
  val gmod :
    'Apronexpr.symbol ->
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round ->
    'Apronexpr.t -> 'Apronexpr.t -> 'Apronexpr.t
  val negate : 'Apronexpr.t -> 'Apronexpr.t
  val cast :
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round -> 'Apronexpr.t -> 'Apronexpr.t
  val sqrt :
    ?typ:Apron.Texpr1.typ ->
    ?round:Apron.Texpr1.round -> 'Apronexpr.t -> 'Apronexpr.t
  val support : 'Apronexpr.symbol -> 'Apronexpr.t -> 'PSette.t
  val substitute_by_var :
    'Apronexpr.symbol ->
    'Apronexpr.t -> ('a, 'a) PMappe.t -> 'Apronexpr.t
  val normalize : 'Apronexpr.symbol -> 'Apronexpr.t -> 'Apronexpr.t
  val equal : 'Apronexpr.symbol -> 'Apronexpr.t -> 'Apronexpr.t -> bool
  val hash : 'Apronexpr.symbol -> 'Apronexpr.t -> int
  val compare :
    'Apronexpr.symbol -> 'Apronexpr.t -> 'Apronexpr.t -> int
  val normalize_as_constraint : 'Apronexpr.t -> 'Apronexpr.t
  val is_dependent_on_integer_only :
    ('a, [> Apronexpr.typ ]) Apronexpr.typ_of_var -> 'Apronexpr.t -> bool
  val typ_of_expr :
    ('a, [> Apronexpr.typ ]) Apronexpr.typ_of_var ->
    'Apronexpr.t -> [ `Int | `Real ]
  val print :
    'Apronexpr.symbol -> Format.formatter -> 'Apronexpr.t -> unit
  val print_typ : Format.formatter -> [> Apronexpr.typ ] -> unit
  val to_texpr0 :
    'Apronexpr.symbol ->
    Apron.Environment.t -> 'Apronexpr.t -> Apron.Texpr0.t
  val to_texpr1 :
    'Apronexpr.symbol ->
    Apron.Environment.t -> 'Apronexpr.t -> Apron.Texpr1.t
  val to_apron :
    'Apronexpr.symbol ->
    Apron.Environment.t ->
    'Apronexpr.t ->
    [ `Linexpr1 of Apron.Linexpr1.t | `Texpr1 of Apron.Texpr1.t ]
  module Condition :
    sig
      type typ =
        Apron.Tcons1.typ =
          EQ
        | SUPEQ
        | SUP
        | DISEQ
        | EQMOD of Apron.Scalar.t
      type 'a t = Apronexpr.Condition.typ * 'Apronexpr.expr
      val make :
        ('a, [> Apronexpr.Condition.typ ]) Apronexpr.typ_of_var ->
        Apronexpr.Condition.typ ->
        'Apronexpr.expr ->
        [ `Bool of bool | `Cond of 'Apronexpr.Condition.t ]
      val negate :
        ('a, [> Apronexpr.Condition.typ ]) Apronexpr.typ_of_var ->
        'Apronexpr.Condition.t -> 'Apronexpr.Condition.t
      val support :
        'Apronexpr.symbol -> 'Apronexpr.Condition.t -> 'PSette.t
      val print :
        'Apronexpr.symbol ->
        Format.formatter -> 'Apronexpr.Condition.t -> unit
      val compare :
        'Apronexpr.symbol ->
        'Apronexpr.Condition.t -> 'Apronexpr.Condition.t -> int
      val to_tcons0 :
        'Apronexpr.symbol ->
        Apron.Environment.t -> 'Apronexpr.Condition.t -> Apron.Tcons0.t
      val to_tcons1 :
        'Apronexpr.symbol ->
        Apron.Environment.t -> 'Apronexpr.Condition.t -> Apron.Tcons1.t
      val to_apron :
        'Apronexpr.symbol ->
        Apron.Environment.t ->
        'Apronexpr.Condition.t ->
        [ `Lincons1 of Apron.Lincons1.t | `Tcons1 of Apron.Tcons1.t ]
    end
end