Arguments Equal {elt} m m'.
Add Parametric Relation (elt : Type) : (t elt) Equal
reflexivity proved by (@Equal_refl elt)
symmetry proved by (@Equal_sym elt)
transitivity proved by (@Equal_trans elt)
as EqualSetoid.
Add Parametric Morphism elt : (@In elt)
with signature E.eq ==> Equal ==> iff as In_m.
Add Parametric Morphism elt : (@MapsTo elt)
with signature E.eq ==> eq ==> Equal ==> iff as MapsTo_m.
Add Parametric Morphism elt : (@Empty elt)
with signature Equal ==> iff as Empty_m.
Add Parametric Morphism elt : (@is_empty elt)
with signature Equal ==> eq as is_empty_m.
Add Parametric Morphism elt : (@mem elt)
with signature E.eq ==> Equal ==> eq as mem_m.
Add Parametric Morphism elt : (@find elt)
with signature E.eq ==> Equal ==> eq as find_m.
Add Parametric Morphism elt : (@add elt)
with signature E.eq ==> eq ==> Equal ==> Equal as add_m.
Add Parametric Morphism elt : (@remove elt)
with signature E.eq ==> Equal ==> Equal as remove_m.
Add Parametric Morphism elt elt' : (@map elt elt')
with signature eq ==> Equal ==> Equal as map_m.
(* Later: Add Morphism cardinal *)
(* old name: *)
Notation not_find_mapsto_iff := not_find_in_iff.
End WFacts_fun.
(** * Same facts for self-contained weak sets and for full maps *)
Module WFacts (M:WS) := WFacts_fun M.E M.
Module Facts := WFacts.
(** * Additional Properties for weak maps  Results about [fold], [elements], induction principles... *)
Module WProperties_fun (E:DecidableType)(M:WSfun E).
Module Import F:=WFacts_fun E M.
Section Elt.
Variable elt:Type.
Definition Add x (e:elt) m m' := forall y, find y m' = find y (add x e m).

(* Specifications: *)
Lemma Add_transpose_neqkey : forall k1 k2 e1 e2 m1 m2 m3,
~ E.eq k1 k2 -> Add k1 e1 m1 m2 -> Add k2 e2 m2 m3 ->
{ m | Add k2 e2 m1 m /\ Add k1 e1 m m3 }.