Library zoo.common.gmultiset
Require Export stdpp.gmultiset.
Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.options.
Section basic.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Lemma gmultisetーemptyーelem_of X :
X = ∅ ↔
∀ x,
x ∉ X.
Lemma gmultisetーdisj_unionーempty X1 X2 :
X1 ⊎ X2 = ∅ ↔
X1 = ∅ ∧
X2 = ∅.
Lemma gmultisetーdisj_unionーemptyーinv X1 X2 :
X1 ⊎ X2 = ∅ →
X1 = ∅ ∧
X2 = ∅.
Lemma elem_ofーgmultisetーdisj_unionーl x X1 X2 :
x ∈ X1 →
x ∈ X1 ⊎ X2.
Lemma elem_ofーgmultisetーdisj_unionーr x X1 X2 :
x ∈ X2 →
x ∈ X1 ⊎ X2.
End basic.
Section size.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Lemma gmultisetーsizeーsingletonーinv X x y :
size X = 1 →
x ∈ X →
y ∈ X →
x = y.
Lemma gmultisetーsizeー1ーelem_of X :
size X = 1 →
∃ x,
X = {[+x+]}.
Lemma gmultisetーelem_ofーsizeーnon_empty x X :
x ∈ X →
size X ≠ 0.
End size.
Section map.
Context `{Countable A}.
Context `{Countable B}.
Context (f : A → B).
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Implicit Type 𝑋 𝑌 : gmultiset B.
Lemma gmultisetーsizeーmap X :
size (gmultiset_map f X) = size X.
Lemma gmultiset_mapーemptyーinv X :
gmultiset_map f X = ∅ →
X = ∅.
Lemma gmultiset_mapーsingletonーinv X 𝑥 :
gmultiset_map f X = {[+𝑥+]} →
∃ x,
X = {[+x+]} ∧
𝑥 = f x.
Lemma gmultiset_mapーdisj_unionーinv X 𝑋1 𝑋2 :
gmultiset_map f X = 𝑋1 ⊎ 𝑋2 →
∃ X1 X2,
X = X1 ⊎ X2 ∧
𝑋1 = gmultiset_map f X1 ∧
𝑋2 = gmultiset_map f X2.
Lemma gmultiset_mapーdisj_unionーsingletonーlーinv X 𝑥 𝑋 :
gmultiset_map f X = {[+𝑥+]} ⊎ 𝑋 →
∃ x X',
X = {[+x+]} ⊎ X' ∧
𝑥 = f x ∧
𝑋 = gmultiset_map f X'.
Lemma gmultiset_mapーdisj_unionーsingletonーrーinv X 𝑥 𝑋 :
gmultiset_map f X = 𝑋 ⊎ {[+𝑥+]} →
∃ X' x,
X = X' ⊎ {[+x+]} ∧
𝑋 = gmultiset_map f X' ∧
𝑥 = f x.
End map.
Section list_to_set_disj.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type l : list A.
Lemma list_to_set_disjーempty l :
list_to_set_disj l =@{gmultiset _} ∅ ↔
l = [].
Lemma list_to_set_disjーsnoc l x :
list_to_set_disj (l ++ [x]) =@{gmultiset _} {[+x+]} ⊎ list_to_set_disj l.
End list_to_set_disj.
Section disj_union_list.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Implicit Type Xs Ys : list $ gmultiset A.
Lemma gmultisetーdisj_union_listーempty Xs :
⋃+ Xs = ∅ ↔
∀ X,
X ∈ Xs →
X = ∅.
Lemma gmultisetーdisj_union_listーreplicateーempty n :
⋃+ replicate n ∅ =@{gmultiset A} ∅.
Lemma gmultisetーdisj_union_listーdelete Xs i X :
Xs !! i = Some X →
⋃+ (delete i Xs) = ⋃+ Xs ∖ X.
Lemma gmultisetーdisj_union_listーdelete' Xs i X :
Xs !! i = Some X →
⋃+ Xs = X ⊎ ⋃+ (delete i Xs).
Lemma gmultisetーdisj_union_listーinsert Xs i X :
is_Some (Xs !! i) →
⋃+ <[i := X]> Xs = X ⊎ ⋃+ (delete i Xs).
Lemma gmultisetーdisj_union_listーinsertーid Xs i X :
Xs !! i = Some X →
⋃+ <[i := X]> Xs = ⋃+ Xs.
Lemma gmultisetーdisj_union_listーinsertーdisj_unionーl Xs i X1 X2 :
Xs !! i = Some X2 →
⋃+ <[i := X1 ⊎ X2]> Xs = X1 ⊎ ⋃+ Xs.
Lemma gmultisetーdisj_union_listーinsertーdisj_unionーr Xs i X1 X2 :
Xs !! i = Some X1 →
⋃+ <[i := X1 ⊎ X2]> Xs = X2 ⊎ ⋃+ Xs.
End disj_union_list.
Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.options.
Section basic.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Lemma gmultisetーemptyーelem_of X :
X = ∅ ↔
∀ x,
x ∉ X.
Lemma gmultisetーdisj_unionーempty X1 X2 :
X1 ⊎ X2 = ∅ ↔
X1 = ∅ ∧
X2 = ∅.
Lemma gmultisetーdisj_unionーemptyーinv X1 X2 :
X1 ⊎ X2 = ∅ →
X1 = ∅ ∧
X2 = ∅.
Lemma elem_ofーgmultisetーdisj_unionーl x X1 X2 :
x ∈ X1 →
x ∈ X1 ⊎ X2.
Lemma elem_ofーgmultisetーdisj_unionーr x X1 X2 :
x ∈ X2 →
x ∈ X1 ⊎ X2.
End basic.
Section size.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Lemma gmultisetーsizeーsingletonーinv X x y :
size X = 1 →
x ∈ X →
y ∈ X →
x = y.
Lemma gmultisetーsizeー1ーelem_of X :
size X = 1 →
∃ x,
X = {[+x+]}.
Lemma gmultisetーelem_ofーsizeーnon_empty x X :
x ∈ X →
size X ≠ 0.
End size.
Section map.
Context `{Countable A}.
Context `{Countable B}.
Context (f : A → B).
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Implicit Type 𝑋 𝑌 : gmultiset B.
Lemma gmultisetーsizeーmap X :
size (gmultiset_map f X) = size X.
Lemma gmultiset_mapーemptyーinv X :
gmultiset_map f X = ∅ →
X = ∅.
Lemma gmultiset_mapーsingletonーinv X 𝑥 :
gmultiset_map f X = {[+𝑥+]} →
∃ x,
X = {[+x+]} ∧
𝑥 = f x.
Lemma gmultiset_mapーdisj_unionーinv X 𝑋1 𝑋2 :
gmultiset_map f X = 𝑋1 ⊎ 𝑋2 →
∃ X1 X2,
X = X1 ⊎ X2 ∧
𝑋1 = gmultiset_map f X1 ∧
𝑋2 = gmultiset_map f X2.
Lemma gmultiset_mapーdisj_unionーsingletonーlーinv X 𝑥 𝑋 :
gmultiset_map f X = {[+𝑥+]} ⊎ 𝑋 →
∃ x X',
X = {[+x+]} ⊎ X' ∧
𝑥 = f x ∧
𝑋 = gmultiset_map f X'.
Lemma gmultiset_mapーdisj_unionーsingletonーrーinv X 𝑥 𝑋 :
gmultiset_map f X = 𝑋 ⊎ {[+𝑥+]} →
∃ X' x,
X = X' ⊎ {[+x+]} ∧
𝑋 = gmultiset_map f X' ∧
𝑥 = f x.
End map.
Section list_to_set_disj.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type l : list A.
Lemma list_to_set_disjーempty l :
list_to_set_disj l =@{gmultiset _} ∅ ↔
l = [].
Lemma list_to_set_disjーsnoc l x :
list_to_set_disj (l ++ [x]) =@{gmultiset _} {[+x+]} ⊎ list_to_set_disj l.
End list_to_set_disj.
Section disj_union_list.
Context `{Countable A}.
Implicit Type x y : A.
Implicit Type X Y : gmultiset A.
Implicit Type Xs Ys : list $ gmultiset A.
Lemma gmultisetーdisj_union_listーempty Xs :
⋃+ Xs = ∅ ↔
∀ X,
X ∈ Xs →
X = ∅.
Lemma gmultisetーdisj_union_listーreplicateーempty n :
⋃+ replicate n ∅ =@{gmultiset A} ∅.
Lemma gmultisetーdisj_union_listーdelete Xs i X :
Xs !! i = Some X →
⋃+ (delete i Xs) = ⋃+ Xs ∖ X.
Lemma gmultisetーdisj_union_listーdelete' Xs i X :
Xs !! i = Some X →
⋃+ Xs = X ⊎ ⋃+ (delete i Xs).
Lemma gmultisetーdisj_union_listーinsert Xs i X :
is_Some (Xs !! i) →
⋃+ <[i := X]> Xs = X ⊎ ⋃+ (delete i Xs).
Lemma gmultisetーdisj_union_listーinsertーid Xs i X :
Xs !! i = Some X →
⋃+ <[i := X]> Xs = ⋃+ Xs.
Lemma gmultisetーdisj_union_listーinsertーdisj_unionーl Xs i X1 X2 :
Xs !! i = Some X2 →
⋃+ <[i := X1 ⊎ X2]> Xs = X1 ⊎ ⋃+ Xs.
Lemma gmultisetーdisj_union_listーinsertーdisj_unionーr Xs i X1 X2 :
Xs !! i = Some X1 →
⋃+ <[i := X1 ⊎ X2]> Xs = X2 ⊎ ⋃+ Xs.
End disj_union_list.