Theorem: CategoryTheory.extensive_regular_generate_coherent
File: Mathlib/CategoryTheory/Sites/Coherent/Comparison.lean

tactic: ext B S
state_before: C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
⊢ Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C) = coherentTopology C
state_after: case h.h.h
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
⊢ S ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves B ↔ S ∈ (coherentTopology C).sieves B

tactic: refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
state_before: case h.h.h
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
⊢ S ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves B ↔ S ∈ (coherentTopology C).sieves B
state_after: case h.h.h.refine_1
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
h : S ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves B
⊢ S ∈ (coherentTopology C).sieves B

case h.h.h.refine_2
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
h : S ∈ (coherentTopology C).sieves B
⊢ S ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves B

tactic: induction h with
| of Y T hT =>
  apply Coverage.saturate.of
  simp only [Coverage.sup_covering, Set.mem_union] at hT
  exact Or.elim hT
    (fun ⟨α, x, X, π, ⟨h, _⟩⟩ ↦ ⟨α, x, X, π, ⟨h, inferInstance⟩⟩)
    (fun ⟨Z, f, ⟨h, _⟩⟩ ↦ ⟨Unit, inferInstance, fun _ ↦ Z, fun _ ↦ f, ⟨h, inferInstance⟩⟩)
| top => apply Coverage.saturate.top
| transitive Y T => apply Coverage.saturate.transitive Y T<;> [assumption; assumption]
state_before: case h.h.h.refine_1
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
h : S ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves B
⊢ S ∈ (coherentTopology C).sieves B
state_after: no goals

tactic: apply Coverage.saturate.of
state_before: case h.h.h.refine_1.of
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (extensiveCoverage C ⊔ regularCoverage C).covering Y
⊢ generate T ∈ (coherentTopology C).sieves Y
state_after: case h.h.h.refine_1.of.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (extensiveCoverage C ⊔ regularCoverage C).covering Y
⊢ T ∈ (coherentCoverage C).covering Y

tactic: simp only [Coverage.sup_covering, Set.mem_union] at hT
state_before: case h.h.h.refine_1.of.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (extensiveCoverage C ⊔ regularCoverage C).covering Y
⊢ T ∈ (coherentCoverage C).covering Y
state_after: case h.h.h.refine_1.of.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (extensiveCoverage C).covering Y ∨ T ∈ (regularCoverage C).covering Y
⊢ T ∈ (coherentCoverage C).covering Y

tactic: exact Or.elim hT
  (fun ⟨α, x, X, π, ⟨h, _⟩⟩ ↦ ⟨α, x, X, π, ⟨h, inferInstance⟩⟩)
  (fun ⟨Z, f, ⟨h, _⟩⟩ ↦ ⟨Unit, inferInstance, fun _ ↦ Z, fun _ ↦ f, ⟨h, inferInstance⟩⟩)
state_before: case h.h.h.refine_1.of.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (extensiveCoverage C).covering Y ∨ T ∈ (regularCoverage C).covering Y
⊢ T ∈ (coherentCoverage C).covering Y
state_after: no goals

tactic: apply Coverage.saturate.top
state_before: case h.h.h.refine_1.top
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
X✝ : C
⊢ ⊤ ∈ (coherentTopology C).sieves X✝
state_after: no goals

tactic: apply Coverage.saturate.transitive Y T<;> [assumption; assumption]
state_before: case h.h.h.refine_1.transitive
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T S✝ : Sieve Y
a✝¹ : (extensiveCoverage C ⊔ regularCoverage C).saturate Y T
a✝ :
  ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄, T.arrows f → (extensiveCoverage C ⊔ regularCoverage C).saturate Y_1 (Sieve.pullback f S✝)
a_ih✝¹ : T ∈ (coherentTopology C).sieves Y
a_ih✝ : ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄, T.arrows f → Sieve.pullback f S✝ ∈ (coherentTopology C).sieves Y_1
⊢ S✝ ∈ (coherentTopology C).sieves Y
state_after: no goals

tactic: obtain ⟨I, _, X, f, rfl, hT⟩ := hT
state_before: case h.h.h.refine_2.of
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T : Presieve Y
hT : T ∈ (coherentCoverage C).covering Y
⊢ generate T ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ generate (Presieve.ofArrows X f) ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y

tactic: apply Coverage.saturate.transitive Y (generate (Presieve.ofArrows
  (fun (_ : Unit) ↦ (∐ fun (i : I) => X i)) (fun (_ : Unit) ↦ Sigma.desc f)))
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ generate (Presieve.ofArrows X f) ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate Y
    (generate (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f))

case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ ∀ ⦃Y_1 : C⦄ ⦃f_1 : Y_1 ⟶ Y⦄,
    (generate (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f)).arrows f_1 →
      (extensiveCoverage C ⊔ regularCoverage C).saturate Y_1 (Sieve.pullback f_1 (generate (Presieve.ofArrows X f)))

tactic: apply Coverage.saturate.of
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate Y
    (generate (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f))
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) ∈
    (extensiveCoverage C ⊔ regularCoverage C).covering Y

tactic: simp only [Coverage.sup_covering, extensiveCoverage, regularCoverage, Set.mem_union,
  Set.mem_setOf_eq]
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) ∈
    (extensiveCoverage C ⊔ regularCoverage C).covering Y
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (∃ α,
      ∃ (x : Finite α),
        ∃ X_1 π,
          (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) = Presieve.ofArrows X_1 π ∧
            IsIso (Sigma.desc π)) ∨
    ∃ X_1 f_1,
      ((Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) =
          Presieve.ofArrows (fun x => X_1) fun x => f_1) ∧
        EffectiveEpi f_1

tactic: exact Or.inr ⟨_, Sigma.desc f, ⟨rfl, inferInstance⟩⟩
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ (∃ α,
      ∃ (x : Finite α),
        ∃ X_1 π,
          (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) = Presieve.ofArrows X_1 π ∧
            IsIso (Sigma.desc π)) ∨
    ∃ X_1 f_1,
      ((Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f) =
          Presieve.ofArrows (fun x => X_1) fun x => f_1) ∧
        EffectiveEpi f_1
state_after: no goals

tactic: rintro R g ⟨W, ψ, σ, ⟨⟩, rfl⟩
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y
hT : EffectiveEpiFamily X f
⊢ ∀ ⦃Y_1 : C⦄ ⦃f_1 : Y_1 ⟶ Y⦄,
    (generate (Presieve.ofArrows (fun x => ∐ fun i => X i) fun x => Sigma.desc f)).arrows f_1 →
      (extensiveCoverage C ⊔ regularCoverage C).saturate Y_1 (Sieve.pullback f_1 (generate (Presieve.ofArrows X f)))
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate R
    (Sieve.pullback (ψ ≫ Sigma.desc f) (generate (Presieve.ofArrows X f)))

tactic: change _ ∈ sieves ((extensiveCoverage C) ⊔ (regularCoverage C)).toGrothendieck _
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate R
    (Sieve.pullback (ψ ≫ Sigma.desc f) (generate (Presieve.ofArrows X f)))
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback (ψ ≫ Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves R

tactic: rw [Sieve.pullback_comp]
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback (ψ ≫ Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves R
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback ψ (Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves R

tactic: apply pullback_stable'
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback ψ (Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves R
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves (∐ fun i => X i)

tactic: have : generate (Presieve.ofArrows X fun (i : I) ↦ Sigma.ι X i) ≤
    (generate (Presieve.ofArrows X f)).pullback (Sigma.desc f) := by
  rintro Q q ⟨E, e, r, ⟨hq, rfl⟩⟩
  exact ⟨E, e, r ≫ (Sigma.desc f), by cases hq; simpa using Presieve.ofArrows.mk _, by simp⟩
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves (∐ fun i => X i)
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves (∐ fun i => X i)

tactic: apply Coverage.saturate_of_superset _ this
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f)) ∈
    (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves (∐ fun i => X i)
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate (∐ X) (generate (Presieve.ofArrows X fun i => Sigma.ι X i))

tactic: apply Coverage.saturate.of
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ (extensiveCoverage C ⊔ regularCoverage C).saturate (∐ X) (generate (Presieve.ofArrows X fun i => Sigma.ι X i))
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ (Presieve.ofArrows X fun i => Sigma.ι X i) ∈ (extensiveCoverage C ⊔ regularCoverage C).covering (∐ X)

tactic: refine Or.inl ⟨I, inferInstance, _, _, ⟨rfl, ?_⟩⟩
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ (Presieve.ofArrows X fun i => Sigma.ι X i) ∈ (extensiveCoverage C ⊔ regularCoverage C).covering (∐ X)
state_after: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ IsIso (Sigma.desc fun i => Sigma.ι X i)

tactic: convert IsIso.id _
state_before: case h.h.h.refine_2.of.intro.intro.intro.intro.intro.a.intro.intro.intro.intro.mk.a.hS
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
⊢ IsIso (Sigma.desc fun i => Sigma.ι X i)
state_after: case h.e'_5.h
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
e_4✝ : ∐ X = ∐ X
⊢ (Sigma.desc fun i => Sigma.ι X i) = 𝟙 (∐ X)

tactic: aesop
state_before: case h.e'_5.h
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
this :
  generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
e_4✝ : ∐ X = ∐ X
⊢ (Sigma.desc fun i => Sigma.ι X i) = 𝟙 (∐ X)
state_after: no goals

tactic: rintro Q q ⟨E, e, r, ⟨hq, rfl⟩⟩
state_before: C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
⊢ generate (Presieve.ofArrows X fun i => Sigma.ι X i) ≤ Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))
state_after: case intro.intro.intro.intro
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
Q E : C
e : Q ⟶ E
r : E ⟶ ∐ X
hq : Presieve.ofArrows X (fun i => Sigma.ι X i) r
⊢ (Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))).arrows (e ≫ r)

tactic: exact ⟨E, e, r ≫ (Sigma.desc f), by cases hq; simpa using Presieve.ofArrows.mk _, by simp⟩
state_before: case intro.intro.intro.intro
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
Q E : C
e : Q ⟶ E
r : E ⟶ ∐ X
hq : Presieve.ofArrows X (fun i => Sigma.ι X i) r
⊢ (Sieve.pullback (Sigma.desc f) (generate (Presieve.ofArrows X f))).arrows (e ≫ r)
state_after: no goals

tactic: cases hq
state_before: C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
Q E : C
e : Q ⟶ E
r : E ⟶ ∐ X
hq : Presieve.ofArrows X (fun i => Sigma.ι X i) r
⊢ Presieve.ofArrows X f (r ≫ Sigma.desc f)
state_after: case mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝¹ : Unit
ψ : R ⟶ ∐ fun i => X i
Q : C
i✝ : I
e : Q ⟶ X i✝
⊢ Presieve.ofArrows X f (Sigma.ι X i✝ ≫ Sigma.desc f)

tactic: simpa using Presieve.ofArrows.mk _
state_before: case mk
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝¹ : Unit
ψ : R ⟶ ∐ fun i => X i
Q : C
i✝ : I
e : Q ⟶ X i✝
⊢ Presieve.ofArrows X f (Sigma.ι X i✝ ≫ Sigma.desc f)
state_after: no goals

tactic: simp
state_before: C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y✝ : C
I : Type
w✝ : Finite I
X : I → C
f : (a : I) → X a ⟶ Y✝
hT : EffectiveEpiFamily X f
R Y : C
i✝ : Unit
ψ : R ⟶ ∐ fun i => X i
Q E : C
e : Q ⟶ E
r : E ⟶ ∐ X
hq : Presieve.ofArrows X (fun i => Sigma.ι X i) r
⊢ e ≫ r ≫ Sigma.desc f = (e ≫ r) ≫ Sigma.desc f
state_after: no goals

tactic: apply Coverage.saturate.top
state_before: case h.h.h.refine_2.top
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
X✝ : C
⊢ ⊤ ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves X✝
state_after: no goals

tactic: apply Coverage.saturate.transitive Y T<;> [assumption; assumption]
state_before: case h.h.h.refine_2.transitive
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Preregular C
inst✝ : FinitaryPreExtensive C
B : C
S : Sieve B
Y : C
T S✝ : Sieve Y
a✝¹ : (coherentCoverage C).saturate Y T
a✝ : ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄, T.arrows f → (coherentCoverage C).saturate Y_1 (Sieve.pullback f S✝)
a_ih✝¹ : T ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y
a_ih✝ :
  ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄,
    T.arrows f → Sieve.pullback f S✝ ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y_1
⊢ S✝ ∈ (Coverage.toGrothendieck C (extensiveCoverage C ⊔ regularCoverage C)).sieves Y
state_after: no goals