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

tactic: intro U x hx
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
⊢ sheafify J G ≤ G'
state_after: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ x ∈ G'.obj U

tactic: convert ((G.sheafifyLift (Subpresheaf.homOfLe h) hG').app U ⟨x, hx⟩).2
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ x ∈ G'.obj U
state_after: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ x = ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)

tactic: apply (hF _ hx).isSeparatedFor.ext
state_before: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ x = ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)
state_after: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ U.unop⦄,
    (G.sieveOfSection x).arrows f → F.map f.op x = F.map f.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)

tactic: intro V i hi
state_before: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ U.unop⦄,
    (G.sieveOfSection x).arrows f → F.map f.op x = F.map f.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)
state_after: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
⊢ F.map i.op x = F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)

tactic: have :=
  congr_arg (fun f : G.toPresheaf ⟶ G'.toPresheaf => (NatTrans.app f (op V) ⟨_, hi⟩).1)
    (G.to_sheafifyLift (Subpresheaf.homOfLe h) hG')
state_before: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
⊢ F.map i.op x = F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)
state_after: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ F.map i.op x = F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)

tactic: convert this.symm
state_before: case h.e'_4
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ F.map i.op x = F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩)
state_after: case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩) =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')

tactic: erw [← Subpresheaf.nat_trans_naturality]
state_before: case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ F.map i.op ↑((G.sheafifyLift (homOfLe h) hG').app U ⟨x, hx⟩) =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')
state_after: case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ ↑((G.sheafifyLift (homOfLe h) hG').app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨x, hx⟩)) =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')

tactic: rfl
state_before: case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
h : G ≤ G'
hF : Presieve.IsSheaf J F
hG' : Presieve.IsSheaf J G'.toPresheaf
U : Cᵒᵖ
x : F.obj U
hx : x ∈ (sheafify J G).obj U
V : C
i : V ⟶ U.unop
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ ↑((G.sheafifyLift (homOfLe h) hG').app { unop := V } ((sheafify J G).toPresheaf.map i.op ⟨x, hx⟩)) =
    (fun f => ↑(f.app { unop := V } ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')
state_after: no goals