Definition GOpt A := G (option A).
Global Instance Monad_GOpt : Monad GOpt := {
ret A x := returnGen (Some x);
bind A B := bindGenOpt;
}.

(* Specifications: *)
Lemma semSize_retryBody {A} (n : nat) (g : G (option A)) (s : nat) :
match n with
| S n' => semGenSize (retry n' g) s <--> semGenSize g s
| O => True
end ->
semGenSize (retryBody retry n g) s <--> semGenSize g s.
Lemma semSize_retry {A} (n : nat) (g : G (option A)) (s : nat) :
semGenSize (retry n g) s <--> semGenSize g s.
Lemma semSizeOpt_retry {A} (n : nat) (g : G (option A)) (s : nat) :
semGenSizeOpt (retry n g) s <--> semGenSizeOpt g s.
Lemma semSizeOpt_suchThatMaybe1 {A : Type} (g : G A) (p : A -> bool)
(s : nat) :
semGenSizeOpt (suchThatMaybe1 g p) s <--> semGenSize g s :&: p.
Lemma semSizeOpt_suchThatMaybe {A : Type} (g : G A) (p : A -> bool)
(s : nat) :
semGenSizeOpt (suchThatMaybe g p) s <--> semGenSize g s :&: p.
Lemma semSizeOpt_suchThatMaybeOpt {A : Type} (g : G (option A))
(p : A -> bool) (s : nat) :
semGenSizeOpt (suchThatMaybeOpt g p) s <--> semGenSizeOpt g s :&: p.