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

tactic: apply hom_ext H P hP _ (J.pullback_stable f E.mem₀)
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
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ lift hP hE le F ≫ P.map f.op = F.ι { Y := Y, f := f, hf := hf }
state_after: 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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ∀ ⦃Y_1 : C⦄ (f_1 : Y_1 ⟶ Y),
    (Sieve.pullback f E.sieve₀).arrows f_1 →
      (lift hP hE le F ≫ P.map f.op) ≫ P.map f_1.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map f_1.op

tactic: intro Z g
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
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ∀ ⦃Y_1 : C⦄ (f_1 : Y_1 ⟶ Y),
    (Sieve.pullback f E.sieve₀).arrows f_1 →
      (lift hP hE le F ≫ P.map f.op) ≫ P.map f_1.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map f_1.op
state_after: 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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
⊢ (Sieve.pullback f E.sieve₀).arrows g →
    (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op

tactic: rintro ⟨T, a, b, hb, fac⟩
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
hP : ∀ ⦃X : C⦄ (E : J.OneHypercover X), H E → Nonempty (IsLimit (E.multifork P))
X : C
S : Sieve X
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
⊢ (Sieve.pullback f E.sieve₀).arrows g →
    (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op
state_after: case intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
T : C
a : Z ⟶ T
b : T ⟶ X
hb : Presieve.ofArrows E.X E.f b
fac : a ≫ b = g ≫ f
⊢ (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op

tactic: cases' hb with i
state_before: case intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
T : C
a : Z ⟶ T
b : T ⟶ X
hb : Presieve.ofArrows E.X E.f b
fac : a ≫ b = g ≫ f
⊢ (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op
state_after: case intro.intro.intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
i : E.I₀
a : Z ⟶ E.X i
fac : a ≫ E.f i = g ≫ f
⊢ (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op

tactic: rw [assoc, ← P.map_comp, ← op_comp, ← fac,
  op_comp, P.map_comp, fac'_assoc]
state_before: case intro.intro.intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
i : E.I₀
a : Z ⟶ E.X i
fac : a ≫ E.f i = g ≫ f
⊢ (lift hP hE le F ≫ P.map f.op) ≫ P.map g.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op
state_after: case intro.intro.intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
i : E.I₀
a : Z ⟶ E.X i
fac : a ≫ E.f i = g ≫ f
⊢ F.ι { Y := E.X i, f := E.f i, hf := ⋯ } ≫ P.map a.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op

tactic: exact F.condition (Cover.Relation.mk { hf := le _ (Sieve.ofArrows_mk _ _ _) }
  { hf := hf } { w := fac })
state_before: case intro.intro.intro.intro.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
E : J.OneHypercover X
hE : H E
le : E.sieve₀ ≤ S
F : Multifork (Cover.index ⟨S, ⋯⟩ P)
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
i : E.I₀
a : Z ⟶ E.X i
fac : a ≫ E.f i = g ≫ f
⊢ F.ι { Y := E.X i, f := E.f i, hf := ⋯ } ≫ P.map a.op = F.ι { Y := Y, f := f, hf := hf } ≫ P.map g.op
state_after: no goals