Module docstring
{"# Sums in WithTop
This file proves results about finite sums over monoids extended by a bottom or top element. "}
{"# Sums in WithTop
This file proves results about finite sums over monoids extended by a bottom or top element. "}
WithTop.coe_sum
      theorem
     (s : Finset ι) (f : ι → α) : ∑ i ∈ s, f i = ∑ i ∈ s, (f i : WithTop α)
        @[simp, norm_cast] lemma coe_sum (s : Finset ι) (f : ι → α) :
    ∑ i ∈ s, f i = ∑ i ∈ s, (f i : WithTop α) := map_sum addHom f s
        WithTop.sum_eq_top
      theorem
     : ∑ i ∈ s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤
        /-- A sum is infinite iff one term is infinite. -/
@[simp] lemma sum_eq_top : ∑ i ∈ s, f i∑ i ∈ s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
  induction s using Finset.cons_induction <;> simp [*]
        WithTop.sum_ne_top
      theorem
     : ∑ i ∈ s, f i ≠ ⊤ ↔ ∀ i ∈ s, f i ≠ ⊤
        /-- A sum is finite iff all terms are finite. -/
lemma sum_ne_top : ∑ i ∈ s, f i∑ i ∈ s, f i ≠ ⊤∑ i ∈ s, f i ≠ ⊤ ↔ ∀ i ∈ s, f i ≠ ⊤ := by simp
        WithTop.sum_lt_top
      theorem
     : ∑ i ∈ s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤
        /-- A sum is finite iff all terms are finite. -/
@[simp] lemma sum_lt_top : ∑ i ∈ s, f i∑ i ∈ s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
  simp [WithTop.lt_top_iff_ne_top]
        WithTop.prod_ne_top
      theorem
     (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i ∈ s, f i ≠ ⊤
        /-- A product of finite terms is finite. -/
lemma prod_ne_top (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i ∈ s, f i∏ i ∈ s, f i ≠ ⊤ :=
  prod_induction f (· ≠ ⊤) (fun _ _ ↦ mul_ne_top) coe_ne_top h
        WithTop.prod_lt_top
      theorem
     [LT α] (h : ∀ i ∈ s, f i < ⊤) : ∏ i ∈ s, f i < ⊤
        /-- A product of finite terms is finite. -/
lemma prod_lt_top [LT α] (h : ∀ i ∈ s, f i < ⊤) : ∏ i ∈ s, f i < ⊤ :=
  prod_induction f (· < ⊤) (fun _ _ ↦ mul_lt_top) (coe_lt_top _) h
        WithBot.coe_sum
      theorem
     (s : Finset ι) (f : ι → α) : ∑ i ∈ s, f i = ∑ i ∈ s, (f i : WithBot α)
        @[simp, norm_cast] lemma coe_sum (s : Finset ι) (f : ι → α) :
    ∑ i ∈ s, f i = ∑ i ∈ s, (f i : WithBot α) := map_sum addHom f s
        WithBot.sum_eq_bot_iff
      theorem
     : ∑ i ∈ s, f i = ⊥ ↔ ∃ i ∈ s, f i = ⊥
        /-- A sum is infinite iff one term is infinite. -/
lemma sum_eq_bot_iff : ∑ i ∈ s, f i∑ i ∈ s, f i = ⊥ ↔ ∃ i ∈ s, f i = ⊥ := by
  induction s using Finset.cons_induction <;> simp [*]
        WithBot.bot_lt_sum_iff
      theorem
     : ⊥ < ∑ i ∈ s, f i ↔ ∀ i ∈ s, ⊥ < f i
        /-- A sum is finite iff all terms are finite. -/
lemma bot_lt_sum_iff : ⊥⊥ < ∑ i ∈ s, f i ↔ ∀ i ∈ s, ⊥ < f i := by
  simp only [WithBot.bot_lt_iff_ne_bot, ne_eq, sum_eq_bot_iff, not_exists, not_and]
        WithBot.sum_lt_bot
      theorem
     (h : ∀ i ∈ s, f i ≠ ⊥) : ⊥ < ∑ i ∈ s, f i
        /-- A sum of finite terms is finite. -/
lemma sum_lt_bot (h : ∀ i ∈ s, f i ≠ ⊥) : ⊥ < ∑ i ∈ s, f i :=
  bot_lt_sum_iff.2 fun i hi ↦ WithBot.bot_lt_iff_ne_bot.2 (h i hi)
        WithBot.prod_ne_bot
      theorem
     (h : ∀ i ∈ s, f i ≠ ⊥) : ∏ i ∈ s, f i ≠ ⊥
        /-- A product of finite terms is finite. -/
lemma prod_ne_bot (h : ∀ i ∈ s, f i ≠ ⊥) : ∏ i ∈ s, f i∏ i ∈ s, f i ≠ ⊥ :=
  prod_induction f (· ≠ ⊥) (fun _ _ ↦ mul_ne_bot) coe_ne_bot h
        WithBot.bot_lt_prod
      theorem
     [LT α] (h : ∀ i ∈ s, ⊥ < f i) : ⊥ < ∏ i ∈ s, f i
        /-- A product of finite terms is finite. -/
lemma bot_lt_prod [LT α] (h : ∀ i ∈ s, ⊥ < f i) : ⊥ < ∏ i ∈ s, f i :=
  prod_induction f (⊥ < ·) (fun _ _ ↦ bot_lt_mul) (bot_lt_coe _) h