Set Warnings "-extraction-opaque-accessed,-extraction".
Set Warnings "-notation-overridden,-parsing".
Structures.Monad.
Local Open Scope monad_scope.
Definition gte n m := Nat.leb m n.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Set Bullet Behavior "Strict Subproofs".
Record Args := MkArgs {
replay     : option (RandomSeed * nat);
maxSuccess : nat;
maxDiscard : nat;
maxShrinks : nat;
maxSize    : nat;
chatty     : bool
}.
Definition updMaxSize (a : Args) (x : nat) : Args :=
let '(MkArgs r msc md msh msz c) := a in
MkArgs r msc md msh x c.
Definition updMaxSuccess (a : Args) (x : nat) : Args :=
let '(MkArgs r msc md msh msz c) := a in
MkArgs r x md msh msz c.
Inductive Result :=
| Success : nat -> nat -> list (string * nat) -> string -> Result
| GaveUp  : nat -> list (string * nat) -> string -> Result
| Failure : nat -> nat -> nat -> RandomSeed -> nat -> string ->
list (string * nat) -> string -> Result
| NoExpectedFailure : nat -> list (string * nat) -> string -> Result.
Definition isSuccess (r : Result) : bool :=
match r with
| Success _ _ _ _ => true
| _         => false
end.

(* Specifications: *)
(* Representing large constants in Coq is not a good idea... :) *)
Axiom defNumTests    : nat.
Extract Constant defNumTests    => "10000".
Axiom defNumDiscards : nat.
Extract Constant defNumDiscards => "(2 * defNumTests)".
Axiom defNumShrinks  : nat.
Extract Constant defNumShrinks  => "1000".
Axiom defSize        : nat.
Extract Constant defSize        => "7".