Definition genPair {A B : Type} (ga : G A) (gb : G B) : G (A * B) :=
liftGen2 pair ga gb.
Definition curry {A B C : Type} (f : A * B -> C) (a : A) (b : B) := f (a,b).
Definition uncurry {A B C : Type} (f : A -> B -> C) (ab : A * B) :=
match ab with
| (a,b) => f a b
end.

(* Specifications: *)
Lemma mergeBinds :
forall A B C (ga : G A) (gb : G B) (f : A -> B -> G C),
semGen (bindGen ga (fun x => bindGen gb (f x))) <-->
semGen (bindGen (genPair ga gb) (uncurry f)).