*)
(* CH: We could create a super class UCheckable that includes the unsized assumption. And we could use sections to hide all the type class stuff from the paper. *)
(* CH: This will be affected by upcoming refactoring; proving it like this only because it appears in ITP submission *)

(* Specifications: *)
Lemma curry_uncurry {A B C : Type} (f : A -> B -> C) :
curry (uncurry f) = f.
Lemma semForAllShrinkSize:
forall {A C} `{Checkable C} `{Show A}
(gen : G A) (f : A -> C) shrinker (size: nat),
semCheckerSize (forAllShrink gen shrinker f) size <->
forall a : A, semGenSize gen size a -> semCheckableSize (f a) size.
Lemma semForAllShrinkUnsized1 :
forall {A C} `{Checkable C} `{Show A}
(gen : G A) (f : A -> C) shrinker `{Unsized _ gen},
(semChecker (forAllShrink gen shrinker f) <->
forall a : A, semGen gen a -> semCheckable (f a)).
Lemma semForAllShrinkUnsized2 :
forall {A C} `{Checkable C} `{Show A}
(gen : G A) (f : A -> C) shrinker
`{forall a, UnsizedChecker (checker (f a))},
(semChecker (forAllShrink gen shrinker f) <->
forall a : A, semGen gen a -> semCheckable (f a)).
Lemma semForAllShrinkMonotonic :
forall {A C} `{Checkable C} `{Show A}
(gen : G A) (f : A -> C) shrinker `{SizeMonotonic _ gen},
(forall a, SizeMonotonicChecker (checker (f a))) ->
(semChecker (forAllShrink gen shrinker f) <->
forall a : A, semGen gen a -> semCheckable (f a)).
Lemma bool_successful :
forall b, resultSuccessful (liftBool b) = b.
Lemma semCheckableBoolSize (b : bool) size : semCheckableSize b size <-> b.
(* begin semCheckableBool *)
Lemma semCheckableBool (b : bool) : semCheckable b <-> b.
Program Instance boolUnsized (b : bool) : UnsizedChecker (checker b).