sig
  type ('a, 'b) man = {
    apron : 'Apron.Manager.t;
    mutable bdd_restrict : Cudd.Bdd.vt -> Cudd.Bdd.vt -> Cudd.Bdd.vt;
    mutable expr_restrict :
      'Bddapron.Expr0.t -> Cudd.Bdd.vt -> 'Bddapron.Expr0.t;
    mutable meet_disjoint : bool;
    mutable join_disjoint : bool;
    mutable meet_cond_unique : bool;
    mutable meet_cond_disjoint : bool;
    mutable meet_cond_depth : int;
    mutable assign_unique : bool;
    mutable assign_disjoint : bool;
    mutable substitute_unique : bool;
    mutable substitute_disjoint : bool;
    mutable forget_unique : bool;
    mutable forget_disjoint : bool;
    mutable change_environment_unique : bool;
    mutable change_environment_disjoint : bool;
  }
  type 'b elt = (Cudd.Man.v, 'Apron.Abstract0.t) Bddapron.Bddleaf.elt
  type 'b t = {
    mutable list : 'Bddapron.Bdddomain0.elt list;
    bottom : 'Bddapron.Bdddomain0.elt;
    mutable unique : bool;
    mutable disjoint : bool;
  }
  val make_man : 'Apron.Manager.t -> ('a, 'b) Bddapron.Bdddomain0.man
  val canonicalize :
    ?apron:bool ->
    ?unique:bool ->
    ?disjoint:bool ->
    ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> unit
  val size :
    ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> int
  val print :
    ?print_apron:((int -> string) ->
                  Format.formatter -> 'Apron.Abstract0.t -> unit) ->
    'Bddapron.Env.t -> Format.formatter -> 'Bddapron.Bdddomain0.t -> unit
  val bottom :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t -> 'Bddapron.Bdddomain0.t
  val top :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t -> 'Bddapron.Bdddomain0.t
  val of_apron :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t -> 'Apron.Abstract0.t -> 'Bddapron.Bdddomain0.t
  val of_bddapron :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t ->
    ('Bddapron.Expr0.Bool.t * 'Apron.Abstract0.t) list ->
    'Bddapron.Bdddomain0.t
  val is_bottom :
    ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> bool
  val is_top :
    ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> bool
  val is_leq :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t -> bool
  val is_eq :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t -> bool
  val to_bddapron :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    ('Bddapron.Expr0.Bool.t * 'Apron.Abstract0.t) list
  val meet :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
  val join :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
  val meet_condition :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t ->
    'Bddapron.Cond.t ->
    'Bddapron.Bdddomain0.t ->
    'Bddapron.Expr0.Bool.t -> 'Bddapron.Bdddomain0.t
  val assign_lexpr :
    ?relational:bool ->
    ?nodependency:bool ->
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t ->
    'Bddapron.Cond.t ->
    'Bddapron.Bdddomain0.t ->
    'a list ->
    'Bddapron.Expr0.t list ->
    'Bddapron.Bdddomain0.t option -> 'Bddapron.Bdddomain0.t
  val substitute_lexpr :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t ->
    'Bddapron.Cond.t ->
    'Bddapron.Bdddomain0.t ->
    'a list ->
    'Bddapron.Expr0.t list ->
    'Bddapron.Bdddomain0.t option -> 'Bddapron.Bdddomain0.t
  val forget_list :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Env.t ->
    'Bddapron.Bdddomain0.t -> 'a list -> 'Bddapron.Bdddomain0.t
  val widening :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
  val widening_threshold :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    'Bddapron.Bdddomain0.t ->
    Apron.Lincons0.t array -> 'Bddapron.Bdddomain0.t
  val apply_change :
    bottom:'Bddapron.Bdddomain0.t ->
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    Bddapron.Env.change -> 'Bddapron.Bdddomain0.t
  val apply_permutation :
    ('a, 'b) Bddapron.Bdddomain0.man ->
    'Bddapron.Bdddomain0.t ->
    int array option * Apron.Dim.perm option -> 'Bddapron.Bdddomain0.t
  module O :
    sig
      module L :
        sig
          val is_bottom :
            'Apron.Manager.t -> 'Bddapron.Bdddomain0.elt -> bool
          val meet_cube :
            'Apron.Manager.t ->
            ('b, [> 'Bddapron.Env.typ ] as 'c,
             [> 'Bddapron.Env.typdef ] as 'd, 'e)
            Bddapron.Env.O.t ->
            ('b, ('b, 'c, 'd, 'e) Bddapron.Env.O.t) Bddapron.Cond.O.t ->
            'Bddapron.Bdddomain0.elt ->
            Cudd.Bdd.vt -> 'Bddapron.Bdddomain0.elt
          val forget :
            'Apron.Manager.t ->
            'Bddapron.Bdddomain0.elt ->
            Cudd.Bdd.vt -> Apron.Dim.t array -> 'Bddapron.Bdddomain0.elt
        end
      val check_wellformed :
        ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> bool
      val canonicalize :
        ?apron:bool ->
        ?unique:bool ->
        ?disjoint:bool ->
        ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> unit
      val size :
        ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> int
      val print :
        ?print_apron:((int -> string) ->
                      Format.formatter -> 'Apron.Abstract0.t -> unit) ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t ->
        Format.formatter -> 'Bddapron.Bdddomain0.t -> unit
      val bottom :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t -> 'Bddapron.Bdddomain0.t
      val top :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t -> 'Bddapron.Bdddomain0.t
      val of_apron :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t -> 'Apron.Abstract0.t -> 'Bddapron.Bdddomain0.t
      val of_bddapron :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t ->
        ('Bddapron.Expr0.Bool.t * 'Apron.Abstract0.t) list ->
        'Bddapron.Bdddomain0.t
      val is_bottom :
        ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> bool
      val is_top :
        ('a, 'b) Bddapron.Bdddomain0.man -> 'Bddapron.Bdddomain0.t -> bool
      val is_leq :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t -> bool
      val is_eq :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t -> bool
      val to_bddapron :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        ('Bddapron.Expr0.Bool.t * 'Apron.Abstract0.t) list
      val meet :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
      val join :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
      val meet_condition :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ] as 'c,
         [> 'Bddapron.Env.typdef ] as 'd, 'e)
        Bddapron.Env.O.t ->
        ('a, ('a, 'c, 'd, 'e) Bddapron.Env.O.t) Bddapron.Cond.O.t ->
        'Bddapron.Bdddomain0.t ->
        'Bddapron.Expr0.Bool.t -> 'Bddapron.Bdddomain0.t
      val assign_lexpr :
        ?relational:bool ->
        ?nodependency:bool ->
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ] as 'c,
         [> 'Bddapron.Env.typdef ] as 'd, 'e)
        Bddapron.Env.O.t ->
        ('a, ('a, 'c, 'd, 'e) Bddapron.Env.O.t) Bddapron.Cond.O.t ->
        'Bddapron.Bdddomain0.t ->
        'a list ->
        'Bddapron.Expr0.t list ->
        'Bddapron.Bdddomain0.t option -> 'Bddapron.Bdddomain0.t
      val substitute_lexpr :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ] as 'c,
         [> 'Bddapron.Env.typdef ] as 'd, 'e)
        Bddapron.Env.O.t ->
        ('a, ('a, 'c, 'd, 'e) Bddapron.Env.O.t) Bddapron.Cond.O.t ->
        'Bddapron.Bdddomain0.t ->
        'a list ->
        'Bddapron.Expr0.t list ->
        'Bddapron.Bdddomain0.t option -> 'Bddapron.Bdddomain0.t
      val forget_list :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        ('a, [> 'Bddapron.Env.typ ], [> 'Bddapron.Env.typdef ], 'e)
        Bddapron.Env.O.t ->
        'Bddapron.Bdddomain0.t -> 'a list -> 'Bddapron.Bdddomain0.t
      val widening :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        'Bddapron.Bdddomain0.t -> 'Bddapron.Bdddomain0.t
      val widening_threshold :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        'Bddapron.Bdddomain0.t ->
        Apron.Lincons0.t array -> 'Bddapron.Bdddomain0.t
      val apply_change :
        bottom:'Bddapron.Bdddomain0.t ->
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        Bddapron.Env.change -> 'Bddapron.Bdddomain0.t
      val apply_permutation :
        ('a, 'b) Bddapron.Bdddomain0.man ->
        'Bddapron.Bdddomain0.t ->
        int array option * Apron.Dim.perm option -> 'Bddapron.Bdddomain0.t
    end
end