0 | module Control.Category.Braided
2 | import Control.Category.Core
3 | import Control.Category.Functor
4 | import Control.Category.Monoidal
5 | import Data.Morphisms
6 | import public Data.Permutation
9 | import Data.List.Quantifiers
30 | interface Monoidal cat ten i =>
31 | Braided (0 cat : Hom obj) (ten : obj -> obj -> obj) (i : obj) | cat,ten where
32 | constructor MkBraided
34 | braid : {a,b : _} -> cat (a `ten` b) (b `ten` a)
41 | braid' : {a,b : _} -> cat (b `ten` a) (a `ten` b)
46 | PreBraided : (cat : Hom obj) -> (ten : obj -> obj -> obj) -> (i : obj) -> Type
47 | PreBraided = Braided
53 | permuteDefault : Braided cat ten i => {xs : _} -> (p : Permutation (length xs)) ->
54 | cat (TenSeq ten i xs) (TenSeq ten i $
permuteList xs p)
67 | interface Braided cat ten i =>
68 | MonSymmetric (0 cat : Hom obj) (ten : obj -> obj -> obj) (i : obj) | cat,ten where
69 | constructor MkMonSymmetric
75 | permute : {xs : _} -> (p : Permutation (length xs)) ->
76 | cat (TenSeq ten i xs) (TenSeq ten i $
permuteList xs p)
77 | permute = permuteDefault
81 | PreSymmetric : (cat : Hom obj) -> (ten : obj -> obj -> obj) -> (i : obj) -> Type
82 | PreSymmetric = MonSymmetric
91 | swapAssoc : Braided cat ten i => {xs,ys : _} ->
92 | cat (TenSeq ten i (xs ++ ys)) (TenSeq ten i (ys ++ xs))
93 | swapAssoc @{c@(MkBraided{})} = mergeAssoc . braid . splitAssoc
100 | swapAssoc' : Braided cat ten i => {xs,ys : _} ->
101 | cat (TenSeq ten i (xs ++ ys)) (TenSeq ten i (ys ++ xs))
102 | swapAssoc' @{c@(MkBraided{})} = mergeAssoc . braid' . splitAssoc
106 | bringToFront : Braided cat ten i => {xs,x,ys : _} ->
107 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (x :: xs ++ ys))
108 | bringToFront @{c@(MkBraided{})} {ys=[]} =
109 | rewrite appendNilRightNeutral xs in mergeAssoc . braid . splitAssoc
110 | bringToFront @{c@(MkBraided{})} {ys=_::_} =
111 | mergeAssoc {xs=x::xs} . mapl' (mergeAssoc {xs=[x]} . braid) . assoc' . splitAssoc
118 | bringToFront' : Braided cat ten i => {xs,x,ys : _} ->
119 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (x :: xs ++ ys))
120 | bringToFront' @{c@(MkBraided{})} {ys=[]} =
121 | rewrite appendNilRightNeutral xs in mergeAssoc . braid' . splitAssoc
122 | bringToFront' @{c@(MkBraided{})} {ys=_::_} =
123 | mergeAssoc {xs=x::xs} . mapl' (mergeAssoc {xs=[x]} . braid') . assoc' . splitAssoc
130 | insertFromFront : Braided cat ten i => {x,xs,ys : _} ->
131 | cat (TenSeq ten i (x :: xs ++ ys)) (TenSeq ten i (xs ++ x :: ys))
132 | insertFromFront @{c@(MkBraided{})} {ys=[]} =
133 | rewrite appendNilRightNeutral xs in mergeAssoc . braid . splitAssoc {xs=[_]}
134 | insertFromFront @{c@(MkBraided{})} {ys=_::_} =
135 | mergeAssoc . assoc . mapl' (Core.(.) braid $
splitAssoc {xs=[x]}) . splitAssoc {xs=x::xs}
144 | insertFromFront' : Braided cat ten i => {x,xs,ys : _} ->
145 | cat (TenSeq ten i (x :: xs ++ ys)) (TenSeq ten i (xs ++ x :: ys))
146 | insertFromFront' @{c@(MkBraided{})} {ys=[]} =
147 | rewrite appendNilRightNeutral xs in mergeAssoc . braid' . splitAssoc {xs=[_]}
148 | insertFromFront' @{c@(MkBraided{})} {ys=_::_} =
149 | mergeAssoc . assoc . mapl' (Core.(.) braid' $
splitAssoc {xs=[x]}) . splitAssoc {xs=x::xs}
153 | sendToBack : Braided cat ten i => {xs,x,ys : _} ->
154 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (xs ++ ys ++ [x]))
155 | sendToBack @{c@(MkBraided{})} {ys=[]} = id
156 | sendToBack @{c@(MkBraided{})} {ys=_::_} =
157 | mergeAssoc . mapr' (mergeAssoc {ys=[x]} . braid) . splitAssoc
164 | sendToBack' : Braided cat ten i => {xs,x,ys : _} ->
165 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (xs ++ ys ++ [x]))
166 | sendToBack' @{c@(MkBraided{})} {ys=[]} = id
167 | sendToBack' @{c@(MkBraided{})} {ys=_::_} =
168 | mergeAssoc . mapr' (mergeAssoc {ys=[x]} . braid') . splitAssoc
175 | insertFromBack : Braided cat ten i => {xs,x,ys : _} ->
176 | cat (TenSeq ten i (xs ++ ys ++ [x])) (TenSeq ten i (xs ++ x :: ys))
177 | insertFromBack @{c@(MkBraided{})} {ys=[]} = id
178 | insertFromBack @{c@(MkBraided{})} {ys=_::_} =
179 | mergeAssoc . mapr' (braid . splitAssoc {ys=[x]}) . splitAssoc
188 | insertFromBack' : Braided cat ten i => {xs,x,ys : _} ->
189 | cat (TenSeq ten i (xs ++ ys ++ [x])) (TenSeq ten i (xs ++ x :: ys))
190 | insertFromBack' @{c@(MkBraided{})} {ys=[]} = id
191 | insertFromBack' @{c@(MkBraided{})} {ys=_::_} =
192 | mergeAssoc . mapr' (braid' . splitAssoc {ys=[x]}) . splitAssoc
197 | permuteDefault @{c@(MkBraided{})} {xs=[]} [] = id
198 | permuteDefault @{c@(MkBraided{})} {xs=[_]} [_] = id
199 | permuteDefault @{c@(MkBraided{})} {xs=[_,_]} [FZ,FZ] = id
200 | permuteDefault @{c@(MkBraided{})} {xs=[_,_]} [FS FZ,FZ] = braid
201 | permuteDefault @{c@(MkBraided{})} {xs} p = go (toList $
inverse p)
203 | believeFst : forall a,b,c. cat a c -> cat b c
204 | believeFst x = replace {p = flip cat _} (believe_me $
Refl {x=()}) x
205 | believeSnd : forall a,b,c. cat a b -> cat a c
206 | believeSnd x = replace {p = cat _} (believe_me $
Refl {x=()}) x
208 | go : {xs' : _} -> List Nat -> cat (TenSeq ten i xs') (TenSeq ten i $
permuteList xs p)
209 | go [] = believeSnd id
212 | (go {xs' = take i xs' ++ drop (S i) xs' ++
213 | [index' xs' (natToFinLt i @{believe_me Oh})]}
219 | x = index' xs' (natToFinLt i @{believe_me Oh}),
220 | ys = drop (S i) xs'})
231 | [FlipBraid] {ten,i : _} -> Braided cat ten i => Braided cat ten i where
243 | [MorFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i) =>
244 | Braided Morphism ten i using Monoidal.MorFromTensor where
250 | [FuncFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i) =>
251 | Braided (~~>) ten i using Category.Function Monoidal.FuncFromTensor where
261 | [KleisliFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i, Bitraversable ten, Monad m) =>
262 | Braided (Kleislimorphism m) ten i using Monoidal.KleisliFromTensor where
263 | braid = Kleisli $
pure . swap'
265 | public export %hint
266 | BraidedMorPair : Braided Morphism Pair ()
267 | BraidedMorPair = MorFromTensor
269 | public export %hint
270 | BraidedMorEither : Braided Morphism Either Void
271 | BraidedMorEither = MorFromTensor
274 | public export %hint
275 | BraidedKleisliPair : Monad m => PreBraided (Kleislimorphism m) Pair ()
276 | BraidedKleisliPair = KleisliFromTensor
278 | public export %hint
279 | BraidedKleisliEither : Monad m => Braided (Kleislimorphism m) Either Void
280 | BraidedKleisliEither = KleisliFromTensor
284 | FuncPair : Braided (~~>) Pair ()
285 | FuncPair = FuncFromTensor
288 | FuncEither : Braided (~~>) Either Void
289 | FuncEither = FuncFromTensor
292 | namespace MonSymmetric
296 | [MorFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i) =>
297 | MonSymmetric Morphism ten i using Braided.MorFromTensor where
302 | [FuncFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i) =>
303 | MonSymmetric (~~>) ten i using Category.Function Braided.FuncFromTensor where
304 | permute = permuteDefault {cat=(~~>),ten}
313 | [KleisliFromTensor] {ten,i : _} -> (Symmetric ten, Tensor ten i, Bitraversable ten, Monad m) =>
314 | MonSymmetric (Kleislimorphism m) ten i using Braided.KleisliFromTensor where
315 | permute p = Kleisli $
Prelude.(.) pure $
permute @{FuncFromTensor} p
318 | MonSymmetric Morphism Pair () where
319 | permute {xs=[]} [] = id
320 | permute {xs=[_]} [_] = id
321 | permute {xs=[_,_]} [FZ,FZ] = id
322 | permute {xs=[_,_]} [FS FZ,FZ] = braid
323 | permute p = Mor $
\xs => pairFromHList $
permuteHList p $
pairToHList xs
325 | public export %hint
326 | SymmetricMorEither : MonSymmetric Morphism Either Void
327 | SymmetricMorEither = MorFromTensor
330 | public export %hint
331 | SymmetricKleisliPair : Monad m => PreSymmetric (Kleislimorphism m) Pair ()
332 | SymmetricKleisliPair = Impl
334 | [Impl] MonSymmetric (Kleislimorphism m) Pair () where
335 | permute {xs=[]} [] = id
336 | permute {xs=[_]} [_] = id
337 | permute {xs=[_,_]} [FZ,FZ] = id
338 | permute {xs=[_,_]} [FS FZ,FZ] = braid
339 | permute p = Kleisli $
\xs => pure $
pairFromHList $
permuteHList p $
pairToHList xs
341 | public export %hint
342 | SymmetricKleisliEither : Monad m => MonSymmetric (Kleislimorphism m) Either Void
343 | SymmetricKleisliEither = KleisliFromTensor
345 | namespace MonSymmetric
347 | FuncPair : MonSymmetric (~~>) Pair ()
348 | FuncPair = MkMonSymmetric @{FuncPair} (\p,xs => pairFromHList $
permuteHList p $
pairToHList xs)
351 | FuncEither : MonSymmetric (~~>) Either Void
352 | FuncEither = FuncFromTensor