Theorem: CategoryTheory.Functor.inducedTopology_sieves
File: Mathlib/CategoryTheory/Sites/InducedTopology.lean

Proof steps:
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
⊢ ⊤ ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
state_after: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
⊢ K.sieves (G.obj X) (Sieve.functorPushforward G ⊤)
tactic: change K _ _
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
⊢ K.sieves (G.obj X) (Sieve.functorPushforward G ⊤)
state_after: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
⊢ K.sieves (G.obj X) ⊤
tactic: rw [Sieve.functorPushforward_top]
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
⊢ K.sieves (G.obj X) ⊤
state_after: no goals
tactic: exact K.top_mem _
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
⊢ Sieve.pullback iYX S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
state_after: case h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
⊢ ∀ ⦃Y_1 : D⦄ ⦃f : Y_1 ⟶ G.obj Y⦄,
    (Sieve.functorPushforward G
            (Sieve.functorPullback G ↑⟨Sieve.pullback (G.map iYX) (Sieve.functorPushforward G S), ⋯⟩)).arrows
        f →
      Sieve.pullback f (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves Y_1
tactic: apply K.transitive (LocallyCoverDense.functorPushforward_functorPullback_mem
      ⟨_, K.pullback_stable (G.map iYX) hS⟩)
state_before: case h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
⊢ ∀ ⦃Y_1 : D⦄ ⦃f : Y_1 ⟶ G.obj Y⦄,
    (Sieve.functorPushforward G
            (Sieve.functorPullback G ↑⟨Sieve.pullback (G.map iYX) (Sieve.functorPushforward G S), ⋯⟩)).arrows
        f →
      Sieve.pullback f (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves Y_1
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (iZU ≫ G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves Z
tactic: rintro Z _ ⟨U, iUY, iZU, ⟨W, iWX, iUW, hiWX, e₁⟩, rfl⟩
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (iZU ≫ G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves Z
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback iZU (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈ K.sieves Z
tactic: rw [Sieve.pullback_comp]
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback iZU (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈ K.sieves Z
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves (G.obj U)
tactic: apply K.pullback_stable
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
Z : D
U : C
iUY : U ⟶ Y
iZU : Z ⟶ G.obj U
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves (G.obj U)
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves (G.obj U)
tactic: clear iZU Z
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)) ∈ K.sieves (G.obj U)
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ ∀ ⦃Y_1 : D⦄ ⦃f : Y_1 ⟶ G.obj U⦄,
    (Sieve.functorPushforward G (G.imageSieve iUW)).arrows f →
      Sieve.pullback f (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈ K.sieves Y_1
tactic: apply K.transitive (G.functorPushforward_imageSieve_mem _ iUW)
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
⊢ ∀ ⦃Y_1 : D⦄ ⦃f : Y_1 ⟶ G.obj U⦄,
    (Sieve.functorPushforward G (G.imageSieve iUW)).arrows f →
      Sieve.pullback f (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈ K.sieves Y_1
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (iZU₁ ≫ G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves Z
tactic: rintro Z _ ⟨U₁, iU₁U, iZU₁, ⟨iU₁W, e₂⟩, rfl⟩
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (iZU₁ ≫ G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves Z
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback iZU₁
      (Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))) ∈
    K.sieves Z
tactic: rw [Sieve.pullback_comp]
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback iZU₁
      (Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))) ∈
    K.sieves Z
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves (G.obj U₁)
tactic: apply K.pullback_stable
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
Z : D
U₁ : C
iU₁U : U₁ ⟶ U
iZU₁ : Z ⟶ G.obj U₁
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves (G.obj U₁)
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves (G.obj U₁)
tactic: clear iZU₁ Z
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro.hS.h.intro.intro.intro.intro.intro.hS
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S))) ∈
    K.sieves (G.obj U₁)
state_after: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.functorPushforward G (Sieve.equalizer (iU₁U ≫ iUY ≫ iYX) (iU₁W ≫ iWX)) ≤
    Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))
tactic: apply K.superset_covering ?_ (G.functorPushforward_equalizer_mem _
      (iU₁U ≫ iUY ≫ iYX) (iU₁W ≫ iWX) (by simp [e₁, e₂]))
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
⊢ Sieve.functorPushforward G (Sieve.equalizer (iU₁U ≫ iUY ≫ iYX) (iU₁W ≫ iWX)) ≤
    Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))
state_after: case intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
Z : D
U₂ : C
iU₂U₁ : U₂ ⟶ U₁
iZU₂ : Z ⟶ G.obj U₂
e₃ : iU₂U₁ ≫ iU₁U ≫ iUY ≫ iYX = iU₂U₁ ≫ iU₁W ≫ iWX
⊢ (Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))).arrows
    (iZU₂ ≫ G.map iU₂U₁)
tactic: rintro Z _ ⟨U₂, iU₂U₁, iZU₂, e₃ : _ = _, rfl⟩
state_before: case intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
Z : D
U₂ : C
iU₂U₁ : U₂ ⟶ U₁
iZU₂ : Z ⟶ G.obj U₂
e₃ : iU₂U₁ ≫ iU₁U ≫ iUY ≫ iYX = iU₂U₁ ≫ iU₁W ≫ iWX
⊢ (Sieve.pullback (G.map iU₁U) (Sieve.pullback (G.map iUY) (Sieve.functorPushforward G (Sieve.pullback iYX S)))).arrows
    (iZU₂ ≫ G.map iU₂U₁)
state_after: case intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
Z : D
U₂ : C
iU₂U₁ : U₂ ⟶ U₁
iZU₂ : Z ⟶ G.obj U₂
e₃ : iU₂U₁ ≫ iU₁U ≫ iUY ≫ iYX = iU₂U₁ ≫ iU₁W ≫ iWX
⊢ (Sieve.pullback iYX S).arrows (iU₂U₁ ≫ iU₁U ≫ iUY)
tactic: refine ⟨_, iU₂U₁ ≫ iU₁U ≫ iUY, iZU₂, ?_, by simp⟩
state_before: case intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X Y : C
S : Sieve X
iYX : Y ⟶ X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
U : C
iUY : U ⟶ Y
W : C
iWX : W ⟶ X
iUW : G.obj U ⟶ G.obj W
hiWX : S.arrows iWX
e₁ : G.map iUY ≫ G.map iYX = iUW ≫ G.map iWX
U₁ : C
iU₁U : U₁ ⟶ U
iU₁W : U₁ ⟶ W
e₂ : G.map iU₁W = G.map iU₁U ≫ iUW
Z : D
U₂ : C
iU₂U₁ : U₂ ⟶ U₁
iZU₂ : Z ⟶ G.obj U₂
e₃ : iU₂U₁ ≫ iU₁U ≫ iUY ≫ iYX = iU₂U₁ ≫ iU₁W ≫ iWX
⊢ (Sieve.pullback iYX S).arrows (iU₂U₁ ≫ iU₁U ≫ iUY)
state_after: no goals
tactic: simpa [e₃] using S.downward_closed hiWX (iU₂U₁ ≫ iU₁W)
state_before: C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
⊢ S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
state_after: case h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ G.obj X⦄,
    (Sieve.functorPushforward G S).arrows f → Sieve.pullback f (Sieve.functorPushforward G S') ∈ K.sieves Y
tactic: apply K.transitive hS
state_before: case h
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ G.obj X⦄,
    (Sieve.functorPushforward G S).arrows f → Sieve.pullback f (Sieve.functorPushforward G S') ∈ K.sieves Y
state_after: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback (i ≫ G.map g) (Sieve.functorPushforward G S') ∈ K.sieves Y
tactic: rintro Y _ ⟨Z, g, i, hg, rfl⟩
state_before: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback (i ≫ G.map g) (Sieve.functorPushforward G S') ∈ K.sieves Y
state_after: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback i (Sieve.pullback (G.map g) (Sieve.functorPushforward G S')) ∈ K.sieves Y
tactic: rw [Sieve.pullback_comp]
state_before: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback i (Sieve.pullback (G.map g) (Sieve.functorPushforward G S')) ∈ K.sieves Y
state_after: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback (G.map g) (Sieve.functorPushforward G S') ∈ K.sieves (G.obj Z)
tactic: apply K.pullback_stable i
state_before: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.pullback (G.map g) (Sieve.functorPushforward G S') ∈ K.sieves (G.obj Z)
state_after: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.functorPushforward G (Sieve.pullback g S') ≤ Sieve.pullback (G.map g) (Sieve.functorPushforward G S')
tactic: refine K.superset_covering ?_ (H' hg)
state_before: case h.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg : S.arrows g
⊢ Sieve.functorPushforward G (Sieve.pullback g S') ≤ Sieve.pullback (G.map g) (Sieve.functorPushforward G S')
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg✝ : S.arrows g
W : D
Z' : C
g' : Z' ⟶ Z
i' : W ⟶ G.obj Z'
hg : (Sieve.pullback g S').arrows g'
⊢ (Sieve.pullback (G.map g) (Sieve.functorPushforward G S')).arrows (i' ≫ G.map g')
tactic: rintro W _ ⟨Z', g', i', hg, rfl⟩
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg✝ : S.arrows g
W : D
Z' : C
g' : Z' ⟶ Z
i' : W ⟶ G.obj Z'
hg : (Sieve.pullback g S').arrows g'
⊢ (Sieve.pullback (G.map g) (Sieve.functorPushforward G S')).arrows (i' ≫ G.map g')
state_after: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg✝ : S.arrows g
W : D
Z' : C
g' : Z' ⟶ Z
i' : W ⟶ G.obj Z'
hg : (Sieve.pullback g S').arrows g'
⊢ (i' ≫ G.map g') ≫ G.map g = i' ≫ G.map (g' ≫ g)
tactic: refine ⟨Z', g' ≫ g , i', hg, ?_⟩
state_before: case h.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
inst✝⁵ : Category.{?u.2513, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.2520, u_2} D
G : C ⥤ D
J : GrothendieckTopology C
K : GrothendieckTopology D
A : Type v
inst✝³ : Category.{u, v} A
inst✝² : G.LocallyCoverDense K
inst✝¹ : G.IsLocallyFull K
inst✝ : G.IsLocallyFaithful K
X : C
S : Sieve X
hS : S ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) X
S' : Sieve X
H' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → Sieve.pullback f S' ∈ (fun X S => K.sieves (G.obj X) (Sieve.functorPushforward G S)) Y
Y : D
Z : C
g : Z ⟶ X
i : Y ⟶ G.obj Z
hg✝ : S.arrows g
W : D
Z' : C
g' : Z' ⟶ Z
i' : W ⟶ G.obj Z'
hg : (Sieve.pullback g S').arrows g'
⊢ (i' ≫ G.map g') ≫ G.map g = i' ≫ G.map (g' ≫ g)
state_after: no goals
tactic: simp