Module docstring
{"# Multiset.range n gives {0, 1, ..., n-1} as a multiset. "}
{"# Multiset.range n gives {0, 1, ..., n-1} as a multiset. "}
Multiset.range
definition
(n : ℕ) : Multiset ℕ
/-- `range n` is the multiset lifted from the list `range n`,
that is, the set `{0, 1, ..., n-1}`. -/
def range (n : ℕ) : Multiset ℕ :=
List.range n
Multiset.coe_range
theorem
(n : ℕ) : ↑(List.range n) = range n
theorem coe_range (n : ℕ) : ↑(List.range n) = range n :=
rfl
Multiset.range_zero
theorem
: range 0 = 0
@[simp]
theorem range_zero : range 0 = 0 :=
rfl
Multiset.range_succ
theorem
(n : ℕ) : range (succ n) = n ::ₘ range n
@[simp]
theorem range_succ (n : ℕ) : range (succ n) = n ::ₘ range n := by
rw [range, List.range_succ, ← coe_add, Multiset.add_comm, range, coe_singleton, singleton_add]
Multiset.card_range
theorem
(n : ℕ) : card (range n) = n
@[simp]
theorem card_range (n : ℕ) : card (range n) = n :=
length_range
Multiset.range_subset
theorem
{m n : ℕ} : range m ⊆ range n ↔ m ≤ n
theorem range_subset {m n : ℕ} : rangerange m ⊆ range nrange m ⊆ range n ↔ m ≤ n :=
List.range_subset
Multiset.mem_range
theorem
{m n : ℕ} : m ∈ range n ↔ m < n
@[simp]
theorem mem_range {m n : ℕ} : m ∈ range nm ∈ range n ↔ m < n :=
List.mem_range
Multiset.not_mem_range_self
theorem
{n : ℕ} : n ∉ range n
theorem not_mem_range_self {n : ℕ} : n ∉ range n :=
List.not_mem_range_self
Multiset.self_mem_range_succ
theorem
(n : ℕ) : n ∈ range (n + 1)
theorem self_mem_range_succ (n : ℕ) : n ∈ range (n + 1) :=
List.self_mem_range_succ
Multiset.range_add
theorem
(a b : ℕ) : range (a + b) = range a + (range b).map (a + ·)
Multiset.range_disjoint_map_add
theorem
(a : ℕ) (m : Multiset ℕ) : Disjoint (range a) (m.map (a + ·))
theorem range_disjoint_map_add (a : ℕ) (m : Multiset ℕ) :
Disjoint (range a) (m.map (a + ·)) := by
rw [disjoint_left]
intro x hxa hxb
rw [range, mem_coe, List.mem_range] at hxa
obtain ⟨c, _, rfl⟩ := mem_map.1 hxb
exact (Nat.le_add_right _ _).not_lt hxa
Multiset.range_add_eq_union
theorem
(a b : ℕ) : range (a + b) = range a ∪ (range b).map (a + ·)
theorem range_add_eq_union (a b : ℕ) : range (a + b) = rangerange a ∪ (range b).map (a + ·) := by
rw [range_add, add_eq_union_iff_disjoint]
apply range_disjoint_map_add
Multiset.nodup_range
theorem
(n : ℕ) : Nodup (range n)
theorem nodup_range (n : ℕ) : Nodup (range n) :=
List.nodup_range
Multiset.range_le
theorem
{m n : ℕ} : range m ≤ range n ↔ m ≤ n
theorem range_le {m n : ℕ} : rangerange m ≤ range n ↔ m ≤ n :=
(le_iff_subset (nodup_range _)).trans range_subset