-- Mathlib/CategoryTheory/Sites/Subsheaf.lean
theorem Subpresheaf.sheafify_le (h : G ≤ G') (hF : Presieve.IsSheaf J F)
    (hG' : Presieve.IsSheaf J G'.toPresheaf) : G.sheafify J ≤ G'

Proof state:
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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'

Tactic:
intro U x hx

Result:
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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

Proof state:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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:
have :=
  congr_arg (fun f : G.toPresheaf ⟶ G'.toPresheaf => (NatTrans.app f (op V) ⟨_, hi⟩).1)
    (G.to_sheafifyLift (Subpresheaf.homOfLe h) hG')

Result:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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⟩)

Proof state:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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:
convert this.symm

Result:
case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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')

Proof state:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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

Result:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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⟩)

Proof state:
case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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:
rfl

Result:
no goals

Proof state:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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:
intro V i hi

Result:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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⟩)

Proof state:
case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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:
rw [← Subpresheaf.nat_trans_naturality]

Result:
case h.e'_3
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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')

Proof state:
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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

Result:
case h.e'_5
C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
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⟩)