Module docstring
{"# Deduplicating Multisets to make Finsets
This file concerns Multiset.dedup and List.dedup as a way to create Finsets.
Tags
finite sets, finset
","### dedup on list and multiset "}
{"# Deduplicating Multisets to make Finsets
This file concerns Multiset.dedup and List.dedup as a way to create Finsets.
finite sets, finset
","### dedup on list and multiset "}
Finset.dedup_eq_self
theorem
[DecidableEq α] (s : Finset α) : dedup s.1 = s.1
@[simp]
theorem dedup_eq_self [DecidableEq α] (s : Finset α) : dedup s.1 = s.1 :=
s.2.dedup
Multiset.toFinset
definition
(s : Multiset α) : Finset α
/-- `toFinset s` removes duplicates from the multiset `s` to produce a finset. -/
def toFinset (s : Multiset α) : Finset α :=
⟨_, nodup_dedup s⟩
Multiset.toFinset_val
theorem
(s : Multiset α) : s.toFinset.1 = s.dedup
Multiset.toFinset_eq
theorem
{s : Multiset α} (n : Nodup s) : Finset.mk s n = s.toFinset
theorem toFinset_eq {s : Multiset α} (n : Nodup s) : Finset.mk s n = s.toFinset :=
Finset.val_inj.1 n.dedup.symm
Multiset.Nodup.toFinset_inj
theorem
{l l' : Multiset α} (hl : Nodup l) (hl' : Nodup l') (h : l.toFinset = l'.toFinset) : l = l'
theorem Nodup.toFinset_inj {l l' : Multiset α} (hl : Nodup l) (hl' : Nodup l')
(h : l.toFinset = l'.toFinset) : l = l' := by
simpa [← toFinset_eq hl, ← toFinset_eq hl'] using h
Multiset.mem_toFinset
theorem
{a : α} {s : Multiset α} : a ∈ s.toFinset ↔ a ∈ s
@[simp]
theorem mem_toFinset {a : α} {s : Multiset α} : a ∈ s.toFinseta ∈ s.toFinset ↔ a ∈ s :=
mem_dedup
Multiset.toFinset_subset
theorem
: s.toFinset ⊆ t.toFinset ↔ s ⊆ t
@[simp]
theorem toFinset_subset : s.toFinset ⊆ t.toFinsets.toFinset ⊆ t.toFinset ↔ s ⊆ t := by
simp only [Finset.subset_iff, Multiset.subset_iff, Multiset.mem_toFinset]
Multiset.toFinset_ssubset
theorem
: s.toFinset ⊂ t.toFinset ↔ s ⊂ t
@[simp]
theorem toFinset_ssubset : s.toFinset ⊂ t.toFinsets.toFinset ⊂ t.toFinset ↔ s ⊂ t := by
simp_rw [Finset.ssubset_def, toFinset_subset]
rfl
Multiset.toFinset_dedup
theorem
(m : Multiset α) : m.dedup.toFinset = m.toFinset
@[simp]
theorem toFinset_dedup (m : Multiset α) : m.dedup.toFinset = m.toFinset := by
simp_rw [toFinset, dedup_idem]
Multiset.isWellFounded_ssubset
instance
: IsWellFounded (Multiset β) (· ⊂ ·)
instance isWellFounded_ssubset : IsWellFounded (Multiset β) (· ⊂ ·) := by
classical
exact Subrelation.isWellFounded (InvImage _ toFinset) toFinset_ssubset.2
Finset.val_toFinset
theorem
[DecidableEq α] (s : Finset α) : s.val.toFinset = s
@[simp]
theorem val_toFinset [DecidableEq α] (s : Finset α) : s.val.toFinset = s := by
ext
rw [Multiset.mem_toFinset, ← mem_def]
Finset.val_le_iff_val_subset
theorem
{a : Finset α} {b : Multiset α} : a.val ≤ b ↔ a.val ⊆ b
theorem val_le_iff_val_subset {a : Finset α} {b : Multiset α} : a.val ≤ b ↔ a.val ⊆ b :=
Multiset.le_iff_subset a.nodup
List.toFinset
definition
(l : List α) : Finset α
/-- `toFinset l` removes duplicates from the list `l` to produce a finset. -/
def toFinset (l : List α) : Finset α :=
Multiset.toFinset l
List.toFinset_val
theorem
(l : List α) : l.toFinset.1 = (l.dedup : Multiset α)
List.toFinset_coe
theorem
(l : List α) : (l : Multiset α).toFinset = l.toFinset
List.toFinset_eq
theorem
(n : Nodup l) : @Finset.mk α l n = l.toFinset
theorem toFinset_eq (n : Nodup l) : @Finset.mk α l n = l.toFinset :=
Multiset.toFinset_eq <| by rwa [Multiset.coe_nodup]
List.mem_toFinset
theorem
: a ∈ l.toFinset ↔ a ∈ l
@[simp]
theorem mem_toFinset : a ∈ l.toFinseta ∈ l.toFinset ↔ a ∈ l :=
mem_dedup
List.coe_toFinset
theorem
(l : List α) : (l.toFinset : Set α) = {a | a ∈ l}
@[simp, norm_cast]
theorem coe_toFinset (l : List α) : (l.toFinset : Set α) = { a | a ∈ l } :=
Set.ext fun _ => List.mem_toFinset
List.toFinset_surj_on
theorem
: Set.SurjOn toFinset {l : List α | l.Nodup} Set.univ
theorem toFinset_surj_on : Set.SurjOn toFinset { l : List α | l.Nodup } Set.univ := by
rintro ⟨⟨l⟩, hl⟩ _
exact ⟨l, hl, (toFinset_eq hl).symm⟩
List.toFinset_surjective
theorem
: Surjective (toFinset : List α → Finset α)
theorem toFinset_surjective : Surjective (toFinset : List α → Finset α) := fun s =>
let ⟨l, _, hls⟩ := toFinset_surj_on (Set.mem_univ s)
⟨l, hls⟩
List.toFinset_eq_iff_perm_dedup
theorem
: l.toFinset = l'.toFinset ↔ l.dedup ~ l'.dedup
theorem toFinset_eq_iff_perm_dedup : l.toFinset = l'.toFinset ↔ l.dedup ~ l'.dedup := by
simp [Finset.ext_iff, perm_ext_iff_of_nodup (nodup_dedup _) (nodup_dedup _)]
List.toFinset.ext_iff
theorem
{a b : List α} : a.toFinset = b.toFinset ↔ ∀ x, x ∈ a ↔ x ∈ b
theorem toFinset.ext_iff {a b : List α} : a.toFinset = b.toFinset ↔ ∀ x, x ∈ a ↔ x ∈ b := by
simp only [Finset.ext_iff, mem_toFinset]
List.toFinset.ext
theorem
: (∀ x, x ∈ l ↔ x ∈ l') → l.toFinset = l'.toFinset
theorem toFinset.ext : (∀ x, x ∈ lx ∈ l ↔ x ∈ l') → l.toFinset = l'.toFinset :=
toFinset.ext_iff.mpr
List.toFinset_eq_of_perm
theorem
(l l' : List α) (h : l ~ l') : l.toFinset = l'.toFinset
theorem toFinset_eq_of_perm (l l' : List α) (h : l ~ l') : l.toFinset = l'.toFinset :=
toFinset_eq_iff_perm_dedup.mpr h.dedup
List.perm_of_nodup_nodup_toFinset_eq
theorem
(hl : Nodup l) (hl' : Nodup l') (h : l.toFinset = l'.toFinset) : l ~ l'
theorem perm_of_nodup_nodup_toFinset_eq (hl : Nodup l) (hl' : Nodup l')
(h : l.toFinset = l'.toFinset) : l ~ l' := by
rw [← Multiset.coe_eq_coe]
exact Multiset.Nodup.toFinset_inj hl hl' h
List.toFinset_reverse
theorem
{l : List α} : toFinset l.reverse = l.toFinset
@[simp]
theorem toFinset_reverse {l : List α} : toFinset l.reverse = l.toFinset :=
toFinset_eq_of_perm _ _ (reverse_perm l)
Finset.toList
definition
(s : Finset α) : List α
Finset.nodup_toList
theorem
(s : Finset α) : s.toList.Nodup
theorem nodup_toList (s : Finset α) : s.toList.Nodup := by
rw [toList, ← Multiset.coe_nodup, Multiset.coe_toList]
exact s.nodup
Finset.mem_toList
theorem
{a : α} {s : Finset α} : a ∈ s.toList ↔ a ∈ s
@[simp]
theorem mem_toList {a : α} {s : Finset α} : a ∈ s.toLista ∈ s.toList ↔ a ∈ s :=
Multiset.mem_toList
Finset.coe_toList
theorem
(s : Finset α) : (s.toList : Multiset α) = s.val
@[simp, norm_cast]
theorem coe_toList (s : Finset α) : (s.toList : Multiset α) = s.val :=
s.val.coe_toList
Finset.toList_toFinset
theorem
[DecidableEq α] (s : Finset α) : s.toList.toFinset = s
@[simp]
theorem toList_toFinset [DecidableEq α] (s : Finset α) : s.toList.toFinset = s := by
ext
simp
List.toFinset_toList
theorem
[DecidableEq α] {s : List α} (hs : s.Nodup) : s.toFinset.toList.Perm s
theorem _root_.List.toFinset_toList [DecidableEq α] {s : List α} (hs : s.Nodup) :
s.toFinset.toList.Perm s := by
apply List.perm_of_nodup_nodup_toFinset_eq (nodup_toList _) hs
rw [toList_toFinset]
Finset.exists_list_nodup_eq
theorem
[DecidableEq α] (s : Finset α) : ∃ l : List α, l.Nodup ∧ l.toFinset = s
theorem exists_list_nodup_eq [DecidableEq α] (s : Finset α) :
∃ l : List α, l.Nodup ∧ l.toFinset = s :=
⟨s.toList, s.nodup_toList, s.toList_toFinset⟩