Module docstring
{"# Sections of a multiset "}
{"# Sections of a multiset "}
Multiset.Sections
definition
(s : Multiset (Multiset α)) : Multiset (Multiset α)
/-- The sections of a multiset of multisets `s` consists of all those multisets
which can be put in bijection with `s`, so each element is a member of the corresponding multiset.
-/
def Sections (s : Multiset (Multiset α)) : Multiset (Multiset α) :=
Multiset.recOn s {0} (fun s _ c => s.bind fun a => c.map (Multiset.cons a)) fun a₀ a₁ _ pi => by
simp [map_bind, bind_bind a₀ a₁, cons_swap]
Multiset.sections_zero
theorem
: Sections (0 : Multiset (Multiset α)) = {0}
Multiset.sections_cons
theorem
(s : Multiset (Multiset α)) (m : Multiset α) : Sections (m ::ₘ s) = m.bind fun a => (Sections s).map (Multiset.cons a)
@[simp]
theorem sections_cons (s : Multiset (Multiset α)) (m : Multiset α) :
Sections (m ::ₘ s) = m.bind fun a => (Sections s).map (Multiset.cons a) :=
recOn_cons m s
Multiset.coe_sections
theorem
:
∀ l : List (List α),
Sections (l.map fun l : List α => (l : Multiset α) : Multiset (Multiset α)) =
(l.sections.map fun l : List α => (l : Multiset α) : Multiset (Multiset α))
theorem coe_sections :
∀ l : List (List α),
Sections (l.map fun l : List α => (l : Multiset α) : Multiset (Multiset α)) =
(l.sections.map fun l : List α => (l : Multiset α) : Multiset (Multiset α))
| [] => rfl
| a :: l => by
simp only [List.map_cons, List.sections]
rw [← cons_coe, sections_cons, bind_map_comm, coe_sections l]
simp [List.sections, Function.comp_def, List.flatMap]
Multiset.sections_add
theorem
(s t : Multiset (Multiset α)) : Sections (s + t) = (Sections s).bind fun m => (Sections t).map (m + ·)
@[simp]
theorem sections_add (s t : Multiset (Multiset α)) :
Sections (s + t) = (Sections s).bind fun m => (Sections t).map (m + ·) :=
Multiset.induction_on s (by simp) fun a s ih => by
simp [ih, bind_assoc, map_bind, bind_map]
Multiset.mem_sections
theorem
{s : Multiset (Multiset α)} : ∀ {a}, a ∈ Sections s ↔ s.Rel (fun s a => a ∈ s) a
theorem mem_sections {s : Multiset (Multiset α)} :
∀ {a}, a ∈ Sections sa ∈ Sections s ↔ s.Rel (fun s a => a ∈ s) a := by
induction s using Multiset.induction_on with
| empty => simp
| cons _ _ ih => simp [ih, rel_cons_left, eq_comm]
Multiset.card_sections
theorem
{s : Multiset (Multiset α)} : card (Sections s) = prod (s.map card)
theorem card_sections {s : Multiset (Multiset α)} : card (Sections s) = prod (s.map card) :=
Multiset.induction_on s (by simp) (by simp +contextual)