File: Mathlib/Algebra/Category/Grp/EpiMono.lean

full_name: AddMonoidHom.ker_eq_bot_of_cancel
code: @[to_additive]
theorem ker_eq_bot_of_cancel {f : A →* B} (h : ∀ u v : f.ker →* A, f.comp u = f.comp v → u = v) :
    f.ker = ⊥ 
goal: f.ker = ⊥

full_name: MonoidHom.ker_eq_bot_of_cancel
code: @[to_additive]
theorem ker_eq_bot_of_cancel {f : A →* B} (h : ∀ u v : f.ker →* A, f.comp u = f.comp v → u = v) :
    f.ker = ⊥ 
goal: f.ker = ⊥

full_name: AddMonoidHom.range_eq_top_of_cancel
code: @[to_additive]
theorem range_eq_top_of_cancel {f : A →* B}
    (h : ∀ u v : B →* B ⧸ f.range, u.comp f = v.comp f → u = v) : f.range = ⊤ 
goal: f.range = ⊤

full_name: MonoidHom.range_eq_top_of_cancel
code: @[to_additive]
theorem range_eq_top_of_cancel {f : A →* B}
    (h : ∀ u v : B →* B ⧸ f.range, u.comp f = v.comp f → u = v) : f.range = ⊤ 
goal: f.range = ⊤

full_name: Grp.instGroupα_1
code: @[to_additive]
instance (G : Grp) : Group G.α 
goal: Group ↑G

full_name: AddGrp.instGroupα_1
code: @[to_additive]
instance (G : Grp) : Group G.α 
goal: AddGroup ↑G

full_name: Grp.ker_eq_bot_of_mono
code: @[to_additive]
theorem ker_eq_bot_of_mono [Mono f] : f.ker = ⊥ 
goal: MonoidHom.ker f = ⊥

full_name: AddGrp.ker_eq_bot_of_mono
code: @[to_additive]
theorem ker_eq_bot_of_mono [Mono f] : f.ker = ⊥ 
goal: AddMonoidHom.ker f = ⊥

full_name: AddGrp.mono_iff_ker_eq_bot
code: @[to_additive]
theorem mono_iff_ker_eq_bot : Mono f ↔ f.ker = ⊥ 
goal: CategoryTheory.Mono f ↔ AddMonoidHom.ker f = ⊥

full_name: Grp.mono_iff_ker_eq_bot
code: @[to_additive]
theorem mono_iff_ker_eq_bot : Mono f ↔ f.ker = ⊥ 
goal: CategoryTheory.Mono f ↔ MonoidHom.ker f = ⊥

full_name: Grp.mono_iff_injective
code: @[to_additive]
theorem mono_iff_injective : Mono f ↔ Function.Injective f 
goal: CategoryTheory.Mono f ↔ Function.Injective ⇑f

full_name: AddGrp.mono_iff_injective
code: @[to_additive]
theorem mono_iff_injective : Mono f ↔ Function.Injective f 
goal: CategoryTheory.Mono f ↔ Function.Injective ⇑f

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termX_1
code: local notation "X" => Set.range (· • (f.range : Set B) : B → Set B)
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Set_range_1
code: local notation "X" => Set.range (· • (f.range : Set B) : B → Set B)
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs.XWithInfinity
code: /-- Define `X'` to be the set of all left cosets with an extra point at "infinity".
-/
inductive XWithInfinity
  | fromCoset : Set.range (· • (f.range : Set B) : B → Set B) → XWithInfinity
  | infinity : XWithInfinity
goal: Type u

full_name: Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity
code: /-- Define `X'` to be the set of all left cosets with an extra point at "infinity".
-/
inductive XWithInfinity
  | fromCoset : Set.range (· • (f.range : Set B) : B → Set B) → XWithInfinity
  | infinity : XWithInfinity
goal: Grp.SurjectiveOfEpiAuxs.XWithInfinity f

full_name: Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset
code: /-- Define `X'` to be the set of all left cosets with an extra point at "infinity".
-/
inductive XWithInfinity
  | fromCoset : Set.range (· • (f.range : Set B) : B → Set B) → XWithInfinity
  | infinity : XWithInfinity
goal: ↑(Set.range fun x => x • ↑(MonoidHom.range f)) → Grp.SurjectiveOfEpiAuxs.XWithInfinity f

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Grp_SurjectiveOfEpiAuxs_XWithInfinity_1
code: local notation "X'" => XWithInfinity f
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termX'_1
code: local notation "X'" => XWithInfinity f
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Grp_SurjectiveOfEpiAuxs_XWithInfinity_infinity_1
code: local notation "∞" => XWithInfinity.infinity
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs.«_aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_term∞_1»
code: local notation "∞" => XWithInfinity.infinity
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termSX'_1
code: local notation "SX'" => Equiv.Perm X'
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Equiv_Perm_1
code: local notation "SX'" => Equiv.Perm X'
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs.instSMulαGroupXWithInfinity
code: instance : SMul B X' 
goal: SMul (↑B) (Grp.SurjectiveOfEpiAuxs.XWithInfinity f)

full_name: Grp.SurjectiveOfEpiAuxs.mul_smul
code: theorem mul_smul (b b' : B) (x : X') : (b * b') • x = b • b' • x 
goal: (b * b') • x = b • b' • x

full_name: Grp.SurjectiveOfEpiAuxs.one_smul
code: theorem one_smul (x : X') : (1 : B) • x = x 
goal: 1 • x = x

full_name: Grp.SurjectiveOfEpiAuxs.fromCoset_eq_of_mem_range
code: theorem fromCoset_eq_of_mem_range {b : B} (hb : b ∈ f.range) :
    fromCoset ⟨b • ↑f.range, b, rfl⟩ = fromCoset ⟨f.range, 1, one_leftCoset _⟩ 
goal: Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨b • ↑(MonoidHom.range f), ⋯⟩ =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.fromCoset_ne_of_nin_range
code: theorem fromCoset_ne_of_nin_range {b : B} (hb : b ∉ f.range) :
    fromCoset ⟨b • ↑f.range, b, rfl⟩ ≠ fromCoset ⟨f.range, 1, one_leftCoset _⟩ 
goal: Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨b • ↑(MonoidHom.range f), ⋯⟩ ≠
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.instDecidableEqXWithInfinity
code: instance : DecidableEq X' 
goal: DecidableEq (Grp.SurjectiveOfEpiAuxs.XWithInfinity f)

full_name: Grp.SurjectiveOfEpiAuxs.tau
code: /-- Let `τ` be the permutation on `X'` exchanging `f.range` and the point at infinity.
-/
noncomputable def tau : SX' 
goal: Equiv.Perm (Grp.SurjectiveOfEpiAuxs.XWithInfinity f)

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Grp_SurjectiveOfEpiAuxs_tau_1
code: local notation "τ" => tau f
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termτ_1
code: local notation "τ" => tau f
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs.τ_apply_infinity
code: theorem τ_apply_infinity : τ ∞ = fromCoset ⟨f.range, 1, one_leftCoset _⟩ 
goal: (Grp.SurjectiveOfEpiAuxs.tau f) Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.τ_apply_fromCoset
code: theorem τ_apply_fromCoset : τ (fromCoset ⟨f.range, 1, one_leftCoset _⟩) = ∞ 
goal: (Grp.SurjectiveOfEpiAuxs.tau f) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity

full_name: Grp.SurjectiveOfEpiAuxs.τ_apply_fromCoset'
code: theorem τ_apply_fromCoset' (x : B) (hx : x ∈ f.range) :
    τ (fromCoset ⟨x • ↑f.range, ⟨x, rfl⟩⟩) = ∞ 
goal: (Grp.SurjectiveOfEpiAuxs.tau f) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨x • ↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity

full_name: Grp.SurjectiveOfEpiAuxs.τ_symm_apply_fromCoset
code: theorem τ_symm_apply_fromCoset : Equiv.symm τ (fromCoset ⟨f.range, 1, one_leftCoset _⟩) = ∞ 
goal: (Equiv.symm (Grp.SurjectiveOfEpiAuxs.tau f))
    (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity

full_name: Grp.SurjectiveOfEpiAuxs.τ_symm_apply_infinity
code: theorem τ_symm_apply_infinity :
    Equiv.symm τ ∞ = fromCoset ⟨f.range, 1, one_leftCoset _⟩ 
goal: (Equiv.symm (Grp.SurjectiveOfEpiAuxs.tau f)) Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.g
code: /-- Let `g : B ⟶ S(X')` be defined as such that, for any `β : B`, `g(β)` is the function sending
point at infinity to point at infinity and sending coset `y` to `β • y`.
-/
def g : B →* SX' 
goal: ↑B →* Equiv.Perm (Grp.SurjectiveOfEpiAuxs.XWithInfinity f)

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termG_1
code: local notation "g" => g f
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Grp_SurjectiveOfEpiAuxs_g_1
code: local notation "g" => g f
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs.h
code: /-- Define `h : B ⟶ S(X')` to be `τ g τ⁻¹`
-/
def h : B →* SX' 
goal: ↑B →* Equiv.Perm (Grp.SurjectiveOfEpiAuxs.XWithInfinity f)

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___unexpand_Grp_SurjectiveOfEpiAuxs_h_1
code: local notation "h" => h f
goal: Lean.PrettyPrinter.Unexpander

full_name: Grp.SurjectiveOfEpiAuxs._aux_Mathlib_Algebra_Category_Grp_EpiMono___macroRules_Grp_SurjectiveOfEpiAuxs_termH_1
code: local notation "h" => h f
goal: Lean.Macro

full_name: Grp.SurjectiveOfEpiAuxs.g_apply_fromCoset
code: theorem g_apply_fromCoset (x : B) (y : Set.range (· • (f.range : Set B) : B → Set B)) :
    g x (fromCoset y) = fromCoset ⟨x • ↑y,
      by obtain ⟨z, hz⟩ := y.2; exact ⟨x * z, by simp [← hz, smul_smul]⟩⟩ 
goal: ((Grp.SurjectiveOfEpiAuxs.g f) x) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset y) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨x • ↑y, ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.g_apply_infinity
code: theorem g_apply_infinity (x : B) : (g x) ∞ = ∞ 
goal: ((Grp.SurjectiveOfEpiAuxs.g f) x) Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity

full_name: Grp.SurjectiveOfEpiAuxs.h_apply_infinity
code: theorem h_apply_infinity (x : B) (hx : x ∈ f.range) : (h x) ∞ = ∞ 
goal: ((Grp.SurjectiveOfEpiAuxs.h f) x) Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.infinity

full_name: Grp.SurjectiveOfEpiAuxs.h_apply_fromCoset
code: theorem h_apply_fromCoset (x : B) :
    (h x) (fromCoset ⟨f.range, 1, one_leftCoset _⟩) =
      fromCoset ⟨f.range, 1, one_leftCoset _⟩ 
goal: ((Grp.SurjectiveOfEpiAuxs.h f) x) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.h_apply_fromCoset'
code: theorem h_apply_fromCoset' (x : B) (b : B) (hb : b ∈ f.range) :
    h x (fromCoset ⟨b • f.range, b, rfl⟩) = fromCoset ⟨b • ↑f.range, b, rfl⟩ 
goal: ((Grp.SurjectiveOfEpiAuxs.h f) x) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨b • ↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨b • ↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.h_apply_fromCoset_nin_range
code: theorem h_apply_fromCoset_nin_range (x : B) (hx : x ∈ f.range) (b : B) (hb : b ∉ f.range) :
    h x (fromCoset ⟨b • f.range, b, rfl⟩) = fromCoset ⟨(x * b) • ↑f.range, x * b, rfl⟩ 
goal: ((Grp.SurjectiveOfEpiAuxs.h f) x) (Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨b • ↑(MonoidHom.range f), ⋯⟩) =
  Grp.SurjectiveOfEpiAuxs.XWithInfinity.fromCoset ⟨(x * b) • ↑(MonoidHom.range f), ⋯⟩

full_name: Grp.SurjectiveOfEpiAuxs.agree
code: theorem agree : f.range = { x | h x = g x } 
goal: ↑(MonoidHom.range f) = {x | (Grp.SurjectiveOfEpiAuxs.h f) x = (Grp.SurjectiveOfEpiAuxs.g f) x}

full_name: Grp.SurjectiveOfEpiAuxs.comp_eq
code: theorem comp_eq : (f ≫ show B ⟶ Grp.of SX' from g) = f ≫ show B ⟶ Grp.of SX' from h 
goal: CategoryTheory.CategoryStruct.comp f
    (let_fun this := Grp.SurjectiveOfEpiAuxs.g f;
    this) =
  CategoryTheory.CategoryStruct.comp f
    (let_fun this := Grp.SurjectiveOfEpiAuxs.h f;
    this)

full_name: Grp.SurjectiveOfEpiAuxs.g_ne_h
code: theorem g_ne_h (x : B) (hx : x ∉ f.range) : g ≠ h 
goal: Grp.SurjectiveOfEpiAuxs.g f ≠ Grp.SurjectiveOfEpiAuxs.h f

full_name: Grp.surjective_of_epi
code: theorem surjective_of_epi [Epi f] : Function.Surjective f 
goal: Function.Surjective ⇑f

full_name: Grp.epi_iff_surjective
code: theorem epi_iff_surjective : Epi f ↔ Function.Surjective f 
goal: CategoryTheory.Epi f ↔ Function.Surjective ⇑f

full_name: Grp.epi_iff_range_eq_top
code: theorem epi_iff_range_eq_top : Epi f ↔ f.range = ⊤ 
goal: CategoryTheory.Epi f ↔ MonoidHom.range f = ⊤

full_name: AddGrp.epi_iff_surjective
code: theorem epi_iff_surjective : Epi f ↔ Function.Surjective f 
goal: CategoryTheory.Epi f ↔ Function.Surjective ⇑f

full_name: AddGrp.epi_iff_range_eq_top
code: theorem epi_iff_range_eq_top : Epi f ↔ f.range = ⊤ 
goal: CategoryTheory.Epi f ↔ AddMonoidHom.range f = ⊤

full_name: Grp.forget_grp_preserves_mono
code: @[to_additive AddGrp.forget_grp_preserves_mono]
instance forget_grp_preserves_mono : (forget Grp).PreservesMonomorphisms 
goal: (CategoryTheory.forget Grp).PreservesMonomorphisms

full_name: AddGrp.forget_grp_preserves_mono
code: @[to_additive AddGrp.forget_grp_preserves_mono]
instance forget_grp_preserves_mono : (forget Grp).PreservesMonomorphisms 
goal: (CategoryTheory.forget AddGrp).PreservesMonomorphisms

full_name: Grp.forget_grp_preserves_epi
code: @[to_additive AddGrp.forget_grp_preserves_epi]
instance forget_grp_preserves_epi : (forget Grp).PreservesEpimorphisms 
goal: (CategoryTheory.forget Grp).PreservesEpimorphisms

full_name: AddGrp.forget_grp_preserves_epi
code: @[to_additive AddGrp.forget_grp_preserves_epi]
instance forget_grp_preserves_epi : (forget Grp).PreservesEpimorphisms 
goal: (CategoryTheory.forget AddGrp).PreservesEpimorphisms

full_name: _private.Mathlib.Algebra.Category.Grp.EpiMono.0.CommGrp.instCommGroupα
code: private instance (A : CommGrp) : CommGroup A.α 
goal: CommGroup ↑A

full_name: _private.Mathlib.Algebra.Category.Grp.EpiMono.0.CommGrp.instGroupαCommGroup
code: private instance (A : CommGrp) : Group A.α 
goal: Group ↑A

full_name: AddCommGrp.ker_eq_bot_of_mono
code: @[to_additive]
theorem ker_eq_bot_of_mono [Mono f] : f.ker = ⊥ 
goal: AddMonoidHom.ker f = ⊥

full_name: CommGrp.ker_eq_bot_of_mono
code: @[to_additive]
theorem ker_eq_bot_of_mono [Mono f] : f.ker = ⊥ 
goal: MonoidHom.ker f = ⊥

full_name: CommGrp.mono_iff_ker_eq_bot
code: @[to_additive]
theorem mono_iff_ker_eq_bot : Mono f ↔ f.ker = ⊥ 
goal: CategoryTheory.Mono f ↔ MonoidHom.ker f = ⊥

full_name: AddCommGrp.mono_iff_ker_eq_bot
code: @[to_additive]
theorem mono_iff_ker_eq_bot : Mono f ↔ f.ker = ⊥ 
goal: CategoryTheory.Mono f ↔ AddMonoidHom.ker f = ⊥

full_name: CommGrp.mono_iff_injective
code: @[to_additive]
theorem mono_iff_injective : Mono f ↔ Function.Injective f 
goal: CategoryTheory.Mono f ↔ Function.Injective ⇑f

full_name: AddCommGrp.mono_iff_injective
code: @[to_additive]
theorem mono_iff_injective : Mono f ↔ Function.Injective f 
goal: CategoryTheory.Mono f ↔ Function.Injective ⇑f

full_name: AddCommGrp.range_eq_top_of_epi
code: @[to_additive]
theorem range_eq_top_of_epi [Epi f] : f.range = ⊤ 
goal: AddMonoidHom.range f = ⊤

full_name: CommGrp.range_eq_top_of_epi
code: @[to_additive]
theorem range_eq_top_of_epi [Epi f] : f.range = ⊤ 
goal: MonoidHom.range f = ⊤

full_name: AddCommGrp.instAddCommGroupObjForget
code: @[to_additive]
instance (G : CommGrp) : CommGroup <| (forget CommGrp).obj G 
goal: AddCommGroup ((CategoryTheory.forget AddCommGrp).obj G)

full_name: CommGrp.instCommGroupObjForget
code: @[to_additive]
instance (G : CommGrp) : CommGroup <| (forget CommGrp).obj G 
goal: CommGroup ((CategoryTheory.forget CommGrp).obj G)

full_name: CommGrp.epi_iff_range_eq_top
code: @[to_additive]
theorem epi_iff_range_eq_top : Epi f ↔ f.range = ⊤ 
goal: CategoryTheory.Epi f ↔ MonoidHom.range f = ⊤

full_name: AddCommGrp.epi_iff_range_eq_top
code: @[to_additive]
theorem epi_iff_range_eq_top : Epi f ↔ f.range = ⊤ 
goal: CategoryTheory.Epi f ↔ AddMonoidHom.range f = ⊤

full_name: AddCommGrp.epi_iff_surjective
code: @[to_additive]
theorem epi_iff_surjective : Epi f ↔ Function.Surjective f 
goal: CategoryTheory.Epi f ↔ Function.Surjective ⇑f

full_name: CommGrp.epi_iff_surjective
code: @[to_additive]
theorem epi_iff_surjective : Epi f ↔ Function.Surjective f 
goal: CategoryTheory.Epi f ↔ Function.Surjective ⇑f

full_name: CommGrp.forget_commGrp_preserves_mono
code: @[to_additive AddCommGrp.forget_commGrp_preserves_mono]
instance forget_commGrp_preserves_mono : (forget CommGrp).PreservesMonomorphisms 
goal: (CategoryTheory.forget CommGrp).PreservesMonomorphisms

full_name: AddCommGrp.forget_commGrp_preserves_mono
code: @[to_additive AddCommGrp.forget_commGrp_preserves_mono]
instance forget_commGrp_preserves_mono : (forget CommGrp).PreservesMonomorphisms 
goal: (CategoryTheory.forget AddCommGrp).PreservesMonomorphisms

full_name: AddCommGrp.forget_commGrp_preserves_epi
code: @[to_additive AddCommGrp.forget_commGrp_preserves_epi]
instance forget_commGrp_preserves_epi : (forget CommGrp).PreservesEpimorphisms 
goal: (CategoryTheory.forget AddCommGrp).PreservesEpimorphisms

full_name: CommGrp.forget_commGrp_preserves_epi
code: @[to_additive AddCommGrp.forget_commGrp_preserves_epi]
instance forget_commGrp_preserves_epi : (forget CommGrp).PreservesEpimorphisms 
goal: (CategoryTheory.forget CommGrp).PreservesEpimorphisms