intros H1 H2 y [y' [[x [Hs1 Hfs2]] Heq]]; inv Heq; clear Heq.
eapply H1 in Hs1.
assert (Hin2 : (Some @: fs x) (Some y')).
{ eexists; split; eauto. now constructor. }
eapply H2 in Hin2.
destruct Hg as [Hgmon].
destruct (Hf x) as [Hfgmon].
edestruct Hs1 as [s [_ Hgen]].
edestruct Hin2 as [s' [_ Hfgen]].
assert (Hin2' : ((fun u : option B => u) :&: semGenSize (f x) s') (Some y')).
{ split; eauto. }
eapply Hgmon with (s2 := s + s')  in Hgen; [| now ssromega ].
eapply Hfgmon with (s2 := s + s')  in Hin2'; [| now ssromega ].
edestruct Hgen as [r1 Hr1].
edestruct Hin2' as [_ [r2 Hr2]].
eexists (s + s'). split; [ now constructor |].
edestruct (randomSplitAssumption r1 r2) as [r'' Heq].
eexists r''. simpl. rewrite Heq.
rewrite Hr1 Hr2. reflexivity.
Qed.
*)

(* Specifications: *)
Lemma semFmapSize A B (f : A -> B) (g : G A) (size : nat) :
semGenSize (fmap f g) size <--> f @: semGenSize g size.  Proof.