aboutsummaryrefslogtreecommitdiff
path: root/Functor/Exact/Instance/Swap.agda
blob: 99a27c55c111dccb2f87f015abb0e1b4f1586f85 (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
{-# OPTIONS --without-K --safe #-}

open import Level using (Level)
open import Category.Cocomplete.Finitely.Bundle using (FinitelyCocompleteCategory)

module Functor.Exact.Instance.Swap {o β„“ e : Level} (π’ž π’Ÿ : FinitelyCocompleteCategory o β„“ e) where

open import Categories.Category using (_[_,_])
open import Categories.Category.BinaryProducts using (BinaryProducts)
open import Categories.Category.Product using (Product) renaming (Swap to Swapβ€²)
open import Categories.Category.Cartesian using (Cartesian)
open import Categories.Diagram.Coequalizer using (IsCoequalizer)
open import Categories.Object.Initial using (IsInitial)
open import Categories.Object.Coproduct using (IsCoproduct)
open import Data.Product.Base using (_,_; proj₁; projβ‚‚; swap)

open import Category.Instance.FinitelyCocompletes {o} {β„“} {e} using (FinitelyCocompletes-Cartesian)
open import Functor.Exact using (RightExactFunctor)

module FCC = Cartesian FinitelyCocompletes-Cartesian
open BinaryProducts (FCC.products) using (_Γ—_) -- ; π₁; Ο€β‚‚; _⁂_; assocΛ‘)


module π’ž = FinitelyCocompleteCategory π’ž
module π’Ÿ = FinitelyCocompleteCategory π’Ÿ

swap-resp-βŠ₯ : {A : π’ž.Obj} {B : π’Ÿ.Obj} β†’ IsInitial (Product π’ž.U π’Ÿ.U) (A , B) β†’ IsInitial (Product π’Ÿ.U π’ž.U) (B , A)
swap-resp-βŠ₯ {A} {B} isInitial = record
    { ! = swap !
    ; !-unique = Ξ» { (f , g) β†’ swap (!-unique (g , f)) }
    }
  where
    open IsInitial isInitial

swap-resp-+
    : {A₁ B₁ A+B₁ : π’ž.Obj}
    β†’ {Aβ‚‚ Bβ‚‚ A+Bβ‚‚ : π’Ÿ.Obj}
    β†’ {i₁₁ : π’ž.U [ A₁ , A+B₁ ]}
    β†’ {i₂₁ : π’ž.U [ B₁ , A+B₁ ]}
    β†’ {i₁₂ : π’Ÿ.U [ Aβ‚‚ , A+Bβ‚‚ ]}
    β†’ {iβ‚‚β‚‚ : π’Ÿ.U [ Bβ‚‚ , A+Bβ‚‚ ]}
    β†’ IsCoproduct (Product π’ž.U π’Ÿ.U) (i₁₁ , i₁₂) (i₂₁ , iβ‚‚β‚‚)
    β†’ IsCoproduct (Product π’Ÿ.U π’ž.U) (i₁₂ , i₁₁) (iβ‚‚β‚‚ , i₂₁)
swap-resp-+ {A₁} {B₁} {A+B₁} {Aβ‚‚} {Bβ‚‚} {A+Bβ‚‚} {i₁₁} {i₂₁} {i₁₂} {iβ‚‚β‚‚} isCoproduct = record
    { [_,_] = Ξ» { X Y β†’ swap ([ swap X , swap Y ]) }
    ; inject₁ = swap inject₁
    ; injectβ‚‚ = swap injectβ‚‚
    ; unique = Ξ» { β‰ˆβ‚ β‰ˆβ‚‚ β†’ swap (unique (swap β‰ˆβ‚) (swap β‰ˆβ‚‚)) }
    }
  where
    open IsCoproduct isCoproduct

swap-resp-coeq
    : {A₁ B₁ C₁ : π’ž.Obj}Β 
      {Aβ‚‚ Bβ‚‚ Cβ‚‚ : π’Ÿ.Obj}
      {f₁ g₁ : π’ž.U [ A₁ , B₁ ]}
      {h₁ : π’ž.U [ B₁ , C₁ ]}
      {fβ‚‚ gβ‚‚ : π’Ÿ.U [ Aβ‚‚ , Bβ‚‚ ]}
      {hβ‚‚ : π’Ÿ.U [ Bβ‚‚ , Cβ‚‚ ]}
    β†’ IsCoequalizer (Product π’ž.U π’Ÿ.U) (f₁ , fβ‚‚) (g₁ , gβ‚‚) (h₁ , hβ‚‚)
    β†’ IsCoequalizer (Product π’Ÿ.U π’ž.U) (fβ‚‚ , f₁) (gβ‚‚ , g₁) (hβ‚‚ , h₁)
swap-resp-coeq isCoequalizer = record
    { equality = swap equality
    ; coequalize = Ξ» { x β†’ swap (coequalize (swap x)) }
    ; universal = swap universal
    ; unique = Ξ» { x β†’ swap (unique (swap x)) }
    }
  where
    open IsCoequalizer isCoequalizer

Swap : RightExactFunctor (π’ž Γ— π’Ÿ) (π’Ÿ Γ— π’ž)
Swap = record
    { F = Swapβ€²
    ; isRightExact = record
        { F-resp-βŠ₯ = swap-resp-βŠ₯
        ; F-resp-+ = swap-resp-+
        ; F-resp-coeq = swap-resp-coeq
        }
    }