Theorem: CategoryTheory.Presheaf.isLocallyInjective_of_whisker
File: Mathlib/CategoryTheory/Sites/PreservesLocallyBijective.lean

tactic: apply K.transitive (H.is_cover_of_isCoverDense K X.unop)
state_before: C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
⊢ equalizerSieve a b ∈ K.sieves X.unop
state_after: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ X.unop⦄,
    (Sieve.coverByImage H X.unop).arrows f → Sieve.pullback f (equalizerSieve a b) ∈ K.sieves Y

tactic: intro Y g ⟨⟨Z, lift, map, fac⟩⟩
state_before: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ X.unop⦄,
    (Sieve.coverByImage H X.unop).arrows f → Sieve.pullback f (equalizerSieve a b) ∈ K.sieves Y
state_after: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback g (equalizerSieve a b) ∈ K.sieves Y

tactic: rw [← fac, Sieve.pullback_comp]
state_before: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback g (equalizerSieve a b) ∈ K.sieves Y
state_after: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback lift (Sieve.pullback map (equalizerSieve a b)) ∈ K.sieves Y

tactic: apply K.pullback_stable
state_before: case h
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback lift (Sieve.pullback map (equalizerSieve a b)) ∈ K.sieves Y
state_after: case h.hS
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback map (equalizerSieve a b) ∈ K.sieves (H.obj Z)

tactic: refine K.superset_covering (Sieve.functorPullback_pushforward_le H _) ?_
state_before: case h.hS
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.pullback map (equalizerSieve a b) ∈ K.sieves (H.obj Z)
state_after: case h.hS
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.functorPushforward H (Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))) ∈ K.sieves (H.obj Z)

tactic: refine K.superset_covering (Sieve.functorPushforward_monotone H _ ?_)
  (hH.cover_preserve <| equalizerSieve_mem J (whiskerLeft H.op f)
    ((forget A).map (F.map map.op) a) ((forget A).map (F.map map.op) b) ?_)
state_before: case h.hS
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ Sieve.functorPushforward H (Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))) ∈ K.sieves (H.obj Z)
state_after: case h.hS.refine_1
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ equalizerSieve ((forget A).map (F.map map.op) a) ((forget A).map (F.map map.op) b) ≤
    Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))

case h.hS.refine_2
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ ((whiskerLeft H.op f).app { unop := Z }) ((forget A).map (F.map map.op) a) =
    ((whiskerLeft H.op f).app { unop := Z }) ((forget A).map (F.map map.op) b)

tactic: intro W q hq
state_before: case h.hS.refine_1
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ equalizerSieve ((forget A).map (F.map map.op) a) ((forget A).map (F.map map.op) b) ≤
    Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))
state_after: case h.hS.refine_1
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
W : C
q : W ⟶ Z
hq : (equalizerSieve ((forget A).map (F.map map.op) a) ((forget A).map (F.map map.op) b)).arrows q
⊢ (Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))).arrows q

tactic: simpa using hq
state_before: case h.hS.refine_1
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
W : C
q : W ⟶ Z
hq : (equalizerSieve ((forget A).map (F.map map.op) a) ((forget A).map (F.map map.op) b)).arrows q
⊢ (Sieve.functorPullback H (Sieve.pullback map (equalizerSieve a b))).arrows q
state_after: no goals

tactic: simp only [comp_obj, op_obj, whiskerLeft_app, Opposite.op_unop]
state_before: case h.hS.refine_2
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ ((whiskerLeft H.op f).app { unop := Z }) ((forget A).map (F.map map.op) a) =
    ((whiskerLeft H.op f).app { unop := Z }) ((forget A).map (F.map map.op) b)
state_after: case h.hS.refine_2
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ (f.app { unop := H.obj Z }) ((forget A).map (F.map map.op) a) =
    (f.app { unop := H.obj Z }) ((forget A).map (F.map map.op) b)

tactic: erw [NatTrans.naturality_apply, NatTrans.naturality_apply, h]
state_before: case h.hS.refine_2
C : Type u_1
D : Type u_2
A : Type u_3
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_5, u_2} D
inst✝³ : Category.{u_7, u_3} A
J : GrothendieckTopology C
K : GrothendieckTopology D
H : C ⥤ D
F G : Dᵒᵖ ⥤ A
f : F ⟶ G
inst✝² : ConcreteCategory A
hH : CoverPreserving J K H
inst✝¹ : H.IsCoverDense K
inst✝ : IsLocallyInjective J (whiskerLeft H.op f)
X : Dᵒᵖ
a b : (forget A).obj (F.obj X)
h : (f.app X) a = (f.app X) b
Y : D
g : Y ⟶ X.unop
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X.unop
fac : lift ≫ map = g
⊢ (f.app { unop := H.obj Z }) ((forget A).map (F.map map.op) a) =
    (f.app { unop := H.obj Z }) ((forget A).map (F.map map.op) b)
state_after: no goals