sig
  val ( ==> ) : bool -> bool -> bool
  val assume : bool -> unit
  val assume_fail : unit -> 'a
  module Gen :
    sig
      type 'a t = Random.State.t -> 'a
      type 'a sized = int -> Random.State.t -> 'a
      val return : '-> 'QCheck.Gen.t
      val ( >>= ) :
        'QCheck.Gen.t -> ('-> 'QCheck.Gen.t) -> 'QCheck.Gen.t
      val ( <*> ) :
        ('-> 'b) QCheck.Gen.t -> 'QCheck.Gen.t -> 'QCheck.Gen.t
      val map : ('-> 'b) -> 'QCheck.Gen.t -> 'QCheck.Gen.t
      val map2 :
        ('-> '-> 'c) ->
        'QCheck.Gen.t -> 'QCheck.Gen.t -> 'QCheck.Gen.t
      val map3 :
        ('-> '-> '-> 'd) ->
        'QCheck.Gen.t ->
        'QCheck.Gen.t -> 'QCheck.Gen.t -> 'QCheck.Gen.t
      val map_keep_input :
        ('-> 'b) -> 'QCheck.Gen.t -> ('a * 'b) QCheck.Gen.t
      val ( >|= ) : 'QCheck.Gen.t -> ('-> 'b) -> 'QCheck.Gen.t
      val oneof : 'QCheck.Gen.t list -> 'QCheck.Gen.t
      val oneofl : 'a list -> 'QCheck.Gen.t
      val oneofa : 'a array -> 'QCheck.Gen.t
      val frequency : (int * 'QCheck.Gen.t) list -> 'QCheck.Gen.t
      val frequencyl : (int * 'a) list -> 'QCheck.Gen.t
      val frequencya : (int * 'a) array -> 'QCheck.Gen.t
      val shuffle_a : 'a array -> unit QCheck.Gen.t
      val shuffle_l : 'a list -> 'a list QCheck.Gen.t
      val unit : unit QCheck.Gen.t
      val bool : bool QCheck.Gen.t
      val float : float QCheck.Gen.t
      val pfloat : float QCheck.Gen.t
      val nfloat : float QCheck.Gen.t
      val nat : int QCheck.Gen.t
      val neg_int : int QCheck.Gen.t
      val pint : int QCheck.Gen.t
      val int : int QCheck.Gen.t
      val small_nat : int QCheck.Gen.t
      val small_int : int QCheck.Gen.t
      val small_signed_int : int QCheck.Gen.t
      val int_bound : int -> int QCheck.Gen.t
      val int_range : int -> int -> int QCheck.Gen.t
      val graft_corners :
        'QCheck.Gen.t -> 'a list -> unit -> 'QCheck.Gen.t
      val int_pos_corners : int list
      val int_corners : int list
      val ( -- ) : int -> int -> int QCheck.Gen.t
      val ui32 : int32 QCheck.Gen.t
      val ui64 : int64 QCheck.Gen.t
      val list : 'QCheck.Gen.t -> 'a list QCheck.Gen.t
      val list_size :
        int QCheck.Gen.t -> 'QCheck.Gen.t -> 'a list QCheck.Gen.t
      val list_repeat : int -> 'QCheck.Gen.t -> 'a list QCheck.Gen.t
      val array : 'QCheck.Gen.t -> 'a array QCheck.Gen.t
      val array_size :
        int QCheck.Gen.t -> 'QCheck.Gen.t -> 'a array QCheck.Gen.t
      val array_repeat : int -> 'QCheck.Gen.t -> 'a array QCheck.Gen.t
      val opt : 'QCheck.Gen.t -> 'a option QCheck.Gen.t
      val pair : 'QCheck.Gen.t -> 'QCheck.Gen.t -> ('a * 'b) QCheck.Gen.t
      val triple :
        'QCheck.Gen.t ->
        'QCheck.Gen.t -> 'QCheck.Gen.t -> ('a * 'b * 'c) QCheck.Gen.t
      val quad :
        'QCheck.Gen.t ->
        'QCheck.Gen.t ->
        'QCheck.Gen.t ->
        'QCheck.Gen.t -> ('a * 'b * 'c * 'd) QCheck.Gen.t
      val char : char QCheck.Gen.t
      val printable : char QCheck.Gen.t
      val numeral : char QCheck.Gen.t
      val string_size :
        ?gen:char QCheck.Gen.t -> int QCheck.Gen.t -> string QCheck.Gen.t
      val string : ?gen:char QCheck.Gen.t -> string QCheck.Gen.t
      val small_string : ?gen:char QCheck.Gen.t -> string QCheck.Gen.t
      val small_list : 'QCheck.Gen.t -> 'a list QCheck.Gen.t
      val join : 'QCheck.Gen.t QCheck.Gen.t -> 'QCheck.Gen.t
      val sized : 'QCheck.Gen.sized -> 'QCheck.Gen.t
      val sized_size :
        int QCheck.Gen.t -> 'QCheck.Gen.sized -> 'QCheck.Gen.t
      val fix :
        ('QCheck.Gen.sized -> 'QCheck.Gen.sized) -> 'QCheck.Gen.sized
      val generate :
        ?rand:Random.State.t -> n:int -> 'QCheck.Gen.t -> 'a list
      val generate1 : ?rand:Random.State.t -> 'QCheck.Gen.t -> 'a
    end
  module Print :
    sig
      type 'a t = '-> string
      val unit : unit QCheck.Print.t
      val int : int QCheck.Print.t
      val bool : bool QCheck.Print.t
      val float : float QCheck.Print.t
      val char : char QCheck.Print.t
      val string : string QCheck.Print.t
      val option : 'QCheck.Print.t -> 'a option QCheck.Print.t
      val pair :
        'QCheck.Print.t -> 'QCheck.Print.t -> ('a * 'b) QCheck.Print.t
      val triple :
        'QCheck.Print.t ->
        'QCheck.Print.t ->
        'QCheck.Print.t -> ('a * 'b * 'c) QCheck.Print.t
      val quad :
        'QCheck.Print.t ->
        'QCheck.Print.t ->
        'QCheck.Print.t ->
        'QCheck.Print.t -> ('a * 'b * 'c * 'd) QCheck.Print.t
      val list : 'QCheck.Print.t -> 'a list QCheck.Print.t
      val array : 'QCheck.Print.t -> 'a array QCheck.Print.t
      val comap : ('-> 'b) -> 'QCheck.Print.t -> 'QCheck.Print.t
    end
  module Iter :
    sig
      type 'a t = ('-> unit) -> unit
      val empty : 'QCheck.Iter.t
      val return : '-> 'QCheck.Iter.t
      val ( <*> ) :
        ('-> 'b) QCheck.Iter.t -> 'QCheck.Iter.t -> 'QCheck.Iter.t
      val ( >>= ) :
        'QCheck.Iter.t -> ('-> 'QCheck.Iter.t) -> 'QCheck.Iter.t
      val map : ('-> 'b) -> 'QCheck.Iter.t -> 'QCheck.Iter.t
      val map2 :
        ('-> '-> 'c) ->
        'QCheck.Iter.t -> 'QCheck.Iter.t -> 'QCheck.Iter.t
      val ( >|= ) : 'QCheck.Iter.t -> ('-> 'b) -> 'QCheck.Iter.t
      val append : 'QCheck.Iter.t -> 'QCheck.Iter.t -> 'QCheck.Iter.t
      val ( <+> ) : 'QCheck.Iter.t -> 'QCheck.Iter.t -> 'QCheck.Iter.t
      val of_list : 'a list -> 'QCheck.Iter.t
      val of_array : 'a array -> 'QCheck.Iter.t
      val pair :
        'QCheck.Iter.t -> 'QCheck.Iter.t -> ('a * 'b) QCheck.Iter.t
      val triple :
        'QCheck.Iter.t ->
        'QCheck.Iter.t -> 'QCheck.Iter.t -> ('a * 'b * 'c) QCheck.Iter.t
      val quad :
        'QCheck.Iter.t ->
        'QCheck.Iter.t ->
        'QCheck.Iter.t ->
        'QCheck.Iter.t -> ('a * 'b * 'c * 'd) QCheck.Iter.t
      val find : ('-> bool) -> 'QCheck.Iter.t -> 'a option
    end
  module Shrink :
    sig
      type 'a t = '-> 'QCheck.Iter.t
      val nil : 'QCheck.Shrink.t
      val unit : unit QCheck.Shrink.t
      val char : char QCheck.Shrink.t
      val int : int QCheck.Shrink.t
      val option : 'QCheck.Shrink.t -> 'a option QCheck.Shrink.t
      val string : string QCheck.Shrink.t
      val int_aggressive : int QCheck.Shrink.t
      val list : ?shrink:'QCheck.Shrink.t -> 'a list QCheck.Shrink.t
      val array : ?shrink:'QCheck.Shrink.t -> 'a array QCheck.Shrink.t
      val pair :
        'QCheck.Shrink.t -> 'QCheck.Shrink.t -> ('a * 'b) QCheck.Shrink.t
      val triple :
        'QCheck.Shrink.t ->
        'QCheck.Shrink.t ->
        'QCheck.Shrink.t -> ('a * 'b * 'c) QCheck.Shrink.t
      val quad :
        'QCheck.Shrink.t ->
        'QCheck.Shrink.t ->
        'QCheck.Shrink.t ->
        'QCheck.Shrink.t -> ('a * 'b * 'c * 'd) QCheck.Shrink.t
    end
  module Observable :
    sig
      type -'a t
      val equal : 'QCheck.Observable.t -> '-> '-> bool
      val hash : 'QCheck.Observable.t -> '-> int
      val print : 'QCheck.Observable.t -> 'QCheck.Print.t
      val unit : unit QCheck.Observable.t
      val bool : bool QCheck.Observable.t
      val int : int QCheck.Observable.t
      val float : float QCheck.Observable.t
      val string : string QCheck.Observable.t
      val char : char QCheck.Observable.t
      val make :
        ?eq:('-> '-> bool) ->
        ?hash:('-> int) -> 'QCheck.Print.t -> 'QCheck.Observable.t
      val map :
        ('-> 'b) -> 'QCheck.Observable.t -> 'QCheck.Observable.t
      val option : 'QCheck.Observable.t -> 'a option QCheck.Observable.t
      val list : 'QCheck.Observable.t -> 'a list QCheck.Observable.t
      val array : 'QCheck.Observable.t -> 'a array QCheck.Observable.t
      val pair :
        'QCheck.Observable.t ->
        'QCheck.Observable.t -> ('a * 'b) QCheck.Observable.t
      val triple :
        'QCheck.Observable.t ->
        'QCheck.Observable.t ->
        'QCheck.Observable.t -> ('a * 'b * 'c) QCheck.Observable.t
      val quad :
        'QCheck.Observable.t ->
        'QCheck.Observable.t ->
        'QCheck.Observable.t ->
        'QCheck.Observable.t -> ('a * 'b * 'c * 'd) QCheck.Observable.t
    end
  type 'a stat = string * ('-> int)
  type 'a arbitrary = {
    gen : 'QCheck.Gen.t;
    print : ('-> string) option;
    small : ('-> int) option;
    shrink : 'QCheck.Shrink.t option;
    collect : ('-> string) option;
    stats : 'QCheck.stat list;
  }
  val make :
    ?print:'QCheck.Print.t ->
    ?small:('-> int) ->
    ?shrink:'QCheck.Shrink.t ->
    ?collect:('-> string) ->
    ?stats:'QCheck.stat list -> 'QCheck.Gen.t -> 'QCheck.arbitrary
  val set_print :
    'QCheck.Print.t -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val set_small : ('-> int) -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val set_shrink :
    'QCheck.Shrink.t -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val set_collect :
    ('-> string) -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val set_stats :
    'QCheck.stat list -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val set_gen : 'QCheck.Gen.t -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val add_stat : 'QCheck.stat -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val gen : 'QCheck.arbitrary -> 'QCheck.Gen.t
  module TestResult :
    sig
      type 'a counter_ex = {
        instance : 'a;
        shrink_steps : int;
        msg_l : string list;
      }
      type 'a failed_state = 'QCheck.TestResult.counter_ex list
      type 'a state =
          Success
        | Failed of 'QCheck.TestResult.failed_state
        | Error of 'QCheck.TestResult.counter_ex * exn * string
      type 'a t = {
        mutable state : 'QCheck.TestResult.state;
        mutable count : int;
        mutable count_gen : int;
        collect_tbl : (string, int) Hashtbl.t lazy_t;
        stats_tbl : ('QCheck.stat * (int, int) Hashtbl.t) list;
      }
      val collect : 'QCheck.TestResult.t -> (string, int) Hashtbl.t option
      val stats :
        'QCheck.TestResult.t ->
        ('QCheck.stat * (int, int) Hashtbl.t) list
    end
  module Test :
    sig
      type 'a cell
      val fail_report : string -> 'a
      val fail_reportf :
        ('a, Format.formatter, unit, 'b) Pervasives.format4 -> 'a
      val make_cell :
        ?count:int ->
        ?long_factor:int ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?small:('-> int) ->
        ?name:string ->
        'QCheck.arbitrary -> ('-> bool) -> 'QCheck.Test.cell
      val get_arbitrary : 'QCheck.Test.cell -> 'QCheck.arbitrary
      val get_law : 'QCheck.Test.cell -> '-> bool
      val get_name : 'QCheck.Test.cell -> string
      val set_name : 'QCheck.Test.cell -> string -> unit
      val get_count : 'QCheck.Test.cell -> int
      val get_long_factor : 'QCheck.Test.cell -> int
      type t = Test : 'QCheck.Test.cell -> QCheck.Test.t
      val make :
        ?count:int ->
        ?long_factor:int ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?small:('-> int) ->
        ?name:string -> 'QCheck.arbitrary -> ('-> bool) -> QCheck.Test.t
      exception Test_fail of string * string list
      exception Test_error of string * string * exn * string
      val print_instance : 'QCheck.arbitrary -> '-> string
      val print_c_ex :
        'QCheck.arbitrary -> 'QCheck.TestResult.counter_ex -> string
      val print_fail :
        'QCheck.arbitrary ->
        string -> 'QCheck.TestResult.counter_ex list -> string
      val print_error :
        ?st:string ->
        'QCheck.arbitrary ->
        string -> 'QCheck.TestResult.counter_ex * exn -> string
      val print_test_fail : string -> string list -> string
      val print_test_error : string -> string -> exn -> string -> string
      val print_collect : (string, int) Hashtbl.t -> string
      val print_stat : 'QCheck.stat * (int, int) Hashtbl.t -> string
      val check_result :
        'QCheck.Test.cell -> 'QCheck.TestResult.t -> unit
      type res = Success | Failure | FalseAssumption | Error of exn * string
      type 'a event =
          Generating
        | Collecting of 'a
        | Testing of 'a
        | Shrunk of int * 'a
        | Shrinking of int * int * 'a
      type 'a handler =
          string -> 'QCheck.Test.cell -> 'QCheck.Test.event -> unit
      type 'a step =
          string -> 'QCheck.Test.cell -> '-> QCheck.Test.res -> unit
      type 'a callback =
          string -> 'QCheck.Test.cell -> 'QCheck.TestResult.t -> unit
      val check_cell :
        ?long:bool ->
        ?call:'QCheck.Test.callback ->
        ?step:'QCheck.Test.step ->
        ?handler:'QCheck.Test.handler ->
        ?rand:Random.State.t -> 'QCheck.Test.cell -> 'QCheck.TestResult.t
      val check_cell_exn :
        ?long:bool ->
        ?call:'QCheck.Test.callback ->
        ?step:'QCheck.Test.step ->
        ?rand:Random.State.t -> 'QCheck.Test.cell -> unit
      val check_exn :
        ?long:bool -> ?rand:Random.State.t -> QCheck.Test.t -> unit
    end
  exception No_example_found of string
  val find_example :
    ?name:string ->
    ?count:int -> f:('-> bool) -> 'QCheck.Gen.t -> 'QCheck.Gen.t
  val find_example_gen :
    ?rand:Random.State.t ->
    ?name:string -> ?count:int -> f:('-> bool) -> 'QCheck.Gen.t -> 'a
  val choose : 'QCheck.arbitrary list -> 'QCheck.arbitrary
  val unit : unit QCheck.arbitrary
  val bool : bool QCheck.arbitrary
  val float : float QCheck.arbitrary
  val pos_float : float QCheck.arbitrary
  val neg_float : float QCheck.arbitrary
  val int : int QCheck.arbitrary
  val int_bound : int -> int QCheck.arbitrary
  val int_range : int -> int -> int QCheck.arbitrary
  val small_nat : int QCheck.arbitrary
  val small_int : int QCheck.arbitrary
  val small_signed_int : int QCheck.arbitrary
  val ( -- ) : int -> int -> int QCheck.arbitrary
  val int32 : int32 QCheck.arbitrary
  val int64 : int64 QCheck.arbitrary
  val pos_int : int QCheck.arbitrary
  val small_int_corners : unit -> int QCheck.arbitrary
  val neg_int : int QCheck.arbitrary
  val char : char QCheck.arbitrary
  val printable_char : char QCheck.arbitrary
  val numeral_char : char QCheck.arbitrary
  val string_gen_of_size :
    int QCheck.Gen.t -> char QCheck.Gen.t -> string QCheck.arbitrary
  val string_gen : char QCheck.Gen.t -> string QCheck.arbitrary
  val string : string QCheck.arbitrary
  val small_string : string QCheck.arbitrary
  val small_list : 'QCheck.arbitrary -> 'a list QCheck.arbitrary
  val string_of_size : int QCheck.Gen.t -> string QCheck.arbitrary
  val printable_string : string QCheck.arbitrary
  val printable_string_of_size : int QCheck.Gen.t -> string QCheck.arbitrary
  val small_printable_string : string QCheck.arbitrary
  val numeral_string : string QCheck.arbitrary
  val numeral_string_of_size : int QCheck.Gen.t -> string QCheck.arbitrary
  val list : 'QCheck.arbitrary -> 'a list QCheck.arbitrary
  val list_of_size :
    int QCheck.Gen.t -> 'QCheck.arbitrary -> 'a list QCheck.arbitrary
  val array : 'QCheck.arbitrary -> 'a array QCheck.arbitrary
  val array_of_size :
    int QCheck.Gen.t -> 'QCheck.arbitrary -> 'a array QCheck.arbitrary
  val pair :
    'QCheck.arbitrary -> 'QCheck.arbitrary -> ('a * 'b) QCheck.arbitrary
  val triple :
    'QCheck.arbitrary ->
    'QCheck.arbitrary ->
    'QCheck.arbitrary -> ('a * 'b * 'c) QCheck.arbitrary
  val quad :
    'QCheck.arbitrary ->
    'QCheck.arbitrary ->
    'QCheck.arbitrary ->
    'QCheck.arbitrary -> ('a * 'b * 'c * 'd) QCheck.arbitrary
  val option : 'QCheck.arbitrary -> 'a option QCheck.arbitrary
  val fun1_unsafe :
    'QCheck.arbitrary -> 'QCheck.arbitrary -> ('-> 'b) QCheck.arbitrary
  val fun2_unsafe :
    'QCheck.arbitrary ->
    'QCheck.arbitrary ->
    'QCheck.arbitrary -> ('-> '-> 'c) QCheck.arbitrary
  type _ fun_repr
  type _ fun_ = Fun : 'QCheck.fun_repr * '-> 'QCheck.fun_
  module Fn :
    sig
      type 'a t = 'QCheck.fun_
      val print : 'QCheck.Fn.t QCheck.Print.t
      val shrink : 'QCheck.Fn.t QCheck.Shrink.t
      val apply : 'QCheck.Fn.t -> 'f
    end
  val fun1 :
    'QCheck.Observable.t ->
    'QCheck.arbitrary -> ('-> 'b) QCheck.fun_ QCheck.arbitrary
  module Tuple :
    sig
      type 'a t =
          Nil : unit QCheck.Tuple.t
        | Cons : 'a * 'QCheck.Tuple.t -> ('a * 'b) QCheck.Tuple.t
      val nil : unit QCheck.Tuple.t
      val cons : '-> 'QCheck.Tuple.t -> ('a * 'b) QCheck.Tuple.t
      type 'a obs
      val o_nil : unit QCheck.Tuple.obs
      val o_cons :
        'QCheck.Observable.t ->
        'QCheck.Tuple.obs -> ('a * 'b) QCheck.Tuple.obs
      module Infix :
        sig
          val ( @:: ) : '-> 'QCheck.Tuple.t -> ('a * 'b) QCheck.Tuple.t
          val ( @-> ) :
            'QCheck.Observable.t ->
            'QCheck.Tuple.obs -> ('a * 'b) QCheck.Tuple.obs
        end
      val ( @:: ) : '-> 'b t -> ('a * 'b) t
      val ( @-> ) : 'Observable.t -> 'b obs -> ('a * 'b) obs
      val observable :
        'QCheck.Tuple.obs -> 'QCheck.Tuple.t QCheck.Observable.t
    end
  val fun_nary :
    'QCheck.Tuple.obs ->
    'QCheck.arbitrary ->
    ('QCheck.Tuple.t -> 'b) QCheck.fun_ QCheck.arbitrary
  val fun2 :
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.arbitrary -> ('-> '-> 'c) QCheck.fun_ QCheck.arbitrary
  val fun3 :
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.arbitrary ->
    ('-> '-> '-> 'd) QCheck.fun_ QCheck.arbitrary
  val fun4 :
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.Observable.t ->
    'QCheck.arbitrary ->
    ('-> '-> '-> '-> 'e) QCheck.fun_ QCheck.arbitrary
  val oneofl :
    ?print:'QCheck.Print.t ->
    ?collect:('-> string) -> 'a list -> 'QCheck.arbitrary
  val oneofa :
    ?print:'QCheck.Print.t ->
    ?collect:('-> string) -> 'a array -> 'QCheck.arbitrary
  val oneof : 'QCheck.arbitrary list -> 'QCheck.arbitrary
  val always : ?print:'QCheck.Print.t -> '-> 'QCheck.arbitrary
  val frequency :
    ?print:'QCheck.Print.t ->
    ?small:('-> int) ->
    ?shrink:'QCheck.Shrink.t ->
    ?collect:('-> string) ->
    (int * 'QCheck.arbitrary) list -> 'QCheck.arbitrary
  val frequencyl :
    ?print:'QCheck.Print.t ->
    ?small:('-> int) -> (int * 'a) list -> 'QCheck.arbitrary
  val frequencya :
    ?print:'QCheck.Print.t ->
    ?small:('-> int) -> (int * 'a) array -> 'QCheck.arbitrary
  val map :
    ?rev:('-> 'a) ->
    ('-> 'b) -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val map_same_type :
    ('-> 'a) -> 'QCheck.arbitrary -> 'QCheck.arbitrary
  val map_keep_input :
    ?print:'QCheck.Print.t ->
    ?small:('-> int) ->
    ('-> 'b) -> 'QCheck.arbitrary -> ('a * 'b) QCheck.arbitrary
end