From e4e6c36d59e0df54dfbbe21b2c6bf51427dbdf7d Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Sat, 23 Feb 2019 14:23:25 +0100
Subject: [PATCH] Some properties of `list_to_set_disj`.

---
 theories/gmultiset.v | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/theories/gmultiset.v b/theories/gmultiset.v
index 7b2e6dcb..b5da1b1c 100644
--- a/theories/gmultiset.v
+++ b/theories/gmultiset.v
@@ -12,7 +12,7 @@ Proof. solve_decision. Defined.
 
 Program Instance gmultiset_countable `{Countable A} :
     Countable (gmultiset A) := {|
-  encode X := encode (gmultiset_car X);  decode p := GMultiSet <$> decode p
+  encode X := encode (gmultiset_car X); decode p := GMultiSet <$> decode p
 |}.
 Next Obligation. intros A ?? [X]; simpl. by rewrite decode_encode. Qed.
 
@@ -250,7 +250,29 @@ Proof.
   by rewrite multiplicity_singleton, multiplicity_empty.
 Qed.
 
-(* Properties of the elements operation *)
+(** Conversion from lists *)
+Lemma list_to_set_disj_nil : list_to_set_disj [] =@{gmultiset A} ∅.
+Proof. done. Qed.
+Lemma list_to_set_disj_cons x l :
+  list_to_set_disj (x :: l) =@{gmultiset A} {[ x ]} ⊎ list_to_set_disj l.
+Proof. done. Qed.
+Lemma list_to_set_disj_app l1 l2 :
+  list_to_set_disj (l1 ++ l2) =@{gmultiset A} list_to_set_disj l1 ⊎ list_to_set_disj l2.
+Proof.
+  induction l1 as [|x l1 IH]; simpl.
+  - by rewrite (left_id_L _ _).
+  - by rewrite IH, (assoc_L _).
+Qed.
+Global Instance list_to_set_disj_perm :
+  Proper ((≡ₚ) ==> (=)) (list_to_set_disj (C:=gmultiset A)).
+Proof.
+  induction 1 as [|x l l' _ IH|x y l|l l' l'' _ IH1 _ IH2]; simpl; auto.
+  - by rewrite IH.
+  - by rewrite !(assoc_L _), (comm_L _ {[ x ]}).
+  - by rewrite IH1.
+Qed.
+
+(** Properties of the elements operation *)
 Lemma gmultiset_elements_empty : elements (∅ : gmultiset A) = [].
 Proof.
   unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_empty.
-- 
GitLab