l3lab/ntp-mathlib huggingface dataset:
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      

Proof state:
case property.refine'_3.mk.pair.up.left
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ m ≫
      F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
        (presheaf F).map
          ((homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op ≫
            (homOfLE
                (_ :
                  WalkingPair.rec U V { down := WalkingPair.left }.down ⊓ WalkingPair.rec U V a✝.down ≤
                    WalkingPair.rec U V { down := WalkingPair.left }.down)).op) =
    interUnionPullbackConeLift F U V s ≫
      F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
        (presheaf F).map
          ((homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op ≫
            (homOfLE
                (_ :
                  WalkingPair.rec U V { down := WalkingPair.left }.down ⊓ WalkingPair.rec U V a✝.down ≤
                    WalkingPair.rec U V { down := WalkingPair.left }.down)).op)

Next tactic:
simp_rw [F.1.map_comp, ← Category.assoc]
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      

Proof state:
case property.refine'_3.mk.pair.up.left
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ ((m ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
        F.val.map
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) ≫
      F.val.map
        (homOfLE
            (_ :
              WalkingPair.rec U V { down := WalkingPair.left }.down ⊓ WalkingPair.rec U V a✝.down ≤
                WalkingPair.rec U V { down := WalkingPair.left }.down)).op =
    ((interUnionPullbackConeLift F U V s ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
        F.val.map
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) ≫
      F.val.map
        (homOfLE
            (_ :
              WalkingPair.rec U V { down := WalkingPair.left }.down ⊓ WalkingPair.rec U V a✝.down ≤
                WalkingPair.rec U V { down := WalkingPair.left }.down)).op

Next tactic:
congr 1
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      congr 1
      

Proof state:
case property.refine'_3.mk.pair.up.left.e_a
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ (m ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
      F.val.map
        (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op =
    (interUnionPullbackConeLift F U V s ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
      F.val.map
        (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op

Next tactic:
simp_rw [Category.assoc, ← F.1.map_comp]
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      

Proof state:
case property.refine'_3.mk.pair.up.right
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ m ≫
      F.val.map (eqToHom (_ : iSup ι = U ⊔ V)).op ≫
        ((presheaf F).mapCone (Cocone.op (Pairwise.cocone ι))).π.app
          { unop := Pairwise.pair { down := WalkingPair.right } a✝ } =
    interUnionPullbackConeLift F U V s ≫
      F.val.map (eqToHom (_ : iSup ι = U ⊔ V)).op ≫
        ((presheaf F).mapCone (Cocone.op (Pairwise.cocone ι))).π.app
          { unop := Pairwise.pair { down := WalkingPair.right } a✝ }

Next tactic:
dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      

Proof state:
case property.refine'_3.mk.pair.up.right
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ m ≫
      F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
        (presheaf F).map
          ((homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op ≫
            (homOfLE
                (_ :
                  WalkingPair.rec U V { down := WalkingPair.right }.down ⊓ WalkingPair.rec U V a✝.down ≤
                    WalkingPair.rec U V { down := WalkingPair.right }.down)).op) =
    interUnionPullbackConeLift F U V s ≫
      F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
        (presheaf F).map
          ((homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op ≫
            (homOfLE
                (_ :
                  WalkingPair.rec U V { down := WalkingPair.right }.down ⊓ WalkingPair.rec U V a✝.down ≤
                    WalkingPair.rec U V { down := WalkingPair.right }.down)).op)

Next tactic:
simp_rw [F.1.map_comp, ← Category.assoc]
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      

Proof state:
case property.refine'_3.mk.pair.up.right
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ ((m ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
        F.val.map
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) ≫
      F.val.map
        (homOfLE
            (_ :
              WalkingPair.rec U V { down := WalkingPair.right }.down ⊓ WalkingPair.rec U V a✝.down ≤
                WalkingPair.rec U V { down := WalkingPair.right }.down)).op =
    ((interUnionPullbackConeLift F U V s ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
        F.val.map
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) ≫
      F.val.map
        (homOfLE
            (_ :
              WalkingPair.rec U V { down := WalkingPair.right }.down ⊓ WalkingPair.rec U V a✝.down ≤
                WalkingPair.rec U V { down := WalkingPair.right }.down)).op

Next tactic:
congr 1
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      congr 1
      

Proof state:
case property.refine'_3.mk.pair.up.right.e_a
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ (m ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
      F.val.map
        (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op =
    (interUnionPullbackConeLift F U V s ≫ F.val.map (eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op) ≫
      F.val.map
        (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.right }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op

Next tactic:
simp_rw [Category.assoc, ← F.1.map_comp]
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      congr 1
      simp_rw [Category.assoc, ← F.1.map_comp]
    · 

Proof state:
case property.refine'_3.mk.pair.up.left.e_a
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ m ≫
      F.val.map
        ((eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) =
    interUnionPullbackConeLift F U V s ≫
      F.val.map
        ((eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op)

Next tactic:
convert h₁
/-- For a sheaf `F`, `F(U ⊔ V)` is the pullback of `F(U) ⟶ F(U ⊓ V)` and `F(V) ⟶ F(U ⊓ V)`. -/
def isLimitPullbackCone : IsLimit (interUnionPullbackCone F U V) := by
  let ι : ULift.{w} WalkingPair → Opens X := fun ⟨j⟩ => WalkingPair.casesOn j U V
  have hι : U ⊔ V = iSup ι := by
    ext
    rw [Opens.coe_iSup, Set.mem_iUnion]
    constructor
    · rintro (h | h)
      exacts [⟨⟨WalkingPair.left⟩, h⟩, ⟨⟨WalkingPair.right⟩, h⟩]
    · rintro ⟨⟨_ | _⟩, h⟩
      exacts [Or.inl h, Or.inr h]
  apply PullbackCone.isLimitAux'
  intro s
  use interUnionPullbackConeLift F U V s
  refine' ⟨_, _, _⟩
  · apply interUnionPullbackConeLift_left
  · apply interUnionPullbackConeLift_right
  · intro m h₁ h₂
    rw [← cancel_mono (F.1.map (eqToHom hι.symm).op)]
    apply (F.presheaf.isSheaf_iff_isSheafPairwiseIntersections.mp F.2 ι).some.hom_ext
    rintro ((_ | _) | (_ | _)) <;>
    rw [Category.assoc, Category.assoc]
    · erw [← F.1.map_comp]
      convert h₁
      apply interUnionPullbackConeLift_left
    · erw [← F.1.map_comp]
      convert h₂
      apply interUnionPullbackConeLift_right
    all_goals
      dsimp only [Functor.op, Pairwise.cocone_ι_app, Functor.mapCone_π_app, Cocone.op,
        Pairwise.coconeιApp, unop_op, op_comp, NatTrans.op]
      simp_rw [F.1.map_comp, ← Category.assoc]
      congr 1
      simp_rw [Category.assoc, ← F.1.map_comp]
    · convert h₁
      

Proof state:
case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Sheaf C X
U V : Opens ↑X
s✝ : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
ι : ULift.{w, 0} WalkingPair → Opens ↑X :=
  fun x =>
    match x with
    | { down := j } => WalkingPair.casesOn j U V
hι : U ⊔ V = iSup ι
s : PullbackCone (F.val.map (homOfLE (_ : U ⊓ V ≤ U)).op) (F.val.map (homOfLE (_ : U ⊓ V ≤ V)).op)
m : s.pt ⟶ (interUnionPullbackCone F U V).pt
h₁ : m ≫ PullbackCone.fst (interUnionPullbackCone F U V) = PullbackCone.fst s
h₂ : m ≫ PullbackCone.snd (interUnionPullbackCone F U V) = PullbackCone.snd s
a✝ : ULift.{w, 0} WalkingPair
⊢ interUnionPullbackConeLift F U V s ≫
      F.val.map
        ((eqToHom (_ : ⨆ x, WalkingPair.rec U V x.down = U ⊔ V)).op ≫
          (homOfLE (_ : WalkingPair.rec U V { down := WalkingPair.left }.down ≤ ⨆ x, WalkingPair.rec U V x.down)).op) =
    PullbackCone.fst s

Next tactic:
apply interUnionPullbackConeLift_left