Module docstring
{"# Categories with finite limits.
A typeclass for categories with all finite (co)limits. "}
{"# Categories with finite limits.
A typeclass for categories with all finite (co)limits. "}
CategoryTheory.Limits.HasFiniteLimits
structure
/-- A category has all finite limits if every functor `J ℤ C` with a `FinCategory J`
instance and `J : Type` has a limit.
This is often called 'finitely complete'.
-/
class HasFiniteLimits : Prop where
/-- `C` has all limits over any type `J` whose objects and morphisms lie in the same universe
and which has `FinType` objects and morphisms -/
out (J : Type) [š„ : SmallCategory J] [@FinCategory J š„] : @HasLimitsOfShape J š„ C _
CategoryTheory.Limits.hasLimitsOfShape_of_hasFiniteLimits
instance
[HasFiniteLimits C] (J : Type w) [SmallCategory J] [FinCategory J] : HasLimitsOfShape J C
instance (priority := 100) hasLimitsOfShape_of_hasFiniteLimits [HasFiniteLimits C] (J : Type w)
[SmallCategory J] [FinCategory J] : HasLimitsOfShape J C := by
apply @hasLimitsOfShape_of_equivalence _ _ _ _ _ _ (FinCategory.equivAsType J) ?_
apply HasFiniteLimits.out
CategoryTheory.Limits.hasFiniteLimits_of_hasLimitsOfSize
theorem
[HasLimitsOfSize.{v', u'} C] : HasFiniteLimits C
lemma hasFiniteLimits_of_hasLimitsOfSize [HasLimitsOfSize.{v', u'} C] :
HasFiniteLimits C where
out := fun J hJ hJ' =>
haveI := hasLimitsOfSizeShrink.{0, 0} C
let F := @FinCategory.equivAsType J (@FinCategory.fintypeObj J hJ hJ') hJ hJ'
@hasLimitsOfShape_of_equivalence (@FinCategory.AsType J (@FinCategory.fintypeObj J hJ hJ'))
(@FinCategory.categoryAsType J (@FinCategory.fintypeObj J hJ hJ') hJ hJ') _ _ J hJ F _
CategoryTheory.Limits.hasFiniteLimits_of_hasLimits
instance
[HasLimits C] : HasFiniteLimits C
/-- If `C` has all limits, it has finite limits. -/
instance (priority := 100) hasFiniteLimits_of_hasLimits [HasLimits C] : HasFiniteLimits C :=
hasFiniteLimits_of_hasLimitsOfSize C
CategoryTheory.Limits.hasFiniteLimits_of_hasLimitsOfSizeā
instance
[HasLimitsOfSize.{0, 0} C] : HasFiniteLimits C
instance (priority := 90) hasFiniteLimits_of_hasLimitsOfSizeā [HasLimitsOfSize.{0, 0} C] :
HasFiniteLimits C :=
hasFiniteLimits_of_hasLimitsOfSize C
CategoryTheory.Limits.hasFiniteLimits_of_hasFiniteLimits_of_size
theorem
(h : ā (J : Type w) {š„ : SmallCategory J} (_ : @FinCategory J š„), HasLimitsOfShape J C) : HasFiniteLimits C
/-- We can always derive `HasFiniteLimits C` by providing limits at an
arbitrary universe. -/
theorem hasFiniteLimits_of_hasFiniteLimits_of_size
(h : ā (J : Type w) {š„ : SmallCategory J} (_ : @FinCategory J š„), HasLimitsOfShape J C) :
HasFiniteLimits C where
out := fun J hJ hhJ => by
haveI := h (ULiftHom.{w} (ULift.{w} J)) <| @CategoryTheory.finCategoryUlift J hJ hhJ
have l : @Equivalence J (ULiftHom (ULift J)) hJ
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) :=
@ULiftHomULiftCategory.equiv J hJ
apply @hasLimitsOfShape_of_equivalence (ULiftHom (ULift J))
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) C _ J hJ
(@Equivalence.symm J hJ (ULiftHom (ULift J))
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) l) _
CategoryTheory.Limits.HasFiniteColimits
structure
/-- A category has all finite colimits if every functor `J ℤ C` with a `FinCategory J`
instance and `J : Type` has a colimit.
This is often called 'finitely cocomplete'.
-/
class HasFiniteColimits : Prop where
/-- `C` has all colimits over any type `J` whose objects and morphisms lie in the same universe
and which has `Fintype` objects and morphisms -/
out (J : Type) [š„ : SmallCategory J] [@FinCategory J š„] : @HasColimitsOfShape J š„ C _
CategoryTheory.Limits.hasColimitsOfShape_of_hasFiniteColimits
instance
[HasFiniteColimits C] (J : Type w) [SmallCategory J] [FinCategory J] : HasColimitsOfShape J C
instance (priority := 100) hasColimitsOfShape_of_hasFiniteColimits [HasFiniteColimits C]
(J : Type w) [SmallCategory J] [FinCategory J] : HasColimitsOfShape J C := by
refine @hasColimitsOfShape_of_equivalence _ _ _ _ _ _ (FinCategory.equivAsType J) ?_
apply HasFiniteColimits.out
CategoryTheory.Limits.hasFiniteColimits_of_hasColimitsOfSize
theorem
[HasColimitsOfSize.{v', u'} C] : HasFiniteColimits C
lemma hasFiniteColimits_of_hasColimitsOfSize [HasColimitsOfSize.{v', u'} C] :
HasFiniteColimits C where
out := fun J hJ hJ' =>
haveI := hasColimitsOfSizeShrink.{0, 0} C
let F := @FinCategory.equivAsType J (@FinCategory.fintypeObj J hJ hJ') hJ hJ'
@hasColimitsOfShape_of_equivalence (@FinCategory.AsType J (@FinCategory.fintypeObj J hJ hJ'))
(@FinCategory.categoryAsType J (@FinCategory.fintypeObj J hJ hJ') hJ hJ') _ _ J hJ F _
CategoryTheory.Limits.hasFiniteColimits_of_hasColimits
instance
[HasColimits C] : HasFiniteColimits C
instance (priority := 100) hasFiniteColimits_of_hasColimits [HasColimits C] : HasFiniteColimits C :=
hasFiniteColimits_of_hasColimitsOfSize C
CategoryTheory.Limits.hasFiniteColimits_of_hasColimitsOfSizeā
instance
[HasColimitsOfSize.{0, 0} C] : HasFiniteColimits C
instance (priority := 90) hasFiniteColimits_of_hasColimitsOfSizeā [HasColimitsOfSize.{0, 0} C] :
HasFiniteColimits C :=
hasFiniteColimits_of_hasColimitsOfSize C
CategoryTheory.Limits.hasFiniteColimits_of_hasFiniteColimits_of_size
theorem
(h : ā (J : Type w) {š„ : SmallCategory J} (_ : @FinCategory J š„), HasColimitsOfShape J C) : HasFiniteColimits C
/-- We can always derive `HasFiniteColimits C` by providing colimits at an
arbitrary universe. -/
theorem hasFiniteColimits_of_hasFiniteColimits_of_size
(h : ā (J : Type w) {š„ : SmallCategory J} (_ : @FinCategory J š„), HasColimitsOfShape J C) :
HasFiniteColimits C where
out := fun J hJ hhJ => by
haveI := h (ULiftHom.{w} (ULift.{w} J)) <| @CategoryTheory.finCategoryUlift J hJ hhJ
have l : @Equivalence J (ULiftHom (ULift J)) hJ
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) :=
@ULiftHomULiftCategory.equiv J hJ
apply @hasColimitsOfShape_of_equivalence (ULiftHom (ULift J))
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) C _ J hJ
(@Equivalence.symm J hJ (ULiftHom (ULift J))
(@ULiftHom.category (ULift J) (@uliftCategory J hJ)) l) _
CategoryTheory.Limits.fintypeWalkingParallelPair
instance
: Fintype WalkingParallelPair
instance fintypeWalkingParallelPair : Fintype WalkingParallelPair where
elems := [WalkingParallelPair.zero, WalkingParallelPair.one].toFinset
complete x := by cases x <;> simp
CategoryTheory.Limits.instFintypeWalkingParallelPairHom
instance
(j j' : WalkingParallelPair) : Fintype (WalkingParallelPairHom j j')
instance instFintypeWalkingParallelPairHom (j j' : WalkingParallelPair) :
Fintype (WalkingParallelPairHom j j') where
elems :=
WalkingParallelPair.recOn j
(WalkingParallelPair.recOn j' [WalkingParallelPairHom.id zero].toFinset
[left, right].toFinset)
(WalkingParallelPair.recOn j' ā
[WalkingParallelPairHom.id one].toFinset)
complete := by
rintro (_|_) <;> simp
cases j <;> simp
CategoryTheory.Limits.instFinCategoryWalkingParallelPair
instance
: FinCategory WalkingParallelPair
instance : FinCategory WalkingParallelPair where
fintypeObj := fintypeWalkingParallelPair
fintypeHom := instFintypeWalkingParallelPairHom
CategoryTheory.Limits.WidePullbackShape.fintypeObj
instance
[Fintype J] : Fintype (WidePullbackShape J)
instance fintypeObj [Fintype J] : Fintype (WidePullbackShape J) :=
inferInstanceAs <| Fintype (Option _)
CategoryTheory.Limits.WidePullbackShape.fintypeHom
instance
(j j' : WidePullbackShape J) : Fintype (j ā¶ j')
instance fintypeHom (j j' : WidePullbackShape J) : Fintype (j ā¶ j') where
elems := by
obtain - | j' := j'
Ā· obtain - | j := j
Ā· exact {Hom.id none}
Ā· exact {Hom.term j}
Ā· by_cases h : some j' = j
Ā· rw [h]
exact {Hom.id j}
Ā· exact ā
complete := by
rintro (_|_)
Ā· cases j <;> simp
Ā· simp
CategoryTheory.Limits.WidePushoutShape.fintypeObj
instance
[Fintype J] : Fintype (WidePushoutShape J)
instance fintypeObj [Fintype J] : Fintype (WidePushoutShape J) := by
rw [WidePushoutShape]; infer_instance
CategoryTheory.Limits.WidePushoutShape.fintypeHom
instance
(j j' : WidePushoutShape J) : Fintype (j ā¶ j')
instance fintypeHom (j j' : WidePushoutShape J) : Fintype (j ā¶ j') where
elems := by
obtain - | j := j
Ā· obtain - | j' := j'
Ā· exact {Hom.id none}
Ā· exact {Hom.init j'}
Ā· by_cases h : some j = j'
Ā· rw [h]
exact {Hom.id j'}
Ā· exact ā
complete := by
rintro (_|_)
Ā· cases j <;> simp
Ā· simp
CategoryTheory.Limits.finCategoryWidePullback
instance
[Fintype J] : FinCategory (WidePullbackShape J)
instance finCategoryWidePullback [Fintype J] : FinCategory (WidePullbackShape J) where
fintypeHom := WidePullbackShape.fintypeHom
CategoryTheory.Limits.finCategoryWidePushout
instance
[Fintype J] : FinCategory (WidePushoutShape J)
CategoryTheory.Limits.HasFiniteWidePullbacks
structure
/-- `HasFiniteWidePullbacks` represents a choice of wide pullback
for every finite collection of morphisms
-/
class HasFiniteWidePullbacks : Prop where
/-- `C` has all wide pullbacks for any Finite `J` -/
out (J : Type) [Finite J] : HasLimitsOfShape (WidePullbackShape J) C
CategoryTheory.Limits.hasLimitsOfShape_widePullbackShape
instance
(J : Type) [Finite J] [HasFiniteWidePullbacks C] : HasLimitsOfShape (WidePullbackShape J) C
instance hasLimitsOfShape_widePullbackShape (J : Type) [Finite J] [HasFiniteWidePullbacks C] :
HasLimitsOfShape (WidePullbackShape J) C := by
haveI := @HasFiniteWidePullbacks.out C _ _ J
infer_instance
CategoryTheory.Limits.HasFiniteWidePushouts
structure
/-- `HasFiniteWidePushouts` represents a choice of wide pushout
for every finite collection of morphisms
-/
class HasFiniteWidePushouts : Prop where
/-- `C` has all wide pushouts for any Finite `J` -/
out (J : Type) [Finite J] : HasColimitsOfShape (WidePushoutShape J) C
CategoryTheory.Limits.hasColimitsOfShape_widePushoutShape
instance
(J : Type) [Finite J] [HasFiniteWidePushouts C] : HasColimitsOfShape (WidePushoutShape J) C
instance hasColimitsOfShape_widePushoutShape (J : Type) [Finite J] [HasFiniteWidePushouts C] :
HasColimitsOfShape (WidePushoutShape J) C := by
haveI := @HasFiniteWidePushouts.out C _ _ J
infer_instance
CategoryTheory.Limits.hasFiniteWidePullbacks_of_hasFiniteLimits
instance
[HasFiniteLimits C] : HasFiniteWidePullbacks C
/-- Finite wide pullbacks are finite limits, so if `C` has all finite limits,
it also has finite wide pullbacks
-/
instance (priority := 900) hasFiniteWidePullbacks_of_hasFiniteLimits [HasFiniteLimits C] :
HasFiniteWidePullbacks C :=
āØfun J _ => by cases nonempty_fintype J; exact HasFiniteLimits.out _ā©
CategoryTheory.Limits.hasFiniteWidePushouts_of_has_finite_limits
instance
[HasFiniteColimits C] : HasFiniteWidePushouts C
/-- Finite wide pushouts are finite colimits, so if `C` has all finite colimits,
it also has finite wide pushouts
-/
instance (priority := 900) hasFiniteWidePushouts_of_has_finite_limits [HasFiniteColimits C] :
HasFiniteWidePushouts C :=
āØfun J _ => by cases nonempty_fintype J; exact HasFiniteColimits.out _ā©
CategoryTheory.Limits.fintypeWalkingPair
instance
: Fintype WalkingPair
instance fintypeWalkingPair : Fintype WalkingPair where
elems := {WalkingPair.left, WalkingPair.right}
complete x := by cases x <;> simp