[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
⊢ Inhabited (ColimitType F)
[PROOFSTEP]
dsimp [ColimitType]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
⊢ Inhabited (Quotient (colimitSetoid F))
[PROOFSTEP]
infer_instance
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
⊢ Monoid (ColimitType F)
[PROOFSTEP]
infer_instance
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
j j' : J
f : j ⟶ j'
⊢ F.map f ≫ coconeMorphism F j' = coconeMorphism F j
[PROOFSTEP]
ext
[GOAL]
case w
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
j j' : J
f : j ⟶ j'
x✝ : ↑(F.obj j)
⊢ ↑(F.map f ≫ coconeMorphism F j') x✝ = ↑(coconeMorphism F j) x✝
[PROOFSTEP]
apply Quot.sound
[GOAL]
case w.a
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
j j' : J
f : j ⟶ j'
x✝ : ↑(F.obj j)
⊢ Setoid.r (Prequotient.of j' (↑(F.map f) x✝)) (Prequotient.of j x✝)
[PROOFSTEP]
apply Relation.map
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
j j' : J
f : j ⟶ j'
x : ↑(F.obj j)
⊢ ↑(coconeMorphism F j') (↑(F.map f) x) = ↑(coconeMorphism F j) x
[PROOFSTEP]
rw [← cocone_naturality F f]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
j j' : J
f : j ⟶ j'
x : ↑(F.obj j)
⊢ ↑(coconeMorphism F j') (↑(F.map f) x) = ↑(F.map f ≫ coconeMorphism F j') x
[PROOFSTEP]
rfl
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
⊢ ColimitType F → ↑s.pt
[PROOFSTEP]
fapply Quot.lift
[GOAL]
case f
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
⊢ Prequotient F → ↑s.pt
[PROOFSTEP]
exact descFunLift F s
[GOAL]
case a
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
⊢ ∀ (a b : Prequotient F), Setoid.r a b → descFunLift F s a = descFunLift F s b
[PROOFSTEP]
intro x y r
[GOAL]
case a
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : Prequotient F
r : Setoid.r x y
⊢ descFunLift F s x = descFunLift F s y
[PROOFSTEP]
induction' r with _ _ _ _ h _ _ _ _ _ h₁ h₂ _ _ f x _ _ _ _ _ _ _ _ h _ _ _ _ h
[GOAL]
case a.refl
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s x✝ = descFunLift F s x✝
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.refl
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s x✝ = descFunLift F s x✝
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.symm
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ : Prequotient F
x✝ : Relation F x✝¹ y✝
h : descFunLift F s x✝¹ = descFunLift F s y✝
⊢ descFunLift F s y✝ = descFunLift F s x✝¹
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.symm
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ : Prequotient F
x✝ : Relation F x✝¹ y✝
h : descFunLift F s x✝¹ = descFunLift F s y✝
⊢ descFunLift F s y✝ = descFunLift F s x✝¹
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.trans
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝² y✝ z✝ : Prequotient F
x✝¹ : Relation F x✝² y✝
x✝ : Relation F y✝ z✝
h₁ : descFunLift F s x✝² = descFunLift F s y✝
h₂ : descFunLift F s y✝ = descFunLift F s z✝
⊢ descFunLift F s x✝² = descFunLift F s z✝
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.trans
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝² y✝ z✝ : Prequotient F
x✝¹ : Relation F x✝² y✝
x✝ : Relation F y✝ z✝
h₁ : descFunLift F s x✝² = descFunLift F s y✝
h₂ : descFunLift F s y✝ = descFunLift F s z✝
⊢ descFunLift F s x✝² = descFunLift F s z✝
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.map
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x✝ y : Prequotient F
j✝ j'✝ : J
f : j✝ ⟶ j'✝
x : ↑(F.obj j✝)
⊢ descFunLift F s (Prequotient.of j'✝ (↑(F.map f) x)) = descFunLift F s (Prequotient.of j✝ x)
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.map
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x✝ y : Prequotient F
j✝ j'✝ : J
f : j✝ ⟶ j'✝
x : ↑(F.obj j✝)
⊢ descFunLift F s (Prequotient.of j'✝ (↑(F.map f) x)) = descFunLift F s (Prequotient.of j✝ x)
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : Prequotient F
j✝ : J
x✝ y✝ : ↑(F.obj j✝)
⊢ descFunLift F s (Prequotient.of j✝ (x✝ * y✝)) = descFunLift F s (mul (Prequotient.of j✝ x✝) (Prequotient.of j✝ y✝))
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : Prequotient F
j✝ : J
x✝ y✝ : ↑(F.obj j✝)
⊢ descFunLift F s (Prequotient.of j✝ (x✝ * y✝)) = descFunLift F s (mul (Prequotient.of j✝ x✝) (Prequotient.of j✝ y✝))
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : Prequotient F
j✝ : J
⊢ descFunLift F s (Prequotient.of j✝ 1) = descFunLift F s one
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : Prequotient F
j✝ : J
⊢ descFunLift F s (Prequotient.of j✝ 1) = descFunLift F s one
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.mul_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ x'✝ y✝ : Prequotient F
x✝ : Relation F x✝¹ x'✝
h : descFunLift F s x✝¹ = descFunLift F s x'✝
⊢ descFunLift F s (mul x✝¹ y✝) = descFunLift F s (mul x'✝ y✝)
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.mul_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ x'✝ y✝ : Prequotient F
x✝ : Relation F x✝¹ x'✝
h : descFunLift F s x✝¹ = descFunLift F s x'✝
⊢ descFunLift F s (mul x✝¹ y✝) = descFunLift F s (mul x'✝ y✝)
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.mul_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ y'✝ : Prequotient F
x✝ : Relation F y✝ y'✝
h : descFunLift F s y✝ = descFunLift F s y'✝
⊢ descFunLift F s (mul x✝¹ y✝) = descFunLift F s (mul x✝¹ y'✝)
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.mul_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ y'✝ : Prequotient F
x✝ : Relation F y✝ y'✝
h : descFunLift F s y✝ = descFunLift F s y'✝
⊢ descFunLift F s (mul x✝¹ y✝) = descFunLift F s (mul x✝¹ y'✝)
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.mul_assoc
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ y✝ z✝ : Prequotient F
⊢ descFunLift F s (mul (mul x✝ y✝) z✝) = descFunLift F s (mul x✝ (mul y✝ z✝))
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.mul_assoc
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ y✝ z✝ : Prequotient F
⊢ descFunLift F s (mul (mul x✝ y✝) z✝) = descFunLift F s (mul x✝ (mul y✝ z✝))
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.one_mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s (mul one x✝) = descFunLift F s x✝
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.one_mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s (mul one x✝) = descFunLift F s x✝
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.mul_one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s (mul x✝ one) = descFunLift F s x✝
[PROOFSTEP]
try
  simp
    -- symm
[GOAL]
case a.mul_one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ : Prequotient F
⊢ descFunLift F s (mul x✝ one) = descFunLift F s x✝
[PROOFSTEP]
simp
  -- symm
[GOAL]
case a.symm
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ : Prequotient F
x✝ : Relation F x✝¹ y✝
h : descFunLift F s x✝¹ = descFunLift F s y✝
⊢ descFunLift F s y✝ = descFunLift F s x✝¹
[PROOFSTEP]
exact h.symm
[GOAL]
case a.trans
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝² y✝ z✝ : Prequotient F
x✝¹ : Relation F x✝² y✝
x✝ : Relation F y✝ z✝
h₁ : descFunLift F s x✝² = descFunLift F s y✝
h₂ : descFunLift F s y✝ = descFunLift F s z✝
⊢ descFunLift F s x✝² = descFunLift F s z✝
[PROOFSTEP]
exact h₁.trans h₂
[GOAL]
case a.map
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x✝ y : Prequotient F
j✝ j'✝ : J
f : j✝ ⟶ j'✝
x : ↑(F.obj j✝)
⊢ ↑(NatTrans.app s.ι j'✝) (↑(F.map f) x) = ↑(NatTrans.app s.ι j✝) x
[PROOFSTEP]
exact s.w_apply f x
[GOAL]
case a.mul_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ x'✝ y✝ : Prequotient F
x✝ : Relation F x✝¹ x'✝
h : descFunLift F s x✝¹ = descFunLift F s x'✝
⊢ descFunLift F s x✝¹ * descFunLift F s y✝ = descFunLift F s x'✝ * descFunLift F s y✝
[PROOFSTEP]
rw [h]
  -- mul_2
[GOAL]
case a.mul_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝¹ y✝ y'✝ : Prequotient F
x✝ : Relation F y✝ y'✝
h : descFunLift F s y✝ = descFunLift F s y'✝
⊢ descFunLift F s x✝¹ * descFunLift F s y✝ = descFunLift F s x✝¹ * descFunLift F s y'✝
[PROOFSTEP]
rw [h]
  -- mul_assoc
[GOAL]
case a.mul_assoc
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y x✝ y✝ z✝ : Prequotient F
⊢ descFunLift F s x✝ * descFunLift F s y✝ * descFunLift F s z✝ =
    descFunLift F s x✝ * (descFunLift F s y✝ * descFunLift F s z✝)
[PROOFSTEP]
rw [mul_assoc]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
x y : ↑(colimit F)
⊢ OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } (x * y) =
    OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } x *
      OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } y
[PROOFSTEP]
induction x using Quot.inductionOn
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
y : ↑(colimit F)
a✝ : Prequotient F
⊢ OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } (Quot.mk Setoid.r a✝ * y) =
    OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } (Quot.mk Setoid.r a✝) *
      OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } y
[PROOFSTEP]
induction y using Quot.inductionOn
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
a✝¹ a✝ : Prequotient F
⊢ OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) }
      (Quot.mk Setoid.r a✝¹ * Quot.mk Setoid.r a✝) =
    OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } (Quot.mk Setoid.r a✝¹) *
      OneHom.toFun { toFun := descFun F s, map_one' := (_ : descFun F s 1 = descFun F s 1) } (Quot.mk Setoid.r a✝)
[PROOFSTEP]
dsimp [descFun]
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
a✝¹ a✝ : Prequotient F
⊢ Quot.lift (descFunLift F s) (_ : ∀ (x y : Prequotient F), Setoid.r x y → descFunLift F s x = descFunLift F s y)
      (Quot.mk Setoid.r a✝¹ * Quot.mk Setoid.r a✝) =
    descFunLift F s a✝¹ * descFunLift F s a✝
[PROOFSTEP]
rw [← quot_mul]
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
a✝¹ a✝ : Prequotient F
⊢ Quot.lift (descFunLift F s) (_ : ∀ (x y : Prequotient F), Setoid.r x y → descFunLift F s x = descFunLift F s y)
      (Quot.mk Setoid.r (mul a✝¹ a✝)) =
    descFunLift F s a✝¹ * descFunLift F s a✝
[PROOFSTEP]
simp only [descFunLift]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
⊢ m = (fun s => descMorphism F s) s
[PROOFSTEP]
ext x
[GOAL]
case w
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x : ↑(colimitCocone F).pt
⊢ ↑m x = ↑((fun s => descMorphism F s) s) x
[PROOFSTEP]
induction' x using Quot.inductionOn with x
[GOAL]
case w.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x : Prequotient F
⊢ ↑m (Quot.mk Setoid.r x) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x)
[PROOFSTEP]
induction' x with j x x y hx hy
[GOAL]
case w.h.of
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
j : J
x : ↑(F.obj j)
⊢ ↑m (Quot.mk Setoid.r (Prequotient.of j x)) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r (Prequotient.of j x))
[PROOFSTEP]
change _ = s.ι.app j _
[GOAL]
case w.h.of
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
j : J
x : ↑(F.obj j)
⊢ ↑m (Quot.mk Setoid.r (Prequotient.of j x)) = ↑(NatTrans.app s.ι j) x
[PROOFSTEP]
rw [← w j]
[GOAL]
case w.h.of
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
j : J
x : ↑(F.obj j)
⊢ ↑m (Quot.mk Setoid.r (Prequotient.of j x)) = ↑(NatTrans.app (colimitCocone F).ι j ≫ m) x
[PROOFSTEP]
rfl
[GOAL]
case w.h.one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
⊢ ↑m (Quot.mk Setoid.r one) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r one)
[PROOFSTEP]
rw [quot_one, map_one]
[GOAL]
case w.h.one
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
⊢ 1 = ↑((fun s => descMorphism F s) s) 1
[PROOFSTEP]
rfl
[GOAL]
case w.h.mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x y : Prequotient F
hx : ↑m (Quot.mk Setoid.r x) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x)
hy : ↑m (Quot.mk Setoid.r y) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r y)
⊢ ↑m (Quot.mk Setoid.r (mul x y)) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r (mul x y))
[PROOFSTEP]
rw [quot_mul, map_mul, hx, hy]
[GOAL]
case w.h.mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x y : Prequotient F
hx : ↑m (Quot.mk Setoid.r x) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x)
hy : ↑m (Quot.mk Setoid.r y) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r y)
⊢ ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x) * ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r y) =
    ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x * Quot.mk Setoid.r y)
[PROOFSTEP]
dsimp [descMorphism, FunLike.coe, descFun]
[GOAL]
case w.h.mul
J : Type v
inst✝ : SmallCategory J
F : J ⥤ MonCat
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x y : Prequotient F
hx : ↑m (Quot.mk Setoid.r x) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r x)
hy : ↑m (Quot.mk Setoid.r y) = ↑((fun s => descMorphism F s) s) (Quot.mk Setoid.r y)
⊢ descFunLift F s x * descFunLift F s y =
    Quot.lift (descFunLift F s) (_ : ∀ (x y : Prequotient F), Setoid.r x y → descFunLift F s x = descFunLift F s y)
      (Quot.mk Setoid.r x * Quot.mk Setoid.r y)
[PROOFSTEP]
simp only [← quot_mul, descFunLift]


[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
S : Sieve X
g : Y ⟶ X
⊢ S ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) X →
    Sieve.pullback g S ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) Y
[PROOFSTEP]
rintro ⟨R, hR, RS⟩
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
S : Sieve X
g : Y ⟶ X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ Sieve.pullback g S ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) Y
[PROOFSTEP]
refine' ⟨_, K.pullbacks g _ hR, _⟩
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
S : Sieve X
g : Y ⟶ X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ pullbackArrows g R ≤ (Sieve.pullback g S).arrows
[PROOFSTEP]
rw [← Sieve.sets_iff_generate, Sieve.pullbackArrows_comm]
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
S : Sieve X
g : Y ⟶ X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ Sieve.pullback g (Sieve.generate R) ≤ Sieve.pullback g S
[PROOFSTEP]
apply Sieve.pullback_monotone
[GOAL]
case intro.intro.a
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
S : Sieve X
g : Y ⟶ X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ Sieve.generate R ≤ S
[PROOFSTEP]
rwa [Sieve.giGenerate.gc]
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
⊢ ∀ ⦃X : C⦄ ⦃S : Sieve X⦄,
    S ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) X →
      ∀ (R : Sieve X),
        (∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
            S.arrows f → Sieve.pullback f R ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) Y) →
          R ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) X
[PROOFSTEP]
rintro X S ⟨R', hR', RS⟩ R t
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X : C
S : Sieve X
R' : Presieve X
hR' : R' ∈ coverings K X
RS : R' ≤ S.arrows
R : Sieve X
t : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, S.arrows f → Sieve.pullback f R ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) Y
⊢ R ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) X
[PROOFSTEP]
choose t₁ t₂ t₃ using t
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X : C
S : Sieve X
R' : Presieve X
hR' : R' ∈ coverings K X
RS : R' ≤ S.arrows
R : Sieve X
t₁ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → S.arrows f → Presieve Y
t₂ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ∈ coverings K Y
t₃ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ≤ (Sieve.pullback f R).arrows
⊢ R ∈ (fun X S => ∃ R, R ∈ coverings K X ∧ R ≤ S.arrows) X
[PROOFSTEP]
refine' ⟨_, K.Transitive _ _ hR' fun _ f hf => t₂ (RS _ hf), _⟩
[GOAL]
case intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X : C
S : Sieve X
R' : Presieve X
hR' : R' ∈ coverings K X
RS : R' ≤ S.arrows
R : Sieve X
t₁ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → S.arrows f → Presieve Y
t₂ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ∈ coverings K Y
t₃ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ≤ (Sieve.pullback f R).arrows
⊢ (Presieve.bind R' fun x f hf => t₁ (_ : f ∈ S.arrows)) ≤ R.arrows
[PROOFSTEP]
rintro Y _ ⟨Z, g, f, hg, hf, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X : C
S : Sieve X
R' : Presieve X
hR' : R' ∈ coverings K X
RS : R' ≤ S.arrows
R : Sieve X
t₁ : ⦃Y : C⦄ → ⦃f : Y ⟶ X⦄ → S.arrows f → Presieve Y
t₂ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ∈ coverings K Y
t₃ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄ (a : S.arrows f), t₁ a ≤ (Sieve.pullback f R).arrows
Y Z : C
g : Y ⟶ Z
f : Z ⟶ X
hg : R' f
hf : t₁ (_ : f ∈ S.arrows) g
⊢ g ≫ f ∈ R.arrows
[PROOFSTEP]
apply t₃ (RS _ hg) _ hf
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X Y : C
f : Y ⟶ X
i : IsIso f
⊢ Sieve.generate (Presieve.singleton f) = ⊤
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X Y : C
f : Y ⟶ X
R : Presieve X
hR : R ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
⊢ pullbackArrows f R ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
[PROOFSTEP]
simp only [Set.mem_def, Sieve.pullbackArrows_comm]
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X Y : C
f : Y ⟶ X
R : Presieve X
hR : R ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
⊢ GrothendieckTopology.sieves J Y (Sieve.pullback f (Sieve.generate R))
[PROOFSTEP]
apply J.pullback_stable f hR
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
⊢ Presieve.bind S Ti ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
[PROOFSTEP]
apply J.transitive hS
[GOAL]
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    (Sieve.generate S).arrows f →
      Sieve.pullback f (Sieve.generate (Presieve.bind S Ti)) ∈ GrothendieckTopology.sieves J Y
[PROOFSTEP]
intro Y f
[GOAL]
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y : C
f : Y ⟶ X
⊢ (Sieve.generate S).arrows f → Sieve.pullback f (Sieve.generate (Presieve.bind S Ti)) ∈ GrothendieckTopology.sieves J Y
[PROOFSTEP]
rintro ⟨Z, g, f, hf, rfl⟩
[GOAL]
case h.intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y Z : C
g : Y ⟶ Z
f : Z ⟶ X
hf : S f
⊢ Sieve.pullback (g ≫ f) (Sieve.generate (Presieve.bind S Ti)) ∈ GrothendieckTopology.sieves J Y
[PROOFSTEP]
rw [Sieve.pullback_comp]
[GOAL]
case h.intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y Z : C
g : Y ⟶ Z
f : Z ⟶ X
hf : S f
⊢ Sieve.pullback g (Sieve.pullback f (Sieve.generate (Presieve.bind S Ti))) ∈ GrothendieckTopology.sieves J Y
[PROOFSTEP]
apply J.pullback_stable g
[GOAL]
case h.intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y Z : C
g : Y ⟶ Z
f : Z ⟶ X
hf : S f
⊢ Sieve.pullback f (Sieve.generate (Presieve.bind S Ti)) ∈ GrothendieckTopology.sieves J Z
[PROOFSTEP]
apply J.superset_covering _ (hTi _ hf)
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y Z : C
g : Y ⟶ Z
f : Z ⟶ X
hf : S f
⊢ Sieve.generate (Ti f hf) ≤ Sieve.pullback f (Sieve.generate (Presieve.bind S Ti))
[PROOFSTEP]
rintro Y g ⟨W, h, g, hg, rfl⟩
[GOAL]
case intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y✝ Z : C
g✝ : Y✝ ⟶ Z
f : Z ⟶ X
hf : S f
Y W : C
h : Y ⟶ W
g : W ⟶ Z
hg : Ti f hf g
⊢ (Sieve.pullback f (Sieve.generate (Presieve.bind S Ti))).arrows (h ≫ g)
[PROOFSTEP]
exact ⟨_, h, _, ⟨_, _, _, hf, hg, rfl⟩, by simp⟩
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
J : GrothendieckTopology C
X : C
S : Presieve X
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y
hS : S ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) X
hTi : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X R => Sieve.generate R ∈ GrothendieckTopology.sieves J X) Y
Y✝ Z : C
g✝ : Y✝ ⟶ Z
f : Z ⟶ X
hf : S f
Y W : C
h : Y ⟶ W
g : W ⟶ Z
hg : Ti f hf g
⊢ h ≫ g ≫ f = (h ≫ g) ≫ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
⊢ toGrothendieck C K ≤ J ↔ K ≤ ofGrothendieck C J
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
⊢ toGrothendieck C K ≤ J → K ≤ ofGrothendieck C J
[PROOFSTEP]
intro h X R hR
[GOAL]
case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
h : toGrothendieck C K ≤ J
X : C
R : Presieve X
hR : R ∈ coverings K X
⊢ R ∈ coverings (ofGrothendieck C J) X
[PROOFSTEP]
exact h _ ⟨_, hR, Sieve.le_generate R⟩
[GOAL]
case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
⊢ K ≤ ofGrothendieck C J → toGrothendieck C K ≤ J
[PROOFSTEP]
rintro h X S ⟨R, hR, RS⟩
[GOAL]
case mpr.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
h : K ≤ ofGrothendieck C J
X : C
S : Sieve X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ S ∈ GrothendieckTopology.sieves J X
[PROOFSTEP]
apply J.superset_covering _ (h _ hR)
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
J : GrothendieckTopology C
h : K ≤ ofGrothendieck C J
X : C
S : Sieve X
R : Presieve X
hR : R ∈ coverings K X
RS : R ≤ S.arrows
⊢ Sieve.generate R ≤ S
[PROOFSTEP]
rwa [Sieve.giGenerate.gc]
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
S : Presieve X
⊢ S ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) X →
    pullbackArrows f S ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
[PROOFSTEP]
rintro ⟨Z, g, i, rfl⟩
[GOAL]
case intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ pullbackArrows f (Presieve.singleton g) ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
[PROOFSTEP]
refine' ⟨pullback g f, pullback.snd, _, _⟩
[GOAL]
case intro.intro.intro.refine'_1
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ IsIso pullback.snd
[PROOFSTEP]
refine' ⟨⟨pullback.lift (f ≫ inv g) (𝟙 _) (by simp), ⟨_, by aesop_cat⟩⟩⟩
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ (f ≫ inv g) ≫ g = 𝟙 Y ≫ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ pullback.lift (f ≫ inv g) (𝟙 Y) (_ : (f ≫ inv g) ≫ g = 𝟙 Y ≫ f) ≫ pullback.snd = 𝟙 Y
[PROOFSTEP]
aesop_cat
[GOAL]
case intro.intro.intro.refine'_1
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ pullback.snd ≫ pullback.lift (f ≫ inv g) (𝟙 Y) (_ : (f ≫ inv g) ≫ g = 𝟙 Y ≫ f) = 𝟙 (pullback g f)
[PROOFSTEP]
ext
[GOAL]
case intro.intro.intro.refine'_1.h₀
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ (pullback.snd ≫ pullback.lift (f ≫ inv g) (𝟙 Y) (_ : (f ≫ inv g) ≫ g = 𝟙 Y ≫ f)) ≫ pullback.fst =
    𝟙 (pullback g f) ≫ pullback.fst
[PROOFSTEP]
rw [assoc, pullback.lift_fst, ← pullback.condition_assoc]
[GOAL]
case intro.intro.intro.refine'_1.h₀
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ pullback.fst ≫ g ≫ inv g = 𝟙 (pullback g f) ≫ pullback.fst
[PROOFSTEP]
simp
[GOAL]
case intro.intro.intro.refine'_1.h₁
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ (pullback.snd ≫ pullback.lift (f ≫ inv g) (𝟙 Y) (_ : (f ≫ inv g) ≫ g = 𝟙 Y ≫ f)) ≫ pullback.snd =
    𝟙 (pullback g f) ≫ pullback.snd
[PROOFSTEP]
simp
[GOAL]
case intro.intro.intro.refine'_2
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Y : C
f : Y ⟶ X
Z : C
g : Z ⟶ X
i : IsIso g
⊢ pullbackArrows f (Presieve.singleton g) = Presieve.singleton pullback.snd
[PROOFSTEP]
apply pullback_singleton
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
⊢ ∀ ⦃X : C⦄ (S : Presieve X) (Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → S f → Presieve Y),
    S ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) X →
      (∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : S f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y) →
        Presieve.bind S Ti ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) X
[PROOFSTEP]
rintro X S Ti ⟨Z, g, i, rfl⟩ hS
[GOAL]
case intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
⊢ Presieve.bind (Presieve.singleton g) Ti ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) X
[PROOFSTEP]
rcases hS g (singleton_self g) with ⟨Y, f, i, hTi⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
⊢ Presieve.bind (Presieve.singleton g) Ti ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) X
[PROOFSTEP]
refine' ⟨_, f ≫ g, _, _⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_1
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
⊢ IsIso (f ≫ g)
[PROOFSTEP]
infer_instance
  -- Porting note: the next four lines were just "ext (W k)"
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
⊢ Presieve.bind (Presieve.singleton g) Ti = Presieve.singleton (f ≫ g)
[PROOFSTEP]
apply funext
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
⊢ ∀ (x : C), Presieve.bind (Presieve.singleton g) Ti = Presieve.singleton (f ≫ g)
[PROOFSTEP]
rintro W
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W : C
⊢ Presieve.bind (Presieve.singleton g) Ti = Presieve.singleton (f ≫ g)
[PROOFSTEP]
apply Set.ext
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W : C
⊢ ∀ (x : W ⟶ X), x ∈ Presieve.bind (Presieve.singleton g) Ti ↔ x ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
rintro k
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W : C
k : W ⟶ X
⊢ k ∈ Presieve.bind (Presieve.singleton g) Ti ↔ k ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
constructor
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W : C
k : W ⟶ X
⊢ k ∈ Presieve.bind (Presieve.singleton g) Ti → k ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
rintro ⟨V, h, k, ⟨_⟩, hh, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mp.intro.intro.intro.intro.mk.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W Y : C
h : W ⟶ Z
hh : Ti g (_ : singleton' g g) h
⊢ h ≫ g ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
rw [hTi] at hh
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mp.intro.intro.intro.intro.mk.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W Y : C
h : W ⟶ Z
hh : Presieve.singleton f h
⊢ h ≫ g ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
cases hh
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mp.intro.intro.intro.intro.mk.intro.mk
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
Y : C
⊢ f ≫ g ∈ Presieve.singleton (f ≫ g)
[PROOFSTEP]
apply singleton.mk
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y : C
f : Y ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
W : C
k : W ⟶ X
⊢ k ∈ Presieve.singleton (f ≫ g) → k ∈ Presieve.bind (Presieve.singleton g) Ti
[PROOFSTEP]
rintro ⟨_⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mpr.mk
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
Y : C
⊢ f ≫ g ∈ Presieve.bind (Presieve.singleton g) Ti
[PROOFSTEP]
refine' bind_comp g singleton.mk _
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mpr.mk
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
Y : C
⊢ Ti g (_ : Presieve.singleton g g) f
[PROOFSTEP]
rw [hTi]
[GOAL]
case intro.intro.intro.intro.intro.intro.refine'_2.h.h.mpr.mk
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
X Z : C
g : Z ⟶ X
i✝ : IsIso g
Ti : ⦃Y : C⦄ → (f : Y ⟶ X) → Presieve.singleton g f → Presieve Y
hS : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (H : Presieve.singleton g f), Ti f H ∈ (fun X S => ∃ Y f x, S = Presieve.singleton f) Y
Y✝ : C
f : Y✝ ⟶ Z
i : IsIso f
hTi : Ti g (_ : Presieve.singleton g g) = Presieve.singleton f
Y : C
⊢ Presieve.singleton f f
[PROOFSTEP]
apply singleton.mk
[GOAL]
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X : C
R : Presieve X
⊢ R ∈ coverings ⊥ X → R ∈ coverings K X
[PROOFSTEP]
rintro ⟨Y, f, hf, rfl⟩
[GOAL]
case intro.intro.intro
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasPullbacks C
K : Pretopology C
X Y : C
f : Y ⟶ X
hf : IsIso f
⊢ Presieve.singleton f ∈ coverings K X
[PROOFSTEP]
exact K.has_isos f