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}}.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'}}.

(* Specifications: *)
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).
Lemma fmap_fcombiner_preserves_unmap_right: forall A B (f : A -> B) (g: B -> A), unmap_right (Join_fcombiner A) (Join_fcombiner B) (fmap f_combiner f g).