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

tactic: apply K.transitive (H.is_cover_of_isCoverDense K X)
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
⊢ imageSieve f a ∈ K.sieves X
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
⊢ ∀ ⦃Y : D⦄ ⦃f_1 : Y ⟶ X⦄, (Sieve.coverByImage H X).arrows f_1 → Sieve.pullback f_1 (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
⊢ ∀ ⦃Y : D⦄ ⦃f_1 : Y ⟶ X⦄, (Sieve.coverByImage H X).arrows f_1 → Sieve.pullback f_1 (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback g (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback g (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback lift (Sieve.pullback map (imageSieve f a)) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback lift (Sieve.pullback map (imageSieve f a)) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback map (imageSieve f a) ∈ K.sieves (H.obj Z)

tactic: have hh := hH.cover_preserve <|
  imageSieve_mem J (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
⊢ Sieve.pullback map (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ Sieve.pullback map (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ Sieve.pullback map (imageSieve f a) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ Sieve.functorPushforward H (Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))) ∈ K.sieves (H.obj Z)

tactic: refine K.superset_covering (Sieve.functorPushforward_monotone H _ ?_) hh
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ Sieve.functorPushforward H (Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))) ∈ 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a) ≤
    Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))

tactic: intro W q ⟨x, 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
⊢ imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a) ≤
    Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
W : C
q : W ⟶ Z
x : (forget A).obj ((H.op ⋙ F).obj { unop := W })
h : ((whiskerLeft H.op f).app { unop := W }) x = ((H.op ⋙ G).map q.op) ((forget A).map (G.map map.op) a)
⊢ (Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))).arrows q

tactic: simp only [Sieve.functorPullback_apply, Presieve.functorPullback_mem, Sieve.pullback_apply]
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
W : C
q : W ⟶ Z
x : (forget A).obj ((H.op ⋙ F).obj { unop := W })
h : ((whiskerLeft H.op f).app { unop := W }) x = ((H.op ⋙ G).map q.op) ((forget A).map (G.map map.op) a)
⊢ (Sieve.functorPullback H (Sieve.pullback map (imageSieve f a))).arrows q
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
W : C
q : W ⟶ Z
x : (forget A).obj ((H.op ⋙ F).obj { unop := W })
h : ((whiskerLeft H.op f).app { unop := W }) x = ((H.op ⋙ G).map q.op) ((forget A).map (G.map map.op) a)
⊢ (imageSieve f a).arrows (H.map q ≫ map)

tactic: exact ⟨x, by simpa using 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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
W : C
q : W ⟶ Z
x : (forget A).obj ((H.op ⋙ F).obj { unop := W })
h : ((whiskerLeft H.op f).app { unop := W }) x = ((H.op ⋙ G).map q.op) ((forget A).map (G.map map.op) a)
⊢ (imageSieve f a).arrows (H.map q ≫ map)
state_after: no goals

tactic: simpa using h
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_6, 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✝ : IsLocallySurjective J (whiskerLeft H.op f)
X : D
a : (forget A).obj (G.obj { unop := X })
Y : D
g : Y ⟶ X
Z : C
lift : Y ⟶ H.obj Z
map : H.obj Z ⟶ X
fac : lift ≫ map = g
hh :
  Sieve.functorPushforward H (imageSieve (whiskerLeft H.op f) ((forget A).map (G.map map.op) a)) ∈
    K.sieves (H.obj { unop := Z }.unop)
W : C
q : W ⟶ Z
x : (forget A).obj ((H.op ⋙ F).obj { unop := W })
h : ((whiskerLeft H.op f).app { unop := W }) x = ((H.op ⋙ G).map q.op) ((forget A).map (G.map map.op) a)
⊢ (f.app { unop := H.obj W }) x = (G.map (H.map q ≫ map).op) a
state_after: no goals