-- Module: Mathlib.Topology.Sheaves.Flasque
Goal:
X : TopCat
U : Opens (↑X : Type u)
F G : Sheaf AddCommGrpCat X
g : F ⟶ G
s : (↑(G.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))).obj (op U)) : Type u)
c : Set (Under g s)
h : IsChain (fun (x y : Under g s) ↦ Nonempty.{u + 1} (y ⟶ x)) c
f : (↑c : Type u) → Opens (↑X : Type u) :=
  fun (x : (↑c : Type u)) ↦
    unop
      ((StructuredArrow.right (↑x : Under g s)).fst (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
        (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
              CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
          c))
t :
  ToType (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦ (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)
    (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))).obj (op (iSup f)))
ht :
  IsGluing (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦ (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)
    (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u)))) f
    (fun (x : (↑c : Type u)) ↦
      (StructuredArrow.right (↑x : Under g s)).snd (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
        (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
              CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
          c))
    t
right :
  ∀
    (y :
      ToType (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦ (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)
        (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))).obj (op (iSup f)))),
    (fun
            (s_1 :
              ToType (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦ (↑x1 : Type u) →+ (↑x2 : Type u)) (CC :=
                AddCommGrpCat.carrier)
                (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))).obj
                  (op (iSup f)))) ↦
          IsGluing (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦ (↑x1 : Type u) →+ (↑x2 : Type u)) (CC :=
            AddCommGrpCat.carrier)
            (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u)))) f
            (fun (x : (↑c : Type u)) ↦
              (StructuredArrow.right (↑x : Under g s)).snd (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
                (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
                      CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                        (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
                  c))
            s_1)
        y →
      y = t
le₁ : iSup f ≤ U
le₂ :
  ∀ i ∈ c,
    unop
        ((StructuredArrow.right i).fst (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
          (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
                CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                  (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
            c)) ≤
      iSup f
h₁ :
  ∀ a ∈ c,
    Nonempty.{u + 1}
      (StructuredArrow.mk
          (CategoryOfElements.homMk
            (Sigma.mk (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
              (G.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
                    CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                      (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
                c)
              (op U) s)
            ((NatTrans.mapElements
                  (Functor.whiskerRight g.hom
                    (CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                      (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)))).obj
              (Sigma.mk (β := fun (c : (Opens (↑X : Type u))ᵒᵖ) ↦
                (F.obj (P := CategoryTheory.Presheaf.IsSheaf (Opens.grothendieckTopology (↑X : Type u))) ⋙
                      CategoryTheory.forget AddCommGrpCat (FC := fun (x1 x2 : AddCommGrpCat.{u}) ↦
                        (↑x1 : Type u) →+ (↑x2 : Type u)) (CC := AddCommGrpCat.carrier)).obj
                  c)
                (op (iSup f)) t))
            (homOfLE le₁).op ⋯) ⟶
        a)
⊢ ∃ (ub : Under g s), ∀ a ∈ c, Nonempty.{u + 1} (ub ⟶ a)

Tactic:
use StructuredArrow.mk (CategoryOfElements.homMk _ _ (homOfLE le₁).op (eq_app_of_locally_eq ht
      (fun i ↦ leOfHom i.1.hom.1.unop) (fun i ↦ (CategoryOfElements.map_snd i.1.hom).symm)).symm :
      ⟨op U, s⟩ ⟶ (Functor.whiskerRight g.hom
      (CategoryTheory.forget AddCommGrpCat)).mapElements.obj ⟨op (iSup f), t⟩)

Premises used: CategoryTheory.CategoryOfElements.map_snd, Quiver.Hom.op, Quiver.Hom.unop, CategoryTheory.StructuredArrow.hom, CategoryTheory.CategoryOfElements.homMk, CategoryTheory.homOfLE, TopCat.Sheaf.eq_app_of_locally_eq, CategoryTheory.StructuredArrow.mk, Eq.symm, Subtype.val, CategoryTheory.leOfHom