module Cat.Instances.Sets.Complete where

Sets is completeπŸ”—

We prove that the category of is for any universe levels and Inverting this to speak of maxima rather than ordering, to admit all we must be in at least the category of but any extra adjustment is also acceptable. So, suppose we have an indexing category and a diagram Let’s build a limit for it!

Sets-is-complete : βˆ€ {ΞΉ ΞΊ o} β†’ is-complete ΞΉ ΞΊ (Sets (ΞΉ βŠ” ΞΊ βŠ” o))
Sets-is-complete {J = D} F = to-limit (to-is-limit lim) module Sets-is-complete where
  module D = Precategory D
  module F = Functor F
  open make-is-limit

Since Set is closed under (arbitrary) products, we can build the limit of an arbitrary diagram β€” which we will write β€” by first taking the product (which is a set of dependent functions), then restricting ourselves to the subset of those for which i.e., those which are cones over

  apex : Set _
  apex = el! $
    Ξ£[ f ∈ ((j : D.Ob) β†’ ∣ F.β‚€ j ∣) ]
      (βˆ€ x y (g : D.Hom x y) β†’ F.₁ g (f x) ≑ (f y))

To form a cone, given an object and an inhabitant of the type underlying f-apex, we must cough up (for ψ) an object of But this is exactly what gives us. Similarly, since witnesses that commutes, we can project it directly.

Given some other cone to build a cone homomorphism recall that comes equipped with its own function which we can simply flip around to get a function This function is in the subset carved out by since is a cone, hence as required.

  -- open Terminal
  lim : make-is-limit F apex
  lim .ψ x (f , p) = f x
  lim .commutes f = funext Ξ» where
    (_ , p) β†’ p _ _ f
  lim .universal eta p x =
    (Ξ» j β†’ eta j x) , Ξ» x y f β†’ p f $β‚š _
  lim .factors _ _ = refl
  lim .unique eta p other q = funext Ξ» x β†’
    Ξ£-prop-path! (funext Ξ» j β†’ q j $β‚š x)

Finite set-limitsπŸ”—

For expository reasons, we present the computation of the most famous shapes of finite limit (terminal objects, products, pullbacks, and equalisers) in the category of sets. All the definitions below are redundant, since finite limits are always small, and thus the category of sets of any level admits them.

  Sets-terminal : Terminal (Sets β„“)
  Sets-terminal .top = el! (Lift _  ⊀)
  Sets-terminal .has⊀ _ = hlevel 0

Products are given by product sets:

  Sets-products : (A B : Set β„“) β†’ Product (Sets β„“) A B
  Sets-products A B .apex = el! (∣ A ∣ Γ— ∣ B ∣)
  Sets-products A B .π₁ = fst
  Sets-products A B .Ο€β‚‚ = snd
  Sets-products A B .has-is-product .⟨_,_⟩ f g x = f x , g x
  Sets-products A B .has-is-product .Ο€β‚βˆ˜factor = refl
  Sets-products A B .has-is-product .Ο€β‚‚βˆ˜factor = refl
  Sets-products A B .has-is-product .unique o p q i x = p i x , q i x

Equalisers are given by carving out the subset of where and agree using

  Sets-equalisers : (f g : Hom A B) β†’ Equaliser (Sets β„“) {A = A} {B = B} f g
  Sets-equalisers {A = A} {B = B} f g = eq where
    eq : Equaliser (Sets β„“) f g
    eq .apex .∣_∣ = Ξ£[ x ∈ A ] (f x ≑ g x)
    eq .apex .is-tr = hlevel 2
    eq .equ = fst
    eq .has-is-eq .equal = funext snd
    eq .has-is-eq .universal {e' = e'} p x = e' x , p $β‚š x
    eq .has-is-eq .factors = refl
    eq .has-is-eq .unique {p = p} q =
      funext Ξ» x β†’ Ξ£-prop-path! (happly q x)

Pullbacks are the same, but carving out a subset of

  Sets-pullbacks : βˆ€ {A B C} (f : Hom A C) (g : Hom B C)
                 β†’ Pullback (Sets β„“) {X = A} {Y = B} {Z = C} f g
  Sets-pullbacks {A = A} {B = B} {C = C} f g = pb where
    pb : Pullback (Sets β„“) f g
    pb .apex .∣_∣   = Ξ£[ x ∈ A ] Ξ£[ y ∈ B ] (f x ≑ g y)
    pb .apex .is-tr = hlevel 2
    pb .p₁ (x , _ , _) = x
    pb .pβ‚‚ (_ , y , _) = y
    pb .has-is-pb .square = funext (snd βŠ™ snd)
    pb .has-is-pb .universal {p₁' = p₁'} {pβ‚‚'} p a = p₁' a , pβ‚‚' a , happly p a
    pb .has-is-pb .pβ‚βˆ˜universal = refl
    pb .has-is-pb .pβ‚‚βˆ˜universal = refl
    pb .has-is-pb .unique {p = p} {lim' = lim'} q r i x =
      q i x , r i x ,
      λ j → is-set→squarep (λ i j → C .is-tr)
        (Ξ» j β†’ f (q j x)) (Ξ» j β†’ lim' x .snd .snd j) (happly p x) (Ξ» j β†’ g (r j x)) i j

Hence, Sets is finitely complete:

  open Finitely-complete

  Sets-finitely-complete : Finitely-complete (Sets β„“)
  Sets-finitely-complete .terminal = Sets-terminal
  Sets-finitely-complete .products = Sets-products
  Sets-finitely-complete .equalisers = Sets-equalisers
  Sets-finitely-complete .pullbacks = Sets-pullbacks