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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
{-# OPTIONS --without-K --safe #-}
open import Categories.Category using (Category)
open import Level using (Level; levelOfTerm)
open import Level using (_â_)
module Category.BinaryBiproducts {o â e : Level} (ð : Category o â e) where
import Categories.Morphism.Reasoning as â-Reasoning
open import Categories.Category.BinaryCoproducts ð using (BinaryCoproducts)
open import Categories.Category.BinaryProducts ð using (BinaryProducts)
open import Categories.Morphism.IsoEquiv ð using (_â_; â_â)
open import Morphism.Zero using (IsZeroâ)
open import Object.Biproduct ð using (Biproduct; BiproductâProduct; BiproductâCoproduct)
record BinaryBiproducts : Set (levelOfTerm ð) where
infixr 7 _â_
field
biproduct : â {A B} â Biproduct A B
open Category ð
private
module biproduct {A} {B} = Biproduct (biproduct {A} {B})
open biproduct using (Ïââiââid; Ïââiââid; permute; ðâ; ðâ; Ïââiâ-isZero; Ïââiâ-isZero; âšâ©-unique; []-unique) public
_â_ : Obj â Obj â Obj
A â B = Biproduct.AâB (biproduct {A} {B})
private
binaryProducts : BinaryProducts
binaryProducts = record { product = BiproductâProduct biproduct }
binaryCoproducts : BinaryCoproducts
binaryCoproducts = record { coproduct = BiproductâCoproduct biproduct }
open BinaryProducts binaryProducts public
hiding (_Ã_)
renaming (_Ãâ_ to infixr 10 _Ãâ_; Ã-comm to â-comm; Ã-assoc to â-assoc)
open BinaryCoproducts binaryCoproducts public
hiding (_+_)
renaming (_+â_ to infixr 10 _+â_; +-comm to â-commâ²; +-assoc to â-assocâ²)
private
module Ïâiâ {A} {B} = IsZeroâ (Ïââiâ-isZero {A} {B})
module Ïâiâ {A} {B} = IsZeroâ (Ïââiâ-isZero {A} {B})
open â-Reasoning ð
open HomReasoning
Ãâ-congË¡ : {A B C D : Obj} â {f : A â B} {g h : C â D} â g â h â f Ãâ g â f Ãâ h
Ãâ-congË¡ gâh = Ãâ-congâ Equiv.refl gâh
Ãâ-congʳ : {A B C D : Obj} â {f g : A â B} {h : C â D} â f â g â f Ãâ h â g Ãâ h
Ãâ-congʳ fâg = Ãâ-congâ fâg Equiv.refl
ÏâiââÏâiâ : {A B : Obj} â Ïâ â iâ â Ïâ {A} {B} â iâ
ÏâiââÏâiâ {A} {B} = begin
Ïâ â iâ ââš identityʳ âš
(Ïâ â iâ) â id ââš Ïâiâ.constant id ((Ïâ â iâ) â (Ïâ â iâ)) â©
(Ïâ â iâ) â ((Ïâ â iâ) â (Ïâ â iâ)) ââš sym-assoc â©
((Ïâ â iâ) â (Ïâ â iâ)) â (Ïâ â iâ) ââš Ïâiâ.coconstant ((Ïâ â iâ) â (Ïâ â iâ)) id â©
id â Ïâ â iâ ââš pullË¡ identityË¡ â©
Ïâ â iâ â
module _ {A B C : Obj} where
Ïâiâ-absorbË¡ : (f : A â C) â f â ðâ {A} {B} â ðâ
Ïâiâ-absorbË¡ f = begin
f â ðâ ââš Ïâiâ.coconstant f (ðâ â ðâ) â©
(ðâ â ðâ) â ðâ ââš assoc â©
ðâ â (ðâ â ðâ) ââš Ïâiâ.constant (ðâ â ðâ) id â©
ðâ â id ââš identityʳ â©
ðâ â
Ïâiâ-absorbʳ : (f : C â B) â ðâ {A} {B} â f â ðâ
Ïâiâ-absorbʳ f = begin
ðâ â f ââš Ïâiâ.constant f (ðâ â ðâ) â©
ðâ â ðâ â ðâ ââš sym-assoc â©
(ðâ â ðâ) â ðâ ââš Ïâiâ.coconstant (ðâ â ðâ) id â©
id â ðâ ââš identityË¡ â©
ðâ â
Ïâiâ-absorbË¡ : (f : B â C) â f â ðâ {A} {B} â ðâ
Ïâiâ-absorbË¡ f = begin
f â ðâ ââš Ïâiâ.coconstant f (ðâ â ðâ) â©
(ðâ â ðâ) â ðâ ââš assoc â©
ðâ â (ðâ â ðâ) ââš Ïâiâ.constant (ðâ â ðâ) id â©
ðâ â id ââš identityʳ â©
ðâ â
Ïâiâ-absorbʳ : (f : C â A) â ðâ {A} {B} â f â ðâ
Ïâiâ-absorbʳ f = begin
ðâ â f ââš Ïâiâ.constant f (ðâ â ðâ) â©
ðâ â ðâ â ðâ ââš sym-assoc â©
(ðâ â ðâ) â ðâ ââš Ïâiâ.coconstant (ðâ â ðâ) id â©
id â ðâ ââš identityË¡ â©
ðâ â
module _ {A B C D : Obj} (f : A â B) (g : C â D) where
Ïââ+â : Ïâ â f +â g â f â Ïâ
Ïââ+â = begin
Ïâ â [ iâ â f , iâ â g ] ââš â[] â©
[ Ïâ â iâ â f , Ïâ â iâ â g ] ââš []-congË¡ sym-assoc â©
[ Ïâ â iâ â f , (Ïâ â iâ) â g ] ââš []-congâ (cancelË¡ Ïââiââid) (Ïâiâ-absorbʳ g) â©
[ f , Ïâ â iâ ] ââš []-congâ (insertʳ Ïââiââid) (Equiv.sym (Ïâiâ-absorbË¡ f)) â©
[ (f â Ïâ) â iâ , f â Ïâ â iâ ] ââš []-congË¡ sym-assoc â©
[ (f â Ïâ) â iâ , (f â Ïâ) â iâ ] ââš +-g-η â©
f â Ïâ â
Ïââ+â : Ïâ â f +â g â g â Ïâ
Ïââ+â = begin
Ïâ â [ iâ â f , iâ â g ] ââš â[] â©
[ Ïâ â iâ â f , Ïâ â iâ â g ] ââš []-congʳ sym-assoc â©
[ (Ïâ â iâ) â f , Ïâ â iâ â g ] ââš []-congâ (Ïâiâ-absorbʳ f) (cancelË¡ Ïââiââid) â©
[ Ïâ â iâ , g ] ââš []-congâ (Equiv.sym (Ïâiâ-absorbË¡ g)) (insertʳ Ïââiââid) â©
[ g â Ïâ â iâ , (g â Ïâ) â iâ ] ââš []-congʳ sym-assoc â©
[ (g â Ïâ) â iâ , (g â Ïâ) â iâ ] ââš +-g-η â©
g â Ïâ â
Ãâ-+â : f Ãâ g â f +â g
Ãâ-+â = âšâ©-unique Ïââ+â Ïââ+â
module _ {A B : Obj} where
Ïââ+-swap : Ïâ â +-swap â Ïâ
Ïââ+-swap = begin
Ïâ â [ iâ , iâ ] ââš â[] â©
[ Ïâ â iâ , Ïâ â iâ ] ââš []-congâ ÏâiââÏâiâ (Ïââiââid â Equiv.sym Ïââiââid) â©
[ Ïâ â iâ , Ïâ â iâ ] ââš +-g-η â©
Ïâ â
Ïââ+-swap : Ïâ â +-swap â Ïâ
Ïââ+-swap = begin
Ïâ â [ iâ , iâ ] ââš â[] â©
[ Ïâ â iâ , Ïâ â iâ ] ââš []-congâ (Ïââiââid â Equiv.sym Ïââiââid) ÏâiââÏâiâ âš
[ Ïâ â iâ , Ïâ â iâ ] ââš +-g-η â©
Ïâ â
swapâ+-swap : swap {A} {B} â +-swap
swapâ+-swap = begin
âš Ïâ , Ïâ â© ââš âšâ©-unique Ïââ+-swap Ïââ+-swap â©
[ iâ , iâ ] â
â-commâ : â-comm {A} {B} â â-commâ²
â-commâ = â swapâ+-swap â
module _ {A B C : Obj} where
private
lemâ : Ïâ â [ iâ , Ïâ â iâ ] â Ïâ â iâ
lemâ = begin
Ïâ â [ iâ , Ïâ â iâ ] ââš â[] â©
[ Ïâ â iâ , Ïâ â Ïâ â iâ ] ââš []-congË¡ (Ïâiâ-absorbË¡ Ïâ) â©
[ Ïâ â iâ , Ïâ â iâ ] ââš []-unique (Ïâiâ-absorbʳ iâ) (Ïâiâ-absorbʳ iâ) â©
Ïâ â iâ â
lemâ : Ïâ â [ iâ , Ïâ â iâ ] â Ïâ
lemâ = begin
Ïâ â [ iâ , Ïâ â iâ ] ââš â[] â©
[ Ïâ â iâ , Ïâ â Ïâ â iâ ] ââš []-congâ Ïââiââid (Ïâiâ-absorbË¡ Ïâ) â©
[ id , Ïâ â iâ ] ââš []-congʳ Ïââiââid âš
[ Ïâ â iâ , Ïâ â iâ ] ââš +-g-η â©
Ïâ â
lemâ : âš Ïâ , Ïâ â Ïâ â© â iâ â iâ
lemâ = begin
âš Ïâ , Ïâ â Ïâ â© â iâ ââš âšâ©â â©
âš Ïâ â iâ , (Ïâ â Ïâ) â iâ â© ââš âšâ©-congâ Ïââiââid assoc â©
âš id , Ïâ â Ïâ â iâ â© ââš âšâ©-congâ (Equiv.sym Ïââiââid) (Ïâiâ-absorbË¡ Ïâ) â©
âš Ïâ â iâ , Ïâ â iâ â© ââš g-η â©
iâ â
lemâ : âš Ïâ , Ïâ â Ïâ â© â iâ â [ iâ , Ïâ â iâ ]
lemâ = begin
âš Ïâ , Ïâ â Ïâ â© â iâ ââš âšâ©â â©
âš Ïâ â iâ , (Ïâ â Ïâ) â iâ â© ââš âšâ©-congË¡ (cancelʳ Ïââiââid) â©
âš Ïâ â iâ , Ïâ â© ââš âšâ©-unique lemâ lemâ â©
[ iâ , Ïâ â iâ ] â
lemâ
: Ïâ â [ iâ â iâ , [ iâ â iâ , iâ ] ] â âš Ïâ , Ïâ â Ïâ â©
lemâ
= begin
Ïâ â [ iâ â iâ , [ iâ â iâ , iâ ] ] ââš â[] â©
[ Ïâ â iâ â iâ , Ïâ â [ iâ â iâ , iâ ] ] ââš []-congË¡ â[] â©
[ Ïâ â iâ â iâ , [ Ïâ â iâ â iâ , Ïâ â iâ ] ] ââš []-congâ (cancelË¡ Ïââiââid) ([]-congʳ (cancelË¡ Ïââiââid)) â©
[ iâ , [ iâ , Ïâ â iâ ] ] ââš []-unique lemâ lemâ â©
âš Ïâ , Ïâ â Ïâ â© â
lemâ : Ïâ â [ iâ â iâ , [ iâ â iâ , iâ ] ] â Ïâ â Ïâ
lemâ = begin
Ïâ â [ iâ â iâ , [ iâ â iâ , iâ ] ] ââš â[] â©
[ Ïâ â iâ â iâ , Ïâ â [ iâ â iâ , iâ ] ] ââš []-congâ sym-assoc â[] â©
[ (Ïâ â iâ) â iâ , [ Ïâ â iâ â iâ , Ïâ â iâ ] ] ââš []-congâ (Ïâiâ-absorbʳ iâ) ([]-congʳ (sym-assoc â Ïâiâ-absorbʳ iâ)) â©
[ Ïâ â iâ , [ Ïâ â iâ , Ïâ â iâ ] ] ââš []-congË¡ ([]-congË¡ (Ïââiââid â Equiv.sym Ïââiââid)) â©
[ Ïâ â iâ , [ Ïâ â iâ , Ïâ â iâ ] ] ââš []-congË¡ +-g-η â©
[ Ïâ â iâ , Ïâ ] ââš []-unique (assoc â Ïâiâ-absorbË¡ Ïâ) (cancelʳ Ïââiââid) â©
Ïâ â Ïâ â
assocʳâ+-assocʳ : assocʳ â +-assocʳ
assocʳâ+-assocʳ = begin
âš âš Ïâ , Ïâ â Ïâ â© , Ïâ â Ïâ â© ââš âšâ©-unique lemâ
lemâ â©
[ iâ â iâ , [ iâ â iâ , iâ ] ] â
â-assocâ : â-assoc {A} {B} {C} â â-assocâ²
â-assocâ = â assocʳâ+-assocʳ â
assocË¡â+-assocË¡ : assocË¡ â +-assocË¡
assocË¡â+-assocË¡ = to-â â-assocâ
where
open _â_
â-assoc : {A : Obj} â â {A} â â +â id â â â id +â â â +-assocË¡
â-assoc = begin
â â â +â id ââš ââ+â â©
[ â , id ] ââš []â+-assocʳ âš
[ id , â ] â +-assocË¡ ââš pushË¡ (Equiv.sym ââ+â) â©
â â id +â â â +-assocË¡ â
â-assoc-Ãâ : {A : Obj} â â {A} â â Ãâ id â â â id Ãâ â â assocË¡
â-assoc-Ãâ = begin
â â â Ãâ id ââš reflâ©ââš Ãâ-+â â id â©
â â â +â id ââš â-assoc â©
â â id +â â â +-assocË¡ ââš reflâ©ââš Ãâ-+â id â â©ââš assocË¡â+-assocË¡ âš
â â id Ãâ â â assocË¡ â
Î-assoc : {A : Obj} â id Ãâ Î â Î {A} â assocË¡ â Î Ãâ id â Î
Î-assoc = begin
id Ãâ Î â Î ââš ÃââÎ â©
âš id , Î â© ââš assocË¡ââšâ© âš
assocË¡ â âš Î , id â© ââš reflâ©ââš ÃââÎ âš
assocË¡ â Î Ãâ id â Î â
module _ {A : Obj} where
â-identityË¡ : â â iâ â id {A}
â-identityË¡ = injectâ
â-identityʳ : â â iâ â id {A}
â-identityʳ = injectâ
Î-identityË¡ : Ïâ â Î â id {A}
Î-identityË¡ = projectâ
Î-identityʳ : Ïâ â Î â id {A}
Î-identityʳ = projectâ
â-comm : {A : Obj} â â {A} â +-swap â â
â-comm = []â+-swap
Î-comm : {A : Obj} â swap â Î {A} â Î
Î-comm = swapââšâ©
ââ : {A B : Obj} {f : A â B} â f â â â â â f +â f
ââ {f = f} = begin
f â â ââš ââ â©
[ f , f ] ââš ââ+â âš
â â f +â f â
âÎ : {A B : Obj} {f : A â B} â Î â f â f Ãâ f â Î
âÎ {A} {B} {f} = begin
Î â f ââš Îâ â©
âš f , f â© ââš ÃââÎ âš
f Ãâ f â Î â
ââ-Ãâ : {A B : Obj} {f : A â B} â f â â â â â f Ãâ f
ââ-Ãâ {f = f} = begin
f â â ââš ââ â©
â â f +â f ââš reflâ©ââš Ãâ-+â f f âš
â â f Ãâ f â
Ãââfirst : {A B C D E : Obj} {f : B â C} {g : D â E} {h : A â B} â (f Ãâ g) â first h â (f â h) Ãâ g
Ãââfirst = ÃââÃâ â Ãâ-congâ Equiv.refl identityʳ
Ãââsecond : {A B C D E : Obj} {f : A â B} {g : D â E} {h : C â D} â (f Ãâ g) â second h â f Ãâ (g â h)
Ãââsecond = ÃââÃâ â Ãâ-congâ identityʳ Equiv.refl
|