Theorem: CategoryTheory.IsInitial.isVanKampenColimit
File: Mathlib/CategoryTheory/Extensive.lean

tactic: intro F' c' α f hf hα
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
⊢ IsVanKampenColimit (asEmptyCocone X)

tactic: have : F' = Functor.empty C := by apply Functor.hext <;> rintro ⟨⟨⟩⟩
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
F' : Discrete PEmpty ⥤ C
c' : Cocone F'
α : F' ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
⊢ Nonempty (IsColimit c') ↔ ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)

tactic: subst this
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
F' : Discrete PEmpty ⥤ C
c' : Cocone F'
α : F' ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
this : F' = Functor.empty C
⊢ Nonempty (IsColimit c') ↔ ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)

tactic: haveI := h.isIso_to f
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
c' : Cocone (Functor.empty C)
α : Functor.empty C ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
⊢ Nonempty (IsColimit c') ↔ ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)

tactic: refine' ⟨by rintro _ ⟨⟨⟩⟩,
  fun _ => ⟨IsColimit.ofIsoColimit h (Cocones.ext (asIso f).symm <| by rintro ⟨⟨⟩⟩)⟩⟩
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
c' : Cocone (Functor.empty C)
α : Functor.empty C ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
this : IsIso f
⊢ Nonempty (IsColimit c') ↔ ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)

tactic: apply Functor.hext <;> rintro ⟨⟨⟩⟩
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
F' : Discrete PEmpty ⥤ C
c' : Cocone F'
α : F' ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
⊢ F' = Functor.empty C

tactic: rintro _ ⟨⟨⟩⟩
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
c' : Cocone (Functor.empty C)
α : Functor.empty C ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
this : IsIso f
⊢ Nonempty (IsColimit c') → ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)

tactic: rintro ⟨⟨⟩⟩
state_before: J : Type v'
inst✝² : Category J
C : Type u
inst✝¹ : Category C
inst✝ : HasStrictInitialObjects C
X : C
h : IsInitial X
c' : Cocone (Functor.empty C)
α : Functor.empty C ⟶ Functor.empty C
f : c'.pt ⟶ (asEmptyCocone X).pt
hf : α ≫ (asEmptyCocone X).ι = c'.ι ≫ (Functor.const (Discrete PEmpty)).map f
hα : NatTrans.Equifibered α
this : IsIso f
x✝ : ∀ (j : Discrete PEmpty), IsPullback (c'.ι.app j) (α.app j) f ((asEmptyCocone X).ι.app j)
⊢ ∀ (j : Discrete PEmpty), (asEmptyCocone X).ι.app j ≫ (asIso f).symm.hom = c'.ι.app j