Theorem: CategoryTheory.GrothendieckTopology.Plus.exists_of_sep
File: Mathlib/CategoryTheory/Sites/Sheafification.lean

tactic: have inj : ∀ X : C, Function.Injective ((J.toPlus P).app (op X)) := inj_of_sep _ hsep
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
⊢ ∃ t, Meq.mk S t = s

tactic: choose T t ht using fun I => exists_rep (s I)
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
⊢ ∃ t, Meq.mk S t = s

tactic: let B : J.Cover X := S.bind T
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
⊢ ∃ t, Meq.mk S t = s

tactic: choose Z e1 e2 he2 _ _ using fun I : B.Arrow => I.hf
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
⊢ ∃ t, Meq.mk S t = s

tactic: let w : Meq P B := meqOfSep P hsep X S s T t ht
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
⊢ ∃ t, Meq.mk S t = s

tactic: use mk w
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
⊢ ∃ t, Meq.mk S t = s

tactic: ext I
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
⊢ Meq.mk S (mk w) = s

tactic: dsimp [Meq.mk]
state_before: case h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
⊢ ↑(Meq.mk S (mk w)) I = ↑s I

tactic: erw [ht, res_mk_eq_mk_pullback]
state_before: case h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
⊢ (forget D).map ((plusObj J P).map I.f.op) (mk (meqOfSep P hsep X S s T t ht)) = ↑s I

tactic: apply sep P (T I)
state_before: case h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
⊢ mk (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) = mk (t I)

tactic: intro II
state_before: case h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
⊢ ∀ (I_1 : Cover.Arrow (T I)),
    (forget D).map ((plusObj J P).map I_1.f.op) (mk (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f)) =
      (forget D).map ((plusObj J P).map I_1.f.op) (mk (t I))

tactic: simp only [res_mk_eq_mk_pullback, eq_mk_iff_exists]
state_before: case h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
⊢ (forget D).map ((plusObj J P).map II.f.op) (mk (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f)) =
    (forget D).map ((plusObj J P).map II.f.op) (mk (t I))

tactic: use (J.pullback II.f).obj (T I)
state_before: case h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
⊢ ∃ W h1 h2,
    Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) h1 =
      Meq.refine (Meq.pullback (t I) II.f) h2

tactic: use e0, 𝟙 _
state_before: case h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
⊢ ∃ h1 h2,
    Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) h1 =
      Meq.refine (Meq.pullback (t I) II.f) h2

tactic: ext IV
state_before: case h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
⊢ Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0 =
    Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))

tactic: let IA : B.Arrow := ⟨_, (IV.f ≫ II.f) ≫ I.f,
  ⟨I.Y, _, _, I.hf, Sieve.downward_closed _ II.hf _, rfl⟩⟩
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
⊢ ↑(Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0) IV =
    ↑(Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))) IV

tactic: let IB : S.Arrow := IA.fromMiddle
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
⊢ ↑(Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0) IV =
    ↑(Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))) IV

tactic: let IC : (T IB).Arrow := IA.toMiddle
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
⊢ ↑(Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0) IV =
    ↑(Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))) IV

tactic: let ID : (T I).Arrow := ⟨IV.Y, IV.f ≫ II.f, Sieve.downward_closed (T I).sieve II.hf IV.f⟩
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
⊢ ↑(Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0) IV =
    ↑(Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))) IV

tactic: change t IB IC = t I ID
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
ID : Cover.Arrow (T I) := { Y := IV.Y, f := IV.f ≫ II.f, hf := (_ : (Cover.sieve (T I)).arrows (IV.f ≫ II.f)) }
⊢ ↑(Meq.refine (Meq.pullback (Meq.pullback (meqOfSep P hsep X S s T t ht) I.f) II.f) e0) IV =
    ↑(Meq.refine (Meq.pullback (t I) II.f) (𝟙 ((pullback J II.f).obj (T I)))) IV

tactic: apply inj IV.Y
state_before: case h.h.h
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
ID : Cover.Arrow (T I) := { Y := IV.Y, f := IV.f ≫ II.f, hf := (_ : (Cover.sieve (T I)).arrows (IV.f ≫ II.f)) }
⊢ ↑(t IB) IC = ↑(t I) ID

tactic: erw [toPlus_apply (T I) (t I) ID, toPlus_apply (T IB) (t IB) IC, ← ht, ← ht]
state_before: case h.h.h.a
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
ID : Cover.Arrow (T I) := { Y := IV.Y, f := IV.f ≫ II.f, hf := (_ : (Cover.sieve (T I)).arrows (IV.f ≫ II.f)) }
⊢ (forget D).map ((toPlus J P).app IV.Y.op) (↑(t IB) IC) = (forget D).map ((toPlus J P).app IV.Y.op) (↑(t I) ID)

tactic: let IR : S.Relation := ⟨_, _, IV.Y, IC.f, ID.f, IB.f, I.f, IB.hf, I.hf, IA.middle_spec⟩
state_before: case h.h.h.a
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
ID : Cover.Arrow (T I) := { Y := IV.Y, f := IV.f ≫ II.f, hf := (_ : (Cover.sieve (T I)).arrows (IV.f ≫ II.f)) }
⊢ (forget D).map ((plusObj J P).map IC.f.op) (↑s IB) = (forget D).map ((plusObj J P).map ID.f.op) (↑s I)

tactic: exact s.condition IR
state_before: case h.h.h.a
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
e0 : (pullback J II.f).obj (T I) ⟶ (pullback J II.f).obj ((pullback J I.f).obj B) :=
  homOfLE
    (_ :
      ∀ ⦃Y : C⦄ (f : Y ⟶ II.Y),
        ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f →
          (Sieve.pullback I.f
                (Sieve.bind (Cover.sieve S).arrows fun Y f H =>
                  (fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f H)).arrows
            (f ≫ II.f))
IV : Cover.Arrow ((pullback J II.f).obj (T I))
IA : Cover.Arrow B :=
  { Y := IV.Y, f := (IV.f ≫ II.f) ≫ I.f,
    hf :=
      (_ :
        ∃ Y g f H,
          (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) Y f H g ∧
            g ≫ f = (IV.f ≫ II.f) ≫ I.f) }
IB : Cover.Arrow S := Cover.Arrow.fromMiddle IA
IC : Cover.Arrow (T IB) := Cover.Arrow.toMiddle IA
ID : Cover.Arrow (T I) := { Y := IV.Y, f := IV.f ≫ II.f, hf := (_ : (Cover.sieve (T I)).arrows (IV.f ≫ II.f)) }
IR : Cover.Relation S :=
  { Y₁ := IB.Y, Y₂ := I.Y, Z := IV.Y, g₁ := IC.f, g₂ := ID.f, f₁ := IB.f, f₂ := I.f,
    h₁ := (_ : (Cover.sieve S).arrows IB.f), h₂ := (_ : (Cover.sieve S).arrows I.f),
    w := (_ : Cover.Arrow.toMiddleHom IA ≫ Cover.Arrow.fromMiddleHom IA = IA.f) }
⊢ (forget D).map ((plusObj J P).map IC.f.op) (↑s IB) = (forget D).map ((plusObj J P).map ID.f.op) (↑s I)

tactic: intro Y f hf
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
⊢ (pullback J II.f).obj (T I) ≤ (pullback J II.f).obj ((pullback J I.f).obj B)

tactic: apply Sieve.le_pullback_bind _ _ _ I.hf
state_before: C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
Y : C
f : Y ⟶ II.Y
hf : ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f
⊢ ((fun a => ↑a) ((pullback J II.f).obj ((pullback J I.f).obj B))).arrows f

tactic: cases I
state_before: case a
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
I : Cover.Arrow S
II : Cover.Arrow (T I)
Y : C
f : Y ⟶ II.Y
hf : ((fun a => ↑a) ((pullback J II.f).obj (T I))).arrows f
⊢ ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) I.Y I.f (_ : (Cover.sieve S).arrows I.f)).arrows
    (f ≫ II.f)

tactic: exact hf
state_before: case a.mk
C : Type u
inst✝⁶ : Category C
J : GrothendieckTopology C
D : Type w
inst✝⁵ : Category D
inst✝⁴ : ConcreteCategory D
inst✝³ : PreservesLimits (forget D)
inst✝² : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
inst✝ : (X : C) → PreservesColimitsOfShape (Cover J X)ᵒᵖ (forget D)
P : Cᵒᵖ ⥤ D
hsep :
  ∀ (X : C) (S : Cover J X) (x y : (forget D).obj (P.obj X.op)),
    (∀ (I : Cover.Arrow S), (forget D).map (P.map I.f.op) x = (forget D).map (P.map I.f.op) y) → x = y
X : C
S : Cover J X
s : Meq (plusObj J P) S
inj : ∀ (X : C), Function.Injective ((forget D).map ((toPlus J P).app X.op))
T : (I : Cover.Arrow S) → Cover J I.Y
t : (I : Cover.Arrow S) → Meq P (T I)
ht : ∀ (I : Cover.Arrow S), ↑s I = mk (t I)
B : Cover J X := Cover.bind S T
Z : Cover.Arrow B → C
e1 : (I : Cover.Arrow B) → I.Y ⟶ Z I
e2 : (I : Cover.Arrow B) → Z I ⟶ X
he2 : ∀ (I : Cover.Arrow B), (Cover.sieve S).arrows (e2 I)
h✝ :
  ∀ (I : Cover.Arrow B),
    (fun Y f h => ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) Y f h).arrows) (Z I) (e2 I)
      (_ : (Cover.sieve S).arrows (e2 I)) (e1 I)
✝ : ∀ (I : Cover.Arrow B), e1 I ≫ e2 I = I.f
w : Meq P B := meqOfSep P hsep X S s T t ht
Y Y✝ : C
f✝ : Y✝ ⟶ X
hf✝ : (Cover.sieve S).arrows f✝
II : Cover.Arrow (T { Y := Y✝, f := f✝, hf := hf✝ })
f : Y ⟶ II.Y
hf : ((fun a => ↑a) ((pullback J II.f).obj (T { Y := Y✝, f := f✝, hf := hf✝ }))).arrows f
⊢ ((fun Y f hf => Cover.sieve (T { Y := Y, f := f, hf := hf })) { Y := Y✝, f := f✝, hf := hf✝ }.Y
        { Y := Y✝, f := f✝, hf := hf✝ }.f (_ : (Cover.sieve S).arrows { Y := Y✝, f := f✝, hf := hf✝ }.f)).arrows
    (f ≫ II.f)