Definition join_hom2 := forall (a1 a2 a3: A)(b1 b2 b3: B),
      join a1 a2 a3
      -> join b1 b2 b3
      -> join (f a1 b1) (f a2 b2) (f a3 b3).(* Two-argument join homomorphisms with a dummy argument *)
  Definition join_hom2' := forall (a1 a2 a3: A)(b1 b2 b3: B),
      join a1 a2 a3
      -> join (f a1 b1) (f a2 b2) (f a3 b3).

(* Specifications: *)
Lemma join_hom_id (A: Type) (JA: Join A) : join_hom (fun x => x).
Lemma join_hom2_pair: join_hom2 (fun a b => (f a, g b)).
Lemma join_hom2_pair' : join_hom2 (fun (a: A) (b: B) => (a, b)).
Lemma join_hom_prod : join_hom (fun p => (f (fst p), g (snd p))).
Lemma join_hom_prodA : forall e: B', join e e e -> join_hom (fun a :A => (f a, e)).
Lemma join_hom_prodA' : forall e: B, join e e e -> join_hom (fun a :A' => (a, e)).
Lemma join_hom_prodB : forall e: A', join e e e -> join_hom (fun b: B => (e, g b)).
Lemma join_hom_prodB' : forall e: A, join e e e -> join_hom (fun b : B' => (e, b)).
Lemma join_hom_proj1 : join_hom (fun p: A*B => fst p).
Lemma join_hom_proj2 : join_hom (fun p : A*B => snd p).
Lemma join_hom_sum : join_hom (fun s: A+B => match s with | inl x => inl _ (f x) | inr y => inr _ (g y) end).
Lemma join_hom_sum_l : join_hom (fun s: A+B => match s with | inl x => inl _ (f x) | inr y => inr _ y end).
Lemma join_hom_sum_r : join_hom (fun s: A+B => match s with | inl x => inl _ x | inr y => inr _ (g y) end).
Lemma join_hom_inj_l : join_hom (fun a : A=> inl Void (f a)).
Lemma join_hom_inj_r : join_hom (fun b => inr Void (g b)).