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

Proof steps:
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: 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
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: convert ((G.sheafifyLift (Subpresheaf.homOfLe h) hG').app U ⟨x, hx⟩).2
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 ⟶ unop U⦄,
    (G.sieveOfSection x).arrows f → F.map f.op x = F.map f.op ↑((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
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ unop U⦄,
    (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 ⟶ unop U
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: 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
V : C
i : V ⟶ unop U
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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op 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: 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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op 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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op 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 (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')
tactic: convert this.symm
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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op 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 (op 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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ ↑((G.sheafifyLift (homOfLe h) hG').app (op V) ((sheafify J G).toPresheaf.map i.op ⟨x, hx⟩)) =
    (fun f => ↑(f.app (op 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 ⟶ unop U
hi : (G.sieveOfSection x).arrows i
this :
  (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG') =
    (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe h)
⊢ ↑((G.sheafifyLift (homOfLe h) hG').app (op V) ((sheafify J G).toPresheaf.map i.op ⟨x, hx⟩)) =
    (fun f => ↑(f.app (op V) ⟨F.map i.op x, hi⟩)) (homOfLe ⋯ ≫ G.sheafifyLift (homOfLe h) hG')
state_after: no goals
tactic: rfl