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)