Theorem: CategoryTheory.GrothendieckTopology.Subpresheaf.to_sheafify_lift_unique
File: Mathlib/CategoryTheory/Sites/Subsheaf.lean

tactic: ext U ⟨s, hs⟩
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
⊢ l₁ = l₂
state_after: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
⊢ l₁.app U ⟨s, hs⟩ = l₂.app U ⟨s, hs⟩

tactic: apply (h _ hs).isSeparatedFor.ext
state_before: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
⊢ l₁.app U ⟨s, hs⟩ = l₂.app U ⟨s, hs⟩
state_after: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ U.unop⦄,
    (G.sieveOfSection s).arrows f → F'.map f.op (l₁.app U ⟨s, hs⟩) = F'.map f.op (l₂.app U ⟨s, hs⟩)

tactic: rintro V i hi
state_before: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ U.unop⦄,
    (G.sieveOfSection s).arrows f → F'.map f.op (l₁.app U ⟨s, hs⟩) = F'.map f.op (l₂.app U ⟨s, hs⟩)
state_after: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection s).arrows i
⊢ F'.map i.op (l₁.app U ⟨s, hs⟩) = F'.map i.op (l₂.app U ⟨s, hs⟩)

tactic: dsimp at hi
state_before: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection s).arrows i
⊢ F'.map i.op (l₁.app U ⟨s, hs⟩) = F'.map i.op (l₂.app U ⟨s, hs⟩)
state_after: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : F.map i.op s ∈ G.obj { unop := V }
⊢ F'.map i.op (l₁.app U ⟨s, hs⟩) = F'.map i.op (l₂.app U ⟨s, hs⟩)

tactic: erw [← FunctorToTypes.naturality, ← FunctorToTypes.naturality]
state_before: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : F.map i.op s ∈ G.obj { unop := V }
⊢ F'.map i.op (l₁.app U ⟨s, hs⟩) = F'.map i.op (l₂.app U ⟨s, hs⟩)
state_after: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : F.map i.op s ∈ G.obj { unop := V }
⊢ l₁.app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨s, hs⟩) =
    l₂.app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨s, hs⟩)

tactic: exact (congr_fun (congr_app e <| op V) ⟨_, hi⟩ : _)
state_before: case w.h.h.mk
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : Presieve.IsSheaf J F'
l₁ l₂ : (sheafify J G).toPresheaf ⟶ F'
e : homOfLe ⋯ ≫ l₁ = homOfLe ⋯ ≫ l₂
U : Cᵒᵖ
s : F.obj U
hs : s ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : F.map i.op s ∈ G.obj { unop := V }
⊢ l₁.app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨s, hs⟩) =
    l₂.app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨s, hs⟩)
state_after: no goals