aboutsummaryrefslogtreecommitdiff
path: root/Category/Cocomplete/Finitely/Product.agda
blob: 25dc346a2daeedcaa63c06131abab8a5a780ae02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
{-# OPTIONS --without-K --safe #-}

open import Categories.Category.Core using (Category)
open import Level using (Level)

module Category.Cocomplete.Finitely.Product {o β„“ e : Level} {π’ž π’Ÿ : Category o β„“ e} where

open import Categories.Category using (_[_,_])
open import Categories.Category.Cocomplete.Finitely using (FinitelyCocomplete)
open import Categories.Category.Cocartesian using (Cocartesian; BinaryCoproducts)
open import Categories.Category.Product using (Product)
open import Categories.Diagram.Coequalizer using (Coequalizer)
open import Categories.Object.Coproduct using (Coproduct)
open import Categories.Object.Initial using (IsInitial; Initial)
open import Data.Product.Base using (_,_; _Γ—_; dmap; zip; map)

Initial-Γ— : Initial π’ž β†’ Initial π’Ÿ β†’ Initial (Product π’žΒ π’Ÿ)
Initial-Γ— initial-π’ž initial-π’Ÿ = record
    { βŠ₯ = π’ž.βŠ₯ , π’Ÿ.βŠ₯
    ; βŠ₯-is-initial = record
        { ! = π’ž.! , π’Ÿ.!
        ; !-unique = dmap π’ž.!-unique π’Ÿ.!-unique
        }
    }
  where
    module π’ž = Initial initial-π’ž
    module π’Ÿ = Initial initial-π’Ÿ

Coproducts-Γ— : BinaryCoproducts π’ž β†’ BinaryCoproducts π’Ÿ β†’ BinaryCoproducts (Product π’ž π’Ÿ)
Coproducts-Γ— coproducts-π’ž coproducts-π’Ÿ = record { coproduct = coproduct }
  where
    coproduct : βˆ€ {(A₁ , B₁) (Aβ‚‚ , Bβ‚‚) : _ Γ— _} β†’ Coproduct (Product π’ž π’Ÿ) (A₁ , B₁) (Aβ‚‚ , Bβ‚‚)
    coproduct = record
        { A+B = π’ž.A+B , π’Ÿ.A+B
        ; i₁ = π’ž.i₁ , π’Ÿ.i₁
        ; iβ‚‚ = π’ž.iβ‚‚ , π’Ÿ.iβ‚‚
        ; [_,_] = zip π’ž.[_,_] π’Ÿ.[_,_]
        ; inject₁ = π’ž.inject₁ , π’Ÿ.inject₁
        ; injectβ‚‚ = π’ž.injectβ‚‚ , π’Ÿ.injectβ‚‚
        ; unique = zip π’ž.unique π’Ÿ.unique
        }
      where
        module Coprod {π’ž} (coprods : BinaryCoproducts π’ž) where
          open BinaryCoproducts coprods using (coproduct)
          open coproduct public
        module π’ž = Coprod coproducts-π’ž
        module π’Ÿ = Coprod coproducts-π’Ÿ

Coequalizer-Γ—
    : (βˆ€ {A} {B} (f g : π’ž [ A , B ]) β†’ Coequalizer π’ž f g)
    β†’ (βˆ€ {A} {B} (f g : π’Ÿ [ A , B ]) β†’ Coequalizer π’Ÿ f g)
    β†’ βˆ€ {A} {B} {C} {D} ((f₁ , g₁) (fβ‚‚ , gβ‚‚) : π’ž [ A , B ] Γ— π’Ÿ [ C , D ])
    β†’ Coequalizer (Product π’ž π’Ÿ) (f₁ , g₁) (fβ‚‚ , gβ‚‚)
Coequalizer-Γ— coequalizer-π’ž coequalizer-π’Ÿ (f₁ , g₁) (fβ‚‚ , gβ‚‚) = record
    { arr = π’ž.arr , π’Ÿ.arr
    ; isCoequalizer = record
        { equality = π’ž.equality , π’Ÿ.equality
        ; coequalize = map π’ž.coequalize π’Ÿ.coequalize
        ; universal = π’ž.universal , π’Ÿ.universal
        ; unique = map π’ž.unique π’Ÿ.unique
        }
    }
  where
    module π’ž = Coequalizer (coequalizer-π’ž f₁ fβ‚‚)
    module π’Ÿ = Coequalizer (coequalizer-π’Ÿ g₁ gβ‚‚)

Cocartesian-Γ— : Cocartesian π’ž β†’ Cocartesian π’Ÿ β†’ Cocartesian (Product π’ž π’Ÿ)
Cocartesian-Γ— cocartesian-π’ž cocartesian-π’Ÿ = record
    { initial = Initial-Γ— π’ž.initial π’Ÿ.initial
    ; coproducts = Coproducts-Γ— π’ž.coproducts π’Ÿ.coproducts
    }
  where
    module π’ž = Cocartesian cocartesian-π’ž
    module π’Ÿ = Cocartesian cocartesian-π’Ÿ

FinitelyCocomplete-Γ— : FinitelyCocomplete π’ž β†’ FinitelyCocomplete π’Ÿ β†’ FinitelyCocomplete (Product π’ž π’Ÿ)
FinitelyCocomplete-Γ— finitelyCocomplete-π’ž finitelyCocomplete-π’Ÿ = record
    { cocartesian = Cocartesian-Γ— π’ž.cocartesian π’Ÿ.cocartesian
    ; coequalizer = Coequalizer-Γ— π’ž.coequalizer π’Ÿ.coequalizer
    }
  where
    module π’ž = FinitelyCocomplete finitelyCocomplete-π’ž
    module π’Ÿ = FinitelyCocomplete finitelyCocomplete-π’Ÿ