File: Mathlib/Topology/Algebra/InfiniteSum/Basic.lean

full_name: hasProd_one
code: /-- Constant one function has product `1` -/
@[to_additive "Constant zero function has sum `0`"]
theorem hasProd_one : HasProd (fun _ ↦ 1 : β → α) 1 
goal: HasProd (fun x => 1) 1

full_name: hasSum_zero
code: /-- Constant one function has product `1` -/
@[to_additive "Constant zero function has sum `0`"]
theorem hasProd_one : HasProd (fun _ ↦ 1 : β → α) 1 
goal: HasSum (fun x => 0) 0

full_name: hasSum_empty
code: @[to_additive]
theorem hasProd_empty [IsEmpty β] : HasProd f 1 
goal: HasSum f 0

full_name: hasProd_empty
code: @[to_additive]
theorem hasProd_empty [IsEmpty β] : HasProd f 1 
goal: HasProd f 1

full_name: summable_zero
code: @[to_additive]
theorem multipliable_one : Multipliable (fun _ ↦ 1 : β → α) 
goal: Summable fun x => 0

full_name: multipliable_one
code: @[to_additive]
theorem multipliable_one : Multipliable (fun _ ↦ 1 : β → α) 
goal: Multipliable fun x => 1

full_name: multipliable_empty
code: @[to_additive]
theorem multipliable_empty [IsEmpty β] : Multipliable f 
goal: Multipliable f

full_name: summable_empty
code: @[to_additive]
theorem multipliable_empty [IsEmpty β] : Multipliable f 
goal: Summable f

full_name: multipliable_congr
code: @[to_additive]
theorem multipliable_congr (hfg : ∀ b, f b = g b) : Multipliable f ↔ Multipliable g 
goal: Multipliable f ↔ Multipliable g

full_name: summable_congr
code: @[to_additive]
theorem multipliable_congr (hfg : ∀ b, f b = g b) : Multipliable f ↔ Multipliable g 
goal: Summable f ↔ Summable g

full_name: Summable.congr
code: @[to_additive]
theorem Multipliable.congr (hf : Multipliable f) (hfg : ∀ b, f b = g b) : Multipliable g 
goal: Summable g

full_name: Multipliable.congr
code: @[to_additive]
theorem Multipliable.congr (hf : Multipliable f) (hfg : ∀ b, f b = g b) : Multipliable g 
goal: Multipliable g

full_name: HasSum.congr_fun
code: @[to_additive]
lemma HasProd.congr_fun (hf : HasProd f a) (h : ∀ x : β, g x = f x) : HasProd g a 
goal: HasSum g a

full_name: HasProd.congr_fun
code: @[to_additive]
lemma HasProd.congr_fun (hf : HasProd f a) (h : ∀ x : β, g x = f x) : HasProd g a 
goal: HasProd g a

full_name: HasProd.hasProd_of_prod_eq
code: @[to_additive]
theorem HasProd.hasProd_of_prod_eq {g : γ → α}
    (h_eq : ∀ u : Finset γ, ∃ v : Finset β, ∀ v', v ⊆ v' →
      ∃ u', u ⊆ u' ∧ ∏ x ∈ u', g x = ∏ b ∈ v', f b)
    (hf : HasProd g a) : HasProd f a 
goal: HasProd f a

full_name: HasSum.hasSum_of_sum_eq
code: @[to_additive]
theorem HasProd.hasProd_of_prod_eq {g : γ → α}
    (h_eq : ∀ u : Finset γ, ∃ v : Finset β, ∀ v', v ⊆ v' →
      ∃ u', u ⊆ u' ∧ ∏ x ∈ u', g x = ∏ b ∈ v', f b)
    (hf : HasProd g a) : HasProd f a 
goal: HasSum f a

full_name: hasProd_iff_hasProd
code: @[to_additive]
theorem hasProd_iff_hasProd {g : γ → α}
    (h₁ : ∀ u : Finset γ, ∃ v : Finset β, ∀ v', v ⊆ v' →
      ∃ u', u ⊆ u' ∧ ∏ x ∈ u', g x = ∏ b ∈ v', f b)
    (h₂ : ∀ v : Finset β, ∃ u : Finset γ, ∀ u', u ⊆ u' →
      ∃ v', v ⊆ v' ∧ ∏ b ∈ v', f b = ∏ x ∈ u', g x) :
    HasProd f a ↔ HasProd g a 
goal: HasProd f a ↔ HasProd g a

full_name: hasSum_iff_hasSum
code: @[to_additive]
theorem hasProd_iff_hasProd {g : γ → α}
    (h₁ : ∀ u : Finset γ, ∃ v : Finset β, ∀ v', v ⊆ v' →
      ∃ u', u ⊆ u' ∧ ∏ x ∈ u', g x = ∏ b ∈ v', f b)
    (h₂ : ∀ v : Finset β, ∃ u : Finset γ, ∀ u', u ⊆ u' →
      ∃ v', v ⊆ v' ∧ ∏ b ∈ v', f b = ∏ x ∈ u', g x) :
    HasProd f a ↔ HasProd g a 
goal: HasSum f a ↔ HasSum g a

full_name: Function.Injective.summable_iff
code: @[to_additive]
theorem Function.Injective.multipliable_iff {g : γ → β} (hg : Injective g)
    (hf : ∀ x ∉ Set.range g, f x = 1) : Multipliable (f ∘ g) ↔ Multipliable f 
goal: Summable (f ∘ g) ↔ Summable f

full_name: Function.Injective.multipliable_iff
code: @[to_additive]
theorem Function.Injective.multipliable_iff {g : γ → β} (hg : Injective g)
    (hf : ∀ x ∉ Set.range g, f x = 1) : Multipliable (f ∘ g) ↔ Multipliable f 
goal: Multipliable (f ∘ g) ↔ Multipliable f

full_name: hasProd_extend_one
code: @[to_additive (attr := simp)] theorem hasProd_extend_one {g : β → γ} (hg : Injective g) :
    HasProd (extend g f 1) a ↔ HasProd f a 
goal: HasProd (Function.extend g f 1) a ↔ HasProd f a

full_name: hasSum_extend_zero
code: @[to_additive (attr := simp)] theorem hasProd_extend_one {g : β → γ} (hg : Injective g) :
    HasProd (extend g f 1) a ↔ HasProd f a 
goal: HasSum (Function.extend g f 0) a ↔ HasSum f a

full_name: summable_extend_zero
code: @[to_additive (attr := simp)] theorem multipliable_extend_one {g : β → γ} (hg : Injective g) :
    Multipliable (extend g f 1) ↔ Multipliable f 
goal: Summable (Function.extend g f 0) ↔ Summable f

full_name: multipliable_extend_one
code: @[to_additive (attr := simp)] theorem multipliable_extend_one {g : β → γ} (hg : Injective g) :
    Multipliable (extend g f 1) ↔ Multipliable f 
goal: Multipliable (Function.extend g f 1) ↔ Multipliable f

full_name: hasProd_subtype_iff_mulIndicator
code: @[to_additive]
theorem hasProd_subtype_iff_mulIndicator {s : Set β} :
    HasProd (f ∘ (↑) : s → α) a ↔ HasProd (s.mulIndicator f) a 
goal: HasProd (f ∘ Subtype.val) a ↔ HasProd (s.mulIndicator f) a

full_name: hasSum_subtype_iff_indicator
code: @[to_additive]
theorem hasProd_subtype_iff_mulIndicator {s : Set β} :
    HasProd (f ∘ (↑) : s → α) a ↔ HasProd (s.mulIndicator f) a 
goal: HasSum (f ∘ Subtype.val) a ↔ HasSum (s.indicator f) a

full_name: multipliable_subtype_iff_mulIndicator
code: @[to_additive]
theorem multipliable_subtype_iff_mulIndicator {s : Set β} :
    Multipliable (f ∘ (↑) : s → α) ↔ Multipliable (s.mulIndicator f) 
goal: Multipliable (f ∘ Subtype.val) ↔ Multipliable (s.mulIndicator f)

full_name: summable_subtype_iff_indicator
code: @[to_additive]
theorem multipliable_subtype_iff_mulIndicator {s : Set β} :
    Multipliable (f ∘ (↑) : s → α) ↔ Multipliable (s.mulIndicator f) 
goal: Summable (f ∘ Subtype.val) ↔ Summable (s.indicator f)

full_name: hasSum_subtype_support
code: @[to_additive (attr := simp)]
theorem hasProd_subtype_mulSupport : HasProd (f ∘ (↑) : mulSupport f → α) a ↔ HasProd f a 
goal: HasSum (f ∘ Subtype.val) a ↔ HasSum f a

full_name: hasProd_subtype_mulSupport
code: @[to_additive (attr := simp)]
theorem hasProd_subtype_mulSupport : HasProd (f ∘ (↑) : mulSupport f → α) a ↔ HasProd f a 
goal: HasProd (f ∘ Subtype.val) a ↔ HasProd f a

full_name: Finset.summable
code: @[to_additive]
protected theorem Finset.multipliable (s : Finset β) (f : β → α) :
    Multipliable (f ∘ (↑) : (↑s : Set β) → α) 
goal: Summable (f ∘ Subtype.val)

full_name: Finset.multipliable
code: @[to_additive]
protected theorem Finset.multipliable (s : Finset β) (f : β → α) :
    Multipliable (f ∘ (↑) : (↑s : Set β) → α) 
goal: Multipliable (f ∘ Subtype.val)

full_name: Set.Finite.multipliable
code: @[to_additive]
protected theorem Set.Finite.multipliable {s : Set β} (hs : s.Finite) (f : β → α) :
    Multipliable (f ∘ (↑) : s → α) 
goal: Multipliable (f ∘ Subtype.val)

full_name: Set.Finite.summable
code: @[to_additive]
protected theorem Set.Finite.multipliable {s : Set β} (hs : s.Finite) (f : β → α) :
    Multipliable (f ∘ (↑) : s → α) 
goal: Summable (f ∘ Subtype.val)

full_name: summable_of_finite_support
code: @[to_additive]
theorem multipliable_of_finite_mulSupport (h : (mulSupport f).Finite) : Multipliable f 
goal: Summable f

full_name: multipliable_of_finite_mulSupport
code: @[to_additive]
theorem multipliable_of_finite_mulSupport (h : (mulSupport f).Finite) : Multipliable f 
goal: Multipliable f

full_name: Multipliable.of_finite
code: @[to_additive]
lemma Multipliable.of_finite [Finite β] {f : β → α} : Multipliable f 
goal: Multipliable f

full_name: Summable.of_finite
code: @[to_additive]
lemma Multipliable.of_finite [Finite β] {f : β → α} : Multipliable f 
goal: Summable f

full_name: hasSum_single
code: @[to_additive]
theorem hasProd_single {f : β → α} (b : β) (hf : ∀ (b') (_ : b' ≠ b), f b' = 1) : HasProd f (f b) 
goal: HasSum f (f b)

full_name: hasProd_single
code: @[to_additive]
theorem hasProd_single {f : β → α} (b : β) (hf : ∀ (b') (_ : b' ≠ b), f b' = 1) : HasProd f (f b) 
goal: HasProd f (f b)

full_name: hasSum_unique
code: @[to_additive (attr := simp)] lemma hasProd_unique [Unique β] (f : β → α) : HasProd f (f default) 
goal: HasSum f (f default)

full_name: hasProd_unique
code: @[to_additive (attr := simp)] lemma hasProd_unique [Unique β] (f : β → α) : HasProd f (f default) 
goal: HasProd f (f default)

full_name: hasSum_singleton
code: @[to_additive (attr := simp)]
lemma hasProd_singleton (m : β) (f : β → α) : HasProd (({m} : Set β).restrict f) (f m) 
goal: HasSum ({m}.restrict f) (f m)

full_name: hasProd_singleton
code: @[to_additive (attr := simp)]
lemma hasProd_singleton (m : β) (f : β → α) : HasProd (({m} : Set β).restrict f) (f m) 
goal: HasProd ({m}.restrict f) (f m)

full_name: hasSum_ite_eq
code: @[to_additive]
theorem hasProd_ite_eq (b : β) [DecidablePred (· = b)] (a : α) :
    HasProd (fun b' ↦ if b' = b then a else 1) a 
goal: HasSum (fun b' => if b' = b then a else 0) a

full_name: hasProd_ite_eq
code: @[to_additive]
theorem hasProd_ite_eq (b : β) [DecidablePred (· = b)] (a : α) :
    HasProd (fun b' ↦ if b' = b then a else 1) a 
goal: HasProd (fun b' => if b' = b then a else 1) a

full_name: Equiv.hasSum_iff
code: @[to_additive]
theorem Equiv.hasProd_iff (e : γ ≃ β) : HasProd (f ∘ e) a ↔ HasProd f a 
goal: HasSum (f ∘ ⇑e) a ↔ HasSum f a

full_name: Equiv.hasProd_iff
code: @[to_additive]
theorem Equiv.hasProd_iff (e : γ ≃ β) : HasProd (f ∘ e) a ↔ HasProd f a 
goal: HasProd (f ∘ ⇑e) a ↔ HasProd f a

full_name: Function.Injective.hasProd_range_iff
code: @[to_additive]
theorem Function.Injective.hasProd_range_iff {g : γ → β} (hg : Injective g) :
    HasProd (fun x : Set.range g ↦ f x) a ↔ HasProd (f ∘ g) a 
goal: HasProd (fun x => f ↑x) a ↔ HasProd (f ∘ g) a

full_name: Function.Injective.hasSum_range_iff
code: @[to_additive]
theorem Function.Injective.hasProd_range_iff {g : γ → β} (hg : Injective g) :
    HasProd (fun x : Set.range g ↦ f x) a ↔ HasProd (f ∘ g) a 
goal: HasSum (fun x => f ↑x) a ↔ HasSum (f ∘ g) a

full_name: Equiv.summable_iff
code: @[to_additive]
theorem Equiv.multipliable_iff (e : γ ≃ β) : Multipliable (f ∘ e) ↔ Multipliable f 
goal: Summable (f ∘ ⇑e) ↔ Summable f

full_name: Equiv.multipliable_iff
code: @[to_additive]
theorem Equiv.multipliable_iff (e : γ ≃ β) : Multipliable (f ∘ e) ↔ Multipliable f 
goal: Multipliable (f ∘ ⇑e) ↔ Multipliable f

full_name: Equiv.hasProd_iff_of_mulSupport
code: @[to_additive]
theorem Equiv.hasProd_iff_of_mulSupport {g : γ → α} (e : mulSupport f ≃ mulSupport g)
    (he : ∀ x : mulSupport f, g (e x) = f x) : HasProd f a ↔ HasProd g a 
goal: HasProd f a ↔ HasProd g a

full_name: Equiv.hasSum_iff_of_support
code: @[to_additive]
theorem Equiv.hasProd_iff_of_mulSupport {g : γ → α} (e : mulSupport f ≃ mulSupport g)
    (he : ∀ x : mulSupport f, g (e x) = f x) : HasProd f a ↔ HasProd g a 
goal: HasSum f a ↔ HasSum g a

full_name: hasProd_iff_hasProd_of_ne_one_bij
code: @[to_additive]
theorem hasProd_iff_hasProd_of_ne_one_bij {g : γ → α} (i : mulSupport g → β)
    (hi : Injective i) (hf : mulSupport f ⊆ Set.range i)
    (hfg : ∀ x, f (i x) = g x) : HasProd f a ↔ HasProd g a 
goal: HasProd f a ↔ HasProd g a

full_name: hasSum_iff_hasSum_of_ne_zero_bij
code: @[to_additive]
theorem hasProd_iff_hasProd_of_ne_one_bij {g : γ → α} (i : mulSupport g → β)
    (hi : Injective i) (hf : mulSupport f ⊆ Set.range i)
    (hfg : ∀ x, f (i x) = g x) : HasProd f a ↔ HasProd g a 
goal: HasSum f a ↔ HasSum g a

full_name: Equiv.multipliable_iff_of_mulSupport
code: @[to_additive]
theorem Equiv.multipliable_iff_of_mulSupport {g : γ → α} (e : mulSupport f ≃ mulSupport g)
    (he : ∀ x : mulSupport f, g (e x) = f x) : Multipliable f ↔ Multipliable g 
goal: Multipliable f ↔ Multipliable g

full_name: Equiv.summable_iff_of_support
code: @[to_additive]
theorem Equiv.multipliable_iff_of_mulSupport {g : γ → α} (e : mulSupport f ≃ mulSupport g)
    (he : ∀ x : mulSupport f, g (e x) = f x) : Multipliable f ↔ Multipliable g 
goal: Summable f ↔ Summable g

full_name: HasSum.map
code: @[to_additive]
protected theorem HasProd.map [CommMonoid γ] [TopologicalSpace γ] (hf : HasProd f a) {G}
    [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) :
    HasProd (g ∘ f) (g a) 
goal: HasSum (⇑g ∘ f) (g a)

full_name: HasProd.map
code: @[to_additive]
protected theorem HasProd.map [CommMonoid γ] [TopologicalSpace γ] (hf : HasProd f a) {G}
    [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) :
    HasProd (g ∘ f) (g a) 
goal: HasProd (⇑g ∘ f) (g a)

full_name: Inducing.hasProd_iff
code: @[to_additive]
protected theorem Inducing.hasProd_iff [CommMonoid γ] [TopologicalSpace γ] {G}
    [FunLike G α γ] [MonoidHomClass G α γ] {g : G} (hg : Inducing g) (f : β → α) (a : α) :
    HasProd (g ∘ f) (g a) ↔ HasProd f a 
goal: HasProd (⇑g ∘ f) (g a) ↔ HasProd f a

full_name: Inducing.hasSum_iff
code: @[to_additive]
protected theorem Inducing.hasProd_iff [CommMonoid γ] [TopologicalSpace γ] {G}
    [FunLike G α γ] [MonoidHomClass G α γ] {g : G} (hg : Inducing g) (f : β → α) (a : α) :
    HasProd (g ∘ f) (g a) ↔ HasProd f a 
goal: HasSum (⇑g ∘ f) (g a) ↔ HasSum f a

full_name: Multipliable.map
code: @[to_additive]
protected theorem Multipliable.map [CommMonoid γ] [TopologicalSpace γ] (hf : Multipliable f) {G}
    [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) : Multipliable (g ∘ f) 
goal: Multipliable (⇑g ∘ f)

full_name: Summable.map
code: @[to_additive]
protected theorem Multipliable.map [CommMonoid γ] [TopologicalSpace γ] (hf : Multipliable f) {G}
    [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) : Multipliable (g ∘ f) 
goal: Summable (⇑g ∘ f)

full_name: Summable.map_iff_of_leftInverse
code: @[to_additive]
protected theorem Multipliable.map_iff_of_leftInverse [CommMonoid γ] [TopologicalSpace γ] {G G'}
    [FunLike G α γ] [MonoidHomClass G α γ] [FunLike G' γ α] [MonoidHomClass G' γ α]
    (g : G) (g' : G') (hg : Continuous g) (hg' : Continuous g') (hinv : Function.LeftInverse g' g) :
    Multipliable (g ∘ f) ↔ Multipliable f 
goal: Summable (⇑g ∘ f) ↔ Summable f

full_name: Multipliable.map_iff_of_leftInverse
code: @[to_additive]
protected theorem Multipliable.map_iff_of_leftInverse [CommMonoid γ] [TopologicalSpace γ] {G G'}
    [FunLike G α γ] [MonoidHomClass G α γ] [FunLike G' γ α] [MonoidHomClass G' γ α]
    (g : G) (g' : G') (hg : Continuous g) (hg' : Continuous g') (hinv : Function.LeftInverse g' g) :
    Multipliable (g ∘ f) ↔ Multipliable f 
goal: Multipliable (⇑g ∘ f) ↔ Multipliable f

full_name: Summable.map_tsum
code: @[to_additive]
theorem Multipliable.map_tprod [CommMonoid γ] [TopologicalSpace γ] [T2Space γ] (hf : Multipliable f)
    {G} [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) :
    g (∏' i, f i) = ∏' i, g (f i) 
goal: g (∑' (i : β), f i) = ∑' (i : β), g (f i)

full_name: Multipliable.map_tprod
code: @[to_additive]
theorem Multipliable.map_tprod [CommMonoid γ] [TopologicalSpace γ] [T2Space γ] (hf : Multipliable f)
    {G} [FunLike G α γ] [MonoidHomClass G α γ] (g : G) (hg : Continuous g) :
    g (∏' i, f i) = ∏' i, g (f i) 
goal: g (∏' (i : β), f i) = ∏' (i : β), g (f i)

full_name: Inducing.summable_iff_tsum_comp_mem_range
code: @[to_additive]
theorem Inducing.multipliable_iff_tprod_comp_mem_range [CommMonoid γ] [TopologicalSpace γ]
    [T2Space γ] {G} [FunLike G α γ] [MonoidHomClass G α γ] {g : G} (hg : Inducing g) (f : β → α) :
    Multipliable f ↔ Multipliable (g ∘ f) ∧ ∏' i, g (f i) ∈ Set.range g 
goal: Summable f ↔ Summable (⇑g ∘ f) ∧ ∑' (i : β), g (f i) ∈ Set.range ⇑g

full_name: Inducing.multipliable_iff_tprod_comp_mem_range
code: @[to_additive]
theorem Inducing.multipliable_iff_tprod_comp_mem_range [CommMonoid γ] [TopologicalSpace γ]
    [T2Space γ] {G} [FunLike G α γ] [MonoidHomClass G α γ] {g : G} (hg : Inducing g) (f : β → α) :
    Multipliable f ↔ Multipliable (g ∘ f) ∧ ∏' i, g (f i) ∈ Set.range g 
goal: Multipliable f ↔ Multipliable (⇑g ∘ f) ∧ ∏' (i : β), g (f i) ∈ Set.range ⇑g

full_name: Multipliable.map_iff_of_equiv
code: /-- "A special case of `Multipliable.map_iff_of_leftInverse` for convenience" -/
@[to_additive "A special case of `Summable.map_iff_of_leftInverse` for convenience"]
protected theorem Multipliable.map_iff_of_equiv [CommMonoid γ] [TopologicalSpace γ] {G}
    [EquivLike G α γ] [MulEquivClass G α γ] (g : G) (hg : Continuous g)
    (hg' : Continuous (EquivLike.inv g : γ → α)) : Multipliable (g ∘ f) ↔ Multipliable f 
goal: Multipliable (⇑g ∘ f) ↔ Multipliable f

full_name: Summable.map_iff_of_equiv
code: /-- "A special case of `Multipliable.map_iff_of_leftInverse` for convenience" -/
@[to_additive "A special case of `Summable.map_iff_of_leftInverse` for convenience"]
protected theorem Multipliable.map_iff_of_equiv [CommMonoid γ] [TopologicalSpace γ] {G}
    [EquivLike G α γ] [MulEquivClass G α γ] (g : G) (hg : Continuous g)
    (hg' : Continuous (EquivLike.inv g : γ → α)) : Multipliable (g ∘ f) ↔ Multipliable f 
goal: Summable (⇑g ∘ f) ↔ Summable f

full_name: Function.Surjective.multipliable_iff_of_hasProd_iff
code: @[to_additive]
theorem Function.Surjective.multipliable_iff_of_hasProd_iff {α' : Type*} [CommMonoid α']
    [TopologicalSpace α'] {e : α' → α} (hes : Function.Surjective e) {f : β → α} {g : γ → α'}
    (he : ∀ {a}, HasProd f (e a) ↔ HasProd g a) : Multipliable f ↔ Multipliable g 
goal: Multipliable f ↔ Multipliable g

full_name: Function.Surjective.summable_iff_of_hasSum_iff
code: @[to_additive]
theorem Function.Surjective.multipliable_iff_of_hasProd_iff {α' : Type*} [CommMonoid α']
    [TopologicalSpace α'] {e : α' → α} (hes : Function.Surjective e) {f : β → α} {g : γ → α'}
    (he : ∀ {a}, HasProd f (e a) ↔ HasProd g a) : Multipliable f ↔ Multipliable g 
goal: Summable f ↔ Summable g

full_name: HasSum.add
code: @[to_additive]
theorem HasProd.mul (hf : HasProd f a) (hg : HasProd g b) :
    HasProd (fun b ↦ f b * g b) (a * b) 
goal: HasSum (fun b => f b + g b) (a + b)

full_name: HasProd.mul
code: @[to_additive]
theorem HasProd.mul (hf : HasProd f a) (hg : HasProd g b) :
    HasProd (fun b ↦ f b * g b) (a * b) 
goal: HasProd (fun b => f b * g b) (a * b)

full_name: Multipliable.mul
code: @[to_additive]
theorem Multipliable.mul (hf : Multipliable f) (hg : Multipliable g) :
    Multipliable fun b ↦ f b * g b 
goal: Multipliable fun b => f b * g b

full_name: Summable.add
code: @[to_additive]
theorem Multipliable.mul (hf : Multipliable f) (hg : Multipliable g) :
    Multipliable fun b ↦ f b * g b 
goal: Summable fun b => f b + g b

full_name: hasProd_prod
code: @[to_additive]
theorem hasProd_prod {f : γ → β → α} {a : γ → α} {s : Finset γ} :
    (∀ i ∈ s, HasProd (f i) (a i)) → HasProd (fun b ↦ ∏ i ∈ s, f i b) (∏ i ∈ s, a i) 
goal: (∀ i ∈ s, HasProd (f i) (a i)) → HasProd (fun b => ∏ i ∈ s, f i b) (∏ i ∈ s, a i)

full_name: hasSum_sum
code: @[to_additive]
theorem hasProd_prod {f : γ → β → α} {a : γ → α} {s : Finset γ} :
    (∀ i ∈ s, HasProd (f i) (a i)) → HasProd (fun b ↦ ∏ i ∈ s, f i b) (∏ i ∈ s, a i) 
goal: (∀ i ∈ s, HasSum (f i) (a i)) → HasSum (fun b => ∑ i ∈ s, f i b) (∑ i ∈ s, a i)

full_name: summable_sum
code: @[to_additive]
theorem multipliable_prod {f : γ → β → α} {s : Finset γ} (hf : ∀ i ∈ s, Multipliable (f i)) :
    Multipliable fun b ↦ ∏ i ∈ s, f i b 
goal: Summable fun b => ∑ i ∈ s, f i b

full_name: multipliable_prod
code: @[to_additive]
theorem multipliable_prod {f : γ → β → α} {s : Finset γ} (hf : ∀ i ∈ s, Multipliable (f i)) :
    Multipliable fun b ↦ ∏ i ∈ s, f i b 
goal: Multipliable fun b => ∏ i ∈ s, f i b

full_name: HasSum.add_disjoint
code: @[to_additive]
theorem HasProd.mul_disjoint {s t : Set β} (hs : Disjoint s t) (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : t → α) b) : HasProd (f ∘ (↑) : (s ∪ t : Set β) → α) (a * b) 
goal: HasSum (f ∘ Subtype.val) (a + b)

full_name: HasProd.mul_disjoint
code: @[to_additive]
theorem HasProd.mul_disjoint {s t : Set β} (hs : Disjoint s t) (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : t → α) b) : HasProd (f ∘ (↑) : (s ∪ t : Set β) → α) (a * b) 
goal: HasProd (f ∘ Subtype.val) (a * b)

full_name: hasSum_sum_disjoint
code: @[to_additive]
theorem hasProd_prod_disjoint {ι} (s : Finset ι) {t : ι → Set β} {a : ι → α}
    (hs : (s : Set ι).Pairwise (Disjoint on t)) (hf : ∀ i ∈ s, HasProd (f ∘ (↑) : t i → α) (a i)) :
    HasProd (f ∘ (↑) : (⋃ i ∈ s, t i) → α) (∏ i ∈ s, a i) 
goal: HasSum (f ∘ Subtype.val) (∑ i ∈ s, a i)

full_name: hasProd_prod_disjoint
code: @[to_additive]
theorem hasProd_prod_disjoint {ι} (s : Finset ι) {t : ι → Set β} {a : ι → α}
    (hs : (s : Set ι).Pairwise (Disjoint on t)) (hf : ∀ i ∈ s, HasProd (f ∘ (↑) : t i → α) (a i)) :
    HasProd (f ∘ (↑) : (⋃ i ∈ s, t i) → α) (∏ i ∈ s, a i) 
goal: HasProd (f ∘ Subtype.val) (∏ i ∈ s, a i)

full_name: HasProd.mul_isCompl
code: @[to_additive]
theorem HasProd.mul_isCompl {s t : Set β} (hs : IsCompl s t) (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : t → α) b) : HasProd f (a * b) 
goal: HasProd f (a * b)

full_name: HasSum.add_isCompl
code: @[to_additive]
theorem HasProd.mul_isCompl {s t : Set β} (hs : IsCompl s t) (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : t → α) b) : HasProd f (a * b) 
goal: HasSum f (a + b)

full_name: HasProd.mul_compl
code: @[to_additive]
theorem HasProd.mul_compl {s : Set β} (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : (sᶜ : Set β) → α) b) : HasProd f (a * b) 
goal: HasProd f (a * b)

full_name: HasSum.add_compl
code: @[to_additive]
theorem HasProd.mul_compl {s : Set β} (ha : HasProd (f ∘ (↑) : s → α) a)
    (hb : HasProd (f ∘ (↑) : (sᶜ : Set β) → α) b) : HasProd f (a * b) 
goal: HasSum f (a + b)

full_name: Summable.add_compl
code: @[to_additive]
theorem Multipliable.mul_compl {s : Set β} (hs : Multipliable (f ∘ (↑) : s → α))
    (hsc : Multipliable (f ∘ (↑) : (sᶜ : Set β) → α)) : Multipliable f 
goal: Summable f

full_name: Multipliable.mul_compl
code: @[to_additive]
theorem Multipliable.mul_compl {s : Set β} (hs : Multipliable (f ∘ (↑) : s → α))
    (hsc : Multipliable (f ∘ (↑) : (sᶜ : Set β) → α)) : Multipliable f 
goal: Multipliable f

full_name: HasSum.compl_add
code: @[to_additive]
theorem HasProd.compl_mul {s : Set β} (ha : HasProd (f ∘ (↑) : (sᶜ : Set β) → α) a)
    (hb : HasProd (f ∘ (↑) : s → α) b) : HasProd f (a * b) 
goal: HasSum f (a + b)

full_name: HasProd.compl_mul
code: @[to_additive]
theorem HasProd.compl_mul {s : Set β} (ha : HasProd (f ∘ (↑) : (sᶜ : Set β) → α) a)
    (hb : HasProd (f ∘ (↑) : s → α) b) : HasProd f (a * b) 
goal: HasProd f (a * b)

full_name: Multipliable.compl_add
code: @[to_additive]
theorem Multipliable.compl_add {s : Set β} (hs : Multipliable (f ∘ (↑) : (sᶜ : Set β) → α))
    (hsc : Multipliable (f ∘ (↑) : s → α)) : Multipliable f 
goal: Multipliable f

full_name: Summable.compl_add
code: @[to_additive]
theorem Multipliable.compl_add {s : Set β} (hs : Multipliable (f ∘ (↑) : (sᶜ : Set β) → α))
    (hsc : Multipliable (f ∘ (↑) : s → α)) : Multipliable f 
goal: Summable f

full_name: HasProd.update'
code: /-- Version of `HasProd.update` for `CommMonoid` rather than `CommGroup`.
Rather than showing that `f.update` has a specific product in terms of `HasProd`,
it gives a relationship between the products of `f` and `f.update` given that both exist. -/
@[to_additive "Version of `HasSum.update` for `AddCommMonoid` rather than `AddCommGroup`.
Rather than showing that `f.update` has a specific sum in terms of `HasSum`,
it gives a relationship between the sums of `f` and `f.update` given that both exist."]
theorem HasProd.update' {α β : Type*} [TopologicalSpace α] [CommMonoid α] [T2Space α]
    [ContinuousMul α] [DecidableEq β] {f : β → α} {a a' : α} (hf : HasProd f a) (b : β) (x : α)
    (hf' : HasProd (update f b x) a') : a * x = a' * f b 
goal: a * x = a' * f b

full_name: HasSum.update'
code: /-- Version of `HasProd.update` for `CommMonoid` rather than `CommGroup`.
Rather than showing that `f.update` has a specific product in terms of `HasProd`,
it gives a relationship between the products of `f` and `f.update` given that both exist. -/
@[to_additive "Version of `HasSum.update` for `AddCommMonoid` rather than `AddCommGroup`.
Rather than showing that `f.update` has a specific sum in terms of `HasSum`,
it gives a relationship between the sums of `f` and `f.update` given that both exist."]
theorem HasProd.update' {α β : Type*} [TopologicalSpace α] [CommMonoid α] [T2Space α]
    [ContinuousMul α] [DecidableEq β] {f : β → α} {a a' : α} (hf : HasProd f a) (b : β) (x : α)
    (hf' : HasProd (update f b x) a') : a * x = a' * f b 
goal: a + x = a' + f b

full_name: eq_add_of_hasSum_ite
code: /-- Version of `hasProd_ite_div_hasProd` for `CommMonoid` rather than `CommGroup`.
Rather than showing that the `ite` expression has a specific product in terms of `HasProd`, it gives
a relationship between the products of `f` and `ite (n = b) 0 (f n)` given that both exist. -/
@[to_additive "Version of `hasSum_ite_sub_hasSum` for `AddCommMonoid` rather than `AddCommGroup`.
Rather than showing that the `ite` expression has a specific sum in terms of `HasSum`,
it gives a relationship between the sums of `f` and `ite (n = b) 0 (f n)` given that both exist."]
theorem eq_mul_of_hasProd_ite {α β : Type*} [TopologicalSpace α] [CommMonoid α] [T2Space α]
    [ContinuousMul α] [DecidableEq β] {f : β → α} {a : α} (hf : HasProd f a) (b : β) (a' : α)
    (hf' : HasProd (fun n ↦ ite (n = b) 1 (f n)) a') : a = a' * f b 
goal: a = a' + f b

full_name: eq_mul_of_hasProd_ite
code: /-- Version of `hasProd_ite_div_hasProd` for `CommMonoid` rather than `CommGroup`.
Rather than showing that the `ite` expression has a specific product in terms of `HasProd`, it gives
a relationship between the products of `f` and `ite (n = b) 0 (f n)` given that both exist. -/
@[to_additive "Version of `hasSum_ite_sub_hasSum` for `AddCommMonoid` rather than `AddCommGroup`.
Rather than showing that the `ite` expression has a specific sum in terms of `HasSum`,
it gives a relationship between the sums of `f` and `ite (n = b) 0 (f n)` given that both exist."]
theorem eq_mul_of_hasProd_ite {α β : Type*} [TopologicalSpace α] [CommMonoid α] [T2Space α]
    [ContinuousMul α] [DecidableEq β] {f : β → α} {a : α} (hf : HasProd f a) (b : β) (a' : α)
    (hf' : HasProd (fun n ↦ ite (n = b) 1 (f n)) a') : a = a' * f b 
goal: a = a' * f b

full_name: tsum_congr_set_coe
code: @[to_additive]
theorem tprod_congr_set_coe (f : β → α) {s t : Set β} (h : s = t) :
    ∏' x : s, f x = ∏' x : t, f x 
goal: ∑' (x : ↑s), f ↑x = ∑' (x : ↑t), f ↑x

full_name: tprod_congr_set_coe
code: @[to_additive]
theorem tprod_congr_set_coe (f : β → α) {s t : Set β} (h : s = t) :
    ∏' x : s, f x = ∏' x : t, f x 
goal: ∏' (x : ↑s), f ↑x = ∏' (x : ↑t), f ↑x

full_name: tprod_congr_subtype
code: @[to_additive]
theorem tprod_congr_subtype (f : β → α) {P Q : β → Prop} (h : ∀ x, P x ↔ Q x) :
    ∏' x : {x // P x}, f x = ∏' x : {x // Q x}, f x 
goal: ∏' (x : { x // P x }), f ↑x = ∏' (x : { x // Q x }), f ↑x

full_name: tsum_congr_subtype
code: @[to_additive]
theorem tprod_congr_subtype (f : β → α) {P Q : β → Prop} (h : ∀ x, P x ↔ Q x) :
    ∏' x : {x // P x}, f x = ∏' x : {x // Q x}, f x 
goal: ∑' (x : { x // P x }), f ↑x = ∑' (x : { x // Q x }), f ↑x

full_name: tsum_eq_finsum
code: @[to_additive]
theorem tprod_eq_finprod (hf : (mulSupport f).Finite) :
    ∏' b, f b = ∏ᶠ b, f b 
goal: ∑' (b : β), f b = ∑ᶠ (b : β), f b

full_name: tprod_eq_finprod
code: @[to_additive]
theorem tprod_eq_finprod (hf : (mulSupport f).Finite) :
    ∏' b, f b = ∏ᶠ b, f b 
goal: ∏' (b : β), f b = ∏ᶠ (b : β), f b

full_name: tprod_eq_prod'
code: @[to_additive]
theorem tprod_eq_prod' {s : Finset β} (hf : mulSupport f ⊆ s) :
    ∏' b, f b = ∏ b ∈ s, f b 
goal: ∏' (b : β), f b = ∏ b ∈ s, f b

full_name: tsum_eq_sum'
code: @[to_additive]
theorem tprod_eq_prod' {s : Finset β} (hf : mulSupport f ⊆ s) :
    ∏' b, f b = ∏ b ∈ s, f b 
goal: ∑' (b : β), f b = ∑ b ∈ s, f b

full_name: tprod_eq_prod
code: @[to_additive]
theorem tprod_eq_prod {s : Finset β} (hf : ∀ b ∉ s, f b = 1) :
    ∏' b, f b = ∏ b ∈ s, f b 
goal: ∏' (b : β), f b = ∏ b ∈ s, f b

full_name: tsum_eq_sum
code: @[to_additive]
theorem tprod_eq_prod {s : Finset β} (hf : ∀ b ∉ s, f b = 1) :
    ∏' b, f b = ∏ b ∈ s, f b 
goal: ∑' (b : β), f b = ∑ b ∈ s, f b

full_name: tprod_one
code: @[to_additive (attr := simp)]
theorem tprod_one : ∏' _ : β, (1 : α) = 1 
goal: ∏' (x : β), 1 = 1

full_name: tsum_zero
code: @[to_additive (attr := simp)]
theorem tprod_one : ∏' _ : β, (1 : α) = 1 
goal: ∑' (x : β), 0 = 0

full_name: tsum_empty
code: @[to_additive (attr := simp)]
theorem tprod_empty [IsEmpty β] : ∏' b, f b = 1 
goal: ∑' (b : β), f b = 0

full_name: tprod_empty
code: @[to_additive (attr := simp)]
theorem tprod_empty [IsEmpty β] : ∏' b, f b = 1 
goal: ∏' (b : β), f b = 1

full_name: tsum_congr
code: @[to_additive]
theorem tprod_congr {f g : β → α}
    (hfg : ∀ b, f b = g b) : ∏' b, f b = ∏' b, g b 
goal: ∑' (b : β), f b = ∑' (b : β), g b

full_name: tprod_congr
code: @[to_additive]
theorem tprod_congr {f g : β → α}
    (hfg : ∀ b, f b = g b) : ∏' b, f b = ∏' b, g b 
goal: ∏' (b : β), f b = ∏' (b : β), g b

full_name: tsum_fintype
code: @[to_additive]
theorem tprod_fintype [Fintype β] (f : β → α) : ∏' b, f b = ∏ b, f b 
goal: ∑' (b : β), f b = ∑ b : β, f b

full_name: tprod_fintype
code: @[to_additive]
theorem tprod_fintype [Fintype β] (f : β → α) : ∏' b, f b = ∏ b, f b 
goal: ∏' (b : β), f b = ∏ b : β, f b

full_name: prod_eq_tprod_mulIndicator
code: @[to_additive]
theorem prod_eq_tprod_mulIndicator (f : β → α) (s : Finset β) :
    ∏ x ∈ s, f x = ∏' x, Set.mulIndicator (↑s) f x 
goal: ∏ x ∈ s, f x = ∏' (x : β), (↑s).mulIndicator f x

full_name: sum_eq_tsum_indicator
code: @[to_additive]
theorem prod_eq_tprod_mulIndicator (f : β → α) (s : Finset β) :
    ∏ x ∈ s, f x = ∏' x, Set.mulIndicator (↑s) f x 
goal: ∑ x ∈ s, f x = ∑' (x : β), (↑s).indicator f x

full_name: tprod_bool
code: @[to_additive]
theorem tprod_bool (f : Bool → α) : ∏' i : Bool, f i = f false * f true 
goal: ∏' (i : Bool), f i = f false * f true

full_name: tsum_bool
code: @[to_additive]
theorem tprod_bool (f : Bool → α) : ∏' i : Bool, f i = f false * f true 
goal: ∑' (i : Bool), f i = f false + f true

full_name: tsum_eq_single
code: @[to_additive]
theorem tprod_eq_mulSingle {f : β → α} (b : β) (hf : ∀ b' ≠ b, f b' = 1) :
    ∏' b, f b = f b 
goal: ∑' (b : β), f b = f b

full_name: tprod_eq_mulSingle
code: @[to_additive]
theorem tprod_eq_mulSingle {f : β → α} (b : β) (hf : ∀ b' ≠ b, f b' = 1) :
    ∏' b, f b = f b 
goal: ∏' (b : β), f b = f b

full_name: tsum_tsum_eq_single
code: @[to_additive]
theorem tprod_tprod_eq_mulSingle (f : β → γ → α) (b : β) (c : γ) (hfb : ∀ b' ≠ b, f b' c = 1)
    (hfc : ∀ b', ∀ c' ≠ c, f b' c' = 1) : ∏' (b') (c'), f b' c' = f b c 
goal: ∑' (b' : β) (c' : γ), f b' c' = f b c

full_name: tprod_tprod_eq_mulSingle
code: @[to_additive]
theorem tprod_tprod_eq_mulSingle (f : β → γ → α) (b : β) (c : γ) (hfb : ∀ b' ≠ b, f b' c = 1)
    (hfc : ∀ b', ∀ c' ≠ c, f b' c' = 1) : ∏' (b') (c'), f b' c' = f b c 
goal: ∏' (b' : β) (c' : γ), f b' c' = f b c

full_name: tsum_ite_eq
code: @[to_additive (attr := simp)]
theorem tprod_ite_eq (b : β) [DecidablePred (· = b)] (a : α) :
    ∏' b', (if b' = b then a else 1) = a 
goal: (∑' (b' : β), if b' = b then a else 0) = a

full_name: tprod_ite_eq
code: @[to_additive (attr := simp)]
theorem tprod_ite_eq (b : β) [DecidablePred (· = b)] (a : α) :
    ∏' b', (if b' = b then a else 1) = a 
goal: (∏' (b' : β), if b' = b then a else 1) = a

full_name: Finset.tsum_subtype
code: @[to_additive (attr := simp, nolint simpNF)]
theorem Finset.tprod_subtype (s : Finset β) (f : β → α) :
    ∏' x : { x // x ∈ s }, f x = ∏ x ∈ s, f x 
goal: ∑' (x : { x // x ∈ s }), f ↑x = ∑ x ∈ s, f x

full_name: Finset.tprod_subtype
code: @[to_additive (attr := simp, nolint simpNF)]
theorem Finset.tprod_subtype (s : Finset β) (f : β → α) :
    ∏' x : { x // x ∈ s }, f x = ∏ x ∈ s, f x 
goal: ∏' (x : { x // x ∈ s }), f ↑x = ∏ x ∈ s, f x

full_name: Finset.tsum_subtype'
code: @[to_additive]
theorem Finset.tprod_subtype' (s : Finset β) (f : β → α) :
    ∏' x : (s : Set β), f x = ∏ x ∈ s, f x 
goal: ∑' (x : ↑↑s), f ↑x = ∑ x ∈ s, f x

full_name: Finset.tprod_subtype'
code: @[to_additive]
theorem Finset.tprod_subtype' (s : Finset β) (f : β → α) :
    ∏' x : (s : Set β), f x = ∏ x ∈ s, f x 
goal: ∏' (x : ↑↑s), f ↑x = ∏ x ∈ s, f x

full_name: tsum_singleton
code: @[to_additive (attr := simp, nolint simpNF)]
theorem tprod_singleton (b : β) (f : β → α) : ∏' x : ({b} : Set β), f x = f b 
goal: ∑' (x : ↑{b}), f ↑x = f b

full_name: tprod_singleton
code: @[to_additive (attr := simp, nolint simpNF)]
theorem tprod_singleton (b : β) (f : β → α) : ∏' x : ({b} : Set β), f x = f b 
goal: ∏' (x : ↑{b}), f ↑x = f b

full_name: Function.Injective.tprod_eq
code: @[to_additive]
theorem Function.Injective.tprod_eq {g : γ → β} (hg : Injective g) {f : β → α}
    (hf : mulSupport f ⊆ Set.range g) : ∏' c, f (g c) = ∏' b, f b 
goal: ∏' (c : γ), f (g c) = ∏' (b : β), f b

full_name: Function.Injective.tsum_eq
code: @[to_additive]
theorem Function.Injective.tprod_eq {g : γ → β} (hg : Injective g) {f : β → α}
    (hf : mulSupport f ⊆ Set.range g) : ∏' c, f (g c) = ∏' b, f b 
goal: ∑' (c : γ), f (g c) = ∑' (b : β), f b

full_name: Equiv.tprod_eq
code: @[to_additive]
theorem Equiv.tprod_eq (e : γ ≃ β) (f : β → α) : ∏' c, f (e c) = ∏' b, f b 
goal: ∏' (c : γ), f (e c) = ∏' (b : β), f b

full_name: Equiv.tsum_eq
code: @[to_additive]
theorem Equiv.tprod_eq (e : γ ≃ β) (f : β → α) : ∏' c, f (e c) = ∏' b, f b 
goal: ∑' (c : γ), f (e c) = ∑' (b : β), f b

full_name: tprod_subtype_eq_of_mulSupport_subset
code: @[to_additive]
theorem tprod_subtype_eq_of_mulSupport_subset {f : β → α} {s : Set β} (hs : mulSupport f ⊆ s) :
    ∏' x : s, f x = ∏' x, f x 
goal: ∏' (x : ↑s), f ↑x = ∏' (x : β), f x

full_name: tsum_subtype_eq_of_support_subset
code: @[to_additive]
theorem tprod_subtype_eq_of_mulSupport_subset {f : β → α} {s : Set β} (hs : mulSupport f ⊆ s) :
    ∏' x : s, f x = ∏' x, f x 
goal: ∑' (x : ↑s), f ↑x = ∑' (x : β), f x

full_name: tsum_subtype_support
code: @[to_additive]
theorem tprod_subtype_mulSupport (f : β → α) : ∏' x : mulSupport f, f x = ∏' x, f x 
goal: ∑' (x : ↑(Function.support f)), f ↑x = ∑' (x : β), f x

full_name: tprod_subtype_mulSupport
code: @[to_additive]
theorem tprod_subtype_mulSupport (f : β → α) : ∏' x : mulSupport f, f x = ∏' x, f x 
goal: ∏' (x : ↑(Function.mulSupport f)), f ↑x = ∏' (x : β), f x

full_name: tsum_subtype
code: @[to_additive]
theorem tprod_subtype (s : Set β) (f : β → α) : ∏' x : s, f x = ∏' x, s.mulIndicator f x 
goal: ∑' (x : ↑s), f ↑x = ∑' (x : β), s.indicator f x

full_name: tprod_subtype
code: @[to_additive]
theorem tprod_subtype (s : Set β) (f : β → α) : ∏' x : s, f x = ∏' x, s.mulIndicator f x 
goal: ∏' (x : ↑s), f ↑x = ∏' (x : β), s.mulIndicator f x

full_name: tsum_univ
code: @[to_additive (attr := simp, nolint simpNF)]
theorem tprod_univ (f : β → α) : ∏' x : (Set.univ : Set β), f x = ∏' x, f x 
goal: ∑' (x : ↑Set.univ), f ↑x = ∑' (x : β), f x

full_name: tprod_univ
code: @[to_additive (attr := simp, nolint simpNF)]
theorem tprod_univ (f : β → α) : ∏' x : (Set.univ : Set β), f x = ∏' x, f x 
goal: ∏' (x : ↑Set.univ), f ↑x = ∏' (x : β), f x

full_name: tsum_image
code: @[to_additive]
theorem tprod_image {g : γ → β} (f : β → α) {s : Set γ} (hg : Set.InjOn g s) :
    ∏' x : g '' s, f x = ∏' x : s, f (g x) 
goal: ∑' (x : ↑(g '' s)), f ↑x = ∑' (x : ↑s), f (g ↑x)

full_name: tprod_image
code: @[to_additive]
theorem tprod_image {g : γ → β} (f : β → α) {s : Set γ} (hg : Set.InjOn g s) :
    ∏' x : g '' s, f x = ∏' x : s, f (g x) 
goal: ∏' (x : ↑(g '' s)), f ↑x = ∏' (x : ↑s), f (g ↑x)

full_name: tsum_range
code: @[to_additive]
theorem tprod_range {g : γ → β} (f : β → α) (hg : Injective g) :
    ∏' x : Set.range g, f x = ∏' x, f (g x) 
goal: ∑' (x : ↑(Set.range g)), f ↑x = ∑' (x : γ), f (g x)

full_name: tprod_range
code: @[to_additive]
theorem tprod_range {g : γ → β} (f : β → α) (hg : Injective g) :
    ∏' x : Set.range g, f x = ∏' x, f (g x) 
goal: ∏' (x : ↑(Set.range g)), f ↑x = ∏' (x : γ), f (g x)

full_name: tprod_setElem_eq_tprod_setElem_diff
code: /-- If `f b = 1` for all `b ∈ t`, then the product of `f a` with `a ∈ s` is the same as the
product of `f a` with `a ∈ s ∖ t`. -/
@[to_additive "If `f b = 0` for all `b ∈ t`, then the sum of `f a` with `a ∈ s` is the same as the
sum of `f a` with `a ∈ s ∖ t`."]
lemma tprod_setElem_eq_tprod_setElem_diff {f : β → α} (s t : Set β)
    (hf₀ : ∀ b ∈ t, f b = 1) :
    ∏' a : s, f a = ∏' a : (s \ t : Set β), f a 
goal: ∏' (a : ↑s), f ↑a = ∏' (a : ↑(s \ t)), f ↑a

full_name: tsum_setElem_eq_tsum_setElem_diff
code: /-- If `f b = 1` for all `b ∈ t`, then the product of `f a` with `a ∈ s` is the same as the
product of `f a` with `a ∈ s ∖ t`. -/
@[to_additive "If `f b = 0` for all `b ∈ t`, then the sum of `f a` with `a ∈ s` is the same as the
sum of `f a` with `a ∈ s ∖ t`."]
lemma tprod_setElem_eq_tprod_setElem_diff {f : β → α} (s t : Set β)
    (hf₀ : ∀ b ∈ t, f b = 1) :
    ∏' a : s, f a = ∏' a : (s \ t : Set β), f a 
goal: ∑' (a : ↑s), f ↑a = ∑' (a : ↑(s \ t)), f ↑a

full_name: tsum_eq_tsum_diff_singleton
code: /-- If `f b = 1`, then the product of `f a` with `a ∈ s` is the same as the product of `f a` for
`a ∈ s ∖ {b}`. -/
@[to_additive "If `f b = 0`, then the sum of `f a` with `a ∈ s` is the same as the sum of `f a`
for `a ∈ s ∖ {b}`."]
lemma tprod_eq_tprod_diff_singleton {f : β → α} (s : Set β) {b : β} (hf₀ : f b = 1) :
    ∏' a : s, f a = ∏' a : (s \ {b} : Set β), f a 
goal: ∑' (a : ↑s), f ↑a = ∑' (a : ↑(s \ {b})), f ↑a

full_name: tprod_eq_tprod_diff_singleton
code: /-- If `f b = 1`, then the product of `f a` with `a ∈ s` is the same as the product of `f a` for
`a ∈ s ∖ {b}`. -/
@[to_additive "If `f b = 0`, then the sum of `f a` with `a ∈ s` is the same as the sum of `f a`
for `a ∈ s ∖ {b}`."]
lemma tprod_eq_tprod_diff_singleton {f : β → α} (s : Set β) {b : β} (hf₀ : f b = 1) :
    ∏' a : s, f a = ∏' a : (s \ {b} : Set β), f a 
goal: ∏' (a : ↑s), f ↑a = ∏' (a : ↑(s \ {b})), f ↑a

full_name: tsum_eq_tsum_of_ne_zero_bij
code: @[to_additive]
theorem tprod_eq_tprod_of_ne_one_bij {g : γ → α} (i : mulSupport g → β) (hi : Injective i)
    (hf : mulSupport f ⊆ Set.range i) (hfg : ∀ x, f (i x) = g x) : ∏' x, f x = ∏' y, g y 
goal: ∑' (x : β), f x = ∑' (y : γ), g y

full_name: tprod_eq_tprod_of_ne_one_bij
code: @[to_additive]
theorem tprod_eq_tprod_of_ne_one_bij {g : γ → α} (i : mulSupport g → β) (hi : Injective i)
    (hf : mulSupport f ⊆ Set.range i) (hfg : ∀ x, f (i x) = g x) : ∏' x, f x = ∏' y, g y 
goal: ∏' (x : β), f x = ∏' (y : γ), g y

full_name: Equiv.tprod_eq_tprod_of_mulSupport
code: @[to_additive]
theorem Equiv.tprod_eq_tprod_of_mulSupport {f : β → α} {g : γ → α}
    (e : mulSupport f ≃ mulSupport g) (he : ∀ x, g (e x) = f x) :
    ∏' x, f x = ∏' y, g y 
goal: ∏' (x : β), f x = ∏' (y : γ), g y

full_name: Equiv.tsum_eq_tsum_of_support
code: @[to_additive]
theorem Equiv.tprod_eq_tprod_of_mulSupport {f : β → α} {g : γ → α}
    (e : mulSupport f ≃ mulSupport g) (he : ∀ x, g (e x) = f x) :
    ∏' x, f x = ∏' y, g y 
goal: ∑' (x : β), f x = ∑' (y : γ), g y

full_name: tprod_dite_right
code: @[to_additive]
theorem tprod_dite_right (P : Prop) [Decidable P] (x : β → ¬P → α) :
    ∏' b : β, (if h : P then (1 : α) else x b h) = if h : P then (1 : α) else ∏' b : β, x b h 
goal: (∏' (b : β), if h : P then 1 else x b h) = if h : P then 1 else ∏' (b : β), x b h

full_name: tsum_dite_right
code: @[to_additive]
theorem tprod_dite_right (P : Prop) [Decidable P] (x : β → ¬P → α) :
    ∏' b : β, (if h : P then (1 : α) else x b h) = if h : P then (1 : α) else ∏' b : β, x b h 
goal: (∑' (b : β), if h : P then 0 else x b h) = if h : P then 0 else ∑' (b : β), x b h

full_name: tsum_dite_left
code: @[to_additive]
theorem tprod_dite_left (P : Prop) [Decidable P] (x : β → P → α) :
    ∏' b : β, (if h : P then x b h else 1) = if h : P then ∏' b : β, x b h else 1 
goal: (∑' (b : β), if h : P then x b h else 0) = if h : P then ∑' (b : β), x b h else 0

full_name: tprod_dite_left
code: @[to_additive]
theorem tprod_dite_left (P : Prop) [Decidable P] (x : β → P → α) :
    ∏' b : β, (if h : P then x b h else 1) = if h : P then ∏' b : β, x b h else 1 
goal: (∏' (b : β), if h : P then x b h else 1) = if h : P then ∏' (b : β), x b h else 1

full_name: tsum_extend_zero
code: @[to_additive (attr := simp)]
lemma tprod_extend_one {γ : Type*} {g : γ → β} (hg : Injective g) (f : γ → α) :
    ∏' y, extend g f 1 y = ∏' x, f x 
goal: ∑' (y : β), Function.extend g f 0 y = ∑' (x : γ), f x

full_name: tprod_extend_one
code: @[to_additive (attr := simp)]
lemma tprod_extend_one {γ : Type*} {g : γ → β} (hg : Injective g) (f : γ → α) :
    ∏' y, extend g f 1 y = ∏' x, f x 
goal: ∏' (y : β), Function.extend g f 1 y = ∏' (x : γ), f x

full_name: Function.Surjective.tprod_eq_tprod_of_hasProd_iff_hasProd
code: @[to_additive]
theorem Function.Surjective.tprod_eq_tprod_of_hasProd_iff_hasProd {α' : Type*} [CommMonoid α']
    [TopologicalSpace α'] {e : α' → α} (hes : Function.Surjective e) (h1 : e 1 = 1) {f : β → α}
    {g : γ → α'} (h : ∀ {a}, HasProd f (e a) ↔ HasProd g a) : ∏' b, f b = e (∏' c, g c) 
goal: ∏' (b : β), f b = e (∏' (c : γ), g c)

full_name: Function.Surjective.tsum_eq_tsum_of_hasSum_iff_hasSum
code: @[to_additive]
theorem Function.Surjective.tprod_eq_tprod_of_hasProd_iff_hasProd {α' : Type*} [CommMonoid α']
    [TopologicalSpace α'] {e : α' → α} (hes : Function.Surjective e) (h1 : e 1 = 1) {f : β → α}
    {g : γ → α'} (h : ∀ {a}, HasProd f (e a) ↔ HasProd g a) : ∏' b, f b = e (∏' c, g c) 
goal: ∑' (b : β), f b = e (∑' (c : γ), g c)

full_name: tprod_eq_tprod_of_hasProd_iff_hasProd
code: @[to_additive]
theorem tprod_eq_tprod_of_hasProd_iff_hasProd {f : β → α} {g : γ → α}
    (h : ∀ {a}, HasProd f a ↔ HasProd g a) : ∏' b, f b = ∏' c, g c 
goal: ∏' (b : β), f b = ∏' (c : γ), g c

full_name: tsum_eq_tsum_of_hasSum_iff_hasSum
code: @[to_additive]
theorem tprod_eq_tprod_of_hasProd_iff_hasProd {f : β → α} {g : γ → α}
    (h : ∀ {a}, HasProd f a ↔ HasProd g a) : ∏' b, f b = ∏' c, g c 
goal: ∑' (b : β), f b = ∑' (c : γ), g c

full_name: tprod_mul
code: @[to_additive]
theorem tprod_mul (hf : Multipliable f) (hg : Multipliable g) :
    ∏' b, (f b * g b) = (∏' b, f b) * ∏' b, g b 
goal: ∏' (b : β), f b * g b = (∏' (b : β), f b) * ∏' (b : β), g b

full_name: tsum_add
code: @[to_additive]
theorem tprod_mul (hf : Multipliable f) (hg : Multipliable g) :
    ∏' b, (f b * g b) = (∏' b, f b) * ∏' b, g b 
goal: ∑' (b : β), (f b + g b) = ∑' (b : β), f b + ∑' (b : β), g b

full_name: tprod_of_prod
code: @[to_additive tsum_sum]
theorem tprod_of_prod {f : γ → β → α} {s : Finset γ} (hf : ∀ i ∈ s, Multipliable (f i)) :
    ∏' b, ∏ i ∈ s, f i b = ∏ i ∈ s, ∏' b, f i b 
goal: ∏' (b : β), ∏ i ∈ s, f i b = ∏ i ∈ s, ∏' (b : β), f i b

full_name: tsum_sum
code: @[to_additive tsum_sum]
theorem tprod_of_prod {f : γ → β → α} {s : Finset γ} (hf : ∀ i ∈ s, Multipliable (f i)) :
    ∏' b, ∏ i ∈ s, f i b = ∏ i ∈ s, ∏' b, f i b 
goal: ∑' (b : β), ∑ i ∈ s, f i b = ∑ i ∈ s, ∑' (b : β), f i b

full_name: tprod_eq_mul_tprod_ite'
code: /-- Version of `tprod_eq_mul_tprod_ite` for `CommMonoid` rather than `CommGroup`.
Requires a different convergence assumption involving `Function.update`. -/
@[to_additive "Version of `tsum_eq_add_tsum_ite` for `AddCommMonoid` rather than `AddCommGroup`.
Requires a different convergence assumption involving `Function.update`."]
theorem tprod_eq_mul_tprod_ite' [DecidableEq β] {f : β → α} (b : β)
    (hf : Multipliable (update f b 1)) :
    ∏' x, f x = f b * ∏' x, ite (x = b) 1 (f x) 
goal: ∏' (x : β), f x = f b * ∏' (x : β), if x = b then 1 else f x

full_name: tsum_eq_add_tsum_ite'
code: /-- Version of `tprod_eq_mul_tprod_ite` for `CommMonoid` rather than `CommGroup`.
Requires a different convergence assumption involving `Function.update`. -/
@[to_additive "Version of `tsum_eq_add_tsum_ite` for `AddCommMonoid` rather than `AddCommGroup`.
Requires a different convergence assumption involving `Function.update`."]
theorem tprod_eq_mul_tprod_ite' [DecidableEq β] {f : β → α} (b : β)
    (hf : Multipliable (update f b 1)) :
    ∏' x, f x = f b * ∏' x, ite (x = b) 1 (f x) 
goal: ∑' (x : β), f x = f b + ∑' (x : β), if x = b then 0 else f x

full_name: tprod_mul_tprod_compl
code: @[to_additive]
theorem tprod_mul_tprod_compl {s : Set β} (hs : Multipliable (f ∘ (↑) : s → α))
    (hsc : Multipliable (f ∘ (↑) : ↑sᶜ → α)) : (∏' x : s, f x) * ∏' x : ↑sᶜ, f x = ∏' x, f x 
goal: (∏' (x : ↑s), f ↑x) * ∏' (x : ↑sᶜ), f ↑x = ∏' (x : β), f x

full_name: tsum_add_tsum_compl
code: @[to_additive]
theorem tprod_mul_tprod_compl {s : Set β} (hs : Multipliable (f ∘ (↑) : s → α))
    (hsc : Multipliable (f ∘ (↑) : ↑sᶜ → α)) : (∏' x : s, f x) * ∏' x : ↑sᶜ, f x = ∏' x, f x 
goal: ∑' (x : ↑s), f ↑x + ∑' (x : ↑sᶜ), f ↑x = ∑' (x : β), f x

full_name: tprod_union_disjoint
code: @[to_additive]
theorem tprod_union_disjoint {s t : Set β} (hd : Disjoint s t) (hs : Multipliable (f ∘ (↑) : s → α))
    (ht : Multipliable (f ∘ (↑) : t → α)) :
    ∏' x : ↑(s ∪ t), f x = (∏' x : s, f x) * ∏' x : t, f x 
goal: ∏' (x : ↑(s ∪ t)), f ↑x = (∏' (x : ↑s), f ↑x) * ∏' (x : ↑t), f ↑x

full_name: tsum_union_disjoint
code: @[to_additive]
theorem tprod_union_disjoint {s t : Set β} (hd : Disjoint s t) (hs : Multipliable (f ∘ (↑) : s → α))
    (ht : Multipliable (f ∘ (↑) : t → α)) :
    ∏' x : ↑(s ∪ t), f x = (∏' x : s, f x) * ∏' x : t, f x 
goal: ∑' (x : ↑(s ∪ t)), f ↑x = ∑' (x : ↑s), f ↑x + ∑' (x : ↑t), f ↑x

full_name: tprod_finset_bUnion_disjoint
code: @[to_additive]
theorem tprod_finset_bUnion_disjoint {ι} {s : Finset ι} {t : ι → Set β}
    (hd : (s : Set ι).Pairwise (Disjoint on t)) (hf : ∀ i ∈ s, Multipliable (f ∘ (↑) : t i → α)) :
    ∏' x : ⋃ i ∈ s, t i, f x = ∏ i ∈ s, ∏' x : t i, f x 
goal: ∏' (x : ↑(⋃ i ∈ s, t i)), f ↑x = ∏ i ∈ s, ∏' (x : ↑(t i)), f ↑x

full_name: tsum_finset_bUnion_disjoint
code: @[to_additive]
theorem tprod_finset_bUnion_disjoint {ι} {s : Finset ι} {t : ι → Set β}
    (hd : (s : Set ι).Pairwise (Disjoint on t)) (hf : ∀ i ∈ s, Multipliable (f ∘ (↑) : t i → α)) :
    ∏' x : ⋃ i ∈ s, t i, f x = ∏ i ∈ s, ∏' x : t i, f x 
goal: ∑' (x : ↑(⋃ i ∈ s, t i)), f ↑x = ∑ i ∈ s, ∑' (x : ↑(t i)), f ↑x