Proof with auto.
repeat intro. hnf in H|-*.
icase x; icase y; icase z.
destruct H.
split; congruence.
simpl in H. subst v0. simpl...
destruct H.
split; congruence.
destruct H.
split...
apply paf_join_hom...
destruct H.
split...
apply fmaps_combjoin_hom...
simpl in H. subst v0. simpl...
Qed.
Definition combjoin_unmap_left (A B : Type)
(f : T1 A -> T1 B) (g : T2 A -> T2 B) : Type :=
forall (x' : T1 B) (y :T1 A) (z : T2 A),
combjoin B x' (f y) (g z) ->
{x : T1 A &  {y0 : T1 A | combjoin A x y0 z /\ f x = x' /\ f y0 = f y}}.
Arguments combjoin_unmap_left [A B] _ _.
Variable combjoin_preserves_unmap_left : forall A B (f : A -> B) (g: B -> A),
combjoin_unmap_left (fmap T1 f g) (fmap T2 f g).
Definition combjoin_unmap_right (A B : Type)
(f : T1 A -> T1 B) (g : T2 A -> T2 B) : Type :=
forall (x y :T1 A) (z' : T2 B),
combjoin B (f x) (f y) z' ->
{y0 : T1 A &  {z : T2 A | combjoin A x y0 z /\ f y0 = f y /\ g z = z'}}.
Arguments combjoin_unmap_right [A B] _ _.
Variable combjoin_preserves_unmap_right : forall A B (f : A -> B) (g: B -> A),
combjoin_unmap_right (fmap T1 f g) (fmap T2 f g).

Lemma fmap_fcombiner_preserves_unmap_left: forall A B (f : A -> B) (g: B -> A),
unmap_left (Join_fcombiner A) (Join_fcombiner B) (fmap f_combiner f g).