Theorem: CategoryTheory.Localization.essSurj_mapComposableArrows_of_hasRightCalculusOfFractions
File: Mathlib/CategoryTheory/Localization/CalculusOfFractions/ComposableArrows.lean

tactic: have := essSurj L W
state_before: C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
n : ℕ
Y : ComposableArrows D n
⊢ Y ∈ (L.mapComposableArrows n).essImage
state_after: C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
n : ℕ
Y : ComposableArrows D n
this : L.EssSurj
⊢ Y ∈ (L.mapComposableArrows n).essImage

tactic: induction n with
| zero =>
  obtain ⟨Y, rfl⟩ := mk₀_surjective Y
  exact ⟨mk₀ _, ⟨isoMk₀ (L.objObjPreimageIso Y)⟩⟩
| succ n hn =>
  obtain ⟨Y, Z, f, rfl⟩ := ComposableArrows.precomp_surjective Y
  obtain ⟨Y', ⟨e⟩⟩ := hn Y
  obtain ⟨f', hf'⟩ := exists_rightFraction L W
    ((L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv)
  refine ⟨Y'.precomp f'.f,
    ⟨isoMkSucc (isoOfHom L W _ f'.hs ≪≫ L.objObjPreimageIso Z) e ?_⟩⟩
  dsimp at hf' ⊢
  simp [← cancel_mono (e.inv.app 0), hf']
state_before: C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
n : ℕ
Y : ComposableArrows D n
this : L.EssSurj
⊢ Y ∈ (L.mapComposableArrows n).essImage
state_after: no goals

tactic: obtain ⟨Y, rfl⟩ := mk₀_surjective Y
state_before: case zero
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
Y : ComposableArrows D 0
⊢ Y ∈ (L.mapComposableArrows 0).essImage
state_after: case zero.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
Y : D
⊢ mk₀ Y ∈ (L.mapComposableArrows 0).essImage

tactic: exact ⟨mk₀ _, ⟨isoMk₀ (L.objObjPreimageIso Y)⟩⟩
state_before: case zero.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
Y : D
⊢ mk₀ Y ∈ (L.mapComposableArrows 0).essImage
state_after: no goals

tactic: obtain ⟨Y, Z, f, rfl⟩ := ComposableArrows.precomp_surjective Y
state_before: case succ
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D (n + 1)
⊢ Y ∈ (L.mapComposableArrows (n + 1)).essImage
state_after: case succ.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage

tactic: obtain ⟨Y', ⟨e⟩⟩ := hn Y
state_before: case succ.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage
state_after: case succ.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage

tactic: obtain ⟨f', hf'⟩ := exists_rightFraction L W
  ((L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv)
state_before: case succ.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage
state_after: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv = f'.map L ⋯
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage

tactic: refine ⟨Y'.precomp f'.f,
  ⟨isoMkSucc (isoOfHom L W _ f'.hs ≪≫ L.objObjPreimageIso Z) e ?_⟩⟩
state_before: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv = f'.map L ⋯
⊢ Y.precomp f ∈ (L.mapComposableArrows (n + 1)).essImage
state_after: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv = f'.map L ⋯
⊢ ((L.mapComposableArrows (n + 1)).obj (Y'.precomp f'.f)).map' 0 1 ⋯ ⋯ ≫ app' e.hom 0 ⋯ =
    (isoOfHom L W f'.s ⋯ ≪≫ L.objObjPreimageIso Z).hom ≫ (Y.precomp f).map' 0 1 ⋯ ⋯

tactic: dsimp at hf' ⊢
state_before: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ (e.app 0).inv = f'.map L ⋯
⊢ ((L.mapComposableArrows (n + 1)).obj (Y'.precomp f'.f)).map' 0 1 ⋯ ⋯ ≫ app' e.hom 0 ⋯ =
    (isoOfHom L W f'.s ⋯ ≪≫ L.objObjPreimageIso Z).hom ≫ (Y.precomp f).map' 0 1 ⋯ ⋯
state_after: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ e.inv.app 0 = f'.map L ⋯
⊢ L.map f'.f ≫ e.hom.app 0 = (L.map f'.s ≫ (L.objObjPreimageIso Z).hom) ≫ f

tactic: simp [← cancel_mono (e.inv.app 0), hf']
state_before: case succ.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
L : C ⥤ D
W : MorphismProperty C
inst✝¹ : L.IsLocalization W
inst✝ : W.HasRightCalculusOfFractions
this : L.EssSurj
n : ℕ
hn : ∀ (Y : ComposableArrows D n), Y ∈ (L.mapComposableArrows n).essImage
Y : ComposableArrows D n
Z : D
f : Z ⟶ Y.left
Y' : ComposableArrows C n
e : (L.mapComposableArrows n).obj Y' ≅ Y
f' : W.RightFraction (L.objPreimage Z) (Y'.obj 0)
hf' : (L.objObjPreimageIso Z).hom ≫ f ≫ e.inv.app 0 = f'.map L ⋯
⊢ L.map f'.f ≫ e.hom.app 0 = (L.map f'.s ≫ (L.objObjPreimageIso Z).hom) ≫ f
state_after: no goals