Module docstring
{"# Erasing duplicates in a multiset. ","### dedup "}
{"# Erasing duplicates in a multiset. ","### dedup "}
Multiset.dedup
definition
(s : Multiset α) : Multiset α
/-- `dedup s` removes duplicates from `s`, yielding a `nodup` multiset. -/
def dedup (s : Multiset α) : Multiset α :=
Quot.liftOn s (fun l => (l.dedup : Multiset α)) fun _ _ p => Quot.sound p.dedup
Multiset.coe_dedup
theorem
(l : List α) : @dedup α _ l = l.dedup
Multiset.dedup_zero
theorem
: @dedup α _ 0 = 0
@[simp]
theorem dedup_zero : @dedup α _ 0 = 0 :=
rfl
Multiset.mem_dedup
theorem
{a : α} {s : Multiset α} : a ∈ dedup s ↔ a ∈ s
@[simp]
theorem mem_dedup {a : α} {s : Multiset α} : a ∈ dedup sa ∈ dedup s ↔ a ∈ s :=
Quot.induction_on s fun _ => List.mem_dedup
Multiset.dedup_cons_of_mem
theorem
{a : α} {s : Multiset α} : a ∈ s → dedup (a ::ₘ s) = dedup s
@[simp]
theorem dedup_cons_of_mem {a : α} {s : Multiset α} : a ∈ s → dedup (a ::ₘ s) = dedup s :=
Quot.induction_on s fun _ m => @congr_arg _ _ _ _ ofList <| List.dedup_cons_of_mem m
Multiset.dedup_cons_of_not_mem
theorem
{a : α} {s : Multiset α} : a ∉ s → dedup (a ::ₘ s) = a ::ₘ dedup s
@[simp]
theorem dedup_cons_of_not_mem {a : α} {s : Multiset α} : a ∉ s → dedup (a ::ₘ s) = a ::ₘ dedup s :=
Quot.induction_on s fun _ m => congr_arg ofList <| List.dedup_cons_of_not_mem m
Multiset.dedup_le
theorem
(s : Multiset α) : dedup s ≤ s
theorem dedup_le (s : Multiset α) : dedup s ≤ s :=
Quot.induction_on s fun _ => (dedup_sublist _).subperm
Multiset.dedup_subset
theorem
(s : Multiset α) : dedup s ⊆ s
theorem dedup_subset (s : Multiset α) : dedupdedup s ⊆ s :=
subset_of_le <| dedup_le _
Multiset.subset_dedup
theorem
(s : Multiset α) : s ⊆ dedup s
theorem subset_dedup (s : Multiset α) : s ⊆ dedup s := fun _ => mem_dedup.2
Multiset.dedup_subset'
theorem
{s t : Multiset α} : dedup s ⊆ t ↔ s ⊆ t
@[simp]
theorem dedup_subset' {s t : Multiset α} : dedupdedup s ⊆ tdedup s ⊆ t ↔ s ⊆ t :=
⟨Subset.trans (subset_dedup _), Subset.trans (dedup_subset _)⟩
Multiset.subset_dedup'
theorem
{s t : Multiset α} : s ⊆ dedup t ↔ s ⊆ t
@[simp]
theorem subset_dedup' {s t : Multiset α} : s ⊆ dedup ts ⊆ dedup t ↔ s ⊆ t :=
⟨fun h => Subset.trans h (dedup_subset _), fun h => Subset.trans h (subset_dedup _)⟩
Multiset.nodup_dedup
theorem
(s : Multiset α) : Nodup (dedup s)
@[simp]
theorem nodup_dedup (s : Multiset α) : Nodup (dedup s) :=
Quot.induction_on s List.nodup_dedup
Multiset.dedup_eq_self
theorem
{s : Multiset α} : dedup s = s ↔ Nodup s
theorem dedup_eq_self {s : Multiset α} : dedupdedup s = s ↔ Nodup s :=
⟨fun e => e ▸ nodup_dedup s, Quot.induction_on s fun _ h => congr_arg ofList h.dedup⟩
Multiset.count_dedup
theorem
(m : Multiset α) (a : α) : m.dedup.count a = if a ∈ m then 1 else 0
theorem count_dedup (m : Multiset α) (a : α) : m.dedup.count a = if a ∈ m then 1 else 0 :=
Quot.induction_on m fun _ => by
simp only [quot_mk_to_coe'', coe_dedup, mem_coe, List.mem_dedup, coe_nodup, coe_count]
apply List.count_dedup _ _
Multiset.dedup_idem
theorem
{m : Multiset α} : m.dedup.dedup = m.dedup
@[simp]
theorem dedup_idem {m : Multiset α} : m.dedup.dedup = m.dedup :=
Quot.induction_on m fun _ => @congr_arg _ _ _ _ ofList List.dedup_idem
Multiset.dedup_eq_zero
theorem
{s : Multiset α} : dedup s = 0 ↔ s = 0
theorem dedup_eq_zero {s : Multiset α} : dedupdedup s = 0 ↔ s = 0 :=
⟨fun h => eq_zero_of_subset_zero <| h ▸ subset_dedup _, fun h => h.symm ▸ dedup_zero⟩
Multiset.dedup_singleton
theorem
{a : α} : dedup ({ a } : Multiset α) = { a }
@[simp]
theorem dedup_singleton {a : α} : dedup ({a} : Multiset α) = {a} :=
(nodup_singleton _).dedup
Multiset.le_dedup
theorem
{s t : Multiset α} : s ≤ dedup t ↔ s ≤ t ∧ Nodup s
Multiset.le_dedup_self
theorem
{s : Multiset α} : s ≤ dedup s ↔ Nodup s
theorem le_dedup_self {s : Multiset α} : s ≤ dedup s ↔ Nodup s := by
rw [le_dedup, and_iff_right le_rfl]
Multiset.dedup_ext
theorem
{s t : Multiset α} : dedup s = dedup t ↔ ∀ a, a ∈ s ↔ a ∈ t
theorem dedup_ext {s t : Multiset α} : dedupdedup s = dedup t ↔ ∀ a, a ∈ s ↔ a ∈ t := by
simp [Nodup.ext]
Multiset.dedup_map_of_injective
theorem
[DecidableEq β] {f : α → β} (hf : Function.Injective f) (s : Multiset α) : (s.map f).dedup = s.dedup.map f
theorem dedup_map_of_injective [DecidableEq β] {f : α → β} (hf : Function.Injective f)
(s : Multiset α) :
(s.map f).dedup = s.dedup.map f :=
Quot.induction_on s fun l => by simp [List.dedup_map_of_injective hf l]
Multiset.dedup_map_dedup_eq
theorem
[DecidableEq β] (f : α → β) (s : Multiset α) : dedup (map f (dedup s)) = dedup (map f s)
theorem dedup_map_dedup_eq [DecidableEq β] (f : α → β) (s : Multiset α) :
dedup (map f (dedup s)) = dedup (map f s) := by
simp [dedup_ext]
Multiset.Nodup.le_dedup_iff_le
theorem
{s t : Multiset α} (hno : s.Nodup) : s ≤ t.dedup ↔ s ≤ t
theorem Nodup.le_dedup_iff_le {s t : Multiset α} (hno : s.Nodup) : s ≤ t.dedup ↔ s ≤ t := by
simp [le_dedup, hno]
Multiset.Subset.dedup_add_right
theorem
{s t : Multiset α} (h : s ⊆ t) : dedup (s + t) = dedup t
theorem Subset.dedup_add_right {s t : Multiset α} (h : s ⊆ t) :
dedup (s + t) = dedup t := by
induction s, t using Quot.induction_on₂
exact congr_arg ((↑) : List α → Multiset α) <| List.Subset.dedup_append_right h
Multiset.Subset.dedup_add_left
theorem
{s t : Multiset α} (h : t ⊆ s) : dedup (s + t) = dedup s
theorem Subset.dedup_add_left {s t : Multiset α} (h : t ⊆ s) :
dedup (s + t) = dedup s := by
rw [s.add_comm, Subset.dedup_add_right h]
Multiset.Disjoint.dedup_add
theorem
{s t : Multiset α} (h : Disjoint s t) : dedup (s + t) = dedup s + dedup t
theorem Disjoint.dedup_add {s t : Multiset α} (h : Disjoint s t) :
dedup (s + t) = dedup s + dedup t := by
induction s, t using Quot.induction_on₂
exact congr_arg ((↑) : List α → Multiset α) <| List.Disjoint.dedup_append (by simpa using h)
List.Subset.dedup_append_left
theorem
{s t : List α} (h : t ⊆ s) : List.dedup (s ++ t) ~ List.dedup s
/-- Note that the stronger `List.Subset.dedup_append_right` is proved earlier. -/
theorem _root_.List.Subset.dedup_append_left {s t : List α} (h : t ⊆ s) :
List.dedupList.dedup (s ++ t) ~ List.dedup s := by
rw [← coe_eq_coe, ← coe_dedup, ← coe_add, Subset.dedup_add_left h, coe_dedup]