-- Mathlib/CategoryTheory/Adjunction/Reflective.lean
lemma mem_essImage_of_counit_isSplitEpi [Coreflective j] {A : D}
    [IsSplitEpi ((coreflectorAdjunction j).counit.app A)] : j.essImage A

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
⊢ j.essImage A

Tactic:
let ε : coreflector j ⋙ j ⟶ 𝟭 D  := (coreflectorAdjunction j).counit

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
⊢ j.essImage A

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
⊢ j.essImage A

Tactic:
haveI : IsIso (ε.app (j.obj ((coreflector j).obj A))) :=
  Functor.essImage.counit_isIso ((j.obj_mem_essImage _))

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ j.essImage A

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ j.essImage A

Tactic:
have : Mono (ε.app A) := by
  refine @mono_of_mono _ _ _ _ _ (ε.app A) (section_ (ε.app A)) ?_
  rw [show ε.app A ≫ section_ _ = _ from (ε.naturality (section_ (ε.app A))).symm]
  apply mono_comp _ (ε.app (j.obj ((coreflector j).obj A)))

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this✝ : IsIso (ε.app (j.obj ((coreflector j).obj A)))
this : Mono (ε.app A)
⊢ j.essImage A

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ Mono ((coreflector j ⋙ j).map (section_ (ε.app A)) ≫ ε.app ((coreflector j ⋙ j).obj A))

Tactic:
apply mono_comp _ (ε.app (j.obj ((coreflector j).obj A)))

Result:
no goals

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this✝¹ : IsIso (ε.app (j.obj ((coreflector j).obj A)))
this✝ : Mono (ε.app A)
this : IsIso (ε.app A)
⊢ j.essImage A

Tactic:
exact (coreflectorAdjunction j).mem_essImage_of_counit_isIso A

Result:
no goals

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ Mono (ε.app A)

Tactic:
refine @mono_of_mono _ _ _ _ _ (ε.app A) (section_ (ε.app A)) ?_

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ Mono (ε.app A ≫ section_ (ε.app A))

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this✝ : IsIso (ε.app (j.obj ((coreflector j).obj A)))
this : Mono (ε.app A)
⊢ j.essImage A

Tactic:
haveI := isIso_of_mono_of_isSplitEpi (ε.app A)

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this✝¹ : IsIso (ε.app (j.obj ((coreflector j).obj A)))
this✝ : Mono (ε.app A)
this : IsIso (ε.app A)
⊢ j.essImage A

Proof state:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ Mono (ε.app A ≫ section_ (ε.app A))

Tactic:
rw [show ε.app A ≫ section_ _ = _ from (ε.naturality (section_ (ε.app A))).symm]

Result:
C : Type u₁
D : Type u₂
inst✝³ : Category.{v₁, u₁} C
inst✝² : Category.{v₂, u₂} D
j : C ⥤ D
inst✝¹ : Coreflective j
A : D
inst✝ : IsSplitEpi ((coreflectorAdjunction j).counit.app A)
ε : coreflector j ⋙ j ⟶ 𝟭 D := (coreflectorAdjunction j).counit
this : IsIso (ε.app (j.obj ((coreflector j).obj A)))
⊢ Mono ((coreflector j ⋙ j).map (section_ (ε.app A)) ≫ ε.app ((coreflector j ⋙ j).obj A))