Theorem: CategoryTheory.isPullback_initial_to_of_cofan_isVanKampen
File: Mathlib/CategoryTheory/Limits/VanKampen.lean

tactic: classical
let f : ι → C := F.obj ∘ Discrete.mk
have : F = Discrete.functor f :=
  Functor.hext (fun i ↦ rfl) (by rintro ⟨i⟩ ⟨j⟩ ⟨⟨rfl : i = j⟩⟩; simp [f])
clear_value f
subst this
have : ∀ i, Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i) := inferInstance
convert isPullback_of_cofan_isVanKampen hc i.as j.as
exact (if_neg (mt (Discrete.ext _ _) hi.symm)).symm
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)
state_after: no goals

tactic: let f : ι → C := F.obj ∘ Discrete.mk
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C := F.obj ∘ Discrete.mk
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)

tactic: have : F = Discrete.functor f :=
  Functor.hext (fun i ↦ rfl) (by rintro ⟨i⟩ ⟨j⟩ ⟨⟨rfl : i = j⟩⟩; simp [f])
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C := F.obj ∘ Discrete.mk
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C := F.obj ∘ Discrete.mk
this : F = Discrete.functor f
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)

tactic: clear_value f
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C := F.obj ∘ Discrete.mk
this : F = Discrete.functor f
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C
this : F = Discrete.functor f
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)

tactic: subst this
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C
this : F = Discrete.functor f
⊢ IsPullback (initial.to (F.obj i)) (initial.to (F.obj j)) (c.ι.app i) (c.ι.app j)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
⊢ IsPullback (initial.to ((Discrete.functor f).obj i)) (initial.to ((Discrete.functor f).obj j)) (c.ι.app i) (c.ι.app j)

tactic: have : ∀ i, Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i) := inferInstance
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
⊢ IsPullback (initial.to ((Discrete.functor f).obj i)) (initial.to ((Discrete.functor f).obj j)) (c.ι.app i) (c.ι.app j)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
this : ∀ (i : Discrete ι), Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i)
⊢ IsPullback (initial.to ((Discrete.functor f).obj i)) (initial.to ((Discrete.functor f).obj j)) (c.ι.app i) (c.ι.app j)

tactic: convert isPullback_of_cofan_isVanKampen hc i.as j.as
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
this : ∀ (i : Discrete ι), Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i)
⊢ IsPullback (initial.to ((Discrete.functor f).obj i)) (initial.to ((Discrete.functor f).obj j)) (c.ι.app i) (c.ι.app j)
state_after: case h.e'_3
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
this : ∀ (i : Discrete ι), Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i)
⊢ (⊥_ C) = if j.as = i.as then f i.as else ⊥_ C

tactic: exact (if_neg (mt (Discrete.ext _ _) hi.symm)).symm
state_before: case h.e'_3
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
i j : Discrete ι
hi : i ≠ j
f : ι → C
c : Cocone (Discrete.functor f)
hc : IsVanKampenColimit c
this : ∀ (i : Discrete ι), Subsingleton (⊥_ C ⟶ (Discrete.functor f).obj i)
⊢ (⊥_ C) = if j.as = i.as then f i.as else ⊥_ C
state_after: no goals

tactic: rintro ⟨i⟩ ⟨j⟩ ⟨⟨rfl : i = j⟩⟩
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i j : Discrete ι
hi : i ≠ j
f : ι → C := F.obj ∘ Discrete.mk
⊢ ∀ (X Y : Discrete ι) (f_1 : X ⟶ Y), HEq (F.map f_1) ((Discrete.functor f).map f_1)
state_after: case mk.mk.up.up
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i✝ j : Discrete ι
hi : i✝ ≠ j
f : ι → C := F.obj ∘ Discrete.mk
i : ι
⊢ HEq (F.map { down := { down := ⋯ } }) ((Discrete.functor f).map { down := { down := ⋯ } })

tactic: simp [f]
state_before: case mk.mk.up.up
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
K : Type u_1
inst✝² : Category.{?u.333164, u_1} K
D : Type u_2
inst✝¹ : Category.{?u.333171, u_2} D
inst✝ : HasInitial C
ι : Type u_3
F : Discrete ι ⥤ C
c : Cocone F
hc : IsVanKampenColimit c
i✝ j : Discrete ι
hi : i✝ ≠ j
f : ι → C := F.obj ∘ Discrete.mk
i : ι
⊢ HEq (F.map { down := { down := ⋯ } }) ((Discrete.functor f).map { down := { down := ⋯ } })
state_after: no goals