Theorem: CategoryTheory.CoverDense.locallyCoverDense
File: Mathlib/CategoryTheory/Sites/InducedTopology.lean

tactic: intro X T
state_before: C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
⊢ LocallyCoverDense K G

tactic: refine' K.superset_covering _ (K.bind_covering T.property fun Y f _ => H.is_cover Y)
state_before: C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
⊢ Sieve.functorPushforward G (Sieve.functorPullback G ↑T) ∈ GrothendieckTopology.sieves K (G.obj X)

tactic: rintro Y _ ⟨Z, _, f, hf, ⟨W, g, f', rfl : _ = _⟩, rfl⟩
state_before: C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
⊢ (Sieve.bind (↑T).arrows fun Y f x => Sieve.coverByImage G Y) ≤ Sieve.functorPushforward G (Sieve.functorPullback G ↑T)

tactic: use W
state_before: case intro.intro.intro.intro.intro.intro.mk
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ (Sieve.functorPushforward G (Sieve.functorPullback G ↑T)).arrows ((g ≫ f') ≫ f)

tactic: use G.preimage (f' ≫ f)
state_before: case intro.intro.intro.intro.intro.intro.mk
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ ∃ g_1 h, (Sieve.functorPullback G ↑T).arrows g_1 ∧ (g ≫ f') ≫ f = h ≫ G.map g_1

tactic: use g
state_before: case intro.intro.intro.intro.intro.intro.mk
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ ∃ h, (Sieve.functorPullback G ↑T).arrows (G.preimage (f' ≫ f)) ∧ (g ≫ f') ≫ f = h ≫ G.map (G.preimage (f' ≫ f))

tactic: constructor
state_before: case intro.intro.intro.intro.intro.intro.mk
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ (Sieve.functorPullback G ↑T).arrows (G.preimage (f' ≫ f)) ∧ (g ≫ f') ≫ f = g ≫ G.map (G.preimage (f' ≫ f))

tactic: simpa using T.val.downward_closed hf f'
state_before: case intro.intro.intro.intro.intro.intro.mk.left
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ (Sieve.functorPullback G ↑T).arrows (G.preimage (f' ≫ f))

case intro.intro.intro.intro.intro.intro.mk.right
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ (g ≫ f') ≫ f = g ≫ G.map (G.preimage (f' ≫ f))

tactic: simp
state_before: case intro.intro.intro.intro.intro.intro.mk.right
C : Type u_3
inst✝³ : Category C
D : Type u_4
inst✝² : Category D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝¹ : Category A
inst✝ : Full G
H : CoverDense K G
X : C
T : ↑(GrothendieckTopology.sieves K (G.obj X))
Y Z : D
f : Z ⟶ G.obj X
hf : (↑T).arrows f
W : C
g : Y ⟶ G.obj W
f' : G.obj W ⟶ Z
⊢ (g ≫ f') ≫ f = g ≫ G.map (G.preimage (f' ≫ f))