[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
⊢ Presieve.IsSheafFor P (Sieve.bind U.arrows B).arrows
[PROOFSTEP]
intro s hs
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
let y : ∀ ⦃Y⦄ ⦃f : Y ⟶ X⦄ (hf : U f), Presieve.FamilyOfElements P (B hf : Presieve Y) := fun Y f hf Z g hg =>
  s _ (Presieve.bind_comp _ _ hg)
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
have hy : ∀ ⦃Y⦄ ⦃f : Y ⟶ X⦄ (hf : U f), (y hf).Compatible :=
  by
  intro Y f H Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ comm
  apply hs
  apply reassoc_of% comm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
[PROOFSTEP]
intro Y f H Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ comm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
Y : C
f : Y ⟶ X
H : U.arrows f
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ Y
f₂ : Y₂ ⟶ Y
hf₁ : (B H).arrows f₁
hf₂ : (B H).arrows f₂
comm : g₁ ≫ f₁ = g₂ ≫ f₂
⊢ P.map g₁.op (y H f₁ hf₁) = P.map g₂.op (y H f₂ hf₂)
[PROOFSTEP]
apply hs
[GOAL]
case a
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
Y : C
f : Y ⟶ X
H : U.arrows f
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ Y
f₂ : Y₂ ⟶ Y
hf₁ : (B H).arrows f₁
hf₂ : (B H).arrows f₂
comm : g₁ ≫ f₁ = g₂ ≫ f₂
⊢ g₁ ≫ f₁ ≫ f = g₂ ≫ f₂ ≫ f
[PROOFSTEP]
apply reassoc_of% comm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
let t : Presieve.FamilyOfElements P (U : Presieve X) := fun Y f hf => (hB hf).amalgamate (y hf) (hy hf)
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
have ht : ∀ ⦃Y⦄ ⦃f : Y ⟶ X⦄ (hf : U f), (y hf).IsAmalgamation (t f hf) := fun Y f hf => (hB hf).isAmalgamation _
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
have hT : t.Compatible := by
  rw [Presieve.compatible_iff_sieveCompatible]
  intro Z W f h hf
  apply (hB (U.downward_closed hf h)).isSeparatedFor.ext
  intro Y l hl
  apply (hB' hf (l ≫ h)).ext
  intro M m hm
  have : bind U B (m ≫ l ≫ h ≫ f) := by
    -- porting note: had to make explicit the parameter `((m ≫ l ≫ h) ≫ f)` and
          -- using `by exact`
    have : bind U B ((m ≫ l ≫ h) ≫ f) := by exact Presieve.bind_comp f hf hm
    simpa using this
  trans s (m ≫ l ≫ h ≫ f) this
  · have := ht (U.downward_closed hf h) _ ((B _).downward_closed hl m)
    rw [op_comp, FunctorToTypes.map_comp_apply] at this 
    rw [this]
    change
      s _ _ =
        s _
          _
            -- porting note: the proof was `by simp`
    congr 1
    simp only [assoc]
  · have h : s _ _ = _ := (ht hf _ hm).symm
    conv_lhs at h => congr; rw [assoc, assoc]
    rw [h]
    simp only [op_comp, assoc, FunctorToTypes.map_comp_apply]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
⊢ Presieve.FamilyOfElements.Compatible t
[PROOFSTEP]
rw [Presieve.compatible_iff_sieveCompatible]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
⊢ Presieve.FamilyOfElements.SieveCompatible t
[PROOFSTEP]
intro Z W f h hf
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
⊢ t (h ≫ f) (_ : U.arrows (h ≫ f)) = P.map h.op (t f hf)
[PROOFSTEP]
apply (hB (U.downward_closed hf h)).isSeparatedFor.ext
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
⊢ ∀ ⦃Y : C⦄ ⦃f_1 : Y ⟶ W⦄,
    (B (_ : U.arrows (h ≫ f))).arrows f_1 →
      P.map f_1.op (t (h ≫ f) (_ : U.arrows (h ≫ f))) = P.map f_1.op (P.map h.op (t f hf))
[PROOFSTEP]
intro Y l hl
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
⊢ P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f))) = P.map l.op (P.map h.op (t f hf))
[PROOFSTEP]
apply (hB' hf (l ≫ h)).ext
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
⊢ ∀ ⦃Y_1 : C⦄ ⦃f_1 : Y_1 ⟶ Y⦄,
    (Sieve.pullback (l ≫ h) (B hf)).arrows f_1 →
      P.map f_1.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = P.map f_1.op (P.map l.op (P.map h.op (t f hf)))
[PROOFSTEP]
intro M m hm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
⊢ P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = P.map m.op (P.map l.op (P.map h.op (t f hf)))
[PROOFSTEP]
have : bind U B (m ≫ l ≫ h ≫ f) := by
  -- porting note: had to make explicit the parameter `((m ≫ l ≫ h) ≫ f)` and
        -- using `by exact`
  have : bind U B ((m ≫ l ≫ h) ≫ f) := by exact Presieve.bind_comp f hf hm
  simpa using this
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
⊢ (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
[PROOFSTEP]
have : bind U B ((m ≫ l ≫ h) ≫ f) := by exact Presieve.bind_comp f hf hm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
⊢ (Sieve.bind U.arrows B).arrows ((m ≫ l ≫ h) ≫ f)
[PROOFSTEP]
exact Presieve.bind_comp f hf hm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows ((m ≫ l ≫ h) ≫ f)
⊢ (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
[PROOFSTEP]
simpa using this
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
⊢ P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = P.map m.op (P.map l.op (P.map h.op (t f hf)))
[PROOFSTEP]
trans s (m ≫ l ≫ h ≫ f) this
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
⊢ P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = s (m ≫ l ≫ h ≫ f) this
[PROOFSTEP]
have := ht (U.downward_closed hf h) _ ((B _).downward_closed hl m)
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this✝ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
this :
  P.map (m ≫ l).op (t (h ≫ f) (_ : U.arrows (h ≫ f))) =
    y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l))
⊢ P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = s (m ≫ l ≫ h ≫ f) this✝
[PROOFSTEP]
rw [op_comp, FunctorToTypes.map_comp_apply] at this 
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this✝ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
this :
  P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) =
    y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l))
⊢ P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) = s (m ≫ l ≫ h ≫ f) this✝
[PROOFSTEP]
rw [this]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this✝ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
this :
  P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) =
    y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l))
⊢ y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l)) = s (m ≫ l ≫ h ≫ f) this✝
[PROOFSTEP]
change
  s _ _ =
    s _
      _
        -- porting note: the proof was `by simp`
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this✝ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
this :
  P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) =
    y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l))
⊢ s ((m ≫ l) ≫ h ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l) ≫ h ≫ f)) =
    s (m ≫ l ≫ h ≫ f) this✝
[PROOFSTEP]
congr 1
[GOAL]
case e_f
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this✝ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
this :
  P.map m.op (P.map l.op (t (h ≫ f) (_ : U.arrows (h ≫ f)))) =
    y (_ : U.arrows (h ≫ f)) (m ≫ l) (_ : (B (_ : U.arrows (h ≫ f))).arrows (m ≫ l))
⊢ (m ≫ l) ≫ h ≫ f = m ≫ l ≫ h ≫ f
[PROOFSTEP]
simp only [assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h ≫ f)
⊢ s (m ≫ l ≫ h ≫ f) this = P.map m.op (P.map l.op (P.map h.op (t f hf)))
[PROOFSTEP]
have h : s _ _ = _ := (ht hf _ hm).symm
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h :
  s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f)) =
    P.map (m ≫ l ≫ h✝).op (t f hf)
⊢ s (m ≫ l ≫ h✝ ≫ f) this = P.map m.op (P.map l.op (P.map h✝.op (t f hf)))
[PROOFSTEP]
conv_lhs at h => congr; rw [assoc, assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h :
  s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f)) =
    P.map (m ≫ l ≫ h✝).op (t f hf)
| s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f))
[PROOFSTEP]
congr; rw [assoc, assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h :
  s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f)) =
    P.map (m ≫ l ≫ h✝).op (t f hf)
| s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f))
[PROOFSTEP]
congr; rw [assoc, assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h :
  s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f)) =
    P.map (m ≫ l ≫ h✝).op (t f hf)
| s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f))
[PROOFSTEP]
congr
[GOAL]
case f
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h :
  s ((m ≫ l ≫ h✝) ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) ((m ≫ l ≫ h✝) ≫ f)) =
    P.map (m ≫ l ≫ h✝).op (t f hf)
| (m ≫ l ≫ h✝) ≫ f
[PROOFSTEP]
rw [assoc, assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h : s (m ≫ l ≫ h✝ ≫ f) (_ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)) = P.map (m ≫ l ≫ h✝).op (t f hf)
⊢ s (m ≫ l ≫ h✝ ≫ f) this = P.map m.op (P.map l.op (P.map h✝.op (t f hf)))
[PROOFSTEP]
rw [h]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
Z W : C
f : Z ⟶ X
h✝ : W ⟶ Z
hf : U.arrows f
Y : C
l : Y ⟶ W
hl : (B (_ : U.arrows (h✝ ≫ f))).arrows l
M : C
m : M ⟶ Y
hm : (Sieve.pullback (l ≫ h✝) (B hf)).arrows m
this : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)
h : s (m ≫ l ≫ h✝ ≫ f) (_ : (Sieve.bind U.arrows B).arrows (m ≫ l ≫ h✝ ≫ f)) = P.map (m ≫ l ≫ h✝).op (t f hf)
⊢ P.map (m ≫ l ≫ h✝).op (t f hf) = P.map m.op (P.map l.op (P.map h✝.op (t f hf)))
[PROOFSTEP]
simp only [op_comp, assoc, FunctorToTypes.map_comp_apply]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
⊢ ∃! t, Presieve.FamilyOfElements.IsAmalgamation s t
[PROOFSTEP]
refine' ⟨hU.amalgamate t hT, _, _⟩
[GOAL]
case refine'_1
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
⊢ (fun t => Presieve.FamilyOfElements.IsAmalgamation s t) (Presieve.IsSheafFor.amalgamate hU t hT)
[PROOFSTEP]
rintro Z _ ⟨Y, f, g, hg, hf, rfl⟩
[GOAL]
case refine'_1.intro.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
Z Y : C
f : Z ⟶ Y
g : Y ⟶ X
hg : U.arrows g
hf : (B hg).arrows f
⊢ P.map (f ≫ g).op (Presieve.IsSheafFor.amalgamate hU t hT) =
    s (f ≫ g) (_ : ∃ Y_1 g_1 f_1 H, (fun Y f h => (B h).arrows) Y_1 f_1 H g_1 ∧ g_1 ≫ f_1 = f ≫ g)
[PROOFSTEP]
rw [op_comp, FunctorToTypes.map_comp_apply, Presieve.IsSheafFor.valid_glue _ _ _ hg]
[GOAL]
case refine'_1.intro.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
Z Y : C
f : Z ⟶ Y
g : Y ⟶ X
hg : U.arrows g
hf : (B hg).arrows f
⊢ P.map f.op (t g hg) = s (f ≫ g) (_ : ∃ Y_1 g_1 f_1 H, (fun Y f h => (B h).arrows) Y_1 f_1 H g_1 ∧ g_1 ≫ f_1 = f ≫ g)
[PROOFSTEP]
apply ht hg _ hf
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y hf)
      (_ : Presieve.FamilyOfElements.Compatible (y hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
⊢ ∀ (y : P.obj (Opposite.op X)),
    (fun t => Presieve.FamilyOfElements.IsAmalgamation s t) y → y = Presieve.IsSheafFor.amalgamate hU t hT
[PROOFSTEP]
intro y hy
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y✝ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y✝ hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y✝ hf)
      (_ : Presieve.FamilyOfElements.Compatible (y✝ hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y✝ hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
y : P.obj (Opposite.op X)
hy : Presieve.FamilyOfElements.IsAmalgamation s y
⊢ y = Presieve.IsSheafFor.amalgamate hU t hT
[PROOFSTEP]
apply hU.isSeparatedFor.ext
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y✝ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y✝ hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y✝ hf)
      (_ : Presieve.FamilyOfElements.Compatible (y✝ hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y✝ hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
y : P.obj (Opposite.op X)
hy : Presieve.FamilyOfElements.IsAmalgamation s y
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, U.arrows f → P.map f.op y = P.map f.op (Presieve.IsSheafFor.amalgamate hU t hT)
[PROOFSTEP]
intro Y f hf
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y✝ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y✝ hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y✝ hf)
      (_ : Presieve.FamilyOfElements.Compatible (y✝ hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y✝ hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
y : P.obj (Opposite.op X)
hy : Presieve.FamilyOfElements.IsAmalgamation s y
Y : C
f : Y ⟶ X
hf : U.arrows f
⊢ P.map f.op y = P.map f.op (Presieve.IsSheafFor.amalgamate hU t hT)
[PROOFSTEP]
apply (hB hf).isSeparatedFor.ext
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y✝ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y✝ hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y✝ hf)
      (_ : Presieve.FamilyOfElements.Compatible (y✝ hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y✝ hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
y : P.obj (Opposite.op X)
hy : Presieve.FamilyOfElements.IsAmalgamation s y
Y : C
f : Y ⟶ X
hf : U.arrows f
⊢ ∀ ⦃Y_1 : C⦄ ⦃f_1 : Y_1 ⟶ Y⦄,
    (B hf).arrows f_1 → P.map f_1.op (P.map f.op y) = P.map f_1.op (P.map f.op (Presieve.IsSheafFor.amalgamate hU t hT))
[PROOFSTEP]
intro Z g hg
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
U : Sieve X
B : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → U.arrows f → Sieve Y
hU : Presieve.IsSheafFor P U.arrows
hB : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.IsSheafFor P (B hf).arrows
hB' :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (h : U.arrows f) ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (B h)).arrows
s : Presieve.FamilyOfElements P (Sieve.bind U.arrows B).arrows
hs : Presieve.FamilyOfElements.Compatible s
y✝ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → (hf : U.arrows f) → Presieve.FamilyOfElements P (B hf).arrows :=
  fun Y f hf Z g hg => s (g ≫ f) (_ : Presieve.bind (fun Y f => U.arrows f) (fun Y f H => (B H).arrows) (g ≫ f))
hy✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.Compatible (y✝ hf)
t : Presieve.FamilyOfElements P U.arrows :=
  fun Y f hf =>
    Presieve.IsSheafFor.amalgamate (_ : Presieve.IsSheafFor P (B hf).arrows) (y✝ hf)
      (_ : Presieve.FamilyOfElements.Compatible (y✝ hf))
ht : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (hf : U.arrows f), Presieve.FamilyOfElements.IsAmalgamation (y✝ hf) (t f hf)
hT : Presieve.FamilyOfElements.Compatible t
y : P.obj (Opposite.op X)
hy : Presieve.FamilyOfElements.IsAmalgamation s y
Y : C
f : Y ⟶ X
hf : U.arrows f
Z : C
g : Z ⟶ Y
hg : (B hf).arrows g
⊢ P.map g.op (P.map f.op y) = P.map g.op (P.map f.op (Presieve.IsSheafFor.amalgamate hU t hT))
[PROOFSTEP]
rw [← FunctorToTypes.map_comp_apply, ← op_comp, hy _ (Presieve.bind_comp _ _ hg), hU.valid_glue _ _ hf, ht hf _ hg]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
⊢ Presieve.IsSheafFor P S.arrows
[PROOFSTEP]
have : (bind R fun Y f _ => S.pullback f : Presieve X) ≤ S :=
  by
  rintro Z f ⟨W, f, g, hg, hf : S _, rfl⟩
  apply hf
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
⊢ (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
[PROOFSTEP]
rintro Z f ⟨W, f, g, hg, hf : S _, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
Z W : C
f : Z ⟶ W
g : W ⟶ X
hg : R.arrows g
hf : S.arrows (f ≫ g)
⊢ f ≫ g ∈ S.arrows
[PROOFSTEP]
apply hf
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
⊢ Presieve.IsSheafFor P S.arrows
[PROOFSTEP]
apply Presieve.isSheafFor_subsieve_aux P this
[GOAL]
case hS
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
⊢ Presieve.IsSheafFor P (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows
case trans
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S)).arrows
[PROOFSTEP]
apply isSheafFor_bind _ _ _ hR hS
[GOAL]
case hS
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    R.arrows f → ∀ ⦃Z : C⦄ (g : Z ⟶ Y), Presieve.IsSeparatedFor P (Sieve.pullback g (Sieve.pullback f S)).arrows
[PROOFSTEP]
intro Y f hf Z g
[GOAL]
case hS
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : R.arrows f
Z : C
g : Z ⟶ Y
⊢ Presieve.IsSeparatedFor P (Sieve.pullback g (Sieve.pullback f S)).arrows
[PROOFSTEP]
rw [← pullback_comp]
[GOAL]
case hS
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : R.arrows f
Z : C
g : Z ⟶ Y
⊢ Presieve.IsSeparatedFor P (Sieve.pullback (g ≫ f) S).arrows
[PROOFSTEP]
apply (hS (R.downward_closed hf _)).isSeparatedFor
[GOAL]
case trans
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S)).arrows
[PROOFSTEP]
intro Y f hf
[GOAL]
case trans
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S)).arrows
[PROOFSTEP]
have : Sieve.pullback f (bind R fun T (k : T ⟶ X) (_ : R k) => pullback k S) = R.pullback f :=
  by
  ext Z g
  constructor
  · rintro ⟨W, k, l, hl, _, comm⟩
    rw [pullback_apply, ← comm]
    simp [hl]
  · intro a
    refine' ⟨Z, 𝟙 Z, _, a, _⟩
    simp [hf]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S) = Sieve.pullback f R
[PROOFSTEP]
ext Z g
[GOAL]
case h
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
⊢ (Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S)).arrows g ↔ (Sieve.pullback f R).arrows g
[PROOFSTEP]
constructor
[GOAL]
case h.mp
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
⊢ (Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S)).arrows g → (Sieve.pullback f R).arrows g
[PROOFSTEP]
rintro ⟨W, k, l, hl, _, comm⟩
[GOAL]
case h.mp.intro.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
W : C
k : Z ⟶ W
l : W ⟶ X
hl : R.arrows l
left✝ : ((fun T k x => Sieve.pullback k S) W l hl).arrows k
comm : k ≫ l = g ≫ f
⊢ (Sieve.pullback f R).arrows g
[PROOFSTEP]
rw [pullback_apply, ← comm]
[GOAL]
case h.mp.intro.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
W : C
k : Z ⟶ W
l : W ⟶ X
hl : R.arrows l
left✝ : ((fun T k x => Sieve.pullback k S) W l hl).arrows k
comm : k ≫ l = g ≫ f
⊢ R.arrows (k ≫ l)
[PROOFSTEP]
simp [hl]
[GOAL]
case h.mpr
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
⊢ (Sieve.pullback f R).arrows g → (Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S)).arrows g
[PROOFSTEP]
intro a
[GOAL]
case h.mpr
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
a : (Sieve.pullback f R).arrows g
⊢ (Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S)).arrows g
[PROOFSTEP]
refine' ⟨Z, 𝟙 Z, _, a, _⟩
[GOAL]
case h.mpr
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
Z : C
g : Z ⟶ Y
a : (Sieve.pullback f R).arrows g
⊢ (fun Y f h => ((fun T k x => Sieve.pullback k S) Y f h).arrows) Z (g ≫ f) a (𝟙 Z) ∧ 𝟙 Z ≫ g ≫ f = g ≫ f
[PROOFSTEP]
simp [hf]
[GOAL]
case trans
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this✝ : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
this : Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S) = Sieve.pullback f R
⊢ Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S)).arrows
[PROOFSTEP]
rw [this]
[GOAL]
case trans
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X Y✝ : C
S✝ : Sieve X
R✝ : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
R S : Sieve X
hR : Presieve.IsSheafFor P R.arrows
hR' : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
hS : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Presieve.IsSheafFor P (Sieve.pullback f S).arrows
this✝ : (Sieve.bind R.arrows fun Y f x => Sieve.pullback f S).arrows ≤ S.arrows
Y : C
f : Y ⟶ X
hf : S.arrows f
this : Sieve.pullback f (Sieve.bind R.arrows fun T k x => Sieve.pullback k S) = Sieve.pullback f R
⊢ Presieve.IsSeparatedFor P (Sieve.pullback f R).arrows
[PROOFSTEP]
apply hR' hf
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S : Sieve X✝
R : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X Y : C
f : Y ⟶ X
⊢ Presieve.IsSheafFor P (Sieve.pullback f ⊤).arrows
[PROOFSTEP]
rw [Sieve.pullback_top]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S : Sieve X✝
R : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X Y : C
f : Y ⟶ X
⊢ Presieve.IsSheafFor P ⊤.arrows
[PROOFSTEP]
exact Presieve.isSheafFor_top_sieve P
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
f : Y ⟶ X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
Z : C
g : Z ⟶ Y
⊢ Presieve.IsSheafFor P (Sieve.pullback g (Sieve.pullback f S)).arrows
[PROOFSTEP]
rw [← pullback_comp]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
f : Y ⟶ X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
Z : C
g : Z ⟶ Y
⊢ Presieve.IsSheafFor P (Sieve.pullback (g ≫ f) S).arrows
[PROOFSTEP]
apply hS
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
⊢ Presieve.IsSheafFor P (Sieve.pullback g R).arrows
[PROOFSTEP]
refine' isSheafFor_trans P (pullback g S) _ (hS Z g) _ _
[GOAL]
case refine'_1
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ Z⦄,
    (Sieve.pullback g R).arrows f → Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.pullback g S)).arrows
[PROOFSTEP]
intro Y f _
[GOAL]
case refine'_1
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
Y : C
f : Y ⟶ Z
x✝ : (Sieve.pullback g R).arrows f
⊢ Presieve.IsSeparatedFor P (Sieve.pullback f (Sieve.pullback g S)).arrows
[PROOFSTEP]
rw [← pullback_comp]
[GOAL]
case refine'_1
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
Y : C
f : Y ⟶ Z
x✝ : (Sieve.pullback g R).arrows f
⊢ Presieve.IsSeparatedFor P (Sieve.pullback (f ≫ g) S).arrows
[PROOFSTEP]
apply (hS _ _).isSeparatedFor
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ Z⦄,
    (Sieve.pullback g S).arrows f → Presieve.IsSheafFor P (Sieve.pullback f (Sieve.pullback g R)).arrows
[PROOFSTEP]
intro Y f hf
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
Y : C
f : Y ⟶ Z
hf : (Sieve.pullback g S).arrows f
⊢ Presieve.IsSheafFor P (Sieve.pullback f (Sieve.pullback g R)).arrows
[PROOFSTEP]
have := hR hf _ (𝟙 _)
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
Y : C
f : Y ⟶ Z
hf : (Sieve.pullback g S).arrows f
this : Presieve.IsSheafFor P (Sieve.pullback (𝟙 Y) (Sieve.pullback (f ≫ g) R)).arrows
⊢ Presieve.IsSheafFor P (Sieve.pullback f (Sieve.pullback g R)).arrows
[PROOFSTEP]
rw [pullback_id, pullback_comp] at this 
[GOAL]
case refine'_2
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R✝ : Presieve X✝
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v
X : C
S : Sieve X
hS : S ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) X
R : Sieve X
hR :
  ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      Sieve.pullback f R ∈ (fun X S => ∀ (Y : C) (f : Y ⟶ X), Presieve.IsSheafFor P (Sieve.pullback f S).arrows) Y
Z : C
g : Z ⟶ X
Y : C
f : Y ⟶ Z
hf : (Sieve.pullback g S).arrows f
this : Presieve.IsSheafFor P (Sieve.pullback f (Sieve.pullback g R)).arrows
⊢ Presieve.IsSheafFor P (Sieve.pullback f (Sieve.pullback g R)).arrows
[PROOFSTEP]
apply this
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type v
X✝ Y : C
S✝ : Sieve X✝
R : Presieve X✝
J J₂ : GrothendieckTopology C
Ps : Set (Cᵒᵖ ⥤ Type v)
h : P ∈ Ps
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves (finestTopology Ps) X
⊢ Presieve.IsSheafFor P S.arrows
[PROOFSTEP]
simpa using hS _ ⟨⟨_, _, ⟨_, h, rfl⟩, rfl⟩, rfl⟩ _ (𝟙 _)
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J✝ J₂ : GrothendieckTopology C
Ps : Set (Cᵒᵖ ⥤ Type v)
J : GrothendieckTopology C
hJ : ∀ (P : Cᵒᵖ ⥤ Type v), P ∈ Ps → Presieve.IsSheaf J P
⊢ J ≤ finestTopology Ps
[PROOFSTEP]
rintro X S hS _ ⟨⟨_, _, ⟨P, hP, rfl⟩, rfl⟩, rfl⟩
[GOAL]
case intro.mk.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y : C
S✝ : Sieve X✝
R : Presieve X✝
J✝ J₂ : GrothendieckTopology C
Ps : Set (Cᵒᵖ ⥤ Type v)
J : GrothendieckTopology C
hJ : ∀ (P : Cᵒᵖ ⥤ Type v), P ∈ Ps → Presieve.IsSheaf J P
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J X
P : Cᵒᵖ ⥤ Type v
hP : P ∈ Ps
⊢ S ∈
    (fun f => ↑f X)
      { val := (finestTopologySingle P).sieves,
        property := (_ : ∃ a, a ∈ finestTopologySingle '' Ps ∧ a.sieves = (finestTopologySingle P).sieves) }
[PROOFSTEP]
intro Y f
[GOAL]
case intro.mk.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type v
X✝ Y✝ : C
S✝ : Sieve X✝
R : Presieve X✝
J✝ J₂ : GrothendieckTopology C
Ps : Set (Cᵒᵖ ⥤ Type v)
J : GrothendieckTopology C
hJ : ∀ (P : Cᵒᵖ ⥤ Type v), P ∈ Ps → Presieve.IsSheaf J P
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J X
P : Cᵒᵖ ⥤ Type v
hP : P ∈ Ps
Y : C
f : Y ⟶ X
⊢ Presieve.IsSheafFor P (Sieve.pullback f S).arrows
[PROOFSTEP]
exact hJ P hP (S.pullback f) (J.pullback_stable f hS)
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type v
X Y : C
S : Sieve X
R : Presieve X
J✝ J₂ J : GrothendieckTopology C
h : ∀ (X : C), Presieve.IsSheaf J (yoneda.obj X)
⊢ ∀ (P : Cᵒᵖ ⥤ Type v), P ∈ Set.range yoneda.toPrefunctor.obj → Presieve.IsSheaf J P
[PROOFSTEP]
rintro P ⟨X, rfl⟩
[GOAL]
case intro
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type v
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
J✝ J₂ J : GrothendieckTopology C
h : ∀ (X : C), Presieve.IsSheaf J (yoneda.obj X)
X : C
⊢ Presieve.IsSheaf J (yoneda.obj X)
[PROOFSTEP]
apply h
