-- Mathlib/CategoryTheory/Localization/CalculusOfFractions.lean
lemma map_comp_map_eq_map {X Y Z : C} (z₁ : W.LeftFraction X Y) (z₂ : W.LeftFraction Y Z)
    (z₃ : W.LeftFraction z₁.Y' z₂.Y') (h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f)
    (L : C ⥤ D) [L.IsLocalization W] :
    z₁.map L (Localization.inverts L W) ≫ z₂.map L (Localization.inverts L W) =
      (z₁.comp₀ z₂ z₃).map L (Localization.inverts L W)

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝¹ : IsIso (L.map z₂.s)
this✝ : IsIso (L.map z₃.s)
this : IsIso (L.map (z₂.s ≫ z₃.s))
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Tactic:
dsimp [LeftFraction.comp₀]

Result:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝¹ : IsIso (L.map z₂.s)
this✝ : IsIso (L.map z₃.s)
this : IsIso (L.map (z₂.s ≫ z₃.s))
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (mk (z₁.f ≫ z₃.f) (z₂.s ≫ z₃.s) ⋯).map L ⋯

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝ : IsIso (L.map z₂.s)
this : IsIso (L.map z₃.s)
⊢ IsIso (L.map (z₂.s ≫ z₃.s))

Tactic:
rw [L.map_comp]

Result:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝ : IsIso (L.map z₂.s)
this : IsIso (L.map z₃.s)
⊢ IsIso (L.map z₂.s ≫ L.map z₃.s)

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝ : IsIso (L.map z₂.s)
this : IsIso (L.map z₃.s)
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Tactic:
have : IsIso (L.map (z₂.s ≫ z₃.s)) := by
  rw [L.map_comp]
  infer_instance

Result:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝¹ : IsIso (L.map z₂.s)
this✝ : IsIso (L.map z₃.s)
this : IsIso (L.map (z₂.s ≫ z₃.s))
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝¹ : IsIso (L.map z₂.s)
this✝ : IsIso (L.map z₃.s)
this : IsIso (L.map (z₂.s ≫ z₃.s))
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (mk (z₁.f ≫ z₃.f) (z₂.s ≫ z₃.s) ⋯).map L ⋯

Tactic:
rw [← cancel_mono (L.map (z₂.s ≫ z₃.s)), map_comp_map_s,
  L.map_comp, assoc, map_comp_map_s_assoc, ← L.map_comp, h₃,
  L.map_comp, map_comp_map_s_assoc, L.map_comp]

Result:
no goals

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝ : IsIso (L.map z₂.s)
this : IsIso (L.map z₃.s)
⊢ IsIso (L.map z₂.s ≫ L.map z₃.s)

Tactic:
infer_instance

Result:
no goals

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Tactic:
have := Localization.inverts L W _ z₂.hs

Result:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this : IsIso (L.map z₂.s)
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Proof state:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this : IsIso (L.map z₂.s)
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯

Tactic:
have := Localization.inverts L W _ z₃.hs

Result:
C : Type u_1
D : Type u_2
inst✝³ : Category.{u_3, u_1} C
inst✝² : Category.{u_4, u_2} D
W : MorphismProperty C
inst✝¹ : W.HasLeftCalculusOfFractions
X Y Z : C
z₁ : W.LeftFraction X Y
z₂ : W.LeftFraction Y Z
z₃ : W.LeftFraction z₁.Y' z₂.Y'
h₃ : z₂.f ≫ z₃.s = z₁.s ≫ z₃.f
L : C ⥤ D
inst✝ : L.IsLocalization W
this✝ : IsIso (L.map z₂.s)
this : IsIso (L.map z₃.s)
⊢ z₁.map L ⋯ ≫ z₂.map L ⋯ = (z₁.comp₀ z₂ z₃).map L ⋯