[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H : IsPushout f g h i
H' : IsVanKampen H
⊢ IsVanKampen (_ : IsPushout g f i h)
[PROOFSTEP]
introv W' hf hg hh hi w
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H : IsPushout f g h i
H' : IsVanKampen H
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ Y
αY : Y' ⟶ X
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX g
hg : IsPullback g' αW αY f
hh : CommSq h' αX αZ i
hi : CommSq i' αY αZ h
w : CommSq f' g' h' i'
⊢ IsPushout f' g' h' i' ↔ IsPullback h' αX αZ i ∧ IsPullback i' αY αZ h
[PROOFSTEP]
simpa only [IsPushout.flip_iff, IsPullback.flip_iff, and_comm] using H' g' f' i' h' αW αY αX αZ hg hf hi hh w.flip
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H : IsPushout f g h i
⊢ IsVanKampen H ↔ IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
[PROOFSTEP]
constructor
[GOAL]
case mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H : IsPushout f g h i
⊢ IsVanKampen H → IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
[PROOFSTEP]
intro H F' c' α fα eα hα
[GOAL]
case mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ Nonempty (IsColimit c') ↔
    ∀ (j : WalkingSpan),
      IsPullback (NatTrans.app c'.ι j) (NatTrans.app α j) fα
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)
[PROOFSTEP]
refine'
  Iff.trans _
    ((H (F'.map WalkingSpan.Hom.fst) (F'.map WalkingSpan.Hom.snd) (c'.ι.app _) (c'.ι.app _) (α.app _) (α.app _)
          (α.app _) fα (by convert hα WalkingSpan.Hom.fst) (by convert hα WalkingSpan.Hom.snd) _ _ _).trans
      _)
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ IsPullback (F'.map WalkingSpan.Hom.fst) (NatTrans.app α WalkingSpan.zero) (NatTrans.app α WalkingSpan.left) f
[PROOFSTEP]
convert hα WalkingSpan.Hom.fst
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ IsPullback (F'.map WalkingSpan.Hom.snd) (NatTrans.app α WalkingSpan.zero) (NatTrans.app α WalkingSpan.right) g
[PROOFSTEP]
convert hα WalkingSpan.Hom.snd
[GOAL]
case mp.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ Nonempty (IsColimit c') ↔
    IsPushout (F'.map WalkingSpan.Hom.fst) (F'.map WalkingSpan.Hom.snd) (NatTrans.app c'.ι WalkingSpan.left)
      (NatTrans.app c'.ι WalkingSpan.right)
[PROOFSTEP]
have :
  F'.map WalkingSpan.Hom.fst ≫ c'.ι.app WalkingSpan.left = F'.map WalkingSpan.Hom.snd ≫ c'.ι.app WalkingSpan.right := by
  simp only [Cocone.w]
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
[PROOFSTEP]
simp only [Cocone.w]
[GOAL]
case mp.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ Nonempty (IsColimit c') ↔
    IsPushout (F'.map WalkingSpan.Hom.fst) (F'.map WalkingSpan.Hom.snd) (NatTrans.app c'.ι WalkingSpan.left)
      (NatTrans.app c'.ι WalkingSpan.right)
[PROOFSTEP]
rw [(IsColimit.equivOfNatIsoOfIso (diagramIsoSpan F') c' (PushoutCocone.mk _ _ this) _).nonempty_congr]
[GOAL]
case mp.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ Nonempty
      (IsColimit (PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this)) ↔
    IsPushout (F'.map WalkingSpan.Hom.fst) (F'.map WalkingSpan.Hom.snd) (NatTrans.app c'.ι WalkingSpan.left)
      (NatTrans.app c'.ι WalkingSpan.right)
[PROOFSTEP]
exact ⟨fun h => ⟨⟨this⟩, h⟩, fun h => h.2⟩
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ (Cocones.precompose (diagramIsoSpan F').inv).obj c' ≅
    PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this
[PROOFSTEP]
refine' Cocones.ext (Iso.refl c'.pt) _
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ ∀ (j : WalkingSpan),
    NatTrans.app ((Cocones.precompose (diagramIsoSpan F').inv).obj c').ι j ≫ (Iso.refl c'.pt).hom =
      NatTrans.app (PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this).ι
        j
[PROOFSTEP]
rintro (_ | _ | _)
[GOAL]
case none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ NatTrans.app ((Cocones.precompose (diagramIsoSpan F').inv).obj c').ι none ≫ (Iso.refl c'.pt).hom =
    NatTrans.app (PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this).ι
      none
[PROOFSTEP]
dsimp
[GOAL]
case some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ NatTrans.app ((Cocones.precompose (diagramIsoSpan F').inv).obj c').ι (some WalkingPair.left) ≫ (Iso.refl c'.pt).hom =
    NatTrans.app (PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this).ι
      (some WalkingPair.left)
[PROOFSTEP]
dsimp
[GOAL]
case some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ NatTrans.app ((Cocones.precompose (diagramIsoSpan F').inv).obj c').ι (some WalkingPair.right) ≫ (Iso.refl c'.pt).hom =
    NatTrans.app (PushoutCocone.mk (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app c'.ι WalkingSpan.right) this).ι
      (some WalkingPair.right)
[PROOFSTEP]
dsimp
[GOAL]
case none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ (𝟙 (F'.obj WalkingSpan.zero) ≫ NatTrans.app c'.ι none) ≫ 𝟙 c'.pt =
    F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left
[PROOFSTEP]
simp only [c'.w, Category.assoc, Category.id_comp, Category.comp_id]
[GOAL]
case some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ (𝟙 (F'.obj WalkingSpan.left) ≫ NatTrans.app c'.ι (some WalkingPair.left)) ≫ 𝟙 c'.pt =
    NatTrans.app c'.ι WalkingSpan.left
[PROOFSTEP]
simp only [c'.w, Category.assoc, Category.id_comp, Category.comp_id]
[GOAL]
case some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
this :
  F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
⊢ (𝟙 (F'.obj WalkingSpan.right) ≫ NatTrans.app c'.ι (some WalkingPair.right)) ≫ 𝟙 c'.pt =
    NatTrans.app c'.ι WalkingSpan.right
[PROOFSTEP]
simp only [c'.w, Category.assoc, Category.id_comp, Category.comp_id]
[GOAL]
case mp.refine'_2
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ CommSq (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h
[PROOFSTEP]
exact ⟨NatTrans.congr_app eα.symm _⟩
[GOAL]
case mp.refine'_3
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ CommSq (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
[PROOFSTEP]
exact ⟨NatTrans.congr_app eα.symm _⟩
[GOAL]
case mp.refine'_4
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ CommSq (F'.map WalkingSpan.Hom.fst) (F'.map WalkingSpan.Hom.snd) (NatTrans.app c'.ι WalkingSpan.left)
    (NatTrans.app c'.ι WalkingSpan.right)
[PROOFSTEP]
exact ⟨by simp⟩
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left =
    F'.map WalkingSpan.Hom.snd ≫ NatTrans.app c'.ι WalkingSpan.right
[PROOFSTEP]
simp
[GOAL]
case mp.refine'_5
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h ∧
      IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i ↔
    ∀ (j : WalkingSpan),
      IsPullback (NatTrans.app c'.ι j) (NatTrans.app α j) fα
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)
[PROOFSTEP]
constructor
[GOAL]
case mp.refine'_5.mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h ∧
      IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i →
    ∀ (j : WalkingSpan),
      IsPullback (NatTrans.app c'.ι j) (NatTrans.app α j) fα
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)
[PROOFSTEP]
rintro ⟨h₁, h₂⟩ (_ | _ | _)
[GOAL]
case mp.refine'_5.mp.intro.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
h₁ : IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h
h₂ : IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
⊢ IsPullback (NatTrans.app c'.ι none) (NatTrans.app α none) fα
    (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι none)
[PROOFSTEP]
rw [← c'.w WalkingSpan.Hom.fst]
[GOAL]
case mp.refine'_5.mp.intro.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
h₁ : IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h
h₂ : IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
⊢ IsPullback (F'.map WalkingSpan.Hom.fst ≫ NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α none) fα
    (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι none)
[PROOFSTEP]
exact (hα WalkingSpan.Hom.fst).paste_horiz h₁
[GOAL]
case mp.refine'_5.mp.intro.some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
h₁ : IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h
h₂ : IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
⊢ IsPullback (NatTrans.app c'.ι (some WalkingPair.left)) (NatTrans.app α (some WalkingPair.left)) fα
    (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι (some WalkingPair.left))
case mp.refine'_5.mp.intro.some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
h₁ : IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h
h₂ : IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
⊢ IsPullback (NatTrans.app c'.ι (some WalkingPair.right)) (NatTrans.app α (some WalkingPair.right)) fα
    (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι (some WalkingPair.right))
[PROOFSTEP]
exacts [h₁, h₂]
[GOAL]
case mp.refine'_5.mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
⊢ (∀ (j : WalkingSpan),
      IsPullback (NatTrans.app c'.ι j) (NatTrans.app α j) fα
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)) →
    IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h ∧
      IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
[PROOFSTEP]
intro h
[GOAL]
case mp.refine'_5.mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h✝ : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h✝ i
H : IsVanKampen H✝
F' : WalkingSpan ⥤ C
c' : Cocone F'
α : F' ⟶ span f g
fα : c'.pt ⟶ (PushoutCocone.mk h✝ i (_ : f ≫ h✝ = g ≫ i)).pt
eα : α ≫ (PushoutCocone.mk h✝ i (_ : f ≫ h✝ = g ≫ i)).ι = c'.ι ≫ (Functor.const WalkingSpan).map fα
hα : NatTrans.Equifibered α
h :
  ∀ (j : WalkingSpan),
    IsPullback (NatTrans.app c'.ι j) (NatTrans.app α j) fα
      (NatTrans.app (PushoutCocone.mk h✝ i (_ : f ≫ h✝ = g ≫ i)).ι j)
⊢ IsPullback (NatTrans.app c'.ι WalkingSpan.left) (NatTrans.app α WalkingSpan.left) fα h✝ ∧
    IsPullback (NatTrans.app c'.ι WalkingSpan.right) (NatTrans.app α WalkingSpan.right) fα i
[PROOFSTEP]
exact ⟨h _, h _⟩
[GOAL]
case mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H : IsPushout f g h i
⊢ IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)) → IsVanKampen H
[PROOFSTEP]
introv H W' hf hg hh hi w
[GOAL]
case mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPushout f' g' h' i' ↔ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
refine' Iff.trans _ ((H w.cocone ⟨by rintro (_ | _ | _); exacts [αW, αX, αY], _⟩ αZ _ _).trans _)
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (X_1 : WalkingSpan) → (span f' g').obj X_1 ⟶ (span f g).obj X_1
[PROOFSTEP]
rintro (_ | _ | _)
[GOAL]
case none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (span f' g').obj none ⟶ (span f g).obj none
case some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (span f' g').obj (some WalkingPair.left) ⟶ (span f g).obj (some WalkingPair.left)
case some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (span f' g').obj (some WalkingPair.right) ⟶ (span f g).obj (some WalkingPair.right)
[PROOFSTEP]
exacts [αW, αX, αY]
[GOAL]
case mpr.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPushout f' g' h' i' ↔ Nonempty (IsColimit (CommSq.cocone w))
case mpr.refine'_2
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ ∀ ⦃X_1 Y_1 : WalkingSpan⦄ (f_1 : X_1 ⟶ Y_1),
    ((span f' g').map f_1 ≫ Option.casesOn Y_1 αW fun val => WalkingPair.casesOn val αX αY) =
      (Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫ (span f g).map f_1
case mpr.refine'_3
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫
      (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι =
    (CommSq.cocone w).ι ≫ (Functor.const WalkingSpan).map αZ
case mpr.refine'_4
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ NatTrans.Equifibered (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
case mpr.refine'_5
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (∀ (j : WalkingSpan),
      IsPullback (NatTrans.app (CommSq.cocone w).ι j)
        (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) j) αZ
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)) ↔
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
rotate_left
[GOAL]
case mpr.refine'_2
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ ∀ ⦃X_1 Y_1 : WalkingSpan⦄ (f_1 : X_1 ⟶ Y_1),
    ((span f' g').map f_1 ≫ Option.casesOn Y_1 αW fun val => WalkingPair.casesOn val αX αY) =
      (Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫ (span f g).map f_1
[PROOFSTEP]
rintro i _ (_ | _ | _)
[GOAL]
case mpr.refine'_2.id
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ ((span f' g').map (WidePushoutShape.Hom.id i) ≫ Option.casesOn i αW fun val => WalkingPair.casesOn val αX αY) =
    (Option.casesOn i αW fun val => WalkingPair.casesOn val αX αY) ≫ (span f g).map (WidePushoutShape.Hom.id i)
[PROOFSTEP]
dsimp
[GOAL]
case mpr.refine'_2.id
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ (span f' g').map (𝟙 i) ≫ Option.rec αW (fun val => WalkingPair.rec αX αY val) i =
    Option.rec αW (fun val => WalkingPair.rec αX αY val) i ≫ (span f g).map (𝟙 i)
[PROOFSTEP]
simp only [Functor.map_id, Category.comp_id, Category.id_comp]
[GOAL]
case mpr.refine'_2.init.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ ((span f' g').map (WidePushoutShape.Hom.init WalkingPair.left) ≫
      Option.casesOn (some WalkingPair.left) αW fun val => WalkingPair.casesOn val αX αY) =
    (Option.casesOn none αW fun val => WalkingPair.casesOn val αX αY) ≫
      (span f g).map (WidePushoutShape.Hom.init WalkingPair.left)
case mpr.refine'_2.init.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ ((span f' g').map (WidePushoutShape.Hom.init WalkingPair.right) ≫
      Option.casesOn (some WalkingPair.right) αW fun val => WalkingPair.casesOn val αX αY) =
    (Option.casesOn none αW fun val => WalkingPair.casesOn val αX αY) ≫
      (span f g).map (WidePushoutShape.Hom.init WalkingPair.right)
[PROOFSTEP]
exacts [hf.w, hg.w]
[GOAL]
case mpr.refine'_3
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫
      (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι =
    (CommSq.cocone w).ι ≫ (Functor.const WalkingSpan).map αZ
[PROOFSTEP]
ext (_ | _ | _)
[GOAL]
case mpr.refine'_3.w.h.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ NatTrans.app
      ((NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫
        (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι)
      none =
    NatTrans.app ((CommSq.cocone w).ι ≫ (Functor.const WalkingSpan).map αZ) none
[PROOFSTEP]
dsimp
[GOAL]
case mpr.refine'_3.w.h.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ αW ≫ f ≫ h = NatTrans.app (CommSq.cocone w).ι none ≫ αZ
[PROOFSTEP]
rw [PushoutCocone.condition_zero]
[GOAL]
case mpr.refine'_3.w.h.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ αW ≫ f ≫ h = (f' ≫ PushoutCocone.inl (CommSq.cocone w)) ≫ αZ
[PROOFSTEP]
erw [Category.assoc, hh.w, hf.w_assoc]
[GOAL]
case mpr.refine'_3.w.h.some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ NatTrans.app
      ((NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫
        (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι)
      (some WalkingPair.left) =
    NatTrans.app ((CommSq.cocone w).ι ≫ (Functor.const WalkingSpan).map αZ) (some WalkingPair.left)
case mpr.refine'_3.w.h.some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ NatTrans.app
      ((NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) ≫
        (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι)
      (some WalkingPair.right) =
    NatTrans.app ((CommSq.cocone w).ι ≫ (Functor.const WalkingSpan).map αZ) (some WalkingPair.right)
[PROOFSTEP]
exacts [hh.w.symm, hi.w.symm]
[GOAL]
case mpr.refine'_4
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ NatTrans.Equifibered (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
[PROOFSTEP]
rintro i _ (_ | _ | _)
[GOAL]
case mpr.refine'_4.id
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ IsPullback ((span f' g').map (WidePushoutShape.Hom.id i))
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) i)
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) i)
    ((span f g).map (WidePushoutShape.Hom.id i))
[PROOFSTEP]
dsimp
[GOAL]
case mpr.refine'_4.id
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ IsPullback ((span f' g').map (𝟙 i)) (Option.rec αW (fun val => WalkingPair.rec αX αY val) i)
    (Option.rec αW (fun val => WalkingPair.rec αX αY val) i) ((span f g).map (𝟙 i))
[PROOFSTEP]
simp_rw [Functor.map_id]
[GOAL]
case mpr.refine'_4.id
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ IsPullback (𝟙 ((span f' g').obj i)) (Option.rec αW (fun val => WalkingPair.rec αX αY val) i)
    (Option.rec αW (fun val => WalkingPair.rec αX αY val) i) (𝟙 ((span f g).obj i))
[PROOFSTEP]
exact IsPullback.of_horiz_isIso ⟨by rw [Category.comp_id, Category.id_comp]⟩
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i✝ : Y ⟶ Z
H✝ : IsPushout f g h i✝
H : IsVanKampenColimit (PushoutCocone.mk h i✝ (_ : f ≫ h = g ≫ i✝))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i✝
w : CommSq f' g' h' i'
i : WalkingSpan
⊢ 𝟙 ((span f' g').obj i) ≫ Option.rec αW (fun val => WalkingPair.rec αX αY val) i =
    Option.rec αW (fun val => WalkingPair.rec αX αY val) i ≫ 𝟙 ((span f g).obj i)
[PROOFSTEP]
rw [Category.comp_id, Category.id_comp]
[GOAL]
case mpr.refine'_4.init.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPullback ((span f' g').map (WidePushoutShape.Hom.init WalkingPair.left))
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) none)
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
      (some WalkingPair.left))
    ((span f g).map (WidePushoutShape.Hom.init WalkingPair.left))
case mpr.refine'_4.init.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPullback ((span f' g').map (WidePushoutShape.Hom.init WalkingPair.right))
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) none)
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
      (some WalkingPair.right))
    ((span f g).map (WidePushoutShape.Hom.init WalkingPair.right))
[PROOFSTEP]
exacts [hf, hg]
[GOAL]
case mpr.refine'_5
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (∀ (j : WalkingSpan),
      IsPullback (NatTrans.app (CommSq.cocone w).ι j)
        (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) j) αZ
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)) ↔
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
constructor
[GOAL]
case mpr.refine'_5.mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ (∀ (j : WalkingSpan),
      IsPullback (NatTrans.app (CommSq.cocone w).ι j)
        (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) j) αZ
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)) →
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
intro h
[GOAL]
case mpr.refine'_5.mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h✝ : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h✝ i
H : IsVanKampenColimit (PushoutCocone.mk h✝ i (_ : f ≫ h✝ = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h✝
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h :
  ∀ (j : WalkingSpan),
    IsPullback (NatTrans.app (CommSq.cocone w).ι j)
      (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) j) αZ
      (NatTrans.app (PushoutCocone.mk h✝ i (_ : f ≫ h✝ = g ≫ i)).ι j)
⊢ IsPullback h' αX αZ h✝ ∧ IsPullback i' αY αZ i
[PROOFSTEP]
exact ⟨h WalkingCospan.left, h WalkingCospan.right⟩
[GOAL]
case mpr.refine'_5.mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i →
    ∀ (j : WalkingSpan),
      IsPullback (NatTrans.app (CommSq.cocone w).ι j)
        (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) j) αZ
        (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι j)
[PROOFSTEP]
rintro ⟨h₁, h₂⟩ (_ | _ | _)
[GOAL]
case mpr.refine'_5.mpr.intro.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h₁ : IsPullback h' αX αZ h
h₂ : IsPullback i' αY αZ i
⊢ IsPullback (NatTrans.app (CommSq.cocone w).ι none)
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY) none) αZ
    (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι none)
[PROOFSTEP]
dsimp
[GOAL]
case mpr.refine'_5.mpr.intro.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h₁ : IsPullback h' αX αZ h
h₂ : IsPullback i' αY αZ i
⊢ IsPullback (NatTrans.app (CommSq.cocone w).ι none) αW αZ (f ≫ h)
[PROOFSTEP]
rw [PushoutCocone.condition_zero]
[GOAL]
case mpr.refine'_5.mpr.intro.none
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h₁ : IsPullback h' αX αZ h
h₂ : IsPullback i' αY αZ i
⊢ IsPullback (f' ≫ PushoutCocone.inl (CommSq.cocone w)) αW αZ (f ≫ h)
[PROOFSTEP]
exact hf.paste_horiz h₁
[GOAL]
case mpr.refine'_5.mpr.intro.some.left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h₁ : IsPullback h' αX αZ h
h₂ : IsPullback i' αY αZ i
⊢ IsPullback (NatTrans.app (CommSq.cocone w).ι (some WalkingPair.left))
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
      (some WalkingPair.left))
    αZ (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι (some WalkingPair.left))
case mpr.refine'_5.mpr.intro.some.right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
h₁ : IsPullback h' αX αZ h
h₂ : IsPullback i' αY αZ i
⊢ IsPullback (NatTrans.app (CommSq.cocone w).ι (some WalkingPair.right))
    (NatTrans.app (NatTrans.mk fun X_1 => Option.casesOn X_1 αW fun val => WalkingPair.casesOn val αX αY)
      (some WalkingPair.right))
    αZ (NatTrans.app (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i)).ι (some WalkingPair.right))
[PROOFSTEP]
exacts [h₁, h₂]
[GOAL]
case mpr.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
H✝ : IsPushout f g h i
H : IsVanKampenColimit (PushoutCocone.mk h i (_ : f ≫ h = g ≫ i))
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ Y
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY g
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPushout f' g' h' i' ↔ Nonempty (IsColimit (CommSq.cocone w))
[PROOFSTEP]
exact ⟨fun h => h.2, fun h => ⟨w, h⟩⟩
[GOAL]
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
⊢ Nonempty (IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)) ↔ IsPushout f (BinaryCofan.inl c) iY fE
[PROOFSTEP]
constructor
[GOAL]
case mp
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
⊢ Nonempty (IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)) → IsPushout f (BinaryCofan.inl c) iY fE
[PROOFSTEP]
rintro ⟨h⟩
[GOAL]
case mp.intro
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
⊢ IsPushout f (BinaryCofan.inl c) iY fE
[PROOFSTEP]
refine' ⟨H, ⟨Limits.PushoutCocone.isColimitAux' _ _⟩⟩
[GOAL]
case mp.intro
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
⊢ (s : PushoutCocone f (BinaryCofan.inl c)) →
    { l //
      PushoutCocone.inl (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ l = PushoutCocone.inl s ∧
        PushoutCocone.inr (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ l = PushoutCocone.inr s ∧
          ∀ {m : (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)).pt ⟶ s.pt},
            PushoutCocone.inl (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ m = PushoutCocone.inl s →
              PushoutCocone.inr (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ m =
                  PushoutCocone.inr s →
                m = l }
[PROOFSTEP]
intro s
[GOAL]
case mp.intro
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ { l //
    PushoutCocone.inl (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ l = PushoutCocone.inl s ∧
      PushoutCocone.inr (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ l = PushoutCocone.inr s ∧
        ∀ {m : (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)).pt ⟶ s.pt},
          PushoutCocone.inl (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ m = PushoutCocone.inl s →
            PushoutCocone.inr (PushoutCocone.mk iY fE (_ : f ≫ iY = BinaryCofan.inl c ≫ fE)) ≫ m = PushoutCocone.inr s →
              m = l }
[PROOFSTEP]
dsimp only [PushoutCocone.inr, PushoutCocone.mk]
  -- Porting note: Originally `dsimp`
[GOAL]
case mp.intro
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ { l //
    PushoutCocone.inl
            { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
          l =
        PushoutCocone.inl s ∧
      fE ≫ l = NatTrans.app s.ι WalkingSpan.right ∧
        ∀ {m : YE ⟶ s.pt},
          PushoutCocone.inl
                  { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
                m =
              PushoutCocone.inl s →
            fE ≫ m = NatTrans.app s.ι WalkingSpan.right → m = l }
[PROOFSTEP]
refine' ⟨h.desc (BinaryCofan.mk (c.inr ≫ s.inr) s.inl), h.fac _ ⟨WalkingPair.right⟩, _, _⟩
[GOAL]
case mp.intro.refine'_1
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ fE ≫ IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
apply BinaryCofan.IsColimit.hom_ext hc
[GOAL]
case mp.intro.refine'_1.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ BinaryCofan.inl c ≫
      fE ≫ IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    BinaryCofan.inl c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
rw [← H.w_assoc]
[GOAL]
case mp.intro.refine'_1.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ f ≫ iY ≫ IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    BinaryCofan.inl c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
erw [h.fac _ ⟨WalkingPair.right⟩]
[GOAL]
case mp.intro.refine'_1.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ f ≫
      NatTrans.app (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)).ι
        { as := WalkingPair.right } =
    BinaryCofan.inl c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
exact s.condition
[GOAL]
case mp.intro.refine'_1.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ BinaryCofan.inr c ≫
      fE ≫ IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    BinaryCofan.inr c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
rw [← Category.assoc]
[GOAL]
case mp.intro.refine'_1.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ (BinaryCofan.inr c ≫ fE) ≫
      IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    BinaryCofan.inr c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
exact h.fac _ ⟨WalkingPair.left⟩
[GOAL]
case mp.intro.refine'_2
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
⊢ ∀ {m : YE ⟶ s.pt},
    PushoutCocone.inl
            { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
          m =
        PushoutCocone.inl s →
      fE ≫ m = NatTrans.app s.ι WalkingSpan.right →
        m = IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s))
[PROOFSTEP]
intro m e₁ e₂
[GOAL]
case mp.intro.refine'_2
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ m = IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s))
[PROOFSTEP]
apply BinaryCofan.IsColimit.hom_ext h
[GOAL]
case mp.intro.refine'_2.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY) ≫ m =
    BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY) ≫
      IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s))
[PROOFSTEP]
dsimp only [BinaryCofan.mk, id]
  -- Porting note: Originally `dsimp`
[GOAL]
case mp.intro.refine'_2.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ BinaryCofan.inl
        { pt := YE,
          ι :=
            NatTrans.mk fun x =>
              WalkingPair.rec (motive := fun t =>
                x.as = t →
                  ((pair ((pair X E).obj { as := WalkingPair.right }) Y).obj { as := x.as } ⟶
                    ((Functor.const (Discrete WalkingPair)).obj YE).obj { as := x.as }))
                (fun h => (_ : WalkingPair.left = x.as) ▸ BinaryCofan.inr c ≫ fE)
                (fun h => (_ : WalkingPair.right = x.as) ▸ iY) x.as (_ : x.as = x.as) } ≫
      m =
    BinaryCofan.inl
        { pt := YE,
          ι :=
            NatTrans.mk fun x =>
              WalkingPair.rec (motive := fun t =>
                x.as = t →
                  ((pair ((pair X E).obj { as := WalkingPair.right }) Y).obj { as := x.as } ⟶
                    ((Functor.const (Discrete WalkingPair)).obj YE).obj { as := x.as }))
                (fun h => (_ : WalkingPair.left = x.as) ▸ BinaryCofan.inr c ≫ fE)
                (fun h => (_ : WalkingPair.right = x.as) ▸ iY) x.as (_ : x.as = x.as) } ≫
      IsColimit.desc h
        { pt := s.pt,
          ι :=
            NatTrans.mk fun x =>
              WalkingPair.rec (motive := fun t =>
                x.as = t →
                  ((pair ((pair X E).obj { as := WalkingPair.right }) Y).obj { as := x.as } ⟶
                    ((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := x.as }))
                (fun h => (_ : WalkingPair.left = x.as) ▸ BinaryCofan.inr c ≫ PushoutCocone.inr s)
                (fun h => (_ : WalkingPair.right = x.as) ▸ PushoutCocone.inl s) x.as (_ : x.as = x.as) }
[PROOFSTEP]
rw [Category.assoc, e₂, eq_comm]
[GOAL]
case mp.intro.refine'_2.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ BinaryCofan.inl
        { pt := YE,
          ι :=
            NatTrans.mk fun x =>
              WalkingPair.rec (motive := fun t =>
                x.as = t →
                  ((pair ((pair X E).obj { as := WalkingPair.right }) Y).obj { as := x.as } ⟶
                    ((Functor.const (Discrete WalkingPair)).obj YE).obj { as := x.as }))
                (fun h => (_ : WalkingPair.left = x.as) ▸ BinaryCofan.inr c ≫ fE)
                (fun h => (_ : WalkingPair.right = x.as) ▸ iY) x.as (_ : x.as = x.as) } ≫
      IsColimit.desc h
        { pt := s.pt,
          ι :=
            NatTrans.mk fun x =>
              WalkingPair.rec (motive := fun t =>
                x.as = t →
                  ((pair ((pair X E).obj { as := WalkingPair.right }) Y).obj { as := x.as } ⟶
                    ((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := x.as }))
                (fun h => (_ : WalkingPair.left = x.as) ▸ BinaryCofan.inr c ≫ PushoutCocone.inr s)
                (fun h => (_ : WalkingPair.right = x.as) ▸ PushoutCocone.inl s) x.as (_ : x.as = x.as) } =
    BinaryCofan.inr c ≫ NatTrans.app s.ι WalkingSpan.right
[PROOFSTEP]
exact h.fac _ ⟨WalkingPair.left⟩
[GOAL]
case mp.intro.refine'_2.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY) ≫ m =
    BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY) ≫
      IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s))
[PROOFSTEP]
refine' e₁.trans (Eq.symm _)
[GOAL]
case mp.intro.refine'_2.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h✝ : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
h : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
s : PushoutCocone f (BinaryCofan.inl c)
m : YE ⟶ s.pt
e₁ :
  PushoutCocone.inl
        { pt := YE, ι := NatTrans.mk fun j => Option.rec (f ≫ iY) (fun val => WalkingPair.rec iY fE val) j } ≫
      m =
    PushoutCocone.inl s
e₂ : fE ≫ m = NatTrans.app s.ι WalkingSpan.right
⊢ BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY) ≫
      IsColimit.desc h (BinaryCofan.mk (BinaryCofan.inr c ≫ PushoutCocone.inr s) (PushoutCocone.inl s)) =
    PushoutCocone.inl s
[PROOFSTEP]
exact h.fac _ _
[GOAL]
case mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H : CommSq f (BinaryCofan.inl c) iY fE
⊢ IsPushout f (BinaryCofan.inl c) iY fE → Nonempty (IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY))
[PROOFSTEP]
refine' fun H => ⟨_⟩
[GOAL]
case mpr
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
⊢ IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ fE) iY)
[PROOFSTEP]
fapply Limits.BinaryCofan.isColimitMk
[GOAL]
case mpr.desc
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
⊢ (s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y) → YE ⟶ s.pt
[PROOFSTEP]
exact fun s =>
  H.isColimit.desc (PushoutCocone.mk s.inr _ <| (hc.fac (BinaryCofan.mk (f ≫ s.inr) s.inl) ⟨WalkingPair.left⟩).symm)
[GOAL]
case mpr.fac_left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
⊢ ∀ (s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y),
    (BinaryCofan.inr c ≫ fE) ≫
        IsColimit.desc (IsPushout.isColimit H)
          (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))) =
      BinaryCofan.inl s
[PROOFSTEP]
intro s
[GOAL]
case mpr.fac_left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
⊢ (BinaryCofan.inr c ≫ fE) ≫
      IsColimit.desc (IsPushout.isColimit H)
        (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))) =
    BinaryCofan.inl s
[PROOFSTEP]
erw [Category.assoc, H.isColimit.fac _ WalkingSpan.right, hc.fac]
[GOAL]
case mpr.fac_left
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
⊢ NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.right } =
    BinaryCofan.inl s
[PROOFSTEP]
rfl
[GOAL]
case mpr.fac_right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
⊢ ∀ (s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y),
    iY ≫
        IsColimit.desc (IsPushout.isColimit H)
          (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))) =
      BinaryCofan.inr s
[PROOFSTEP]
intro s
[GOAL]
case mpr.fac_right
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
⊢ iY ≫
      IsColimit.desc (IsPushout.isColimit H)
        (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))) =
    BinaryCofan.inr s
[PROOFSTEP]
exact H.isColimit.fac _ WalkingSpan.left
[GOAL]
case mpr.uniq
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
⊢ ∀ (s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y) (m : YE ⟶ s.pt),
    (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s →
      iY ≫ m = BinaryCofan.inr s →
        m =
          IsColimit.desc (IsPushout.isColimit H)
            (PushoutCocone.mk (BinaryCofan.inr s)
              (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
              (_ :
                NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                  NatTrans.app c.ι { as := WalkingPair.left } ≫
                    IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s))))
[PROOFSTEP]
intro s m e₁ e₂
[GOAL]
case mpr.uniq
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ m =
    IsColimit.desc (IsPushout.isColimit H)
      (PushoutCocone.mk (BinaryCofan.inr s)
        (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
        (_ :
          NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
            NatTrans.app c.ι { as := WalkingPair.left } ≫
              IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s))))
[PROOFSTEP]
apply PushoutCocone.IsColimit.hom_ext H.isColimit
[GOAL]
case mpr.uniq.h₀
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ PushoutCocone.inl (IsPushout.cocone H) ≫ m =
    PushoutCocone.inl (IsPushout.cocone H) ≫
      IsColimit.desc (IsPushout.isColimit H)
        (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s))))
[PROOFSTEP]
symm
[GOAL]
case mpr.uniq.h₀
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ PushoutCocone.inl (IsPushout.cocone H) ≫
      IsColimit.desc (IsPushout.isColimit H)
        (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))) =
    PushoutCocone.inl (IsPushout.cocone H) ≫ m
[PROOFSTEP]
exact (H.isColimit.fac _ WalkingSpan.left).trans e₂.symm
[GOAL]
case mpr.uniq.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ PushoutCocone.inr (IsPushout.cocone H) ≫ m =
    PushoutCocone.inr (IsPushout.cocone H) ≫
      IsColimit.desc (IsPushout.isColimit H)
        (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s))))
[PROOFSTEP]
erw [H.isColimit.fac _ WalkingSpan.right]
[GOAL]
case mpr.uniq.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ PushoutCocone.inr (IsPushout.cocone H) ≫ m =
    NatTrans.app
      (PushoutCocone.mk (BinaryCofan.inr s)
          (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
          (_ :
            NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
              NatTrans.app c.ι { as := WalkingPair.left } ≫
                IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))).ι
      WalkingSpan.right
[PROOFSTEP]
apply BinaryCofan.IsColimit.hom_ext hc
[GOAL]
case mpr.uniq.h₁.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ BinaryCofan.inl c ≫ PushoutCocone.inr (IsPushout.cocone H) ≫ m =
    BinaryCofan.inl c ≫
      NatTrans.app
        (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))).ι
        WalkingSpan.right
[PROOFSTEP]
erw [hc.fac, ← H.w_assoc, e₂]
[GOAL]
case mpr.uniq.h₁.h₁
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ f ≫ BinaryCofan.inr s =
    NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left }
[PROOFSTEP]
rfl
[GOAL]
case mpr.uniq.h₁.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ BinaryCofan.inr c ≫ PushoutCocone.inr (IsPushout.cocone H) ≫ m =
    BinaryCofan.inr c ≫
      NatTrans.app
        (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))).ι
        WalkingSpan.right
[PROOFSTEP]
refine' ((Category.assoc _ _ _).symm.trans e₁).trans _
[GOAL]
case mpr.uniq.h₁.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ BinaryCofan.inl s =
    BinaryCofan.inr c ≫
      NatTrans.app
        (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))).ι
        WalkingSpan.right
[PROOFSTEP]
symm
[GOAL]
case mpr.uniq.h₁.h₂
J : Type v'
inst✝¹ : Category.{u', v'} J
C : Type u
inst✝ : Category.{v, u} C
W X✝ Y✝ Z : C
f✝ : W ⟶ X✝
g : W ⟶ Y✝
h : X✝ ⟶ Z
i : Y✝ ⟶ Z
X E Y YE : C
c : BinaryCofan X E
hc : IsColimit c
f : X ⟶ Y
iY : Y ⟶ YE
fE : c.pt ⟶ YE
H✝ : CommSq f (BinaryCofan.inl c) iY fE
H : IsPushout f (BinaryCofan.inl c) iY fE
s : BinaryCofan ((pair X E).obj { as := WalkingPair.right }) Y
m : YE ⟶ s.pt
e₁ : (BinaryCofan.inr c ≫ fE) ≫ m = BinaryCofan.inl s
e₂ : iY ≫ m = BinaryCofan.inr s
⊢ BinaryCofan.inr c ≫
      NatTrans.app
        (PushoutCocone.mk (BinaryCofan.inr s)
            (IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))
            (_ :
              NatTrans.app (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)).ι { as := WalkingPair.left } =
                NatTrans.app c.ι { as := WalkingPair.left } ≫
                  IsColimit.desc hc (BinaryCofan.mk (f ≫ BinaryCofan.inr s) (BinaryCofan.inl s)))).ι
        WalkingSpan.right =
    BinaryCofan.inl s
[PROOFSTEP]
exact hc.fac _ _
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
⊢ IsVanKampen H
[PROOFSTEP]
obtain ⟨hc₁⟩ := (is_coprod_iff_isPushout c hc H.1).mpr H
[GOAL]
case intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
⊢ IsVanKampen H
[PROOFSTEP]
introv W' hf hg hh hi w
[GOAL]
case intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
⊢ IsPushout f' g' h' i' ↔ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
obtain ⟨hc₂⟩ :=
  ((BinaryCofan.isVanKampen_iff _).mp (FinitaryExtensive.vanKampen c hc) (BinaryCofan.mk _ pullback.fst) _ _ _ hg.w.symm
        pullback.condition.symm).mpr
    ⟨hg, IsPullback.of_hasPullback αY c.inr⟩
[GOAL]
case intro.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ IsPushout f' g' h' i' ↔ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
refine' (is_coprod_iff_isPushout _ hc₂ w).symm.trans _
[GOAL]
case intro.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ Nonempty (IsColimit (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) ↔
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
refine'
  ((BinaryCofan.isVanKampen_iff _).mp (FinitaryExtensive.vanKampen _ hc₁) (BinaryCofan.mk _ _) pullback.snd _ _ _
        hh.w.symm).trans
    _
[GOAL]
case intro.intro.refine'_1
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ pullback.snd ≫ BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h) =
    BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h') ≫ αZ
[PROOFSTEP]
dsimp
[GOAL]
case intro.intro.refine'_1
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ pullback.snd ≫ BinaryCofan.inr c ≫ i = (pullback.fst ≫ i') ≫ αZ
[PROOFSTEP]
rw [← pullback.condition_assoc, Category.assoc, hi.w]
[GOAL]
case intro.intro.refine'_2
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
        αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) ∧
      IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
        (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) ↔
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
constructor
[GOAL]
case intro.intro.refine'_2.mp
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
        αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) ∧
      IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
        (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) →
    IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
rintro ⟨hc₃, hc₄⟩
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
⊢ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i
[PROOFSTEP]
refine' ⟨hc₄, _⟩
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
let Y'' := pullback αZ i
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
let cmp : Y' ⟶ Y'' := pullback.lift i' αY hi.w
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
have e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ c.inl := by rw [Category.assoc, pullback.lift_snd, hg.w]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
⊢ (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
[PROOFSTEP]
rw [Category.assoc, pullback.lift_snd, hg.w]
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
have e₂ : (pullback.fst ≫ cmp : pullback αY c.inr ⟶ _) ≫ pullback.snd = pullback.snd ≫ c.inr := by
  rw [Category.assoc, pullback.lift_snd, pullback.condition]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
⊢ (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
[PROOFSTEP]
rw [Category.assoc, pullback.lift_snd, pullback.condition]
[GOAL]
case intro.intro.refine'_2.mp.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
obtain ⟨hc₄⟩ :=
  ((BinaryCofan.isVanKampen_iff _).mp (FinitaryExtensive.vanKampen c hc) (BinaryCofan.mk _ _) αW _ _ e₁.symm
        e₂.symm).mpr <|
    by
    constructor
    · apply IsPullback.of_right _ e₁ (IsPullback.of_hasPullback _ _)
      rw [Category.assoc, pullback.lift_fst, ← H.w, ← w.w]; exact hf.paste_horiz hc₄
    · apply IsPullback.of_right _ e₂ (IsPullback.of_hasPullback _ _)
      rw [Category.assoc, pullback.lift_fst]; exact hc₃
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback (BinaryCofan.inl (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))) αW pullback.snd (BinaryCofan.inl c) ∧
    IsPullback (BinaryCofan.inr (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))) pullback.snd pullback.snd
      (BinaryCofan.inr c)
[PROOFSTEP]
constructor
[GOAL]
case left
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback (BinaryCofan.inl (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))) αW pullback.snd (BinaryCofan.inl c)
[PROOFSTEP]
apply IsPullback.of_right _ e₁ (IsPullback.of_hasPullback _ _)
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback ((g' ≫ cmp) ≫ pullback.fst) αW αZ (BinaryCofan.inl c ≫ i)
[PROOFSTEP]
rw [Category.assoc, pullback.lift_fst, ← H.w, ← w.w]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback (f' ≫ h') αW αZ (f ≫ h)
[PROOFSTEP]
exact hf.paste_horiz hc₄
[GOAL]
case right
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback (BinaryCofan.inr (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))) pullback.snd pullback.snd
    (BinaryCofan.inr c)
[PROOFSTEP]
apply IsPullback.of_right _ e₂ (IsPullback.of_hasPullback _ _)
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback ((pullback.fst ≫ cmp) ≫ pullback.fst) pullback.snd αZ (BinaryCofan.inr c ≫ i)
[PROOFSTEP]
rw [Category.assoc, pullback.lift_fst]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
⊢ IsPullback (pullback.fst ≫ i') pullback.snd αZ (BinaryCofan.inr c ≫ i)
[PROOFSTEP]
exact hc₃
[GOAL]
case intro.intro.refine'_2.mp.intro.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ IsPullback i' αY αZ i
[PROOFSTEP]
rw [← Category.id_comp αZ, ← show cmp ≫ pullback.snd = αY from pullback.lift_snd _ _ _]
[GOAL]
case intro.intro.refine'_2.mp.intro.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ IsPullback i' (cmp ≫ pullback.snd) (𝟙 Z' ≫ αZ) i
[PROOFSTEP]
apply IsPullback.paste_vert _ (IsPullback.of_hasPullback αZ i)
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ IsPullback i' cmp (𝟙 Z') pullback.fst
[PROOFSTEP]
have : cmp = (hc₂.coconePointUniqueUpToIso hc₄).hom :=
  by
  apply BinaryCofan.IsColimit.hom_ext hc₂
  exacts [(hc₂.comp_coconePointUniqueUpToIso_hom hc₄ ⟨WalkingPair.left⟩).symm,
    (hc₂.comp_coconePointUniqueUpToIso_hom hc₄ ⟨WalkingPair.right⟩).symm]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ cmp = (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
[PROOFSTEP]
apply BinaryCofan.IsColimit.hom_ext hc₂
[GOAL]
case h₁
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ BinaryCofan.inl (BinaryCofan.mk g' pullback.fst) ≫ cmp =
    BinaryCofan.inl (BinaryCofan.mk g' pullback.fst) ≫ (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
case h₂
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
⊢ BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ cmp =
    BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
[PROOFSTEP]
exacts [(hc₂.comp_coconePointUniqueUpToIso_hom hc₄ ⟨WalkingPair.left⟩).symm,
  (hc₂.comp_coconePointUniqueUpToIso_hom hc₄ ⟨WalkingPair.right⟩).symm]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
this : cmp = (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
⊢ IsPullback i' cmp (𝟙 Z') pullback.fst
[PROOFSTEP]
rw [this]
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
this : cmp = (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
⊢ IsPullback i' (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom (𝟙 Z') pullback.fst
[PROOFSTEP]
exact IsPullback.of_vert_isIso ⟨by rw [← this, Category.comp_id, pullback.lift_fst]⟩
[GOAL]
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ :
  IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
    αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
hc₄✝ :
  IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
    (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
Y'' : C := pullback αZ i
cmp : Y' ⟶ Y'' := pullback.lift i' αY (_ : i' ≫ αZ = αY ≫ i)
e₁ : (g' ≫ cmp) ≫ pullback.snd = αW ≫ BinaryCofan.inl c
e₂ : (pullback.fst ≫ cmp) ≫ pullback.snd = pullback.snd ≫ BinaryCofan.inr c
hc₄ : IsColimit (BinaryCofan.mk (g' ≫ cmp) (pullback.fst ≫ cmp))
this : cmp = (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom
⊢ i' ≫ 𝟙 Z' = (IsColimit.coconePointUniqueUpToIso hc₂ hc₄).hom ≫ pullback.fst
[PROOFSTEP]
rw [← this, Category.comp_id, pullback.lift_fst]
[GOAL]
case intro.intro.refine'_2.mpr
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
⊢ IsPullback h' αX αZ h ∧ IsPullback i' αY αZ i →
    IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h'))
        pullback.snd αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) ∧
      IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
        (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
[PROOFSTEP]
rintro ⟨hc₃, hc₄⟩
[GOAL]
case intro.intro.refine'_2.mpr.intro
J : Type v'
inst✝³ : Category.{u', v'} J
C : Type u
inst✝² : Category.{v, u} C
W✝ X✝ Y Z✝ : C
f✝ : W✝ ⟶ X✝
g : W✝ ⟶ Y
h✝ : X✝ ⟶ Z✝
i✝ : Y ⟶ Z✝
W E X Z : C
c : BinaryCofan W E
inst✝¹ : FinitaryExtensive C
inst✝ : HasPullbacks C
hc : IsColimit c
f : W ⟶ X
h : X ⟶ Z
i : c.pt ⟶ Z
H : IsPushout f (BinaryCofan.inl c) h i
hc₁ : IsColimit (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)
W' X' Y' Z' : C
f' : W' ⟶ X'
g' : W' ⟶ Y'
h' : X' ⟶ Z'
i' : Y' ⟶ Z'
αW : W' ⟶ W
αX : X' ⟶ X
αY : Y' ⟶ ((Functor.const (Discrete WalkingPair)).obj c.pt).obj { as := WalkingPair.left }
αZ : Z' ⟶ Z
hf : IsPullback f' αW αX f
hg : IsPullback g' αW αY (BinaryCofan.inl c)
hh : CommSq h' αX αZ h
hi : CommSq i' αY αZ i
w : CommSq f' g' h' i'
hc₂ : IsColimit (BinaryCofan.mk g' pullback.fst)
hc₃ : IsPullback h' αX αZ h
hc₄ : IsPullback i' αY αZ i
⊢ IsPullback (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) pullback.snd
      αZ (BinaryCofan.inl (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h)) ∧
    IsPullback (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr (BinaryCofan.mk g' pullback.fst) ≫ i') h')) αX αZ
      (BinaryCofan.inr (BinaryCofan.mk (BinaryCofan.inr c ≫ i) h))
[PROOFSTEP]
exact ⟨(IsPullback.of_hasPullback αY c.inr).paste_horiz hc₄, hc₃⟩
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ g ≫ 𝟙 Y = 𝟙 W ≫ g
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ 𝟙 W ≫ g = g ≫ 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ 𝟙 W ≫ g = g ≫ 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ g ≫ 𝟙 Y = 𝟙 W ≫ g
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ 𝟙 W ≫ g = g ≫ 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono f
H : IsPushout f g h i
H' : IsVanKampen H
⊢ 𝟙 W ≫ g = g ≫ 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp
[GOAL]
J : Type v'
inst✝² : Category.{u', v'} J
C : Type u
inst✝¹ : Category.{v, u} C
W X Y Z : C
f : W ⟶ X
g : W ⟶ Y
h : X ⟶ Z
i : Y ⟶ Z
inst✝ : Mono g
H : IsPushout f g h i
H' : IsVanKampen H
⊢ f ≫ 𝟙 X = 𝟙 W ≫ f
[PROOFSTEP]
simp