0 | module Control.Category.Braided
2 | import Control.Category.Core
3 | import Control.Category.Functor
4 | import Control.Category.Monoidal
5 | import Data.Morphisms
31 | interface Monoidal cat ten i =>
32 | Braided (0 cat : Hom obj) (ten : obj -> obj -> obj) (i : obj) | cat,ten where
33 | constructor MkBraided
35 | braid : {a,b : _} -> cat (a `ten` b) (b `ten` a)
42 | braid' : {a,b : _} -> cat (b `ten` a) (a `ten` b)
47 | PreBraided : (cat : Hom obj) -> (ten : obj -> obj -> obj) -> (i : obj) -> Type
48 | PreBraided = Braided
57 | swapAssoc : Braided cat ten i => {xs,ys : _} ->
58 | cat (TenSeq ten i (xs ++ ys)) (TenSeq ten i (ys ++ xs))
59 | swapAssoc @{c@(MkBraided{})} = mergeAssoc . braid . splitAssoc
66 | swapAssoc' : Braided cat ten i => {xs,ys : _} ->
67 | cat (TenSeq ten i (xs ++ ys)) (TenSeq ten i (ys ++ xs))
68 | swapAssoc' @{c@(MkBraided{})} = mergeAssoc . braid' . splitAssoc
72 | bringToFront : Braided cat ten i => {xs,x,ys : _} ->
73 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (x :: xs ++ ys))
74 | bringToFront @{c@(MkBraided{})} {ys=[]} =
75 | rewrite appendNilRightNeutral xs in mergeAssoc . braid . splitAssoc
76 | bringToFront @{c@(MkBraided{})} {ys=_::_} =
77 | mergeAssoc {xs=x::xs} . mapl' (mergeAssoc {xs=[x]} . braid) . assoc' . splitAssoc
84 | bringToFront' : Braided cat ten i => {xs,x,ys : _} ->
85 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (x :: xs ++ ys))
86 | bringToFront' @{c@(MkBraided{})} {ys=[]} =
87 | rewrite appendNilRightNeutral xs in mergeAssoc . braid' . splitAssoc
88 | bringToFront' @{c@(MkBraided{})} {ys=_::_} =
89 | mergeAssoc {xs=x::xs} . mapl' (mergeAssoc {xs=[x]} . braid') . assoc' . splitAssoc
96 | insertFromFront : Braided cat ten i => {x,xs,ys : _} ->
97 | cat (TenSeq ten i (x :: xs ++ ys)) (TenSeq ten i (xs ++ x :: ys))
98 | insertFromFront @{c@(MkBraided{})} {ys=[]} =
99 | rewrite appendNilRightNeutral xs in mergeAssoc . braid . splitAssoc {xs=[_]}
100 | insertFromFront @{c@(MkBraided{})} {ys=_::_} =
101 | mergeAssoc . assoc . mapl' (Core.(.) braid $
splitAssoc {xs=[x]}) . splitAssoc {xs=x::xs}
110 | insertFromFront' : Braided cat ten i => {x,xs,ys : _} ->
111 | cat (TenSeq ten i (x :: xs ++ ys)) (TenSeq ten i (xs ++ x :: ys))
112 | insertFromFront' @{c@(MkBraided{})} {ys=[]} =
113 | rewrite appendNilRightNeutral xs in mergeAssoc . braid' . splitAssoc {xs=[_]}
114 | insertFromFront' @{c@(MkBraided{})} {ys=_::_} =
115 | mergeAssoc . assoc . mapl' (Core.(.) braid' $
splitAssoc {xs=[x]}) . splitAssoc {xs=x::xs}
119 | sendToBack : Braided cat ten i => {xs,x,ys : _} ->
120 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (xs ++ ys ++ [x]))
121 | sendToBack @{c@(MkBraided{})} {ys=[]} = id
122 | sendToBack @{c@(MkBraided{})} {ys=_::_} =
123 | mergeAssoc . mapr' (mergeAssoc {ys=[x]} . braid) . splitAssoc
130 | sendToBack' : Braided cat ten i => {xs,x,ys : _} ->
131 | cat (TenSeq ten i (xs ++ x :: ys)) (TenSeq ten i (xs ++ ys ++ [x]))
132 | sendToBack' @{c@(MkBraided{})} {ys=[]} = id
133 | sendToBack' @{c@(MkBraided{})} {ys=_::_} =
134 | mergeAssoc . mapr' (mergeAssoc {ys=[x]} . braid') . splitAssoc
141 | insertFromBack : Braided cat ten i => {xs,x,ys : _} ->
142 | cat (TenSeq ten i (xs ++ ys ++ [x])) (TenSeq ten i (xs ++ x :: ys))
143 | insertFromBack @{c@(MkBraided{})} {ys=[]} = id
144 | insertFromBack @{c@(MkBraided{})} {ys=_::_} =
145 | mergeAssoc . mapr' (braid . splitAssoc {ys=[x]}) . splitAssoc
154 | insertFromBack' : Braided cat ten i => {xs,x,ys : _} ->
155 | cat (TenSeq ten i (xs ++ ys ++ [x])) (TenSeq ten i (xs ++ x :: ys))
156 | insertFromBack' @{c@(MkBraided{})} {ys=[]} = id
157 | insertFromBack' @{c@(MkBraided{})} {ys=_::_} =
158 | mergeAssoc . mapr' (braid' . splitAssoc {ys=[x]}) . splitAssoc
169 | [FlipBraid] {ten,i : _} -> Braided cat ten i => Braided cat ten i where
182 | [MorFromTensor] {ten,i : _} -> (Tensor.Symmetric ten, Tensor ten i) =>
183 | Braided Morphism ten i using Monoidal.MorFromTensor where
189 | [FuncFromTensor] {ten,i : _} -> (Tensor.Symmetric ten, Tensor ten i) =>
190 | Braided (~~>) ten i using Category.Function Monoidal.FuncFromTensor where
200 | [KleisliFromTensor] {ten,i : _} -> (Tensor.Symmetric ten, Tensor ten i, Bitraversable ten, Monad m) =>
201 | Braided (Kleislimorphism m) ten i using Monoidal.KleisliFromTensor where
202 | braid = Kleisli $
pure . swap'
204 | public export %hint
205 | BraidedMorPair : Braided Morphism Pair ()
206 | BraidedMorPair = MorFromTensor
208 | public export %hint
209 | BraidedMorEither : Braided Morphism Either Void
210 | BraidedMorEither = MorFromTensor
213 | public export %hint
214 | BraidedKleisliPair : Monad m => PreBraided (Kleislimorphism m) Pair ()
215 | BraidedKleisliPair = KleisliFromTensor
217 | public export %hint
218 | BraidedKleisliEither : Monad m => Braided (Kleislimorphism m) Either Void
219 | BraidedKleisliEither = KleisliFromTensor
223 | FuncPair : Braided (~~>) Pair ()
224 | FuncPair = FuncFromTensor
227 | FuncEither : Braided (~~>) Either Void
228 | FuncEither = FuncFromTensor