(*
  Definition saKey := sa_equiv Key.
  Definition saKeyA := sa_prod saKey saA.
  Definition saKeyAList := sa_list saKeyA.
  Definition saSum := sa_sum saA sa_unit.
  Definition saRange := sa_bijection _ _ (bij_sa_sum_option A) _ saSum.
*)

  Fixpoint lookup k (rho: list (Key*A)) :=
    match rho with
      | nil => None
      | (k', a) :: rho' =>
          if Key_dec_eq k k' then Some a else lookup k rho'
    end.Instance Join_Key : Join Key := @Join_equiv Key.

(* Specifications: *)
Lemma join_hom_fun : join_hom (fun env k => lookup k env).
Lemma join_hom_bij {A: Type} `{Perm_alg A} {B: Type} (bij: bijection A B): @join_hom _ _ _ (Join_bij _ _ _ bij) (bij_f _ _ bij).
Lemma join_hom_join_sub {A}{B}`{Join A}`{Join B}: forall (f: A -> B) a1 a2, join_sub a1 a2 -> join_hom f -> join_sub (f a1) (f a2).
Lemma join_hom_identity {A}{B}`{Perm_alg A}{SA: Sep_alg A}{CA: Disj_alg A}`{Perm_alg B}{SB: Sep_alg B}{CB: Disj_alg B}: forall (f: A -> B) a1, identity a1 -> join_hom f -> identity (f a1).
Lemma join_hom2_identity {A}{B}{C} `{Perm_alg A}{SA: Sep_alg A}{CA: Disj_alg A} `{Perm_alg B}{SB: Sep_alg B}{CB: Disj_alg B} `{Perm_alg C}{SC: Sep_alg C}{CC: Disj_alg C}: forall (g: A -> B -> C) a1 b1, identity a1 -> identity b1 -> join_hom2 g -> identity (g a1 b1).
Lemma join_hom_comparable {A}{B}`{Perm_alg A}{SA: Sep_alg A}`{Perm_alg B}{SB:Sep_alg B}: forall (f: A -> B) a1 a2, comparable a1 a2 -> join_hom f -> comparable (f a1) (f a2).
Lemma join_hom2_comparable {A}{B}{C} `{Perm_alg A}{SA: Sep_alg A}`{Perm_alg B}{SB: Sep_alg B}`{Perm_alg C}{SC: Sep_alg C}: forall (g: A -> B -> C) a1 a2 b1 b2, comparable a1 a2 -> comparable b1 b2 -> join_hom2 g -> comparable (g a1 b1) (g a2 b2).