-- Lean 4 proof step from Mathlib.CategoryTheory.Sites.DenseSubsite.OneHypercoverDense (goal)
Goal:
C₀ : Type u₀
C : Type u
inst : Category.{v₀, u₀} C₀
inst_1 : Category.{v, u} C
F : Functor.{v₀, v, u₀, u} C₀ C
J₀ : GrothendieckTopology.{v₀, u₀} C₀
J : GrothendieckTopology.{v, u} C
A : Type u'
inst_2 : Category.{v', u'} A
inst_3 : IsDenseSubsite J₀ J F
data : (X : C) → OneHypercoverDenseData.{w, v₀, v, u₀, u} F J₀ J X
inst_4 : HasLimitsOfSize.{w, w, v', u'} A
G₀ : Sheaf.{v₀, v', u₀, u'} J₀ A
X₀ W₀ : C₀
a : W₀ ⟶ X₀
ha :
  Presieve.functorPullback F
    (Sieve.arrows
      (PreZeroHypercover.sieve₀.{w, v, u}
        (PreOneHypercover.toPreZeroHypercover
          (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀)))))))
    a
T₀ : C₀
b : T₀ ⟶ X₀
hb :
  Presieve.functorPullback F
    (Sieve.arrows
      (PreZeroHypercover.sieve₀.{w, v, u}
        (PreOneHypercover.toPreZeroHypercover
          (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀)))))))
    b
U₀ : C₀
p₁ : U₀ ⟶ W₀
p₂ : U₀ ⟶ T₀
fac : p₁ ≫ a = p₂ ≫ b
ha' :
  Sieve.ofArrows.h ha ≫
      PreOneHypercoverDenseData.f (toPreOneHypercoverDenseData (data (F.obj X₀))) (Sieve.ofArrows.i ha) =
    F.map a
hb' :
  Sieve.ofArrows.h hb ≫
      PreOneHypercoverDenseData.f (toPreOneHypercoverDenseData (data (F.obj X₀))) (Sieve.ofArrows.i hb) =
    F.map b
rw :
  Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj W₀) (g := F.map a) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj W₀) (g := F.map a) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯) ≫ G₀.obj (P := Presheaf.IsSheaf J₀).map p₁.op))
    (CategoryStruct.comp (Y :=
        G₀.obj (P := Presheaf.IsSheaf J₀).obj
          (op
            (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀)
              (toPreOneHypercoverDenseData (data (F.obj X₀)))
              (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
                PreZeroHypercover.X
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (f :=
                PreZeroHypercover.f
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (W := F.obj T₀) (g := F.map b) ⋯))))
        (presheafObjπ data G₀ (F.obj X₀)
          (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
            PreZeroHypercover.X
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (f :=
            PreZeroHypercover.f
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (W := F.obj T₀) (g := F.map b) ⋯))
        (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯)) ≫
      G₀.obj (P := Presheaf.IsSheaf J₀).map p₂.op)
rw₁ :
  Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj W₀) (g := F.map a) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj W₀) (g := F.map a) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯) ≫ G₀.obj (P := Presheaf.IsSheaf J₀).map p₁.op))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj T₀) (g := F.map b) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj T₀) (g := F.map b) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯) ≫ G₀.obj (P := Presheaf.IsSheaf J₀).map p₂.op))
rw₂ :
  Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj W₀) (g := F.map a) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj W₀) (g := F.map a) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (F.map p₁ ≫ Sieve.ofArrows.h ⋯)))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj T₀) (g := F.map b) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj T₀) (g := F.map b) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯) ≫ G₀.obj (P := Presheaf.IsSheaf J₀).map p₂.op))
rw₃ :
  Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj W₀) (g := F.map a) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj W₀) (g := F.map a) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (F.map p₁ ≫ Sieve.ofArrows.h ⋯)))
    (CategoryStruct.comp (Y :=
      G₀.obj (P := Presheaf.IsSheaf J₀).obj
        (op
          (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
            (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
              PreZeroHypercover.X
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (f :=
              PreZeroHypercover.f
                (PreOneHypercover.toPreZeroHypercover
                  (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
              (W := F.obj T₀) (g := F.map b) ⋯))))
      (presheafObjπ data G₀ (F.obj X₀)
        (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
          PreZeroHypercover.X
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (f :=
          PreZeroHypercover.f
            (PreOneHypercover.toPreZeroHypercover
              (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
          (W := F.obj T₀) (g := F.map b) ⋯))
      (IsDenseSubsite.mapPreimage J F G₀ (F.map p₂ ≫ Sieve.ofArrows.h ⋯)))
⊢ Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
    (CategoryStruct.comp (Y :=
        G₀.obj (P := Presheaf.IsSheaf J₀).obj
          (op
            (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀)
              (toPreOneHypercoverDenseData (data (F.obj X₀)))
              (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
                PreZeroHypercover.X
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (f :=
                PreZeroHypercover.f
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (W := F.obj W₀) (g := F.map a) ⋯))))
        (presheafObjπ data G₀ (F.obj X₀)
          (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
            PreZeroHypercover.X
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (f :=
            PreZeroHypercover.f
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (W := F.obj W₀) (g := F.map a) ⋯))
        (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯)) ≫
      G₀.obj (P := Presheaf.IsSheaf J₀).map p₁.op)
    (CategoryStruct.comp (Y :=
        G₀.obj (P := Presheaf.IsSheaf J₀).obj
          (op
            (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀)
              (toPreOneHypercoverDenseData (data (F.obj X₀)))
              (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
                PreZeroHypercover.X
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (f :=
                PreZeroHypercover.f
                  (PreOneHypercover.toPreZeroHypercover
                    (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
                (W := F.obj T₀) (g := F.map b) ⋯))))
        (presheafObjπ data G₀ (F.obj X₀)
          (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
            PreZeroHypercover.X
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (f :=
            PreZeroHypercover.f
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (W := F.obj T₀) (g := F.map b) ⋯))
        (IsDenseSubsite.mapPreimage J F G₀ (Sieve.ofArrows.h ⋯)) ≫
      G₀.obj (P := Presheaf.IsSheaf J₀).map p₂.op)
have rw₄ : Eq (α := presheafObj data G₀ (F.obj X₀) ⟶ G₀.obj (P := Presheaf.IsSheaf J₀).obj (op U₀))
  (restriction data G₀ (F.map (p₁ ≫ a)))
  (CategoryStruct.comp (Y :=
    G₀.obj (P := Presheaf.IsSheaf J₀).obj
      (op
        (PreOneHypercoverDenseData.X.{w, v₀, v, u₀, u} (S := F.obj X₀) (toPreOneHypercoverDenseData (data (F.obj X₀)))
          (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
            PreZeroHypercover.X
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (f :=
            PreZeroHypercover.f
              (PreOneHypercover.toPreZeroHypercover
                (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
            (W := F.obj T₀) (g := F.map b) sorry))))
    (presheafObjπ data G₀ (F.obj X₀)
      (Sieve.ofArrows.i.{v, u, w} (C := C) (X := F.obj X₀) (Y :=
        PreZeroHypercover.X
          (PreOneHypercover.toPreZeroHypercover
            (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
        (f :=
        PreZeroHypercover.f
          (PreOneHypercover.toPreZeroHypercover
            (PreOneHypercoverDenseData.toPreOneHypercover (toPreOneHypercoverDenseData (data (F.obj X₀))))))
        (W := F.obj T₀) (g := F.map b) sorry))
    (IsDenseSubsite.mapPreimage J F G₀ (F.map p₂ ≫ Sieve.ofArrows.h sorry)))
Tactic: rw [assoc, assoc, IsDenseSubsite.mapPreimage_comp_map,
          IsDenseSubsite.mapPreimage_comp_map,
          ← restriction_eq_of_fac data G₀ (F.map (p₁ ≫ a))
            (F.map p₁ ≫ Sieve.ofArrows.h ha) (by rw [assoc, ha', map_comp]),
          restriction_eq_of_fac data G₀ (F.map (p₁ ≫ a))
            (F.map p₂ ≫ Sieve.ofArrows.h hb) (by rw [assoc, hb', fac, map_comp])]