Theorem: CategoryTheory.CoverDense.functorPullback_pushforward_covering
File: Mathlib/CategoryTheory/Sites/DenseSubsite.lean

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
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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.refl
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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.refl
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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.refl
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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.refl
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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.refl.left
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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))

tactic: simp
state_before: case intro.intro.intro.intro.intro.intro.mk.refl.right
C : Type u_3
inst✝⁴ : Category C
D : Type u_4
inst✝³ : Category D
E : Type ?u.8038
inst✝² : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.8090
inst✝¹ : Category A
G : C ⥤ D
H✝ : CoverDense K G
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))