Theorem: CategoryTheory.Limits.Concrete.Pi.map_ext
File: Mathlib/CategoryTheory/Limits/Shapes/ConcreteCategory.lean

tactic: apply ConcreteCategory.injective_of_mono_of_preservesPullback (PreservesProduct.iso F f).hom
state_before: C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
⊢ x = y
state_after: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
⊢ (PreservesProduct.iso F f).hom x = (PreservesProduct.iso F f).hom y

tactic: apply @Concrete.limit_ext.{w, w, r, t} D
  _ _ (Discrete J) _ _ _ _ (piComparison F _ x) (piComparison F _ y)
state_before: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
⊢ (PreservesProduct.iso F f).hom x = (PreservesProduct.iso F f).hom y
state_after: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
⊢ ∀ (j : Discrete J),
    (limit.π (Discrete.functor fun b => F.obj (f b)) j) ((piComparison F f) x) =
      (limit.π (Discrete.functor fun b => F.obj (f b)) j) ((piComparison F f) y)

tactic: intro ⟨(j : J)⟩
state_before: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
⊢ ∀ (j : Discrete J),
    (limit.π (Discrete.functor fun b => F.obj (f b)) j) ((piComparison F f) x) =
      (limit.π (Discrete.functor fun b => F.obj (f b)) j) ((piComparison F f) y)
state_after: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j }) ((piComparison F f) x) =
    (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j }) ((piComparison F f) y)

tactic: show ((forget D).map (piComparison F f) ≫ (forget D).map (limit.π _ _)) x =
  ((forget D).map (piComparison F f) ≫ (forget D).map _) y
state_before: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j }) ((piComparison F f) x) =
    (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j }) ((piComparison F f) y)
state_after: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ ((forget D).map (piComparison F f) ≫ (forget D).map (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j })) x =
    ((forget D).map (piComparison F f) ≫ (forget D).map (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j })) y

tactic: rw [← (forget D).map_comp, piComparison_comp_π]
state_before: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ ((forget D).map (piComparison F f) ≫ (forget D).map (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j })) x =
    ((forget D).map (piComparison F f) ≫ (forget D).map (limit.π (Discrete.functor fun b => F.obj (f b)) { as := j })) y
state_after: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ (forget D).map (F.map (Pi.π f j)) x = (forget D).map (F.map (Pi.π f j)) y

tactic: exact h j
state_before: case a
C : Type u
inst✝⁷ : Category.{v, u} C
J : Type w
f : J → C
inst✝⁶ : HasProduct f
D : Type t
inst✝⁵ : Category.{r, t} D
inst✝⁴ : ConcreteCategory D
F : C ⥤ D
inst✝³ : PreservesLimit (Discrete.functor f) F
inst✝² : HasProduct fun j => F.obj (f j)
inst✝¹ : PreservesLimitsOfShape WalkingCospan (forget D)
inst✝ : PreservesLimit (Discrete.functor fun b => F.obj (f b)) (forget D)
x y : (forget D).obj (F.obj (∏ᶜ f))
h : ∀ (i : J), (F.map (Pi.π f i)) x = (F.map (Pi.π f i)) y
j : J
⊢ (forget D).map (F.map (Pi.π f j)) x = (forget D).map (F.map (Pi.π f j)) y
state_after: no goals