Instance eqmap_equiv : Equivalence eqmap.Definition upd {A} (m : nat -> A) x e :=
  fun y => if eq_nat_dec x y then e else m y.Definition updatemap (m : map) (x e : nat) : option map :=
  match m x with Some _ => Some (upd m x (Some e)) | None => None end.Definition assertmap (m : map) (x : nat) : Prop :=
  match m x with Some (S _) => True | _ => False end.Definition joincell (a b : option nat) : option (option nat) :=
  match a, b with
    | None, None => Some None
    | Some a, None | None, Some a => Some (Some a)
    | Some _, Some _ => None
  end.Definition join (m n o : map) : Prop := forall x, joincell (m x) (n x) = Some (o x).Definition joins (m n : map) : Prop := exists o, join m n o.Add Parametric Morphism : join with signature eqmap ==> eqmap ==> eqmap ==> iff as join_morphism.

(* Specifications: *)
Lemma join_eqmap_compat_l {m m' n o} : eqmap m m' -> join m n o -> join m' n o.
Lemma join_eqmap_compat_r {m n n' o} : eqmap n n' -> join m n o -> join m n' o.
Lemma join_eqmap {m n o o'} : join m n o -> join m n o' -> eqmap o o'.
Lemma join_eqmap_r {m n n' o} : join m n o -> join m n' o -> eqmap n n'.
Lemma join_eqmap_l {m m' n o} : join m n o -> join m' n o -> eqmap m m'.