Theorem: CategoryTheory.GrothendieckTopology.OneHypercoverFamily.isSheaf_iff
File: Mathlib/CategoryTheory/Sites/IsSheafOneHypercover.lean

tactic: constructor
state_before: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
⊢ Presheaf.IsSheaf J P ↔ ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
state_after: case mp
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
⊢ Presheaf.IsSheaf J P → ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))

case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
⊢ (∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))) → Presheaf.IsSheaf J P

tactic: intro hP X E _
state_before: case mp
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
⊢ Presheaf.IsSheaf J P → ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
state_after: case mp
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
X : C
E : J.OneHypercover X
x✝ : H E
⊢ Nonempty (IsLimit (E.multifork P))

tactic: exact ⟨E.isLimitMultifork ⟨_, hP⟩⟩
state_before: case mp
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
X : C
E : J.OneHypercover X
x✝ : H E
⊢ Nonempty (IsLimit (E.multifork P))
state_after: no goals

tactic: intro hP
state_before: case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
⊢ (∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))) → Presheaf.IsSheaf J P
state_after: case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
⊢ Presheaf.IsSheaf J P

tactic: rw [Presheaf.isSheaf_iff_multifork]
state_before: case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
⊢ Presheaf.IsSheaf J P
state_after: case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
⊢ ∀ (X : C) (S : J.Cover X), Nonempty (IsLimit (S.multifork P))

tactic: rintro X ⟨S, hS⟩
state_before: case mpr
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
⊢ ∀ (X : C) (S : J.Cover X), Nonempty (IsLimit (S.multifork P))
state_after: case mpr.mk
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
hS : S ∈ J.sieves X
⊢ Nonempty (IsLimit (Cover.multifork ⟨S, hS⟩ P))

tactic: obtain ⟨E, hE, le⟩ := H.exists_oneHypercover S hS
state_before: case mpr.mk
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
hS : S ∈ J.sieves X
⊢ Nonempty (IsLimit (Cover.multifork ⟨S, hS⟩ P))
state_after: case mpr.mk.intro.intro
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
hS : S ∈ J.sieves X
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
⊢ Nonempty (IsLimit (Cover.multifork ⟨S, hS⟩ P))

tactic: exact ⟨IsSheafIff.isLimit hP hE le⟩
state_before: case mpr.mk.intro.intro
C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝¹ : Category.{v', u'} A
H : J.OneHypercoverFamily
inst✝ : H.IsGenerating
P : Cᵒᵖ ⥤ A
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
hS : S ∈ J.sieves X
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
⊢ Nonempty (IsLimit (Cover.multifork ⟨S, hS⟩ P))
state_after: no goals