Skip to content

Commit 58d8468

Browse files
committed
chore(CategoryTheory/Limits): add IsColimit.nonempty_isColimit_iff_isIso_desc and golf (leanprover-community#34237)
We also fix the name of `Cofan.isColimit_iff_isIso_sigmaDesc` and turn the `iff` around.
1 parent 97eec2f commit 58d8468

5 files changed

Lines changed: 30 additions & 20 deletions

File tree

Mathlib/AlgebraicGeometry/Limits.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ lemma nonempty_isColimit_cofanMk_of [Small.{u} σ]
305305
have : IsOpenImmersion (Sigma.desc f) := by
306306
refine isOpenImmersion_sigmaDesc _ _ (fun i j hij ↦ ?_)
307307
simpa [Function.onFun_apply, disjoint_iff, Opens.ext_iff] using hdisj hij
308-
simp only [Cofan.isColimit_iff_isIso_sigmaDesc (Cofan.mk S f), cofan_mk_inj, Cofan.mk_pt]
308+
simp only [Cofan.nonempty_isColimit_iff_isIso_sigmaDesc (Cofan.mk S f), cofan_mk_inj, Cofan.mk_pt]
309309
apply isIso_of_isOpenImmersion_of_opensRange_eq_top
310310
rw [eq_top_iff]
311311
intro x hx

Mathlib/CategoryTheory/Extensive.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -541,9 +541,9 @@ lemma FinitaryPreExtensive.isIso_sigmaDesc_fst [FinitaryPreExtensive C] {α : Ty
541541
{X : C} {Z : α → C} (π : (a : α) → Z a ⟶ X) {Y : C} (f : Y ⟶ X) (hπ : IsIso (Sigma.desc π)) :
542542
IsIso (Sigma.desc ((fun _ ↦ pullback.fst _ _) : (a : α) → pullback f (π a) ⟶ _)) := by
543543
let c := (Cofan.mk _ ((fun _ ↦ pullback.fst _ _) : (a : α) → pullback f (π a) ⟶ _))
544-
apply c.isColimit_iff_isIso_sigmaDesc.mpr
544+
apply c.nonempty_isColimit_iff_isIso_sigmaDesc.mp
545545
have hau : IsUniversalColimit (Cofan.mk X π) := FinitaryPreExtensive.isUniversal_finiteCoproducts
546-
((Cofan.isColimit_iff_isIso_sigmaDesc _).mp hπ).some
546+
((Cofan.nonempty_isColimit_iff_isIso_sigmaDesc _).mpr hπ).some
547547
refine hau.nonempty_isColimit_of_pullbackCone_left _ (𝟙 _) _ _ (fun i ↦ ?_)
548548
(PullbackCone.mk (𝟙 _) f (by simp)) (IsPullback.id_horiz f).isLimit _ (Iso.refl _)
549549
(by simp) (by simp [c]) (by simp [pullback.condition, c])
@@ -561,7 +561,7 @@ instance FinitaryPreExtensive.isIso_sigmaDesc_map [HasPullbacks C] [FinitaryPreE
561561
let c : Cofan _ := Cofan.mk _ <| fun (p : ι × ι') ↦
562562
pullback.map (f p.1) (g p.2) (Sigma.desc f) (Sigma.desc g) (Sigma.ι _ p.1)
563563
(Sigma.ι _ p.2) (𝟙 S) (by simp) (by simp)
564-
apply c.isColimit_iff_isIso_sigmaDesc.mpr
564+
apply c.nonempty_isColimit_iff_isIso_sigmaDesc.mp
565565
refine IsUniversalColimit.nonempty_isColimit_prod_of_pullbackCone
566566
(a := Cofan.mk _ <| fun i ↦ Sigma.ι _ i) (b := Cofan.mk _ <| fun i ↦ Sigma.ι _ i)
567567
?_ ?_ f g (Sigma.desc f) (Sigma.desc g) (fun i j ↦ (pullback.cone (f i) (g j)))

Mathlib/CategoryTheory/Limits/IsLimit.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ theorem hom_ext (h : IsLimit t) {W : C} {f f' : W ⟶ t.pt}
201201
f = f' := by
202202
rw [h.hom_lift f, h.hom_lift f']; congr; exact funext w
203203

204+
lemma nonempty_isLimit_iff_isIso_lift {s t : Cone F} (hs : IsLimit s) :
205+
Nonempty (IsLimit t) ↔ IsIso (hs.lift t) :=
206+
fun ⟨ht⟩ ↦ ⟨ht.lift s, ht.hom_ext (by simp), hs.hom_ext (by simp)⟩, fun h ↦ ⟨hs.ofPointIso⟩⟩
207+
204208
/-- Given a right adjoint functor between categories of cones,
205209
the image of a limit cone is a limit cone.
206210
-/
@@ -671,6 +675,10 @@ theorem hom_ext (h : IsColimit t) {W : C} {f f' : t.pt ⟶ W}
671675
(w : ∀ j, t.ι.app j ≫ f = t.ι.app j ≫ f') : f = f' := by
672676
rw [h.hom_desc f, h.hom_desc f']; congr; exact funext w
673677

678+
lemma nonempty_isColimit_iff_isIso_desc {s t : Cocone F} (hs : IsColimit s) :
679+
Nonempty (IsColimit t) ↔ IsIso (hs.desc t) :=
680+
fun ⟨ht⟩ ↦ ⟨ht.desc s, hs.hom_ext (by simp), ht.hom_ext (by simp)⟩, fun h ↦ ⟨hs.ofPointIso⟩⟩
681+
674682
/-- Given a left adjoint functor between categories of cocones,
675683
the image of a colimit cocone is a colimit cocone.
676684
-/

Mathlib/CategoryTheory/Limits/Shapes/Products.lean

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,16 @@ def Fan.ext {f : β → C} {c₁ c₂ : Fan f} (e : c₁.pt ≅ c₂.pt)
257257
(w : ∀ (b : β), c₁.proj b = e.hom ≫ c₂.proj b := by cat_disch) : c₁ ≅ c₂ :=
258258
Cones.ext e (fun ⟨j⟩ => w j)
259259

260+
/-- A fan `c` on `f` such that the induced map `c.pt ⟶ ∏ f` is an iso, is a product. -/
261+
def Fan.isLimitOfIsIsoPiLift {f : β → C} [HasProduct f] (c : Fan f)
262+
[hc : IsIso (Pi.lift c.proj)] : IsLimit c :=
263+
IsLimit.ofIsoLimit (limit.isLimit (Discrete.functor f))
264+
(Fan.ext (@asIso _ _ _ _ _ hc) (fun _ => (limit.lift_π _ _).symm)).symm
265+
266+
lemma Fan.nonempty_isLimit_iff_isIso_piLift {f : β → C} [HasProduct f] (c : Fan f) :
267+
Nonempty (IsLimit c) ↔ IsIso (Pi.lift c.proj) :=
268+
(limit.isLimit (Discrete.functor f)).nonempty_isLimit_iff_isIso_lift
269+
260270
/-- A collection of morphisms `f b ⟶ P` induces a morphism `∐ f ⟶ P`. -/
261271
abbrev Sigma.desc {f : β → C} [HasCoproduct f] {P : C} (p : ∀ b, f b ⟶ P) : ∐ f ⟶ P :=
262272
colimit.desc _ (Cofan.mk P p)
@@ -283,20 +293,12 @@ def Cofan.isColimitOfIsIsoSigmaDesc {f : β → C} [HasCoproduct f] (c : Cofan f
283293
IsColimit.ofIsoColimit (colimit.isColimit (Discrete.functor f))
284294
(Cofan.ext (@asIso _ _ _ _ _ hc) (fun _ => colimit.ι_desc _ _))
285295

286-
set_option linter.flexible false in -- simp followed by infer_instance
287-
lemma Cofan.isColimit_iff_isIso_sigmaDesc {f : β → C} [HasCoproduct f] (c : Cofan f) :
288-
IsIso (Sigma.desc c.inj) ↔ Nonempty (IsColimit c) := by
289-
refine ⟨fun h ↦ ⟨isColimitOfIsIsoSigmaDesc c⟩, fun ⟨hc⟩ ↦ ?_⟩
290-
have : IsIso (((coproductIsCoproduct f).coconePointUniqueUpToIso hc).hom ≫ hc.desc c) := by
291-
simp; infer_instance
292-
convert this
293-
ext
294-
simp only [colimit.ι_desc, mk_pt, mk_ι_app, IsColimit.coconePointUniqueUpToIso,
295-
coproductIsCoproduct, colimit.cocone_x, Functor.mapIso_hom, IsColimit.uniqueUpToIso_hom,
296-
Cocones.forget_map, IsColimit.descCoconeMorphism_hom, IsColimit.ofIsoColimit_desc,
297-
Cocones.ext_inv_hom, Iso.refl_inv, colimit.isColimit_desc, Category.id_comp,
298-
IsColimit.desc_self, Category.comp_id]
299-
rfl
296+
lemma Cofan.nonempty_isColimit_iff_isIso_sigmaDesc {f : β → C} [HasCoproduct f] (c : Cofan f) :
297+
Nonempty (IsColimit c) ↔ IsIso (Sigma.desc c.inj) :=
298+
(colimit.isColimit (Discrete.functor f)).nonempty_isColimit_iff_isIso_desc
299+
300+
@[deprecated (since := "2026-01-21")]
301+
alias Cofan.isColimit_iff_isIso_sigmaDesc := Cofan.nonempty_isColimit_iff_isIso_sigmaDesc
300302

301303
/-- A coproduct of coproducts is a coproduct -/
302304
def Cofan.isColimitTrans {X : α → C} (c : Cofan X) (hc : IsColimit c)

Mathlib/CategoryTheory/Sites/Coherent/ExtensiveTopology.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ lemma extensiveTopology.mem_sieves_iff_contains_colimit_cofan {X : C} (S : Sieve
5858
apply (extensiveCoverage C).mem_toGrothendieck_sieves_of_superset (R := Presieve.ofArrows Y π)
5959
· exact fun _ _ hh ↦ by cases hh; exact h' _
6060
· refine ⟨α, inferInstance, Y, π, rfl, ?_⟩
61-
rw [show IsIso (Sigma.desc π) ↔ _ from
62-
Limits.Cofan.isColimit_iff_isIso_sigmaDesc (c := Cofan.mk X π)]
61+
rw [show _ ↔ IsIso (Sigma.desc π) from
62+
Limits.Cofan.nonempty_isColimit_iff_isIso_sigmaDesc (c := Cofan.mk X π)]
6363
exact h
6464

6565
end CategoryTheory

0 commit comments

Comments
 (0)