Definition MapDisjoint (m:Map A) (m':Map B) :=
    forall a:ad, in_dom A a m = true -> in_dom B a m' = true -> False.Definition MapDisjoint_1 (m:Map A) (m':Map B) :=
    match MapSweep A (fun (a:ad) (_:A) => in_dom B a m') m with
    | None => true
    | _ => false
    end.Definition MapDisjoint_2 (m:Map A) (m':Map B) :=
    eqmap A (MapDomRestrTo A B m m') (M0 A).

(* Specifications: *)
Lemma MapDisjoint_imp_1 : forall (m:Map A) (m':Map B), MapDisjoint m m' -> MapDisjoint_1 m m' = true.
Lemma MapDisjoint_1_imp : forall (m:Map A) (m':Map B), MapDisjoint_1 m m' = true -> MapDisjoint m m'.
Lemma MapDisjoint_imp_2 : forall (m:Map A) (m':Map B), MapDisjoint m m' -> MapDisjoint_2 m m'.
Lemma MapDisjoint_2_imp : forall (m:Map A) (m':Map B), MapDisjoint_2 m m' -> MapDisjoint m m'.
Lemma Map_M0_disjoint : forall m:Map B, MapDisjoint (M0 A) m.
Lemma Map_disjoint_M0 : forall m:Map A, MapDisjoint m (M0 B).
Lemma MapDisjoint_ext : forall (m0 m1:Map A) (m2 m3:Map B), eqmap A m0 m1 -> eqmap B m2 m3 -> MapDisjoint A B m0 m2 -> MapDisjoint A B m1 m3.
Lemma MapMerge_disjoint : forall m m':Map A, MapDisjoint A A m m' -> forall a:ad, in_dom A a (MapMerge A m m') = orb (andb (in_dom A a m) (negb (in_dom A a m'))) (andb (in_dom A a m') (negb (in_dom A a m))).
Lemma MapDisjoint_M2_l : forall (m0 m1:Map A) (m2 m3:Map B), MapDisjoint A B (M2 A m0 m1) (M2 B m2 m3) -> MapDisjoint A B m0 m2.
Lemma MapDisjoint_M2_r : forall (m0 m1:Map A) (m2 m3:Map B), MapDisjoint A B (M2 A m0 m1) (M2 B m2 m3) -> MapDisjoint A B m1 m3.
Lemma MapDisjoint_M2 : forall (m0 m1:Map A) (m2 m3:Map B), MapDisjoint A B m0 m2 -> MapDisjoint A B m1 m3 -> MapDisjoint A B (M2 A m0 m1) (M2 B m2 m3).
Lemma MapDisjoint_M1_l : forall (m:Map A) (a:ad) (y:B), MapDisjoint B A (M1 B a y) m -> in_dom A a m = false.
Lemma MapDisjoint_M1_r : forall (m:Map A) (a:ad) (y:B), MapDisjoint A B m (M1 B a y) -> in_dom A a m = false.
Lemma MapDisjoint_M1_conv_l : forall (m:Map A) (a:ad) (y:B), in_dom A a m = false -> MapDisjoint B A (M1 B a y) m.
Lemma MapDisjoint_M1_conv_r : forall (m:Map A) (a:ad) (y:B), in_dom A a m = false -> MapDisjoint A B m (M1 B a y).
Lemma MapDisjoint_sym : forall (m:Map A) (m':Map B), MapDisjoint A B m m' -> MapDisjoint B A m' m.
Lemma MapDisjoint_empty : forall m:Map A, MapDisjoint A A m m -> eqmap A m (M0 A).
Lemma MapDelta_disjoint : forall m m':Map A, MapDisjoint A A m m' -> eqmap A (MapDelta A m m') (MapMerge A m m').
Lemma MapDomRestr_disjoint : forall (m:Map A) (m':Map B) (m'':Map C), MapDisjoint A B (MapDomRestrTo A C m m'') (MapDomRestrBy B C m' m'').
Lemma MapDelta_RestrTo_disjoint : forall m m':Map A, MapDisjoint A A (MapDelta A m m') (MapDomRestrTo A A m m').
Lemma MapDelta_RestrTo_disjoint_2 : forall m m':Map A, MapDisjoint A A (MapDelta A m m') (MapDomRestrTo A A m' m).
Lemma MapSubset_Disjoint : forall (m:Map A) (m':Map B) (m'':Map C) (m''':Map D), MapSubset _ _ m m' -> MapSubset _ _ m'' m''' -> MapDisjoint _ _ m' m''' -> MapDisjoint _ _ m m''.
Lemma MapSubset_Disjoint_l : forall (m:Map A) (m':Map B) (m'':Map C), MapSubset _ _ m m' -> MapDisjoint _ _ m' m'' -> MapDisjoint _ _ m m''.
Lemma MapSubset_Disjoint_r : forall (m:Map A) (m'':Map C) (m''':Map D), MapSubset _ _ m'' m''' -> MapDisjoint _ _ m m''' -> MapDisjoint _ _ m m''.