Theorem: CategoryTheory.Functor.isCoverDense_of_generate_singleton_functor_π_mem
File: Mathlib/CategoryTheory/Sites/DenseSubsite.lean

Proof steps:
state_before: C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
⊢ Sieve.coverByImage G B ∈ K.sieves B
state_after: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f) ∈ K.sieves B
⊢ Sieve.coverByImage G B ∈ K.sieves B
tactic: obtain ⟨X, f, h⟩ := h B
state_before: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f) ∈ K.sieves B
⊢ Sieve.coverByImage G B ∈ K.sieves B
state_after: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f) ∈ K.sieves B
⊢ Sieve.generate (Presieve.singleton f) ≤ Sieve.coverByImage G B
tactic: refine K.superset_covering ?_ h
state_before: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f) ∈ K.sieves B
⊢ Sieve.generate (Presieve.singleton f) ≤ Sieve.coverByImage G B
state_after: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝¹ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f✝ : G.obj X ⟶ B
h✝ : Sieve.generate (Presieve.singleton f✝) ∈ K.sieves B
Y : D
f : Y ⟶ B
Z : D
g : Y ⟶ Z
w✝ : Z ⟶ B
h : Presieve.singleton f✝ w✝
w : g ≫ w✝ = f
⊢ (Sieve.coverByImage G B).arrows f
tactic: intro Y f ⟨Z, g, _, h, w⟩
state_before: case intro.intro
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝¹ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f✝ : G.obj X ⟶ B
h✝ : Sieve.generate (Presieve.singleton f✝) ∈ K.sieves B
Y : D
f : Y ⟶ B
Z : D
g : Y ⟶ Z
w✝ : Z ⟶ B
h : Presieve.singleton f✝ w✝
w : g ≫ w✝ = f
⊢ (Sieve.coverByImage G B).arrows f
state_after: case intro.intro.mk
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f✝ : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f✝) ∈ K.sieves B
Y : D
f : Y ⟶ B
g : Y ⟶ G.obj X
w : g ≫ f✝ = f
⊢ (Sieve.coverByImage G B).arrows f
tactic: cases h
state_before: case intro.intro.mk
C : Type u_1
inst✝² : Category.{u_4, u_1} C
D : Type u_2
inst✝¹ : Category.{u_5, u_2} D
E : Type u_3
inst✝ : Category.{?u.5749, u_3} E
J : GrothendieckTopology C
K✝ : GrothendieckTopology D
L : GrothendieckTopology E
G : C ⥤ D
K : GrothendieckTopology D
h✝ : ∀ (B : D), ∃ X f, Sieve.generate (Presieve.singleton f) ∈ K.sieves B
B : D
X : C
f✝ : G.obj X ⟶ B
h : Sieve.generate (Presieve.singleton f✝) ∈ K.sieves B
Y : D
f : Y ⟶ B
g : Y ⟶ G.obj X
w : g ≫ f✝ = f
⊢ (Sieve.coverByImage G B).arrows f
state_after: no goals
tactic: exact ⟨⟨_, g, _, w⟩⟩