import Mathlib.Algebra.GroupPower.Lemmas import Mathlib.Algebra.Group.Prod import Mathlib.Data.Int.Cast.Lemmas import Mathlib.Algebra.Ring.Basic import UnitConjecture.EnumDecide /-! ## Free groups The definition of a free group on a basis, along with a few properties. Free groups are defined constructively to allow automatic equality checking of homomorphisms on finitely generated free groups. ## Overview - `AddFreeGroup` - the main definition. - `decideHomsEqual` - the crucial result that allows the automatic comparison of homomorphisms by checking their values on the basis. - `β€Free` - a proof that the additive group of integers is a free group on the one-element type. - `prodFree` - a proof that the product of free groups is free. -/ /-- Free (Additive) Groups, implemented as a typeclass. A free additive group with a basis `X` is an additive group `F` with an inclusion map `ΞΉ : X β F`, such that any map `f : X β A` from the basis to any Abelian group `A` extends *uniquely* to an *additive group homomorphism* `Ο : F β+ A`. -/ classAddFreeGroup (AddFreeGroup: {F : Type u_1} β [inst : AddCommGroup F] β {X : Type u_2} β (ΞΉ : X β F) β (inducedHom : (A : Type) β [inst_1 : AddCommGroup A] β (X β A) β F β+ A) β (β {A : Type} [inst_1 : AddCommGroup A] (f : X β A), β(inducedHom A f) β ΞΉ = f) β (β {A : Type} [inst_1 : AddCommGroup A] (f g : F β+ A), βf β ΞΉ = βg β ΞΉ β f = g) β AddFreeGroup F XF :F: Type ?u.2Type _) [AddCommGroupType _: Type (?u.2+1)F] (F: Type ?u.2X :X: Type ?u.8Type _) where /-- The inclusion map from the basis to the free group. -/Type _: Type (?u.8+1)ΞΉ :ΞΉ: {F : Type u_1} β [inst : AddCommGroup F] β {X : Type u_2} β [self : AddFreeGroup F X] β X β FX βX: Type ?u.8F /-- The homomorphism from the free group induced by a map from the basis. -/F: Type ?u.2inducedHom : (inducedHom: {F : Type u_1} β [inst : AddCommGroup F] β {X : Type u_2} β [self : AddFreeGroup F X] β (A : Type) β [inst_1 : AddCommGroup A] β (X β A) β F β+ AA :A: TypeType) β [AddCommGroupType: Type 1A] β (A: TypeX βX: Type ?u.8A) β (A: TypeF β+F: Type ?u.2A) /-- A proof that the induced homomorphism extends the map from the basis. -/A: Typeinduced_extends {induced_extends: β {F : Type u_1} [inst : AddCommGroup F] {X : Type u_2} [self : AddFreeGroup F X] {A : Type} [inst_1 : AddCommGroup A] (f : X β A), β(AddFreeGroup.inducedHom A f) β AddFreeGroup.ΞΉ = fA :A: TypeType} [AddCommGroupType: Type 1A] : βA: Typef :f: X β AX βX: Type ?u.8A, (A: TypeinducedHominducedHom: (A : Type) β [inst : AddCommGroup A] β (X β A) β F β+ AAA: Typef) βf: X β AΞΉ =ΞΉ: X β Ff /-- A proof that any homomorphism extending a map from the basis must be unique. -/f: X β Aunique_extension {unique_extension: β {F : Type u_1} [inst : AddCommGroup F] {X : Type u_2} [self : AddFreeGroup F X] {A : Type} [inst_1 : AddCommGroup A] (f g : F β+ A), βf β AddFreeGroup.ΞΉ = βg β AddFreeGroup.ΞΉ β f = gA :A: TypeType} [AddCommGroupType: Type 1A] (A: Typeff: F β+ Ag :g: F β+ AF β+F: Type ?u.2A) :A: Typef βf: F β+ AΞΉ =ΞΉ: X β Fg βg: F β+ AΞΉ βΞΉ: X β Ff =f: F β+ Ag /-- The additive group of integers `β€` is the free group on a singleton basis. -/ instanceg: F β+ Aβ€Free :β€Free: AddFreeGroup β€ UnitAddFreeGroupAddFreeGroup: (F : Type ?u.3359) β [inst : AddCommGroup F] β Type ?u.3358 β Type (max(max1?u.3359)?u.3358)β€β€: TypeUnit where ΞΉ := funUnit: Type_ =>_: ?m.33771 inducedHom := fun1: ?m.3380AA: ?m.3393__: ?m.3396f => (zmultiplesHomf: ?m.3399A).toFun (A: ?m.3393ff: ?m.3399()) induced_extends :=(): Unitβ {A : Type} [inst : AddCommGroup A] (f : Unit β A), (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A inst f) β fun x => 1) = f(β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A instβ f) β fun x => 1) = fβ {A : Type} [inst : AddCommGroup A] (f : Unit β A), (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A inst f) β fun x => 1) = f
hFunction.comp (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A instβ f)) (fun x => 1) u = f u
hFunction.comp (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A instβ f)) (fun x => 1) u = f uβ {A : Type} [inst : AddCommGroup A] (f : Unit β A), (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A inst f) β fun x => 1) = f
h.unitFunction.comp (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A instβ f)) (fun x => 1) PUnit.unit = f PUnit.unitβ {A : Type} [inst : AddCommGroup A] (f : Unit β A), (β((fun A x f => Equiv.toFun (zmultiplesHom A) (f ())) A inst f) β fun x => 1) = funique_extension :=Goals accomplished! πA: Type
abg: AddCommGroup A
f, g: β€ β+ A
hyp: (βf β fun x => 1) = βg β fun x => 1
hyp':= congrFun hyp (): Function.comp (βf) (fun x => 1) () = Function.comp (βg) (fun x => 1) ()f = gA: Type
abg: AddCommGroup A
f, g: β€ β+ A
hyp: (βf β fun x => 1) = βg β fun x => 1
hyp': β(Equiv.symm (zmultiplesHom A)) f = βg 1f = gA: Type
abg: AddCommGroup A
f, g: β€ β+ A
hyp: (βf β fun x => 1) = βg β fun x => 1
hyp': β(Equiv.symm (zmultiplesHom A)) f = β(Equiv.symm (zmultiplesHom A)) gf = gopen EnumDecide in /-- Equality of homomorphisms from a free group on an exhaustively searchable basis is decidable. -/ @[instance] defGoals accomplished! πdecideHomsEqual {decideHomsEqual: {F : Type ?u.6984} β [inst : AddCommGroup F] β {X : Type ?u.6990} β [inst_1 : DecideForall X] β [fgp : AddFreeGroup F X] β {A : Type ?u.7008} β [inst_2 : AddCommGroup A] β [inst_3 : DecidableEq A] β DecidableEq (F β+ A)F :F: Type ?u.6984Type _} [AddCommGroupType _: Type (?u.6984+1)F] {F: Type ?u.6984X :X: Type ?u.6990Type _} [DecideForallType _: Type (?u.6990+1)X] [X: Type ?u.6990fgp :fgp: AddFreeGroup F XAddFreeGroupAddFreeGroup: (F : Type ?u.6997) β [inst : AddCommGroup F] β Type ?u.6996 β Type (max(max1?u.6997)?u.6996)FF: Type ?u.6984X] {X: Type ?u.6990A :A: Type ?u.7008Type _} [AddCommGroupType _: Type (?u.7008+1)A] [DecidableEqA: Type ?u.7008A] : DecidableEq (A: Type ?u.7008F β+F: Type ?u.6984A) := funA: Type ?u.7008ff: ?m.7478g => ifg: ?m.7481c : βc: ?m.9157x :x: XX,X: Type ?u.6990f (f: ?m.7478fgp.fgp: AddFreeGroup F XΞΉΞΉ: {F : Type ?u.8274} β [inst : AddCommGroup F] β {X : Type ?u.8273} β [self : AddFreeGroup F X] β X β Fx) =x: Xg (g: ?m.7481fgp.fgp: AddFreeGroup F XΞΉΞΉ: {F : Type ?u.9052} β [inst : AddCommGroup F] β {X : Type ?u.9051} β [self : AddFreeGroup F X] β X β Fx) thenx: XF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type ?u.7008
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type ?u.7008
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
hf = gF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type ?u.7008
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
h.aF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type ?u.7008
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
x: X
h.a.hFunction.comp (βf) AddFreeGroup.ΞΉ x = Function.comp (βg) AddFreeGroup.ΞΉ xF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type ?u.7008
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)elseGoals accomplished! πF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
hF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = g
hF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = g
hF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = gβ (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = g
xβ: Xβf (AddFreeGroup.ΞΉ xβ) = βg (AddFreeGroup.ΞΉ xβ)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = g
xβ: Xβf (AddFreeGroup.ΞΉ xβ) = βg (AddFreeGroup.ΞΉ xβ)F: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)
contra: f = gβ (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)Goals accomplished! πF: Type ?u.6984
instβΒ³: AddCommGroup F
X: Type ?u.6990
instβΒ²: DecideForall X
fgp: AddFreeGroup F X
A: Type
instβΒΉ: AddCommGroup A
instβ: DecidableEq A
f, g: F β+ A
c: Β¬β (x : X), βf (AddFreeGroup.ΞΉ x) = βg (AddFreeGroup.ΞΉ x)namespace AddFreeGroup.Product variable {Goals accomplished! πAA: Type ?u.14585B :B: Type ?u.11319Type _} [AddCommGroupType _: Type (?u.12604+1)A] [AddCommGroupA: Type ?u.11328B] variable {B: Type ?u.14588X_AX_A: Type ?u.11358X_B :X_B: Type ?u.14600Type _} variable [Type _: Type (?u.11358+1)FAb_A :FAb_A: AddFreeGroup A X_AAddFreeGroupAddFreeGroup: (F : Type ?u.11365) β [inst : AddCommGroup F] β Type ?u.11364 β Type (max(max1?u.11365)?u.11364)AA: Type ?u.11346X_A] [X_A: Type ?u.11358FAb_B :FAb_B: AddFreeGroup B X_BAddFreeGroupAddFreeGroup: (F : Type ?u.11377) β [inst : AddCommGroup F] β Type ?u.11376 β Type (max(max1?u.11377)?u.11376)BB: Type ?u.12604X_B] /-- The inclusion map from the direct sum of the bases of two free groups into their product. -/ def ΞΉ : (X_B: Type ?u.11361X_A βX_A: Type ?u.11400X_B) βX_B: Type ?u.11403A ΓA: Type ?u.11388B | Sum.inlB: Type ?u.11391x_a => (x_a: X_AFAb_A.FAb_A: AddFreeGroup A X_AΞΉΞΉ: {F : Type ?u.11467} β [inst : AddCommGroup F] β {X : Type ?u.11466} β [self : AddFreeGroup F X] β X β Fx_a,x_a: X_A0) | Sum.inr0: ?m.11482x_b => (x_b: X_B0,0: ?m.11855FAb_B.FAb_B: AddFreeGroup B X_BΞΉΞΉ: {F : Type ?u.12204} β [inst : AddCommGroup F] β {X : Type ?u.12203} β [self : AddFreeGroup F X] β X β Fx_b) /-- The group homomorphism from the product of two free groups induced by a map from the basis. -/ defx_b: X_BinducedProdHom (inducedProdHom: (G : Type ?u.12643) β [inst : AddCommGroup G] β (X_A β X_B β G) β A Γ B β+ GG :G: Type ?u.12643Type _) [AddCommGroupType _: Type (?u.12643+1)G] (G: Type ?u.12643f :f: X_A β X_B β GX_A βX_A: Type ?u.12613X_B βX_B: Type ?u.12616G) :G: Type ?u.12643A ΓA: Type ?u.12601B β+B: Type ?u.12604G := letG: Type ?u.12643f_A :f_A: X_A β GX_A βX_A: Type ?u.12613G :=G: Type ?u.12643f β Sum.inl letf: X_A β X_B β Gf_B :f_B: X_B β GX_B βX_B: Type ?u.12616G :=G: Type ?u.12643f β Sum.inrf: X_A β X_B β GAddMonoidHom.coprod (AddMonoidHom.coprod: {M : Type ?u.13371} β {N : Type ?u.13370} β {P : Type ?u.13369} β [inst : AddZeroClass M] β [inst_1 : AddZeroClass N] β [inst_2 : AddCommMonoid P] β (M β+ P) β (N β+ P) β M Γ N β+ PFAb_A.FAb_A: AddFreeGroup A X_AinducedHominducedHom: {F : Type ?u.13712} β [inst : AddCommGroup F] β {X : Type ?u.13711} β [self : AddFreeGroup F X] β (A : Type) β [inst_1 : AddCommGroup A] β (X β A) β F β+ AGG: Type ?u.12643f_A) (f_A: X_A β GFAb_B.FAb_B: AddFreeGroup B X_BinducedHominducedHom: {F : Type ?u.13762} β [inst : AddCommGroup F] β {X : Type ?u.13761} β [self : AddFreeGroup F X] β (A : Type) β [inst_1 : AddCommGroup A] β (X β A) β F β+ AGG: Type ?u.12643f_B) /-- The product of free groups is free. -/ instancef_B: X_B β GprodFree :prodFree: AddFreeGroup (A Γ B) (X_A β X_B)AddFreeGroup (AddFreeGroup: (F : Type ?u.14628) β [inst : AddCommGroup F] β Type ?u.14627 β Type (max(max1?u.14628)?u.14627)A ΓA: Type ?u.14585B) (B: Type ?u.14588X_A βX_A: Type ?u.14597X_B) := { ΞΉ :=X_B: Type ?u.14600ΞΉ inducedHom :=ΞΉ: {A : Type ?u.14696} β {B : Type ?u.14695} β [inst : AddCommGroup A] β [inst_1 : AddCommGroup B] β {X_A : Type ?u.14694} β {X_B : Type ?u.14693} β [FAb_A : AddFreeGroup A X_A] β [FAb_B : AddFreeGroup B X_B] β X_A β X_B β A Γ BinducedProdHom induced_extends :=inducedProdHom: {A : Type ?u.14775} β {B : Type ?u.14774} β [inst : AddCommGroup A] β [inst_1 : AddCommGroup B] β {X_A : Type ?u.14773} β {X_B : Type ?u.14772} β [FAb_A : AddFreeGroup A X_A] β [FAb_B : AddFreeGroup B X_B] β (G : Type) β [inst_2 : AddCommGroup G] β (X_A β X_B β G) β A Γ B β+ GA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_Bβ {A_1 : Type} [inst : AddCommGroup A_1] (f : X_A β X_B β A_1), β(inducedProdHom A_1 f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aββ(inducedProdHom Aβ f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_Bβ {A_1 : Type} [inst : AddCommGroup A_1] (f : X_A β X_B β A_1), β(inducedProdHom A_1 f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
x: X_A β X_B
hFunction.comp (β(inducedProdHom Aβ f)) ΞΉ x = f xA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
x: X_A β X_B
hFunction.comp (β(inducedProdHom Aβ f)) ΞΉ x = f xA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_Bβ {A_1 : Type} [inst : AddCommGroup A_1] (f : X_A β X_B β A_1), β(inducedProdHom A_1 f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_A
h.inlFunction.comp (β(inducedProdHom Aβ f)) ΞΉ (Sum.inl valβ) = f (Sum.inl valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_B
h.inrFunction.comp (β(inducedProdHom Aβ f)) ΞΉ (Sum.inr valβ) = f (Sum.inr valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
x: X_A β X_B
hFunction.comp (β(inducedProdHom Aβ f)) ΞΉ x = f xA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_A
h.inlFunction.comp (β(inducedProdHom Aβ f)) ΞΉ (Sum.inl valβ) = f (Sum.inl valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_B
h.inrFunction.comp (β(inducedProdHom Aβ f)) ΞΉ (Sum.inr valβ) = f (Sum.inr valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
x: X_A β X_B
hFunction.comp (β(inducedProdHom Aβ f)) ΞΉ x = f xA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_B
h.inrβ(inducedHom Aβ (f β Sum.inr)) (AddFreeGroup.ΞΉ valβ) = f (Sum.inr valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_Bβ {A_1 : Type} [inst : AddCommGroup A_1] (f : X_A β X_B β A_1), β(inducedProdHom A_1 f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_A
h.inlβ(inducedHom Aβ (f β Sum.inl)) (AddFreeGroup.ΞΉ valβ) = f (Sum.inl valβ)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_B
h.inrβ(inducedHom Aβ (f β Sum.inr)) (AddFreeGroup.ΞΉ valβ) = f (Sum.inr valβ)Goals accomplished! πA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_Bβ {A_1 : Type} [inst : AddCommGroup A_1] (f : X_A β X_B β A_1), β(inducedProdHom A_1 f) β ΞΉ = fA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f: X_A β X_B β Aβ
valβ: X_B
h.inrβ(inducedHom Aβ (f β Sum.inr)) (AddFreeGroup.ΞΉ valβ) = f (Sum.inr valβ)unique_extension :=Goals accomplished! πA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉf = gA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkβf (a, b) = βg (a, b)A: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkβf (a, b) = βg (a, b)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkβf (a, b) = βg (a, b)Goals accomplished! πA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkβf (a, b) = βg (a, b)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkβf (a, b) = βg (a, b)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: BAddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
aβ(AddMonoidHom.comp f (AddMonoidHom.inl A B)) β AddFreeGroup.ΞΉ = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) β AddFreeGroup.ΞΉA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
aβ(AddMonoidHom.comp f (AddMonoidHom.inl A B)) β AddFreeGroup.ΞΉ = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) β AddFreeGroup.ΞΉA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: BAddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
x_A: X_A
a.hFunction.comp (β(AddMonoidHom.comp f (AddMonoidHom.inl A B))) AddFreeGroup.ΞΉ x_A = Function.comp (β(AddMonoidHom.comp g (AddMonoidHom.inl A B))) AddFreeGroup.ΞΉ x_AA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
x_A: X_A
a.hFunction.comp (β(AddMonoidHom.comp f (AddMonoidHom.inl A B))) AddFreeGroup.ΞΉ x_A = Function.comp (β(AddMonoidHom.comp g (AddMonoidHom.inl A B))) AddFreeGroup.ΞΉ x_AA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: BAddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)Goals accomplished! πA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
h.mkA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
aβ(AddMonoidHom.comp f (AddMonoidHom.inr A B)) β AddFreeGroup.ΞΉ = β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) β AddFreeGroup.ΞΉA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
aβ(AddMonoidHom.comp f (AddMonoidHom.inr A B)) β AddFreeGroup.ΞΉ = β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) β AddFreeGroup.ΞΉA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)A: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
x_B: X_B
a.hFunction.comp (β(AddMonoidHom.comp f (AddMonoidHom.inr A B))) AddFreeGroup.ΞΉ x_B = Function.comp (β(AddMonoidHom.comp g (AddMonoidHom.inr A B))) AddFreeGroup.ΞΉ x_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
x_B: X_B
a.hFunction.comp (β(AddMonoidHom.comp f (AddMonoidHom.inr A B))) AddFreeGroup.ΞΉ x_B = Function.comp (β(AddMonoidHom.comp g (AddMonoidHom.inr A B))) AddFreeGroup.ΞΉ x_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)Goals accomplished! πA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
B_unique: AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)
h.mkβ(AddMonoidHom.comp f (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp f (AddMonoidHom.inr A B)) b = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) bA: Type ?u.14585
B: Type ?u.14588
instβΒΉ: AddCommGroup A
instβ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_BA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
B_unique: AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)
h.mkβ(AddMonoidHom.comp f (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp f (AddMonoidHom.inr A B)) b = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) bA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
B_unique: AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)
h.mkβ(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp f (AddMonoidHom.inr A B)) b = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) bA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
B_unique: AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)
h.mkβ(AddMonoidHom.comp f (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp f (AddMonoidHom.inr A B)) b = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) bA: Type ?u.14585
B: Type ?u.14588
instβΒ²: AddCommGroup A
instβΒΉ: AddCommGroup B
X_A: Type ?u.14597
X_B: Type ?u.14600
FAb_A: AddFreeGroup A X_A
FAb_B: AddFreeGroup B X_B
Aβ: Type
instβ: AddCommGroup Aβ
f, g: A Γ B β+ Aβ
hyp: βf β ΞΉ = βg β ΞΉ
a: A
b: B
A_unique: AddMonoidHom.comp f (AddMonoidHom.inl A B) = AddMonoidHom.comp g (AddMonoidHom.inl A B)
B_unique: AddMonoidHom.comp f (AddMonoidHom.inr A B) = AddMonoidHom.comp g (AddMonoidHom.inr A B)
h.mkβ(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) b = β(AddMonoidHom.comp g (AddMonoidHom.inl A B)) a + β(AddMonoidHom.comp g (AddMonoidHom.inr A B)) b} end AddFreeGroup.ProductGoals accomplished! π