l3lab/ntp-mathlib huggingface dataset:
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> 

Proof state:
case some.none.term.left
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
⊢ (cospan (F.map (ι D i)) (F.map (ι D j))).map (WidePullbackShape.Hom.term WalkingPair.left) ≫
      ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          none).hom =
    ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          (some WalkingPair.left)).hom ≫
      (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).map (WidePullbackShape.Hom.term WalkingPair.left)

Next tactic:
simp
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> 

Proof state:
case some.none.term.right
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
⊢ (cospan (F.map (ι D i)) (F.map (ι D j))).map (WidePullbackShape.Hom.term WalkingPair.right) ≫
      ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          none).hom =
    ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          (some WalkingPair.right)).hom ≫
      (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).map (WidePullbackShape.Hom.term WalkingPair.right)

Next tactic:
simp
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> 

Proof state:
case some.some.id
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
val✝ : WalkingPair
⊢ (cospan (F.map (ι D i)) (F.map (ι D j))).map (WidePullbackShape.Hom.id (some val✝)) ≫
      ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          (some val✝)).hom =
    ((fun x =>
            Option.casesOn (motive := fun t =>
              x = t →
                ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
                  (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
              x (fun h => (_ : none = x) ▸ gluedIso D F)
              (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val)))
              (_ : x = x))
          (some val✝)).hom ≫
      (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).map (WidePullbackShape.Hom.id (some val✝))

Next tactic:
simp
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  

Proof state:
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ IsLimit
    (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
      (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j)))

Next tactic:
apply IsLimit.postcomposeHomEquiv e _ _
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  

Proof state:
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ IsLimit
    ((Cones.postcompose e.hom).obj
      (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
        (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j))))

Next tactic:
apply hc.ofIsoLimit
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  

Proof state:
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ vPullbackCone (mapGlueData D F) i j ≅
    (Cones.postcompose e.hom).obj
      (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
        (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j)))

Next tactic:
refine' Cones.ext (Iso.refl _) _
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  refine' Cones.ext (Iso.refl _) _
  · 

Proof state:
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ ∀ (j_1 : WalkingCospan),
    (vPullbackCone (mapGlueData D F) i j).π.app j_1 =
      (Iso.refl (vPullbackCone (mapGlueData D F) i j).pt).hom ≫
        ((Cones.postcompose e.hom).obj
                (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
                  (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j)))).π.app
          j_1

Next tactic:
rintro (_ | _ | _)
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  refine' Cones.ext (Iso.refl _) _
  · rintro (_ | _ | _)
    change _ = _ ≫ (_ ≫ _) ≫ _
    all_goals 

Proof state:
case none
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ (vPullbackCone (mapGlueData D F) i j).π.app none =
    (Iso.refl (vPullbackCone (mapGlueData D F) i j).pt).hom ≫ (F.map (f D i j) ≫ F.map (ι D i)) ≫ e.hom.app none

Next tactic:
change _ = 𝟙 _ ≫ _ ≫ _
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  refine' Cones.ext (Iso.refl _) _
  · rintro (_ | _ | _)
    change _ = _ ≫ (_ ≫ _) ≫ _
    all_goals change _ = 𝟙 _ ≫ _ ≫ _; 

Proof state:
case none
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ (vPullbackCone (mapGlueData D F) i j).π.app none =
    𝟙 (((Functor.const WalkingCospan).obj (vPullbackCone (mapGlueData D F) i j).pt).obj none) ≫
      (F.map (f D i j) ≫ F.map (ι D i)) ≫ e.hom.app none

Next tactic:
aesop_cat
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  refine' Cones.ext (Iso.refl _) _
  · rintro (_ | _ | _)
    change _ = _ ≫ (_ ≫ _) ≫ _
    all_goals 

Proof state:
case some.left
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ (vPullbackCone (mapGlueData D F) i j).π.app (some WalkingPair.left) =
    (Iso.refl (vPullbackCone (mapGlueData D F) i j).pt).hom ≫
      ((Cones.postcompose e.hom).obj
              (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
                (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j)))).π.app
        (some WalkingPair.left)

Next tactic:
change _ = 𝟙 _ ≫ _ ≫ _
/-- If `F` preserves the gluing, and reflects the pullback of `U i ⟶ glued` and `U j ⟶ glued`,
then `F` reflects the fact that `V_pullback_cone` is a pullback. -/
def vPullbackConeIsLimitOfMap (i j : D.J) [ReflectsLimit (cospan (D.ι i) (D.ι j)) F]
    (hc : IsLimit ((D.mapGlueData F).vPullbackCone i j)) : IsLimit (D.vPullbackCone i j) := by
  apply isLimitOfReflects F
  apply (isLimitMapConePullbackConeEquiv _ _).symm _
  let e :
    cospan (F.map (D.ι i)) (F.map (D.ι j)) ≅
      cospan ((D.mapGlueData F).ι i) ((D.mapGlueData F).ι j)
  exact
    NatIso.ofComponents
      (fun x => by
        cases x
        exacts [D.gluedIso F, Iso.refl _])
      (by rintro (_ | _) (_ | _) (_ | _ | _) <;> simp)
  apply IsLimit.postcomposeHomEquiv e _ _
  apply hc.ofIsoLimit
  refine' Cones.ext (Iso.refl _) _
  · rintro (_ | _ | _)
    change _ = _ ≫ (_ ≫ _) ≫ _
    all_goals change _ = 𝟙 _ ≫ _ ≫ _; 

Proof state:
case some.left
C : Type u₁
inst✝⁴ : Category.{v, u₁} C
C' : Type u₂
inst✝³ : Category.{v, u₂} C'
D : GlueData C
F : C ⥤ C'
H : (i j k : D.J) → PreservesLimit (cospan (f D i j) (f D i k)) F
inst✝² : HasMulticoequalizer (diagram D)
inst✝¹ : PreservesColimit (MultispanIndex.multispan (diagram D)) F
i j : D.J
inst✝ : ReflectsLimit (cospan (ι D i) (ι D j)) F
hc : IsLimit (vPullbackCone (mapGlueData D F) i j)
e : cospan (F.map (ι D i)) (F.map (ι D j)) ≅ cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j) :=
  NatIso.ofComponents fun x =>
    Option.casesOn (motive := fun t =>
      x = t →
        ((cospan (F.map (ι D i)) (F.map (ι D j))).obj x ≅
          (cospan (ι (mapGlueData D F) i) (ι (mapGlueData D F) j)).obj x))
      x (fun h => (_ : none = x) ▸ gluedIso D F)
      (fun val h => (_ : some val = x) ▸ Iso.refl ((cospan (F.map (ι D i)) (F.map (ι D j))).obj (some val))) (_ : x = x)
⊢ (vPullbackCone (mapGlueData D F) i j).π.app (some WalkingPair.left) =
    𝟙 (((Functor.const WalkingCospan).obj (vPullbackCone (mapGlueData D F) i j).pt).obj (some WalkingPair.left)) ≫
      (PullbackCone.mk (F.map (f D i j)) (F.map (t D i j ≫ f D j i))
                (_ : F.map (f D i j) ≫ F.map (ι D i) = F.map (t D i j ≫ f D j i) ≫ F.map (ι D j))).π.app
          (some WalkingPair.left) ≫
        e.hom.app (some WalkingPair.left)

Next tactic:
aesop_cat