-- Lean 4 proof step from Mathlib.CategoryTheory.Sites.PrecoverageToGrothendieck (goal)
Goal:
C : Type u_3
inst : Category.{u_2, u_3} C
J : Precoverage.{u_2, u_3} C
P : Functor.{u_2, u_1, u_3, u_1 + 1} Cᵒᵖ (Type u_1)
X_1 : C
S_1 : Sieve.{u_2, u_3} X_1
X : C
R S : Sieve.{u_2, u_3} X
hS : J.Saturate X R
h_1 : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → J.Saturate Y (Sieve.pullback f S)
Y : C
f : Y ⟶ X
H :
  ∀ {X Y : C} {f : Y ⟶ X},
    ∀ R ∈ J.coverings X,
      Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.generate R)).arrows ∧
        ∀ (x : Presieve.FamilyOfElements P (Sieve.pullback f (Sieve.generate R)).arrows),
          x.Compatible (R := (Sieve.pullback f (Sieve.generate R)).arrows) →
            ∃ (t : P.obj (Opposite.op Y)), x.IsAmalgamation (R := (Sieve.pullback f (Sieve.generate R)).arrows) t
H1 : ∀ ⦃Y : C⦄ (f : Y ⟶ X), Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
H1' :
  ∀ ⦃Y : C⦄ (f : Y ⟶ X) (x : Presieve.FamilyOfElements P (Sieve.pullback f R).arrows),
    x.Compatible (R := (Sieve.pullback f R).arrows) →
      ∃ (t : P.obj (Opposite.op Y)), x.IsAmalgamation (R := (Sieve.pullback f R).arrows) t
H2 :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    R.arrows f → ∀ ⦃Y_1 : C⦄ (f_1 : Y_1 ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback f_1 (Sieve.pullback f S)).arrows
H2' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    R.arrows f →
      ∀ ⦃Y_1 : C⦄ (f_1 : Y_1 ⟶ Y) (x : Presieve.FamilyOfElements P (Sieve.pullback f_1 (Sieve.pullback f S)).arrows),
        x.Compatible (R := (Sieve.pullback f_1 (Sieve.pullback f S)).arrows) →
          ∃ (t : P.obj (Opposite.op Y_1)), x.IsAmalgamation (R := (Sieve.pullback f_1 (Sieve.pullback f S)).arrows) t
x : Presieve.FamilyOfElements P (Sieve.pullback f S).arrows
hx : x.Compatible (R := (Sieve.pullback f S).arrows)
y : ⦃Z : C⦄ → (g : Z ⟶ Y) → Presieve.FamilyOfElements P (Sieve.pullback (𝟙 Z) (Sieve.pullback (g ≫ f) S)).arrows :=
  fun (Z : C) (g : Z ⟶ Y) (ZZ : C) (gg : ZZ ⟶ Z) (hgg : (Sieve.pullback (𝟙 Z) (Sieve.pullback (g ≫ f) S)).arrows gg) ↦
    x (gg ≫ g) ⋯
hy : ∀ ⦃Z : C⦄ (g : Z ⟶ Y), (y g).Compatible (R := (Sieve.pullback (𝟙 Z) (Sieve.pullback (g ≫ f) S)).arrows)
z : ⦃Z : C⦄ → ⦃g : Z ⟶ Y⦄ → (hg : (Sieve.pullback f R).arrows g) → P.obj (Opposite.op Z)
hz :
  ∀ ⦃Z : C⦄ ⦃g : Z ⟶ Y⦄ (hg : (Sieve.pullback f R).arrows g),
    (y g).IsAmalgamation (R := (Sieve.pullback (𝟙 Z) (Sieve.pullback (g ≫ f) S)).arrows) (z hg)
q : Presieve.FamilyOfElements P (Sieve.pullback f R).arrows :=
  fun (Z : C) (g : Z ⟶ Y) (hg : (Sieve.pullback f R).arrows g) ↦ z hg
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ Y
f₂ : Y₂ ⟶ Y
h₁ : (Sieve.pullback f R).arrows f₁
h₂ : (Sieve.pullback f R).arrows f₂
h : g₁ ≫ f₁ = g₂ ≫ f₂
ZZ : C
gg : ZZ ⟶ Z
hgg : (Sieve.pullback g₁ (Sieve.pullback (f₁ ≫ f) S)).arrows gg
rw : y f₁ (gg ≫ g₁) ⋯ = y f₂ (gg ≫ g₂) ⋯
h₃ : (Sieve.pullback (𝟙 Y₂) (Sieve.pullback (f₂ ≫ f) S)).arrows (gg ≫ g₂)
⊢ Eq (α := P.obj (Opposite.op ZZ))
    ((ConcreteCategory.hom (FC := TypeCat.Fun) (P.map g₁.op ≫ P.map gg.op) :
          (a : P.obj (Opposite.op Y₁)) → P.obj (Opposite.op ZZ))
        (q f₁ h₁) :
      P.obj (Opposite.op ZZ))
    ((ConcreteCategory.hom (FC := TypeCat.Fun) (P.map g₂.op ≫ P.map gg.op) :
          (a : P.obj (Opposite.op Y₂)) → P.obj (Opposite.op ZZ))
        (q f₂ h₂) :
      P.obj (Opposite.op ZZ))
have h₄ : (Sieve.pullback (𝟙 Y₁) (Sieve.pullback (f₁ ≫ f) S)).arrows (gg ≫ g₁)
Tactic: rw [← P.map_comp, ← P.map_comp, ← op_comp, ← op_comp, hz, hz]