sig
  type pid
  and mlvalue
  type common = { pid : Cudd.Custom.pid; arity : int; memo : Cudd.Memo.t; }
  type ('a, 'b) op1 = { common1 : Cudd.Custom.common; closure1 : '-> 'b; }
  type ('a, 'b, 'c) op2 = {
    common2 : Cudd.Custom.common;
    closure2 : '-> '-> 'c;
    ospecial2 :
      ('Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option) option;
    commutative : bool;
    idempotent : bool;
  }
  type ('a, 'b) test2 = {
    common2t : Cudd.Custom.common;
    closure2t : '-> '-> bool;
    ospecial2t : ('Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool option) option;
    symetric : bool;
    reflexive : bool;
  }
  type ('a, 'b, 'c, 'd) op3 = {
    common3 : Cudd.Custom.common;
    closure3 : '-> '-> '-> 'd;
    ospecial3 :
      ('Cudd.Vdd.t ->
       'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t option)
      option;
  }
  type ('a, 'b) opN = {
    commonN : Cudd.Custom.common;
    arityNbdd : int;
    closureN :
      Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t option;
  }
  type ('a, 'b) opG = {
    commonG : Cudd.Custom.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;
  }
  type 'a exist = {
    commonexist : Cudd.Custom.common;
    combineexist : ('a, 'a, 'a) Cudd.Custom.op2;
  }
  type 'a existand = {
    commonexistand : Cudd.Custom.common;
    combineexistand : ('a, 'a, 'a) Cudd.Custom.op2;
    bottomexistand : 'a;
  }
  type ('a, 'b) existop1 = {
    commonexistop1 : Cudd.Custom.common;
    combineexistop1 : ('b, 'b, 'b) Cudd.Custom.op2;
    existop1 : ('a, 'b) Cudd.Custom.op1;
  }
  type ('a, 'b) existandop1 = {
    commonexistandop1 : Cudd.Custom.common;
    combineexistandop1 : ('b, 'b, 'b) Cudd.Custom.op2;
    existandop1 : ('a, 'b) Cudd.Custom.op1;
    bottomexistandop1 : 'b;
  }
  external newpid : unit -> Cudd.Custom.pid = "camlidl_custom_newpid"
  external apply_op1 :
    ('a, 'b) Cudd.Custom.op1 -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom_apply_op1"
  external apply_op2 :
    ('a, 'b, 'c) Cudd.Custom.op2 ->
    'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom_apply_op2"
  external apply_test2 :
    ('a, 'b) Cudd.Custom.test2 -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> bool
    = "camlidl_custom_apply_test2"
  external apply_op3 :
    ('a, 'b, 'c, 'd) Cudd.Custom.op3 ->
    'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom_apply_op3"
  external apply_opN :
    ('a, 'b) Cudd.Custom.opN ->
    Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t
    = "camlidl_cudd_apply_opN"
  external apply_opG :
    ('a, 'b) Cudd.Custom.opG ->
    Cudd.Bdd.vt array -> 'Cudd.Vdd.t array -> 'Cudd.Vdd.t
    = "camlidl_cudd_apply_opG"
  external _apply_exist :
    'Cudd.Custom.exist -> Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom__apply_exist"
  external _apply_existand :
    'Cudd.Custom.existand ->
    Cudd.Bdd.vt -> Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom__apply_existand"
  external _apply_existop1 :
    ('a, 'b) Cudd.Custom.existop1 ->
    Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom__apply_existop1"
  external _apply_existandop1 :
    ('a, 'b) Cudd.Custom.existandop1 ->
    Cudd.Bdd.vt -> Cudd.Bdd.vt -> 'Cudd.Vdd.t -> 'Cudd.Vdd.t
    = "camlidl_custom__apply_existandop1"
end