(* QuickChick Prelude *)
Set Warnings "-extraction-opaque-accessed,-extraction".
Set Warnings "-notation-overridden,-parsing".
Set Bullet Behavior "Strict Subproofs".
(* End prelude *)
Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
Derive ArbitrarySizedSuchThat for (fun n => ev n).
Derive SizedProofEqs for (fun n => ev n).
Derive SizeMonotonicSuchThatOpt for (fun n => ev n).
Derive GenSizedSuchThatCorrect for (fun n => ev n).
Derive GenSizedSuchThatSizeMonotonicOpt for (fun n => ev n).
(* Future work: Before relevant software foundations testing book, this needs to be automated... *)
Instance dec_ev (n : nat) : Dec (ev n) :=
{| dec := let fix aux n :=
let n' := n in
let Heq := erefl n' : n' = n in
match n as n'' return (n' = n'' -> _) with
| O => fun H => left _
| S O => fun H => right _
| S (S n) => fun H => _ (aux n)
end Heq in
aux n |}.

(* Specifications: *)
Theorem ev_double : forall n,
ev (double n).