sig
  type pid = Cudd.Custom.pid
  type common =
    Cudd.Custom.common = {
    pid : Cudd.User.pid;
    arity : int;
    memo : Cudd.Memo.t;
  }
  val newpid : unit -> Cudd.Custom.pid
  val make_common : ?memo:Cudd.Memo.t -> int -> Cudd.User.common
  type ('a, 'b) op1 =
    ('a, 'b) Cudd.Custom.op1 = private {
    common1 : Cudd.User.common;
    closure1 : '-> 'b;
  }
  val make_op1 : ?memo:Cudd.Memo.t -> ('-> 'b) -> ('a, 'b) Cudd.User.op1
  val apply_op1 : ('a, 'b) Cudd.User.op1 -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type ('a, 'b, 'c) op2 =
    ('a, 'b, 'c) Cudd.Custom.op2 = private {
    common2 : Cudd.User.common;
    closure2 : '-> '-> 'c;
    ospecial2 :
      ('Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) option;
    commutative : bool;
    idempotent : bool;
  }
  val make_op2 :
    ?memo:Cudd.Memo.t ->
    ?commutative:bool ->
    ?idempotent:bool ->
    ?special:('Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) ->
    ('-> '-> 'c) -> ('a, 'b, 'c) Cudd.User.op2
  val apply_op2 :
    ('a, 'b, 'c) Cudd.User.op2 ->
    'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type ('a, 'b, 'c, 'd) op3 =
    ('a, 'b, 'c, 'd) Cudd.Custom.op3 = private {
    common3 : Cudd.User.common;
    closure3 : '-> '-> '-> 'd;
    ospecial3 :
      ('Cudd.Vdd.t ->
       'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option)
      option;
  }
  val make_op3 :
    ?memo:Cudd.Memo.t ->
    ?special:('Cudd.Vdd.t ->
              'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) ->
    ('-> '-> '-> 'd) -> ('a, 'b, 'c, 'd) Cudd.User.op3
  val apply_op3 :
    ('a, 'b, 'c, 'd) Cudd.User.op3 ->
    'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type ('a, 'b) opN =
    ('a, 'b) Cudd.Custom.opN = private {
    commonN : Cudd.User.common;
    arityNbdd : int;
    closureN :
      Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option;
  }
  val make_opN :
    ?memo:Cudd.Memo.t ->
    int ->
    int ->
    (Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option) ->
    ('a, 'b) Cudd.User.opN
  val apply_opN :
    ('a, 'b) Cudd.User.opN ->
    Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t
  type ('a, 'b) opG =
    ('a, 'b) Cudd.Custom.opG = private {
    commonG : Cudd.User.common;
    arityGbdd : int;
    closureG :
      Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option;
    oclosureBeforeRec :
      (int * bool ->
       Cudd.Bdd.vt array ->
       'Cudd.Vdd.t array -> Cudd.Bdd.vt array * 'Cudd.Vdd.t array)
      option;
    oclosureIte :
      (int -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t) option;
  }
  val make_opG :
    ?memo:Cudd.Memo.t ->
    ?beforeRec:(int * bool ->
                Cudd.Bdd.vt array ->
                'Cudd.Vdd.t array ->
                Cudd.Bdd.vt array * 'Cudd.Vdd.t array) ->
    ?ite:(int -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t) ->
    int ->
    int ->
    (Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option) ->
    ('a, 'b) Cudd.User.opG
  val apply_opG :
    ('a, 'b) Cudd.User.opG ->
    Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t
  type ('a, 'b) test2 =
    ('a, 'b) Cudd.Custom.test2 = private {
    common2t : Cudd.User.common;
    closure2t : '-> '-> bool;
    ospecial2t : ('Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool option) option;
    symetric : bool;
    reflexive : bool;
  }
  val make_test2 :
    ?memo:Cudd.Memo.t ->
    ?symetric:bool ->
    ?reflexive:bool ->
    ?special:('Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool option) ->
    ('-> '-> bool) -> ('a, 'b) Cudd.User.test2
  val apply_test2 :
    ('a, 'b) Cudd.User.test2 -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool
  type 'a exist =
    'Cudd.Custom.exist = private {
    commonexist : Cudd.User.common;
    combineexist : ('a, 'a, 'a) Cudd.User.op2;
  }
  val make_exist :
    ?memo:Cudd.Memo.t -> ('a, 'a, 'a) Cudd.User.op2 -> 'Cudd.User.exist
  val apply_exist :
    'Cudd.User.exist -> supp:Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type 'a existand =
    'Cudd.Custom.existand = private {
    commonexistand : Cudd.User.common;
    combineexistand : ('a, 'a, 'a) Cudd.User.op2;
    bottomexistand : 'a;
  }
  val make_existand :
    ?memo:Cudd.Memo.t ->
    bottom:'-> ('a, 'a, 'a) Cudd.User.op2 -> 'Cudd.User.existand
  val apply_existand :
    'Cudd.User.existand ->
    supp:Cudd.Bdd.vt -> Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type ('a, 'b) existop1 =
    ('a, 'b) Cudd.Custom.existop1 = private {
    commonexistop1 : Cudd.User.common;
    combineexistop1 : ('b, 'b, 'b) Cudd.User.op2;
    existop1 : ('a, 'b) Cudd.User.op1;
  }
  val make_existop1 :
    ?memo:Cudd.Memo.t ->
    op1:('a, 'b) Cudd.User.op1 ->
    ('b, 'b, 'b) Cudd.User.op2 -> ('a, 'b) Cudd.User.existop1
  val apply_existop1 :
    ('a, 'b) Cudd.User.existop1 ->
    supp:Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  type ('a, 'b) existandop1 =
    ('a, 'b) Cudd.Custom.existandop1 = private {
    commonexistandop1 : Cudd.User.common;
    combineexistandop1 : ('b, 'b, 'b) Cudd.User.op2;
    existandop1 : ('a, 'b) Cudd.User.op1;
    bottomexistandop1 : 'b;
  }
  val make_existandop1 :
    ?memo:Cudd.Memo.t ->
    op1:('a, 'b) Cudd.User.op1 ->
    bottom:'-> ('b, 'b, 'b) Cudd.User.op2 -> ('a, 'b) Cudd.User.existandop1
  val apply_existandop1 :
    ('a, 'b) Cudd.User.existandop1 ->
    supp:Cudd.Bdd.vt -> Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  val clear_common : Cudd.User.common -> unit
  val clear_op1 : ('a, 'b) Cudd.User.op1 -> unit
  val clear_op2 : ('a, 'b, 'c) Cudd.User.op2 -> unit
  val clear_op3 : ('a, 'b, 'c, 'd) Cudd.User.op3 -> unit
  val clear_opN : ('a, 'b) Cudd.User.opN -> unit
  val clear_opG : ('a, 'b) Cudd.User.opG -> unit
  val clear_test2 : ('a, 'b) Cudd.User.test2 -> unit
  val clear_exist : 'Cudd.User.exist -> unit
  val clear_existand : 'Cudd.User.existand -> unit
  val clear_existop1 : ('a, 'b) Cudd.User.existop1 -> unit
  val clear_existandop1 : ('a, 'b) Cudd.User.existandop1 -> unit
  val map_op1 :
    ?memo:Cudd.Memo.t -> ('-> 'b) -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  val map_op2 :
    ?memo:Cudd.Memo.t ->
    ?commutative:bool ->
    ?idempotent:bool ->
    ?special:('Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) ->
    ('-> '-> 'c) -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  val map_op3 :
    ?memo:Cudd.Memo.t ->
    ?special:('Cudd.Vdd.t ->
              'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) ->
    ('-> '-> '-> 'd) ->
    'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
  val map_opN :
    ?memo:Cudd.Memo.t ->
    (Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option) ->
    Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t
  val map_test2 :
    ?memo:Cudd.Memo.t ->
    ?symetric:bool ->
    ?reflexive:bool ->
    ?special:('Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool option) ->
    ('-> '-> bool) -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool
end