Instance bindOptMonotonic
{A B} (g : G (option A)) (f : A -> G (option B))
`{SizeMonotonic _ g} `{forall x, SizeMonotonic (f x)} :
SizeMonotonic (bindGenOpt g f).

(* Specifications: *)
Lemma semBindOptSizeMonotonicIncl_r {A B} (g : G (option A)) (f : A -> G (option B)) (s1 : set A) (s2 : A -> set B) :
semGen g \subset (Some @: s1) :|: [set None] ->
(forall x, semGen (f x) \subset Some @: (s2 x) :|: [set None]) ->
semGen (bindGenOpt g f) \subset Some @: (\bigcup_(a in s1) s2 a) :|: [set None].
Lemma semBindOptSizeMonotonicIncl_l {A B} (g : G (option A)) (f : A -> G (option B)) (s1 : set A)
(fs : A -> set B)
`{Hg : SizeMonotonicOpt _ g}
`{Hf : forall a, SizeMonotonicOpt (f a)} :
Some @: s1 \subset semGen g ->
(forall x, Some @: (fs x) \subset semGen (f x)) ->
(Some @: \bigcup_(a in s1) (fs a)) \subset semGen (bindGenOpt g f).
Lemma  semBindOptSizeOpt_subset_compat {A B : Type} (g g' : G (option A)) (f f' : A -> G (option B)) :
(forall s, isSome :&: semGenSize g s \subset isSome :&: semGenSize g' s) ->
(forall x s, isSome :&: semGenSize (f x) s \subset isSome :&: semGenSize (f' x) s) ->
(forall s, isSome :&: semGenSize (bindGenOpt g f) s \subset isSome :&: semGenSize (bindGenOpt g' f') s).