Module DepMapFactsOn (X : OrderedType) (S : DepMap X) : DepMapFacts(X) with Definition key := X.t.
Include S.
(** ***  Comparisons over dependent maps  **)
Definition eq {A : Type} dom₁ dom₂ (m₁ : t A dom₁) (m₂ : t A dom₂) := forall x, find x m₁ = find x m₂.
Instance eq_refl : forall A dom, Reflexive (@eq A dom dom).
Definition incl {A : Type} dom₁ dom₂ (m₁ : t A dom₁) (m₂ : t A dom₂) :=
forall x v, find x m₁ = Some v -> find x m₂ = Some v.
Instance incl_refl : forall A dom (m : t A dom), Reflexive (@incl A dom dom).
Instance eq_incl_compat : forall A dom, PartialOrder (@eq A dom dom) (@incl A dom dom).
(** ***  Compatibility Instances  **)
Instance mem_compat (A : Type) dom : Proper (X.eq ==> @eq A dom dom ==> Logic.eq) (@mem A dom).
Instance set_compat2 (A : Type) x dom :
Proper (Logic.eq ==> @eq A dom dom ==> full_relation ==> @eq A dom dom) (@set A dom x).
Instance add_compat2 (A : Type) x dom :
Proper (Logic.eq ==> @eq A dom dom ==> @eq A (Dom.add x dom) (Dom.add x dom)) (@add A dom x).
Instance remove_compat2 (A : Type) x dom :
Proper (@eq A dom dom ==> @eq A (Dom.remove x dom) (Dom.remove x dom)) (@remove A dom x).
(** [exists_] **)
Definition exists_ {A : Type} (f : key -> A -> bool) dom (m : t A dom) :=
fold (fun x v b => b || f x v) m false.
(* (** [filter] **)
Definition filter {A : Type} (f : key -> A -> bool) {dom} (m : t A dom) :=
fold (fun x v acc => if f x v then add x acc else acc) m empty.

Lemma filter_spec : forall A f dom (m : t A dom) x v,
find x (filter f m) = Some v <-> find x m = Some v ∧ f x v = true.