From 85a4e1af3da6b32ebad58d1ef5066413d1cf36b0 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Wed, 17 Feb 2016 12:55:23 +0100
Subject: [PATCH] Misc elements (of fin set) properties.

---
 theories/fin_collections.v | 40 +++++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 13 deletions(-)

diff --git a/theories/fin_collections.v b/theories/fin_collections.v
index 60abe908..59a8b55c 100644
--- a/theories/fin_collections.v
+++ b/theories/fin_collections.v
@@ -24,14 +24,35 @@ Proof.
   - apply NoDup_elements.
   - intros. by rewrite !elem_of_elements, E.
 Qed.
+Lemma elements_empty : elements (∅ : C) = [].
+Proof.
+  apply elem_of_nil_inv; intros x.
+  rewrite elem_of_elements, elem_of_empty; tauto.
+Qed.
+Lemma elements_union_singleton (X : C) x :
+  x ∉ X → elements ({[ x ]} ∪ X) ≡ₚ x :: elements X.
+Proof.
+  intros ?; apply NoDup_Permutation.
+  { apply NoDup_elements. }
+  { by constructor; rewrite ?elem_of_elements; try apply NoDup_elements. }
+  intros y; rewrite elem_of_elements, elem_of_union, elem_of_singleton.
+  by rewrite elem_of_cons, elem_of_elements.
+Qed.
+Lemma elements_singleton x : elements {[ x ]} = [x].
+Proof.
+  apply Permutation_singleton. by rewrite <-(right_id ∅ (∪) {[x]}),
+    elements_union_singleton, elements_empty by solve_elem_of.
+Qed.
+Lemma elements_contains X Y : X ⊆ Y → elements X `contains` elements Y.
+Proof.
+  intros; apply NoDup_contains; auto using NoDup_elements.
+  intros x. rewrite !elem_of_elements; auto.
+Qed.
+
 Global Instance collection_size_proper: Proper ((≡) ==> (=)) (@size C _).
 Proof. intros ?? E. apply Permutation_length. by rewrite E. Qed.
 Lemma size_empty : size (∅ : C) = 0.
-Proof.
-  unfold size, collection_size. simpl.
-  rewrite (elem_of_nil_inv (elements ∅)); [done|intro].
-  rewrite elem_of_elements, elem_of_empty; auto.
-Qed.
+Proof. unfold size, collection_size. simpl. by rewrite elements_empty. Qed.
 Lemma size_empty_inv (X : C) : size X = 0 → X ≡ ∅.
 Proof.
   intros; apply equiv_empty; intros x; rewrite <-elem_of_elements.
@@ -42,14 +63,7 @@ Proof. split. apply size_empty_inv. by intros ->; rewrite size_empty. Qed.
 Lemma size_non_empty_iff (X : C) : size X ≠ 0 ↔ X ≢ ∅.
 Proof. by rewrite size_empty_iff. Qed.
 Lemma size_singleton (x : A) : size {[ x ]} = 1.
-Proof.
-  change (length (elements {[ x ]}) = length [x]).
-  apply Permutation_length, NoDup_Permutation.
-  - apply NoDup_elements.
-  - apply NoDup_singleton.
-  - intros y.
-    by rewrite elem_of_elements, elem_of_singleton, elem_of_list_singleton.
-Qed.
+Proof. unfold size, collection_size. simpl. by rewrite elements_singleton. Qed.
 Lemma size_singleton_inv X x y : size X = 1 → x ∈ X → y ∈ X → x = y.
 Proof.
   unfold size, collection_size. simpl. rewrite <-!elem_of_elements.
-- 
GitLab