Documentation

Mathlib.Data.Multiset.AddSub

Sum and difference of multisets #

This file defines the following operations on multisets:

Notation (defined later) #

Additive monoid #

def Multiset.add {α : Type u_1} (s₁ s₂ : Multiset α) :

The sum of two multisets is the lift of the list append operation. This adds the multiplicities of each element, i.e. count a (s + t) = count a s + count a t.

Equations
instance Multiset.instAdd {α : Type u_1} :
Equations
@[simp]
theorem Multiset.coe_add {α : Type u_1} (s t : List α) :
s + t = ↑(s ++ t)
@[simp]
theorem Multiset.singleton_add {α : Type u_1} (a : α) (s : Multiset α) :
{a} + s = a ::ₘ s
theorem Multiset.add_le_add_iff_left {α : Type u_1} {s t u : Multiset α} :
s + t s + u t u
theorem Multiset.add_le_add_iff_right {α : Type u_1} {s t u : Multiset α} :
s + u t + u s t
theorem Multiset.le_of_add_le_add_left {α : Type u_1} {s t u : Multiset α} :
s + t s + ut u

Alias of the forward direction of Multiset.add_le_add_iff_left.

theorem Multiset.add_le_add_left {α : Type u_1} {s t u : Multiset α} :
t us + t s + u

Alias of the reverse direction of Multiset.add_le_add_iff_left.

theorem Multiset.le_of_add_le_add_right {α : Type u_1} {s t u : Multiset α} :
s + u t + us t

Alias of the forward direction of Multiset.add_le_add_iff_right.

theorem Multiset.add_le_add_right {α : Type u_1} {s t u : Multiset α} :
s ts + u t + u

Alias of the reverse direction of Multiset.add_le_add_iff_right.

theorem Multiset.add_comm {α : Type u_1} (s t : Multiset α) :
s + t = t + s
theorem Multiset.add_assoc {α : Type u_1} (s t u : Multiset α) :
s + t + u = s + (t + u)
@[simp]
theorem Multiset.zero_add {α : Type u_1} (s : Multiset α) :
0 + s = s
@[simp]
theorem Multiset.add_zero {α : Type u_1} (s : Multiset α) :
s + 0 = s
theorem Multiset.le_add_right {α : Type u_1} (s t : Multiset α) :
s s + t
theorem Multiset.le_add_left {α : Type u_1} (s t : Multiset α) :
s t + s
theorem Multiset.subset_add_left {α : Type u_1} {s t : Multiset α} :
s s + t
theorem Multiset.subset_add_right {α : Type u_1} {s t : Multiset α} :
s t + s
theorem Multiset.le_iff_exists_add {α : Type u_1} {s t : Multiset α} :
s t ∃ (u : Multiset α), t = s + u
@[simp]
theorem Multiset.cons_add {α : Type u_1} (a : α) (s t : Multiset α) :
a ::ₘ s + t = a ::ₘ (s + t)
@[simp]
theorem Multiset.add_cons {α : Type u_1} (a : α) (s t : Multiset α) :
s + a ::ₘ t = a ::ₘ (s + t)
@[simp]
theorem Multiset.mem_add {α : Type u_1} {a : α} {s t : Multiset α} :
a s + t a s a t
@[simp]
theorem Multiset.countP_add {α : Type u_1} (p : αProp) [DecidablePred p] (s t : Multiset α) :
countP p (s + t) = countP p s + countP p t
@[simp]
theorem Multiset.count_add {α : Type u_1} [DecidableEq α] (a : α) (s t : Multiset α) :
count a (s + t) = count a s + count a t
theorem Multiset.add_left_inj {α : Type u_1} {s t u : Multiset α} :
s + u = t + u s = t
theorem Multiset.add_right_inj {α : Type u_1} {s t u : Multiset α} :
s + t = s + u t = u
@[simp]
theorem Multiset.card_add {α : Type u_1} (s t : Multiset α) :
(s + t).card = s.card + t.card

Erasing one copy of an element #

def Multiset.erase {α : Type u_1} [DecidableEq α] (s : Multiset α) (a : α) :

erase s a is the multiset that subtracts 1 from the multiplicity of a.

Equations
Instances For
@[simp]
theorem Multiset.coe_erase {α : Type u_1} [DecidableEq α] (l : List α) (a : α) :
(↑l).erase a = (l.erase a)
@[simp]
theorem Multiset.erase_zero {α : Type u_1} [DecidableEq α] (a : α) :
erase 0 a = 0
@[simp]
theorem Multiset.erase_cons_head {α : Type u_1} [DecidableEq α] (a : α) (s : Multiset α) :
(a ::ₘ s).erase a = s
@[simp]
theorem Multiset.erase_cons_tail {α : Type u_1} [DecidableEq α] {a b : α} (s : Multiset α) (h : b a) :
(b ::ₘ s).erase a = b ::ₘ s.erase a
@[simp]
theorem Multiset.erase_singleton {α : Type u_1} [DecidableEq α] (a : α) :
{a}.erase a = 0
@[simp]
theorem Multiset.erase_of_not_mem {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
ass.erase a = s
@[simp]
theorem Multiset.cons_erase {α : Type u_1} [DecidableEq α] {s : Multiset α} {a : α} :
a sa ::ₘ s.erase a = s
theorem Multiset.erase_cons_tail_of_mem {α : Type u_1} [DecidableEq α] {s : Multiset α} {a b : α} (h : a s) :
(b ::ₘ s).erase a = b ::ₘ s.erase a
theorem Multiset.le_cons_erase {α : Type u_1} [DecidableEq α] (s : Multiset α) (a : α) :
s a ::ₘ s.erase a
theorem Multiset.add_singleton_eq_iff {α : Type u_1} [DecidableEq α] {s t : Multiset α} {a : α} :
s + {a} = t a t s = t.erase a
theorem Multiset.erase_add_left_pos {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} (t : Multiset α) :
a s(s + t).erase a = s.erase a + t
theorem Multiset.erase_add_right_pos {α : Type u_1} [DecidableEq α] {t : Multiset α} {a : α} (s : Multiset α) (h : a t) :
(s + t).erase a = s + t.erase a
theorem Multiset.erase_add_right_neg {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} (t : Multiset α) :
as(s + t).erase a = s + t.erase a
theorem Multiset.erase_add_left_neg {α : Type u_1} [DecidableEq α] {t : Multiset α} {a : α} (s : Multiset α) (h : at) :
(s + t).erase a = s.erase a + t
theorem Multiset.erase_le {α : Type u_1} [DecidableEq α] (a : α) (s : Multiset α) :
s.erase a s
@[simp]
theorem Multiset.erase_lt {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
s.erase a < s a s
theorem Multiset.erase_subset {α : Type u_1} [DecidableEq α] (a : α) (s : Multiset α) :
s.erase a s
theorem Multiset.mem_erase_of_ne {α : Type u_1} [DecidableEq α] {a b : α} {s : Multiset α} (ab : a b) :
a s.erase b a s
theorem Multiset.mem_of_mem_erase {α : Type u_1} [DecidableEq α] {a b : α} {s : Multiset α} :
a s.erase ba s
theorem Multiset.erase_comm {α : Type u_1} [DecidableEq α] (s : Multiset α) (a b : α) :
(s.erase a).erase b = (s.erase b).erase a
theorem Multiset.erase_le_erase {α : Type u_1} [DecidableEq α] {s t : Multiset α} (a : α) (h : s t) :
s.erase a t.erase a
theorem Multiset.erase_le_iff_le_cons {α : Type u_1} [DecidableEq α] {s t : Multiset α} {a : α} :
s.erase a t s a ::ₘ t
@[simp]
theorem Multiset.card_erase_of_mem {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
a s(s.erase a).card = s.card.pred
@[simp]
theorem Multiset.card_erase_add_one {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
a s(s.erase a).card + 1 = s.card
theorem Multiset.card_erase_lt_of_mem {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
a s(s.erase a).card < s.card
theorem Multiset.card_erase_le {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
(s.erase a).card s.card
theorem Multiset.card_erase_eq_ite {α : Type u_1} [DecidableEq α] {a : α} {s : Multiset α} :
@[simp]
theorem Multiset.count_erase_self {α : Type u_1} [DecidableEq α] (a : α) (s : Multiset α) :
count a (s.erase a) = count a s - 1
@[simp]
theorem Multiset.count_erase_of_ne {α : Type u_1} [DecidableEq α] {a b : α} (ab : a b) (s : Multiset α) :
count a (s.erase b) = count a s

Subtraction #

def Multiset.sub {α : Type u_1} [DecidableEq α] (s t : Multiset α) :

s - t is the multiset such that count a (s - t) = count a s - count a t for all a. (note that it is truncated subtraction, so count a (s - t) = 0 if count a s ≤ count a t).

Equations
instance Multiset.instSub {α : Type u_1} [DecidableEq α] :
Equations
@[simp]
theorem Multiset.coe_sub {α : Type u_1} [DecidableEq α] (s t : List α) :
s - t = (s.diff t)
@[simp]
theorem Multiset.sub_zero {α : Type u_1} [DecidableEq α] (s : Multiset α) :
s - 0 = s

This is a special case of tsub_zero, which should be used instead of this. This is needed to prove OrderedSub (Multiset α).

@[simp]
theorem Multiset.sub_cons {α : Type u_1} [DecidableEq α] (a : α) (s t : Multiset α) :
s - a ::ₘ t = s.erase a - t
theorem Multiset.zero_sub {α : Type u_1} [DecidableEq α] (t : Multiset α) :
0 - t = 0
@[simp]
theorem Multiset.countP_sub {α : Type u_1} [DecidableEq α] {s t : Multiset α} :
t s∀ (p : αProp) [inst : DecidablePred p], countP p (s - t) = countP p s - countP p t
@[simp]
theorem Multiset.count_sub {α : Type u_1} [DecidableEq α] (a : α) (s t : Multiset α) :
count a (s - t) = count a s - count a t
theorem Multiset.sub_le_iff_le_add {α : Type u_1} [DecidableEq α] {s t u : Multiset α} :
s - t u s u + t

This is a special case of tsub_le_iff_right, which should be used instead of this. This is needed to prove OrderedSub (Multiset α).

theorem Multiset.sub_le_iff_le_add' {α : Type u_1} [DecidableEq α] {s t u : Multiset α} :
s - t u s t + u

This is a special case of tsub_le_iff_left, which should be used instead of this.

theorem Multiset.sub_le_self {α : Type u_1} [DecidableEq α] (s t : Multiset α) :
s - t s
theorem Multiset.add_sub_assoc {α : Type u_1} [DecidableEq α] {s t u : Multiset α} (hut : u t) :
s + t - u = s + (t - u)
theorem Multiset.add_sub_cancel {α : Type u_1} [DecidableEq α] {s t : Multiset α} (hts : t s) :
s - t + t = s
theorem Multiset.sub_add_cancel {α : Type u_1} [DecidableEq α] {s t : Multiset α} (hts : t s) :
s - t + t = s
theorem Multiset.sub_add_eq_sub_sub {α : Type u_1} [DecidableEq α] {s t u : Multiset α} :
s - (t + u) = s - t - u
theorem Multiset.le_sub_add {α : Type u_1} [DecidableEq α] {s t : Multiset α} :
s s - t + t
theorem Multiset.le_add_sub {α : Type u_1} [DecidableEq α] {s t : Multiset α} :
s t + (s - t)
theorem Multiset.sub_le_sub_right {α : Type u_1} [DecidableEq α] {s t u : Multiset α} (hst : s t) :
s - u t - u
theorem Multiset.add_sub_cancel_right {α : Type u_1} [DecidableEq α] {s t : Multiset α} :
s + t - t = s
theorem Multiset.eq_sub_of_add_eq {α : Type u_1} [DecidableEq α] {s t u : Multiset α} (hstu : s + t = u) :
s = u - t
theorem Multiset.cons_sub_of_le {α : Type u_1} [DecidableEq α] (a : α) {s t : Multiset α} (h : t s) :
a ::ₘ s - t = a ::ₘ (s - t)
@[simp]
theorem Multiset.card_sub {α : Type u_1} [DecidableEq α] {s t : Multiset α} (h : t s) :
(s - t).card = s.card - t.card
@[simp]
theorem Multiset.sub_singleton {α : Type u_1} [DecidableEq α] (a : α) (s : Multiset α) :
s - {a} = s.erase a
theorem Multiset.mem_sub {α : Type u_1} [DecidableEq α] {a : α} {s t : Multiset α} :
a s - t count a t < count a s

Lift a relation to Multisets #

theorem Multiset.Rel.add {α : Type u_1} {β : Type v} {r : αβProp} {s : Multiset α} {t : Multiset β} {u : Multiset α} {v : Multiset β} (hst : Rel r s t) (huv : Rel r u v) :
Rel r (s + u) (t + v)
theorem Multiset.rel_add_left {α : Type u_1} {β : Type v} {r : αβProp} {as₀ as₁ : Multiset α} {bs : Multiset β} :
Rel r (as₀ + as₁) bs ∃ (bs₀ : Multiset β) (bs₁ : Multiset β), Rel r as₀ bs₀ Rel r as₁ bs₁ bs = bs₀ + bs₁
theorem Multiset.rel_add_right {α : Type u_1} {β : Type v} {r : αβProp} {as : Multiset α} {bs₀ bs₁ : Multiset β} :
Rel r as (bs₀ + bs₁) ∃ (as₀ : Multiset α) (as₁ : Multiset α), Rel r as₀ bs₀ Rel r as₁ bs₁ as = as₀ + as₁
@[simp]
theorem Multiset.nodup_singleton {α : Type u_1} (a : α) :
theorem Multiset.not_nodup_pair {α : Type u_1} (a : α) :
theorem Multiset.Nodup.erase {α : Type u_1} [DecidableEq α] (a : α) {l : Multiset α} :
l.Nodup(l.erase a).Nodup
theorem Multiset.mem_sub_of_nodup {α : Type u_1} [DecidableEq α] {a : α} {s t : Multiset α} (d : s.Nodup) :
a s - t a s at