/- Copyright (c) 2018 Simon Hudon. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Simon Hudon, Patrick Massot ! This file was ported from Lean 3 source module algebra.big_operators.pi ! leanprover-community/mathlib commit fa2309577c7009ea243cffdf990cd6c84f0ad497 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.Fintype.Card import Mathlib.Algebra.Group.Prod import Mathlib.Algebra.BigOperators.Basic import Mathlib.Algebra.Ring.Pi /-! # Big operators for Pi Types This file contains theorems relevant to big operators in binary and arbitrary product of monoids and groups -/ open BigOperators namespace Pi @[to_additive] theoremlist_prod_apply {α :α: Type ?u.2Type _} {Type _: Type (?u.2+1)β :β: α → Type ?u.7α →α: Type ?u.2Type _} [∀Type _: Type (?u.7+1)a, Monoid (a: ?m.11ββ: α → Type ?u.7a)] (a: ?m.11a :a: αα) (α: Type ?u.2l : List (∀l: List ((a : α) → β a)a,a: ?m.22ββ: α → Type ?u.7a)) :a: ?m.22l.prodl: List ((a : α) → β a)a = (a: αl.map funl: List ((a : α) → β a)f : ∀f: (a : α) → β aa,a: ?m.1895ββ: α → Type ?u.7a ↦a: ?m.1895ff: (a : α) → β aa).prod := (a: αevalMonoidHomevalMonoidHom: {I : Type ?u.2513} → (f : I → Type ?u.2512) → [inst : (i : I) → MulOneClass (f i)] → (i : I) → ((i : I) → f i) →* f iββ: α → Type u_2a).a: αmap_list_prod_ #align pi.list_prod_apply Pi.list_prod_apply #align pi.list_sum_apply Pi.list_sum_apply @[_: List ?m.3164to_additive] theoremto_additive: ∀ {α : Type u_1} {β : α → Type u_2} [inst : (a : α) → AddCommMonoid (β a)] (a : α) (s : Multiset ((a : α) → β a)), Multiset.sum s a = Multiset.sum (Multiset.map (fun f => f a) s)multiset_prod_apply {multiset_prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Multiset ((a : α) → β a)), Multiset.prod s a = Multiset.prod (Multiset.map (fun f => f a) s)α :α: Type ?u.3356Type _} {Type _: Type (?u.3356+1)β :β: α → Type ?u.3361α →α: Type ?u.3356Type _} [∀Type _: Type (?u.3361+1)a, CommMonoid (a: ?m.3365ββ: α → Type ?u.3361a)] (a: ?m.3365a :a: αα) (α: Type ?u.3356s : Multiset (∀s: Multiset ((a : α) → β a)a,a: ?m.3376ββ: α → Type ?u.3361a)) :a: ?m.3376s.s: Multiset ((a : α) → β a)prodprod: {α : Type ?u.3383} → [inst : CommMonoid α] → Multiset α → αa = (a: αs.map funs: Multiset ((a : α) → β a)f : ∀f: (a : α) → β aa,a: ?m.3454ββ: α → Type ?u.3361a ↦a: ?m.3454ff: (a : α) → β aa).a: αprod := (prod: {α : Type ?u.3461} → [inst : CommMonoid α] → Multiset α → αevalMonoidHomevalMonoidHom: {I : Type ?u.3489} → (f : I → Type ?u.3488) → [inst : (i : I) → MulOneClass (f i)] → (i : I) → ((i : I) → f i) →* f iββ: α → Type u_2a).a: αmap_multiset_prodmap_multiset_prod: ∀ {α : Type ?u.4386} {β : Type ?u.4387} [inst : CommMonoid α] [inst_1 : CommMonoid β] (f : α →* β) (s : Multiset α), ↑f (Multiset.prod s) = Multiset.prod (Multiset.map (↑f) s)_ #align pi.multiset_prod_apply_: Multiset ?m.4394Pi.multiset_prod_apply #align pi.multiset_sum_applyPi.multiset_prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Multiset ((a : α) → β a)), Multiset.prod s a = Multiset.prod (Multiset.map (fun f => f a) s)Pi.multiset_sum_apply end Pi @[Pi.multiset_sum_apply: ∀ {α : Type u_1} {β : α → Type u_2} [inst : (a : α) → AddCommMonoid (β a)] (a : α) (s : Multiset ((a : α) → β a)), Multiset.sum s a = Multiset.sum (Multiset.map (fun f => f a) s)to_additive (attr:=simp)] theoremto_additive: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : (a : α) → AddCommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.sum s (fun c => g c) a = ∑ c in s, g c aFinset.prod_apply {Finset.prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.prod s (fun c => g c) a = ∏ c in s, g c aα :α: Type u_1Type _} {Type _: Type (?u.4567+1)β :β: α → Type u_2α →α: Type ?u.4567Type _} {Type _: Type (?u.4572+1)γ} [∀γ: ?m.4575a, CommMonoid (a: ?m.4579ββ: α → Type ?u.4572a)] (a: ?m.4579a :a: αα) (α: Type ?u.4567s : Finsets: Finset γγ) (γ: ?m.4575g :g: γ → (a : α) → β aγ → ∀γ: ?m.4575a,a: ?m.4594ββ: α → Type ?u.4572a) : (∏a: ?m.4594c inc: ?m.4608s,s: Finset γgg: γ → (a : α) → β ac)c: ?m.4608a = ∏a: αc inc: ?m.4676s,s: Finset γgg: γ → (a : α) → β acc: ?m.4676a := (a: αPi.evalMonoidHomPi.evalMonoidHom: {I : Type ?u.4703} → (f : I → Type ?u.4702) → [inst : (i : I) → MulOneClass (f i)] → (i : I) → ((i : I) → f i) →* f iββ: α → Type u_2a).a: αmap_prodmap_prod: ∀ {β : Type ?u.5602} {α : Type ?u.5601} {γ : Type ?u.5600} [inst : CommMonoid β] [inst_1 : CommMonoid γ] (g : β →* γ) (f : α → β) (s : Finset α), ↑g (∏ x in s, f x) = ∏ x in s, ↑g (f x)__: ?m.5612 → ?m.5611_ #align finset.prod_apply_: Finset ?m.5612Finset.prod_apply #align finset.sum_applyFinset.prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.prod s (fun c => g c) a = ∏ c in s, g c aFinset.sum_apply /-- An 'unapplied' analogue of `Finset.prod_apply`. -/ @[Finset.sum_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : (a : α) → AddCommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.sum s (fun c => g c) a = ∑ c in s, g c ato_additive "An 'unapplied' analogue of `Finset.sum_apply`."] theoremFinset.prod_fn {α :α: Type u_1Type _} {Type _: Type (?u.5852+1)β :β: α → Type u_2α →α: Type ?u.5852Type _} {Type _: Type (?u.5857+1)γ} [∀γ: ?m.5860a, CommMonoid (a: ?m.5864ββ: α → Type ?u.5857a)] (a: ?m.5864s : Finsets: Finset γγ) (γ: ?m.5860g :g: γ → (a : α) → β aγ → ∀γ: ?m.5860a,a: ?m.5877ββ: α → Type ?u.5857a) : (∏a: ?m.5877c inc: ?m.5891s,s: Finset γgg: γ → (a : α) → β ac) = func: ?m.5891a ↦ ∏a: ?m.5953c inc: ?m.5962s,s: Finset γgg: γ → (a : α) → β acc: ?m.5962a := funext funa: ?m.5953_ ↦_: ?m.6007Finset.prod_applyFinset.prod_apply: ∀ {α : Type ?u.6009} {β : α → Type ?u.6010} {γ : Type ?u.6011} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.prod s (fun c => g c) a = ∏ c in s, g c a__: ?m.6012__: Finset ?m.6014_ #align finset.prod_fn Finset.prod_fn #align finset.sum_fn Finset.sum_fn @[_: ?m.6014 → (a : ?m.6012) → ?m.6013 ato_additive] theoremto_additive: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : Fintype γ] [inst_1 : (a : α) → AddCommMonoid (β a)] (a : α) (g : γ → (a : α) → β a), Finset.sum Finset.univ (fun c => g c) a = ∑ c : γ, g c aFintype.prod_apply {Fintype.prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : Fintype γ] [inst_1 : (a : α) → CommMonoid (β a)] (a : α) (g : γ → (a : α) → β a), Finset.prod Finset.univ (fun c => g c) a = ∏ c : γ, g c aα :α: Type u_1Type _} {Type _: Type (?u.6174+1)β :β: α → Type ?u.6179α →α: Type ?u.6174Type _} {Type _: Type (?u.6179+1)γ :γ: Type u_3Type _} [FintypeType _: Type (?u.6182+1)γ] [∀γ: Type ?u.6182a, CommMonoid (a: ?m.6189ββ: α → Type ?u.6179a)] (a: ?m.6189a :a: αα) (α: Type ?u.6174g :g: γ → (a : α) → β aγ → ∀γ: Type ?u.6182a,a: ?m.6201ββ: α → Type ?u.6179a) : (∏a: ?m.6201c,c: ?m.6265gg: γ → (a : α) → β ac)c: ?m.6265a = ∏a: αc,c: ?m.6389gg: γ → (a : α) → β acc: ?m.6389a :=a: αFinset.prod_applyFinset.prod_apply: ∀ {α : Type ?u.6415} {β : α → Type ?u.6416} {γ : Type ?u.6417} [inst : (a : α) → CommMonoid (β a)] (a : α) (s : Finset γ) (g : γ → (a : α) → β a), Finset.prod s (fun c => g c) a = ∏ c in s, g c aa Finset.univa: αg #align fintype.prod_applyg: γ → (a : α) → β aFintype.prod_apply #align fintype.sum_applyFintype.prod_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : Fintype γ] [inst_1 : (a : α) → CommMonoid (β a)] (a : α) (g : γ → (a : α) → β a), Finset.prod Finset.univ (fun c => g c) a = ∏ c : γ, g c aFintype.sum_apply @[to_additiveFintype.sum_apply: ∀ {α : Type u_1} {β : α → Type u_2} {γ : Type u_3} [inst : Fintype γ] [inst_1 : (a : α) → AddCommMonoid (β a)] (a : α) (g : γ → (a : α) → β a), Finset.sum Finset.univ (fun c => g c) a = ∑ c : γ, g c aprod_mk_sum] theoremprod_mk_sum: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] (s : Finset γ) (f : γ → α) (g : γ → β), (∑ x in s, f x, ∑ x in s, g x) = ∑ x in s, (f x, g x)prod_mk_prod {prod_mk_prod: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : CommMonoid α] [inst_1 : CommMonoid β] (s : Finset γ) (f : γ → α) (g : γ → β), (∏ x in s, f x, ∏ x in s, g x) = ∏ x in s, (f x, g x)αα: Type u_1ββ: Type ?u.6591γ :γ: Type u_3Type _} [CommMonoidType _: Type (?u.6594+1)α] [CommMonoidα: Type ?u.6588β] (β: Type ?u.6591s : Finsets: Finset γγ) (γ: Type ?u.6594f :f: γ → αγ →γ: Type ?u.6594α) (α: Type ?u.6588g :g: γ → βγ →γ: Type ?u.6594β) : (∏β: Type ?u.6591x inx: ?m.6651s,s: Finset γff: γ → αx, ∏x: ?m.6651x inx: ?m.6699s,s: Finset γgg: γ → βx) = ∏x: ?m.6699x inx: ?m.6723s, (s: Finset γff: γ → αx,x: ?m.6723gg: γ → βx) := haveI :=x: ?m.6723Classical.decEqClassical.decEq: (α : Sort ?u.6790) → DecidableEq αγ Finset.induction_onγ: Type u_3s rfl (s: Finset γGoals accomplished! 🐙α: Type u_1
β: Type u_2
γ: Type u_3
inst✝¹: CommMonoid α
inst✝: CommMonoid β
s: Finset γ
f: γ → α
g: γ → β
this: DecidableEq γ) #align prod_mk_prodGoals accomplished! 🐙prod_mk_prod #align prod_mk_sumprod_mk_prod: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : CommMonoid α] [inst_1 : CommMonoid β] (s : Finset γ) (f : γ → α) (g : γ → β), (∏ x in s, f x, ∏ x in s, g x) = ∏ x in s, (f x, g x)prod_mk_sum section MulSingle variable {prod_mk_sum: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] (s : Finset γ) (f : γ → α) (g : γ → β), (∑ x in s, f x, ∑ x in s, g x) = ∑ x in s, (f x, g x)I :I: Type ?u.13588Type _} [DecidableEqType _: Type (?u.13613+1)I] {I: Type ?u.13613Z :Z: I → Type ?u.13602I →I: Type ?u.13613Type _} variable [∀Type _: Type (?u.17784+1)i, CommMonoid (i: ?m.13631ZZ: I → Type ?u.13627i)] @[i: ?m.13606to_additive] theoremto_additive: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_2} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Fintype I] (f : (i : I) → Z i), ∑ i : I, Pi.single i (f i) = fFinset.univ_prod_mulSingle [FintypeFinset.univ_prod_mulSingle: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_2} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Fintype I] (f : (i : I) → Z i), ∏ i : I, Pi.mulSingle i (f i) = fI] (I: Type ?u.13613f : ∀f: (i : I) → Z ii,i: ?m.13642ZZ: I → Type ?u.13627i) : (∏i: ?m.13642i,i: ?m.13706Pi.mulSinglePi.mulSingle: {I : Type ?u.13709} → {f : I → Type ?u.13708} → [inst : DecidableEq I] → [inst : (i : I) → One (f i)] → (i : I) → f i → (j : I) → f ji (i: ?m.13706ff: (i : I) → Z ii)) =i: ?m.13706f :=f: (i : I) → Z iGoals accomplished! 🐙I: Type u_1
inst✝²: DecidableEq I
Z: I → Type u_2
inst✝¹: (i : I) → CommMonoid (Z i)
inst✝: Fintype I
f: (i : I) → Z i∏ i : I, Pi.mulSingle i (f i) = fI: Type u_1
inst✝²: DecidableEq I
Z: I → Type u_2
inst✝¹: (i : I) → CommMonoid (Z i)
inst✝: Fintype I
f: (i : I) → Z i
a: I
hFinset.prod univ (fun i => Pi.mulSingle i (f i)) a = f aI: Type u_1
inst✝²: DecidableEq I
Z: I → Type u_2
inst✝¹: (i : I) → CommMonoid (Z i)
inst✝: Fintype I
f: (i : I) → Z i∏ i : I, Pi.mulSingle i (f i) = f#align finset.univ_prod_mul_singleGoals accomplished! 🐙Finset.univ_prod_mulSingle #align finset.univ_sum_singleFinset.univ_prod_mulSingle: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_2} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Fintype I] (f : (i : I) → Z i), ∏ i : I, Pi.mulSingle i (f i) = fFinset.univ_sum_single @[Finset.univ_sum_single: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_2} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Fintype I] (f : (i : I) → Z i), ∑ i : I, Pi.single i (f i) = fto_additive] theoremto_additive: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : AddCommMonoid G] (g h : ((i : I) → Z i) →+ G), (∀ (i : I) (x : Z i), ↑g (Pi.single i x) = ↑h (Pi.single i x)) → g = hMonoidHom.functions_ext [FiniteMonoidHom.functions_ext: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : CommMonoid G] (g h : ((i : I) → Z i) →* G), (∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)) → g = hI] (I: Type ?u.17770G :G: Type ?u.17798Type _) [CommMonoidType _: Type (?u.17798+1)G] (G: Type ?u.17798gg: ((i : I) → Z i) →* Gh : (∀h: ((i : I) → Z i) →* Gi,i: ?m.19246ZZ: I → Type ?u.17784i) →*i: ?m.19246G) (G: Type ?u.17798H : ∀H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)ii: ?m.19255x,x: ?m.19258g (g: ((i : I) → Z i) →* GPi.mulSinglePi.mulSingle: {I : Type ?u.26313} → {f : I → Type ?u.26312} → [inst : DecidableEq I] → [inst : (i : I) → One (f i)] → (i : I) → f i → (j : I) → f jii: ?m.19255x) =x: ?m.19258h (h: ((i : I) → Z i) →* GPi.mulSinglePi.mulSingle: {I : Type ?u.34535} → {f : I → Type ?u.34534} → [inst : DecidableEq I] → [inst : (i : I) → One (f i)] → (i : I) → f i → (j : I) → f jii: ?m.19255x)) :x: ?m.19258g =g: ((i : I) → Z i) →* Gh :=h: ((i : I) → Z i) →* GGoals accomplished! 🐙I: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)g = hI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
introg = hI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)g = hI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h↑g k = ↑h kI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)g = hI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h↑g k = ↑h kI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h↑g (∏ i : I, Pi.mulSingle i (k i)) = ↑h (∏ i : I, Pi.mulSingle i (k i))I: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h↑g k = ↑h kI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h∏ x : I, ↑g (Pi.mulSingle x (k x)) = ↑h (∏ i : I, Pi.mulSingle i (k i))I: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h↑g k = ↑h kI: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h∏ x : I, ↑g (Pi.mulSingle x (k x)) = ∏ x : I, ↑h (Pi.mulSingle x (k x))I: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)
val✝: Fintype I
k: (i : I) → Z i
intro.h∏ x : I, ↑g (Pi.mulSingle x (k x)) = ∏ x : I, ↑h (Pi.mulSingle x (k x))I: Type u_1
inst✝³: DecidableEq I
Z: I → Type u_3
inst✝²: (i : I) → CommMonoid (Z i)
inst✝¹: Finite I
G: Type u_2
inst✝: CommMonoid G
g, h: ((i : I) → Z i) →* G
H: ∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)g = h#align monoid_hom.functions_extGoals accomplished! 🐙MonoidHom.functions_ext #align add_monoid_hom.functions_extMonoidHom.functions_ext: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : CommMonoid G] (g h : ((i : I) → Z i) →* G), (∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)) → g = hAddMonoidHom.functions_ext /-- This is used as the ext lemma instead of `MonoidHom.functions_ext` for reasons explained in note [partially-applied ext lemmas]. -/ @[AddMonoidHom.functions_ext: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : AddCommMonoid G] (g h : ((i : I) → Z i) →+ G), (∀ (i : I) (x : Z i), ↑g (Pi.single i x) = ↑h (Pi.single i x)) → g = hto_additive (attr := ext) "\nThis is used as the ext lemma instead of `AddMonoidHom.functions_ext` for reasons explained in note [partially-applied ext lemmas]."] theoremto_additive: ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Finite I] (M : Type u_2) [inst_3 : AddCommMonoid M] (g h : ((i : I) → Z i) →+ M), (∀ (i : I), AddMonoidHom.comp g (AddMonoidHom.single Z i) = AddMonoidHom.comp h (AddMonoidHom.single Z i)) → g = hMonoidHom.functions_ext' [FiniteI] (I: Type ?u.37285M :M: Type u_2Type _) [CommMonoidType _: Type (?u.37313+1)M] (M: Type ?u.37313gg: ((i : I) → Z i) →* Mh : (∀h: ((i : I) → Z i) →* Mi,i: ?m.37322ZZ: I → Type ?u.37299i) →*i: ?m.38761M) (H : ∀M: Type ?u.37313i,i: ?m.38770g.g: ((i : I) → Z i) →* Mcomp (comp: {M : Type ?u.38776} → {N : Type ?u.38775} → {P : Type ?u.38774} → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → [inst_2 : MulOneClass P] → (N →* P) → (M →* N) → M →* PMonoidHom.singleMonoidHom.single: {I : Type ?u.38797} → (f : I → Type ?u.38796) → [inst : DecidableEq I] → [inst : (i : I) → MulOneClass (f i)] → (i : I) → f i →* (i : I) → f iZZ: I → Type ?u.37299i) =i: ?m.38770h.h: ((i : I) → Z i) →* Mcomp (comp: {M : Type ?u.40075} → {N : Type ?u.40074} → {P : Type ?u.40073} → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → [inst_2 : MulOneClass P] → (N →* P) → (M →* N) → M →* PMonoidHom.singleMonoidHom.single: {I : Type ?u.40092} → (f : I → Type ?u.40091) → [inst : DecidableEq I] → [inst : (i : I) → MulOneClass (f i)] → (i : I) → f i →* (i : I) → f iZZ: I → Type ?u.37299i)) :i: ?m.38770g =g: ((i : I) → Z i) →* Mh :=h: ((i : I) → Z i) →* Mg.g: ((i : I) → Z i) →* Mfunctions_extfunctions_ext: ∀ {I : Type ?u.40131} [inst : DecidableEq I] {Z : I → Type ?u.40133} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Finite I] (G : Type ?u.40132) [inst_3 : CommMonoid G] (g h : ((i : I) → Z i) →* G), (∀ (i : I) (x : Z i), ↑g (Pi.mulSingle i x) = ↑h (Pi.mulSingle i x)) → g = hMM: Type u_2h funh: ((i : I) → Z i) →* Mi => FunLike.congr_fun (Hi: ?m.40249i) #align monoid_hom.functions_ext'i: ?m.40249MonoidHom.functions_ext' #align add_monoid_hom.functions_ext'MonoidHom.functions_ext': ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → CommMonoid (Z i)] [inst_2 : Finite I] (M : Type u_2) [inst_3 : CommMonoid M] (g h : ((i : I) → Z i) →* M), (∀ (i : I), MonoidHom.comp g (MonoidHom.single Z i) = MonoidHom.comp h (MonoidHom.single Z i)) → g = hAddMonoidHom.functions_ext' end MulSingle section RingHom open Pi variable {AddMonoidHom.functions_ext': ∀ {I : Type u_1} [inst : DecidableEq I] {Z : I → Type u_3} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Finite I] (M : Type u_2) [inst_3 : AddCommMonoid M] (g h : ((i : I) → Z i) →+ M), (∀ (i : I), AddMonoidHom.comp g (AddMonoidHom.single Z i) = AddMonoidHom.comp h (AddMonoidHom.single Z i)) → g = hI :I: Type ?u.47778Type _} [DecidableEqType _: Type (?u.47753+1)I] {I: Type ?u.47736f :f: I → Type ?u.47792I →I: Type ?u.47753Type _} variable [∀Type _: Type (?u.47767+1)i, NonAssocSemiring (i: ?m.47796ff: I → Type ?u.47792i)] @[ext] theoremi: ?m.47771RingHom.functions_ext [FiniteRingHom.functions_ext: ∀ {I : Type u_1} [inst : DecidableEq I] {f : I → Type u_3} [inst_1 : (i : I) → NonAssocSemiring (f i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : NonAssocSemiring G] (g h : ((i : I) → f i) →+* G), (∀ (i : I) (x : f i), ↑g (single i x) = ↑h (single i x)) → g = hI] (I: Type ?u.47778G :G: Type ?u.47806Type _) [NonAssocSemiringType _: Type (?u.47806+1)G] (G: Type ?u.47806gg: ((i : I) → f i) →+* Gh : (∀h: ((i : I) → f i) →+* Gi,i: ?m.47871ff: I → Type ?u.47792i) →+*i: ?m.47871G) (H : ∀ (G: Type ?u.47806i :i: II) (I: Type ?u.47778x :x: f iff: I → Type ?u.47792i),i: Ig (g: ((i : I) → f i) →+* Gsinglesingle: {I : Type ?u.54848} → {f : I → Type ?u.54847} → [inst : DecidableEq I] → [inst : (i : I) → Zero (f i)] → (i : I) → f i → (j : I) → f jii: Ix) =x: f ih (h: ((i : I) → f i) →+* Gsinglesingle: {I : Type ?u.62645} → {f : I → Type ?u.62644} → [inst : DecidableEq I] → [inst : (i : I) → Zero (f i)] → (i : I) → f i → (j : I) → f jii: Ix)) :x: f ig =g: ((i : I) → f i) →+* Gh :=h: ((i : I) → f i) →+* GRingHom.coe_addMonoidHom_injective <| @RingHom.coe_addMonoidHom_injective: ∀ {α : Type ?u.62799} {β : Type ?u.62800} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β}, Function.Injective fun f => ↑fAddMonoidHom.functions_extAddMonoidHom.functions_ext: ∀ {I : Type ?u.62817} [inst : DecidableEq I] {Z : I → Type ?u.62819} [inst_1 : (i : I) → AddCommMonoid (Z i)] [inst_2 : Finite I] (G : Type ?u.62818) [inst_3 : AddCommMonoid G] (g h : ((i : I) → Z i) →+ G), (∀ (i : I) (x : Z i), ↑g (single i x) = ↑h (single i x)) → g = hI _I: Type ?u.47778f _ _f: I → Type ?u.47792G _ (G: Type u_2g : (∀g: ((i : I) → f i) →+* Gi,i: ?m.62831ff: I → Type ?u.47792i) →+i: ?m.62831G)G: Type u_2h H #align ring_hom.functions_exth: ((i : I) → f i) →+* GRingHom.functions_ext end RingHom namespace Prod variable {RingHom.functions_ext: ∀ {I : Type u_1} [inst : DecidableEq I] {f : I → Type u_3} [inst_1 : (i : I) → NonAssocSemiring (f i)] [inst_2 : Finite I] (G : Type u_2) [inst_3 : NonAssocSemiring G] (g h : ((i : I) → f i) →+* G), (∀ (i : I) (x : f i), ↑g (single i x) = ↑h (single i x)) → g = hαα: Type ?u.64455ββ: Type ?u.65562γ :γ: Type ?u.64437Type _} [CommMonoidType _: Type (?u.64458+1)α] [CommMonoidα: Type ?u.64455β] {β: Type ?u.65562s : Finsets: Finset γγ} {γ: Type ?u.64437f :f: γ → α × βγ →γ: Type ?u.64461α ×α: Type ?u.64431β} @[β: Type ?u.64434to_additive] theoremto_additive: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] {s : Finset γ} {f : γ → α × β}, (∑ c in s, f c).fst = ∑ c in s, (f c).fstfst_prod : (∏fst_prod: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : CommMonoid α] [inst_1 : CommMonoid β] {s : Finset γ} {f : γ → α × β}, (∏ c in s, f c).fst = ∏ c in s, (f c).fstc inc: ?m.64488s,s: Finset γff: γ → α × βc).1 = ∏c: ?m.64488c inc: ?m.64552s, (s: Finset γff: γ → α × βc).1 := (c: ?m.64552MonoidHom.fstMonoidHom.fst: (M : Type ?u.64574) → (N : Type ?u.64573) → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → M × N →* Mαα: Type ?u.64455β).β: Type ?u.64458map_prodmap_prod: ∀ {β : Type ?u.65407} {α : Type ?u.65406} {γ : Type ?u.65405} [inst : CommMonoid β] [inst_1 : CommMonoid γ] (g : β →* γ) (f : α → β) (s : Finset α), ↑g (∏ x in s, f x) = ∏ x in s, ↑g (f x)ff: γ → α × βs #align prod.fst_prods: Finset γProd.fst_prod #align prod.fst_sumProd.fst_prod: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : CommMonoid α] [inst_1 : CommMonoid β] {s : Finset γ} {f : γ → α × β}, (∏ c in s, f c).fst = ∏ c in s, (f c).fstProd.fst_sum @[Prod.fst_sum: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] {s : Finset γ} {f : γ → α × β}, (∑ c in s, f c).fst = ∑ c in s, (f c).fstto_additive] theoremto_additive: ∀ {α : Type u_2} {β : Type u_1} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] {s : Finset γ} {f : γ → α × β}, (∑ c in s, f c).snd = ∑ c in s, (f c).sndsnd_prod : (∏snd_prod: (∏ c in s, f c).snd = ∏ c in s, (f c).sndc inc: ?m.65592s,s: Finset γff: γ → α × βc).2 = ∏c: ?m.65592c inc: ?m.65656s, (s: Finset γff: γ → α × βc).2 := (c: ?m.65656MonoidHom.sndMonoidHom.snd: (M : Type ?u.65678) → (N : Type ?u.65677) → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → M × N →* Nαα: Type ?u.65559β).β: Type ?u.65562map_prodmap_prod: ∀ {β : Type ?u.66511} {α : Type ?u.66510} {γ : Type ?u.66509} [inst : CommMonoid β] [inst_1 : CommMonoid γ] (g : β →* γ) (f : α → β) (s : Finset α), ↑g (∏ x in s, f x) = ∏ x in s, ↑g (f x)ff: γ → α × βs #align prod.snd_prods: Finset γProd.snd_prod #align prod.snd_sumProd.snd_prod: ∀ {α : Type u_2} {β : Type u_1} {γ : Type u_3} [inst : CommMonoid α] [inst_1 : CommMonoid β] {s : Finset γ} {f : γ → α × β}, (∏ c in s, f c).snd = ∏ c in s, (f c).sndProd.snd_sum end ProdProd.snd_sum: ∀ {α : Type u_2} {β : Type u_1} {γ : Type u_3} [inst : AddCommMonoid α] [inst_1 : AddCommMonoid β] {s : Finset γ} {f : γ → α × β}, (∑ c in s, f c).snd = ∑ c in s, (f c).snd