From 700a60a07a001a2cf21d2abb82d94780234a95c1 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Mon, 21 Nov 2016 09:26:40 +0100
Subject: [PATCH] =?UTF-8?q?Show=20that=20=E2=8A=86=20on=20multisets=20is?=
 =?UTF-8?q?=20decidable.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 prelude/gmultiset.v | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/prelude/gmultiset.v b/prelude/gmultiset.v
index e157b48f0..c8594c563 100644
--- a/prelude/gmultiset.v
+++ b/prelude/gmultiset.v
@@ -239,6 +239,20 @@ Proof.
   - intros X Y HXY HYX; apply gmultiset_eq; intros x. by apply (anti_symm (≤)).
 Qed.
 
+Lemma gmultiset_subseteq_alt X Y :
+  X ⊆ Y ↔
+  map_relation (≤) (λ _, False) (λ _, True) (gmultiset_car X) (gmultiset_car Y).
+Proof.
+  apply forall_proper; intros x. unfold multiplicity.
+  destruct (gmultiset_car X !! x), (gmultiset_car Y !! x); naive_solver omega.
+Qed.
+Global Instance gmultiset_subseteq_dec X Y : Decision (X ⊆ Y).
+Proof.
+ refine (cast_if (decide (map_relation (≤)
+   (λ _, False) (λ _, True) (gmultiset_car X) (gmultiset_car Y))));
+   by rewrite gmultiset_subseteq_alt.
+Defined.
+
 Lemma gmultiset_subset_subseteq X Y : X ⊂ Y → X ⊆ Y.
 Proof. apply strict_include. Qed.
 Hint Resolve gmultiset_subset_subseteq.
-- 
GitLab