|
|
|
|
From stdpp Require Import gmap.
|
|
|
|
|
From stdpp Require Export relations orders.
|
|
|
|
|
|
|
|
|
|
(** * Finite sets *)
|
|
|
|
|
(** This file provides lemmas on finite sets [gset].
|
|
|
|
|
The stdpp library provides a definitions and lemmas on finite sets [gset], but states lemmas axiomatically in terms of the [FinSet] typeclass, which may make them hard to read for novice users of stdpp.
|
|
|
|
|
We therefore instantiate the most important lemmas specifically for [gset] to make the statements easier to comprehend.
|
|
|
|
|
|
|
|
|
|
The most important operations are:
|
|
|
|
|
- the empty set ∅ defines a set with no elements
|
|
|
|
|
- the singleton set {[ x ]} defines a singleton set
|
|
|
|
|
- the union operation X ∪ Y represents the union of two sets
|
|
|
|
|
- the intersection operation X ∩ Y represents the union of two sets
|
|
|
|
|
- the difference operation X ∖ Y represents the difference (Note: this is NOT a backslash. Pay attention to use the right unicode symbol.)
|
|
|
|
|
- the subset predicate X ⊆ Y states that X is a subset of Y
|
|
|
|
|
- the element predicate x ∈ X states that x is an element of X
|
|
|
|
|
- the elements operation elements X gives a duplicate-free list of elements of X
|
|
|
|
|
|
|
|
|
|
stdpp's sets satisfy extensional Leibniz equality -- that is, two sets X and Y are equal (X = Y) iff they contain the same elements.
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
|
|
Section sets.
|
|
|
|
|
Context {K} {A : Type} `{Countable K}.
|
|
|
|
|
|
|
|
|
|
Definition gset := gset.
|
|
|
|
|
#[global]
|
|
|
|
|
Arguments gset _ {_ _}.
|
|
|
|
|
|
|
|
|
|
Implicit Types (X Y : gset K).
|
|
|
|
|
|
|
|
|
|
Lemma elem_of_singleton x y : x ∈ ({[ y ]} : gset K) ↔ x = y.
|
|
|
|
|
Proof. apply elem_of_singleton. Qed.
|
|
|
|
|
Lemma elem_of_union X Y x : x ∈ X ∪ Y ↔ x ∈ X ∨ x ∈ Y.
|
|
|
|
|
Proof. apply elem_of_union. Qed.
|
|
|
|
|
Lemma elem_of_intersection X Y x : x ∈ X ∩ Y ↔ x ∈ X ∧ x ∈ Y.
|
|
|
|
|
Proof. apply elem_of_intersection. Qed.
|
|
|
|
|
Lemma elem_of_difference X Y x : x ∈ X ∖ Y ↔ x ∈ X ∧ x ∉ Y.
|
|
|
|
|
Proof. apply elem_of_difference. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma elem_of_elements X x : x ∈ elements X ↔ x ∈ X.
|
|
|
|
|
Proof. apply elem_of_elements. Qed.
|
|
|
|
|
Lemma elements_empty : elements (∅ : gset K) = [].
|
|
|
|
|
Proof. apply elements_empty. Qed.
|
|
|
|
|
Lemma elements_empty_iff X : elements X = [] ↔ X = ∅.
|
|
|
|
|
Proof. rewrite elements_empty_iff. by rewrite leibniz_equiv_iff. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma set_equiv X Y : X = Y ↔ ∀ x, x ∈ X ↔ x ∈ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma set_equiv_subseteq X Y : X = Y ↔ X ⊆ Y ∧ Y ⊆ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
(** Subset relation *)
|
|
|
|
|
Lemma subseteq_union X Y : X ⊆ Y ↔ X ∪ Y = Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma subseteq_union_1 X Y : X ⊆ Y → X ∪ Y = Y.
|
|
|
|
|
Proof. by rewrite subseteq_union. Qed.
|
|
|
|
|
Lemma subseteq_union_2 X Y : X ∪ Y = Y → X ⊆ Y.
|
|
|
|
|
Proof. by rewrite subseteq_union. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma union_subseteq_l X Y : X ⊆ X ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_subseteq_l' X X' Y : X ⊆ X' → X ⊆ X' ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_subseteq_r X Y : Y ⊆ X ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_subseteq_r' X Y Y' : Y ⊆ Y' → Y ⊆ X ∪ Y'.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_least X Y Z : X ⊆ Z → Y ⊆ Z → X ∪ Y ⊆ Z.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma elem_of_subseteq X Y : X ⊆ Y ↔ ∀ x, x ∈ X → x ∈ Y.
|
|
|
|
|
Proof. done. Qed.
|
|
|
|
|
Lemma elem_of_subset X Y : X ⊂ Y ↔ (∀ x, x ∈ X → x ∈ Y) ∧ ¬(∀ x, x ∈ Y → x ∈ X).
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma elem_of_weaken x X Y : x ∈ X → X ⊆ Y → x ∈ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma not_elem_of_weaken x X Y : x ∉ Y → X ⊆ Y → x ∉ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
(** Union *)
|
|
|
|
|
Lemma union_subseteq X Y Z : X ∪ Y ⊆ Z ↔ X ⊆ Z ∧ Y ⊆ Z.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma not_elem_of_union x X Y : x ∉ X ∪ Y ↔ x ∉ X ∧ x ∉ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma elem_of_union_l x X Y : x ∈ X → x ∈ X ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma elem_of_union_r x X Y : x ∈ Y → x ∈ X ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_mono_l X Y1 Y2 : Y1 ⊆ Y2 → X ∪ Y1 ⊆ X ∪ Y2.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_mono_r X1 X2 Y : X1 ⊆ X2 → X1 ∪ Y ⊆ X2 ∪ Y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_mono X1 X2 Y1 Y2 : X1 ⊆ X2 → Y1 ⊆ Y2 → X1 ∪ Y1 ⊆ X2 ∪ Y2.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma empty_union X Y : X ∪ Y = ∅ ↔ X = ∅ ∧ Y = ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
(** Empty *)
|
|
|
|
|
Lemma empty_subseteq X : ∅ ⊆ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma elem_of_equiv_empty X : X = ∅ ↔ ∀ x, x ∉ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma elem_of_empty x : x ∈ (∅ : gset K) ↔ False.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma equiv_empty X : X ⊆ ∅ → X = ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_positive_l X Y : X ∪ Y ≡ ∅ → X ≡ ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma union_positive_l_alt X Y : X ≢ ∅ → X ∪ Y ≢ ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma non_empty_inhabited x X : x ∈ X → X ≢ ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
(** Singleton *)
|
|
|
|
|
Lemma elem_of_singleton_1 x y : x ∈ ({[y]} : gset K) → x = y.
|
|
|
|
|
Proof. by rewrite elem_of_singleton. Qed.
|
|
|
|
|
Lemma elem_of_singleton_2 x y : x = y → x ∈ ({[y]} : gset K).
|
|
|
|
|
Proof. by rewrite elem_of_singleton. Qed.
|
|
|
|
|
Lemma elem_of_subseteq_singleton x X : x ∈ X ↔ {[ x ]} ⊆ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma non_empty_singleton x : ({[ x ]} : gset K) ≠ ∅.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma not_elem_of_singleton x y : x ∉ ({[ y ]} : gset K) ↔ x ≠ y.
|
|
|
|
|
Proof. by rewrite elem_of_singleton. Qed.
|
|
|
|
|
Lemma not_elem_of_singleton_1 x y : x ∉ ({[ y ]} : gset K) → x ≠ y.
|
|
|
|
|
Proof. apply not_elem_of_singleton. Qed.
|
|
|
|
|
Lemma not_elem_of_singleton_2 x y : x ≠ y → x ∉ ({[ y ]} : gset K).
|
|
|
|
|
Proof. apply not_elem_of_singleton. Qed.
|
|
|
|
|
|
|
|
|
|
Lemma singleton_subseteq_l x X : {[ x ]} ⊆ X ↔ x ∈ X.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
Lemma singleton_subseteq x y : ({[ x ]} : gset K) ⊆ {[ y ]} ↔ x = y.
|
|
|
|
|
Proof. set_solver. Qed.
|
|
|
|
|
|
|
|
|
|
End sets.
|