0 | module Control.Category.Records.Closed
2 | import Control.Category
3 | import Control.Category.Records.Category
4 | import Control.Category.Records.Functor
5 | import Control.Category.Records.Monoidal
6 | import Control.Category.Records.Braided
7 | import Control.Category.Records.Cartesian
8 | import Data.Morphisms
11 | %prefix_record_projections off
23 | record ClosedR where
24 | constructor MkClosedR
26 | tensor, ihom : obj -> obj -> obj
28 | {auto impl : Closed hom tensor ihom unit}
32 | public export %inline
33 | (.categoryR) : (rec : ClosedR) -> CategoryR
34 | (.categoryR) (MkClosedR {} {hom}) = MkCategoryR hom
37 | public export %inline
38 | (.id) : (rec : ClosedR) -> {a : _} -> rec.hom a a
39 | (.id) rec@(MkClosedR {}) = rec.categoryR.id
42 | public export %inline
43 | (.comp) : (rec : ClosedR) -> {a,b,c : _} ->
44 | rec.hom b c -> rec.hom a b -> rec.hom a c
45 | (.comp) rec@(MkClosedR {}) = rec.categoryR.comp
49 | public export %inline
50 | (.tensorR) : (rec : ClosedR) -> EndoBifunctorR rec.categoryR
51 | (.tensorR) (MkClosedR {} {tensor}) = MkBifunctorR tensor
55 | public export %inline
56 | (.monoidalR) : (rec : ClosedR) -> MonoidalR
57 | (.monoidalR) (MkClosedR {} {hom,tensor,unit}) = MkMonoidalR hom tensor unit
60 | public export %inline
61 | (.assoc) : (rec : ClosedR) -> {a,b,c : _} ->
62 | rec.hom (rec.tensor (rec.tensor a b) c) (rec.tensor a (rec.tensor b c))
63 | (.assoc) rec@(MkClosedR {}) = rec.monoidalR.assoc
66 | public export %inline
67 | (.assoc') : (rec : ClosedR) -> {a,b,c : _} ->
68 | rec.hom (rec.tensor a (rec.tensor b c)) (rec.tensor (rec.tensor a b) c)
69 | (.assoc') rec@(MkClosedR {}) = rec.monoidalR.assoc'
72 | public export %inline
73 | (.unitl) : (rec : ClosedR) -> {a : _} ->
74 | rec.hom (rec.tensor rec.unit a) a
75 | (.unitl) rec@(MkClosedR {}) = rec.monoidalR.unitl
78 | public export %inline
79 | (.unitl') : (rec : ClosedR) -> {a : _} ->
80 | rec.hom a (rec.tensor rec.unit a)
81 | (.unitl') rec@(MkClosedR {}) = rec.monoidalR.unitl'
84 | public export %inline
85 | (.unitr) : (rec : ClosedR) -> {a : _} ->
86 | rec.hom (rec.tensor a rec.unit) a
87 | (.unitr) rec@(MkClosedR {}) = rec.monoidalR.unitr
90 | public export %inline
91 | (.unitr') : (rec : ClosedR) -> {a : _} ->
92 | rec.hom a (rec.tensor a rec.unit)
93 | (.unitr') rec@(MkClosedR {}) = rec.monoidalR.unitr'
97 | public export %inline
98 | (.closedR) : (rec : ClosedR) -> ClosedR
102 | public export %inline
103 | (.curry) : (rec : ClosedR) -> {a,b,c : _} ->
104 | rec.hom (rec.tensor a b) c -> rec.hom a (rec.ihom b c)
105 | (.curry) rec = curry @{rec.impl}
108 | public export %inline
109 | (.uncurry) : (rec : ClosedR) -> {a,b,c : _} ->
110 | rec.hom a (rec.ihom b c) -> rec.hom (rec.tensor a b) c
111 | (.uncurry) rec = uncurry @{rec.impl}
114 | public export %inline
115 | (.eval) : (rec : ClosedR) -> {a,b : _} ->
116 | rec.hom (rec.tensor (rec.ihom a b) a) b
117 | (.eval) rec = eval @{rec.impl}
120 | public export %inline
121 | (.coeval) : (rec : ClosedR) -> {a,b : _} ->
122 | rec.hom a (rec.ihom b (rec.tensor a b))
123 | (.coeval) rec = coeval @{rec.impl}
128 | record CartesianClosedR where
129 | constructor MkCartesianClosedR
131 | tensor, ihom : obj -> obj -> obj
133 | {auto impl : CartesianClosed hom tensor ihom unit}
138 | CCC = CartesianClosedR
140 | namespace CartesianClosedR
142 | public export %inline
143 | (.categoryR) : (rec : CartesianClosedR) -> CategoryR
144 | (.categoryR) (MkCartesianClosedR {} {hom}) = MkCategoryR hom
147 | public export %inline
148 | (.id) : (rec : CartesianClosedR) -> {a : _} -> rec.hom a a
149 | (.id) rec@(MkCartesianClosedR {}) = rec.categoryR.id
152 | public export %inline
153 | (.comp) : (rec : CartesianClosedR) -> {a,b,c : _} ->
154 | rec.hom b c -> rec.hom a b -> rec.hom a c
155 | (.comp) rec@(MkCartesianClosedR {}) = rec.categoryR.comp
159 | public export %inline
160 | (.tensorR) : (rec : CartesianClosedR) -> EndoBifunctorR rec.categoryR
161 | (.tensorR) (MkCartesianClosedR {} {tensor}) = MkBifunctorR tensor
165 | public export %inline
166 | (.monoidalR) : (rec : CartesianClosedR) -> MonoidalR
167 | (.monoidalR) (MkCartesianClosedR {} {hom,tensor,unit}) = MkMonoidalR hom tensor unit
170 | public export %inline
171 | (.assoc) : (rec : CartesianClosedR) -> {a,b,c : _} ->
172 | rec.hom (rec.tensor (rec.tensor a b) c) (rec.tensor a (rec.tensor b c))
173 | (.assoc) rec@(MkCartesianClosedR {}) = rec.monoidalR.assoc
176 | public export %inline
177 | (.assoc') : (rec : CartesianClosedR) -> {a,b,c : _} ->
178 | rec.hom (rec.tensor a (rec.tensor b c)) (rec.tensor (rec.tensor a b) c)
179 | (.assoc') rec@(MkCartesianClosedR {}) = rec.monoidalR.assoc'
182 | public export %inline
183 | (.unitl) : (rec : CartesianClosedR) -> {a : _} ->
184 | rec.hom (rec.tensor rec.unit a) a
185 | (.unitl) rec@(MkCartesianClosedR {}) = rec.monoidalR.unitl
188 | public export %inline
189 | (.unitl') : (rec : CartesianClosedR) -> {a : _} ->
190 | rec.hom a (rec.tensor rec.unit a)
191 | (.unitl') rec@(MkCartesianClosedR {}) = rec.monoidalR.unitl'
194 | public export %inline
195 | (.unitr) : (rec : CartesianClosedR) -> {a : _} ->
196 | rec.hom (rec.tensor a rec.unit) a
197 | (.unitr) rec@(MkCartesianClosedR {}) = rec.monoidalR.unitr
200 | public export %inline
201 | (.unitr') : (rec : CartesianClosedR) -> {a : _} ->
202 | rec.hom a (rec.tensor a rec.unit)
203 | (.unitr') rec@(MkCartesianClosedR {}) = rec.monoidalR.unitr'
207 | public export %inline
208 | (.braidedR) : (rec : CartesianClosedR) -> BraidedR
209 | (.braidedR) (MkCartesianClosedR {} {hom,tensor,unit}) =
210 | MkBraidedR {hom,tensor,unit,impl = FromCartesian}
213 | public export %inline
214 | (.braid) : (rec : CartesianClosedR) -> {a,b : _} ->
215 | rec.hom (rec.tensor a b) (rec.tensor b a)
216 | (.braid) rec@(MkCartesianClosedR {}) = rec.braidedR.braid
219 | public export %inline
220 | (.braid') : (rec : CartesianClosedR) -> {a,b : _} ->
221 | rec.hom (rec.tensor b a) (rec.tensor a b)
222 | (.braid') rec@(MkCartesianClosedR {}) = rec.braidedR.braid'
226 | public export %inline
227 | (.cartesianR) : (rec : CartesianClosedR) -> CartesianR
228 | (.cartesianR) (MkCartesianClosedR {} {hom,tensor,unit}) = MkCartesianR {hom,tensor,unit}
231 | public export %inline
232 | (.projl) : (rec : CartesianClosedR) -> {a,b : _} ->
233 | rec.hom (rec.tensor a b) a
234 | (.projl) rec@(MkCartesianClosedR {}) = rec.cartesianR.projl
237 | public export %inline
238 | (.projr) : (rec : CartesianClosedR) -> {a,b : _} ->
239 | rec.hom (rec.tensor a b) b
240 | (.projr) rec@(MkCartesianClosedR {}) = rec.cartesianR.projr
243 | public export %inline
244 | (.prod) : (rec : CartesianClosedR) -> {a,b,b' : _} ->
245 | rec.hom a b -> rec.hom a b' -> rec.hom a (rec.tensor b b')
246 | (.prod) rec@(MkCartesianClosedR {}) = rec.cartesianR.prod
249 | public export %inline
250 | (.split) : (rec : CartesianClosedR) -> {a : _} ->
251 | rec.hom a (rec.tensor a a)
252 | (.split) rec@(MkCartesianClosedR {}) = rec.cartesianR.split
255 | public export %inline
256 | (.elim) : (rec : CartesianClosedR) -> {a : _} ->
258 | (.elim) rec@(MkCartesianClosedR {}) = rec.cartesianR.elim
262 | public export %inline
263 | (.closedR) : (rec : CartesianClosedR) -> ClosedR
264 | (.closedR) (MkCartesianClosedR {} {hom,tensor,ihom,unit}) =
265 | MkClosedR {hom,tensor,ihom,unit}
268 | public export %inline
269 | (.curry) : (rec : CartesianClosedR) -> {a,b,c : _} ->
270 | rec.hom (rec.tensor a b) c -> rec.hom a (rec.ihom b c)
271 | (.curry) rec@(MkCartesianClosedR {}) = rec.closedR.curry
274 | public export %inline
275 | (.uncurry) : (rec : CartesianClosedR) -> {a,b,c : _} ->
276 | rec.hom a (rec.ihom b c) -> rec.hom (rec.tensor a b) c
277 | (.uncurry) rec@(MkCartesianClosedR {}) = rec.closedR.uncurry
280 | public export %inline
281 | (.eval) : (rec : CartesianClosedR) -> {a,b : _} ->
282 | rec.hom (rec.tensor (rec.ihom a b) a) b
283 | (.eval) rec@(MkCartesianClosedR {}) = rec.closedR.eval
286 | public export %inline
287 | (.coeval) : (rec : CartesianClosedR) -> {a,b : _} ->
288 | rec.hom a (rec.ihom b (rec.tensor a b))
289 | (.coeval) rec@(MkCartesianClosedR {}) = rec.closedR.coeval