From f3e78cbbe7665c99e00742cb4b3efbc14adfaf77 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Fri, 22 Jul 2016 21:28:05 +0200
Subject: [PATCH] More mapset deciders.

---
 prelude/mapset.v | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/prelude/mapset.v b/prelude/mapset.v
index fb3788cce..5a3dd7188 100644
--- a/prelude/mapset.v
+++ b/prelude/mapset.v
@@ -34,16 +34,6 @@ Proof.
   f_equal. apply map_eq. intros i. apply option_eq. intros []. by apply E.
 Qed.
 
-Global Instance mapset_eq_dec `{∀ m1 m2 : M unit, Decision (m1 = m2)}
-  (X1 X2 : mapset M) : Decision (X1 = X2) | 1.
-Proof.
- refine
-  match X1, X2 with Mapset m1, Mapset m2 => cast_if (decide (m1 = m2)) end;
-  abstract congruence.
-Defined.
-Global Instance mapset_elem_of_dec x (X : mapset M) : Decision (x ∈ X) | 1.
-Proof. solve_decision. Defined.
-
 Instance: Collection K (mapset M).
 Proof.
   split; [split | | ].
@@ -77,6 +67,30 @@ Proof.
     apply NoDup_fst_map_to_list.
 Qed.
 
+Section deciders.
+  Context `{∀ m1 m2 : M unit, Decision (m1 = m2)}.
+  Global Instance mapset_eq_dec (X1 X2 : mapset M) : Decision (X1 = X2) | 1.
+  Proof.
+   refine
+    match X1, X2 with Mapset m1, Mapset m2 => cast_if (decide (m1 = m2)) end;
+    abstract congruence.
+  Defined.
+  Global Instance mapset_equiv_dec (X1 X2 : mapset M) : Decision (X1 ≡ X2) | 1.
+  Proof. refine (cast_if (decide (X1 = X2))); abstract (by fold_leibniz). Defined.
+  Global Instance mapset_elem_of_dec x (X : mapset M) : Decision (x ∈ X) | 1.
+  Proof. solve_decision. Defined.
+  Global Instance mapset_disjoint_dec (X1 X2 : mapset M) : Decision (X1 ⊥ X2).
+  Proof.
+   refine (cast_if (decide (X1 ∩ X2 = ∅)));
+    abstract (by rewrite disjoint_intersection_L).
+  Defined.
+  Global Instance mapset_subseteq_dec (X1 X2 : mapset M) : Decision (X1 ⊆ X2).
+  Proof.
+   refine (cast_if (decide (X1 ∪ X2 = X2)));
+    abstract (by rewrite subseteq_union_L).
+  Defined.
+End deciders.
+
 Definition mapset_map_with {A B} (f : bool → A → option B)
     (X : mapset M) : M A → M B :=
   let (mX) := X in merge (λ x y,
-- 
GitLab