{-# LANGUAGE MultiParamTypeClasses, MonadComprehensions #-}
module Math.Categories.CommaCategory
(
CommaObject,
indexSource,
indexTarget,
selectedArrow,
commaObject,
unsafeCommaObject,
CommaMorphism,
indexFirstArrow,
indexSecondArrow,
commaMorphism,
unsafeCommaMorphism,
CommaCategory(..),
sliceCategory,
cosliceCategory,
arrowCategory,
)
where
import qualified Data.WeakSet as Set
import Data.WeakSet (Set)
import Data.WeakSet.Safe
import qualified Data.WeakMap as Map
import Data.WeakMap (Map)
import Data.WeakMap.Safe
import Math.Category
import Math.FiniteCategory
import Math.Categories.FinCat
import Math.Categories.FunctorCategory
import Math.FiniteCategories.One
import Math.IO.PrettyPrint
data CommaObject o1 o2 m3 = CommaObject { forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource :: o1
, forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget :: o2
, forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow :: m3
} deriving (CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
(CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool)
-> (CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool)
-> Eq (CommaObject o1 o2 m3)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall o1 o2 m3.
(Eq o1, Eq o2, Eq m3) =>
CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
$c== :: forall o1 o2 m3.
(Eq o1, Eq o2, Eq m3) =>
CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
== :: CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
$c/= :: forall o1 o2 m3.
(Eq o1, Eq o2, Eq m3) =>
CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
/= :: CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
Eq)
instance (PrettyPrint o1, PrettyPrint o2, PrettyPrint m3) =>
PrettyPrint (CommaObject o1 o2 m3) where
pprint :: CommaObject o1 o2 m3 -> String
pprint CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e, indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d, selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f} = String
"<"String -> String -> String
forall a. [a] -> [a] -> [a]
++o1 -> String
forall a. PrettyPrint a => a -> String
pprint o1
eString -> String -> String
forall a. [a] -> [a] -> [a]
++String
", "String -> String -> String
forall a. [a] -> [a] -> [a]
++o2 -> String
forall a. PrettyPrint a => a -> String
pprint o2
dString -> String -> String
forall a. [a] -> [a] -> [a]
++String
", "String -> String -> String
forall a. [a] -> [a] -> [a]
++m3 -> String
forall a. PrettyPrint a => a -> String
pprint m3
fString -> String -> String
forall a. [a] -> [a] -> [a]
++String
">"
instance (Show o1, Show o2, Show m3) =>
Show (CommaObject o1 o2 m3) where
show :: CommaObject o1 o2 m3 -> String
show CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e, indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d, selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f} = String
"(unsafeCommaObject ("String -> String -> String
forall a. [a] -> [a] -> [a]
++ o1 -> String
forall a. Show a => a -> String
show o1
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ o2 -> String
forall a. Show a => a -> String
show o2
d String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ m3 -> String
forall a. Show a => a -> String
show m3
f String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"))"
commaObject :: (Morphism m3 o3, Eq o1, Eq o2, Eq o3) => Diagram c1 m1 o1 c3 m3 o3 -> Diagram c2 m2 o2 c3 m3 o3 -> o1 -> o2 -> m3 -> Maybe (CommaObject o1 o2 m3)
commaObject :: forall m3 o3 o1 o2 c1 m1 c3 c2 m2.
(Morphism m3 o3, Eq o1, Eq o2, Eq o3) =>
Diagram c1 m1 o1 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
-> o1
-> o2
-> m3
-> Maybe (CommaObject o1 o2 m3)
commaObject Diagram c1 m1 o1 c3 m3 o3
d1 Diagram c2 m2 o2 c3 m3 o3
d2 o1
iS o2
iT m3
arr
| Diagram c1 m1 o1 c3 m3 o3
d1 Diagram c1 m1 o1 c3 m3 o3 -> o1 -> o3
forall o1 c1 m1 c2 m2 o2.
Eq o1 =>
Diagram c1 m1 o1 c2 m2 o2 -> o1 -> o2
->$ o1
iS o3 -> o3 -> Bool
forall a. Eq a => a -> a -> Bool
== (m3 -> o3
forall m o. Morphism m o => m -> o
source m3
arr) Bool -> Bool -> Bool
&& Diagram c2 m2 o2 c3 m3 o3
d2 Diagram c2 m2 o2 c3 m3 o3 -> o2 -> o3
forall o1 c1 m1 c2 m2 o2.
Eq o1 =>
Diagram c1 m1 o1 c2 m2 o2 -> o1 -> o2
->$ o2
iT o3 -> o3 -> Bool
forall a. Eq a => a -> a -> Bool
== (m3 -> o3
forall m o. Morphism m o => m -> o
target m3
arr) = CommaObject o1 o2 m3 -> Maybe (CommaObject o1 o2 m3)
forall a. a -> Maybe a
Just CommaObject{indexSource :: o1
indexSource=o1
iS, indexTarget :: o2
indexTarget=o2
iT,selectedArrow :: m3
selectedArrow=m3
arr}
| Bool
otherwise = Maybe (CommaObject o1 o2 m3)
forall a. Maybe a
Nothing
unsafeCommaObject :: o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject :: forall o1 o2 m3. o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject o1
iS o2
iT m3
arr = CommaObject{indexSource :: o1
indexSource=o1
iS, indexTarget :: o2
indexTarget=o2
iT,selectedArrow :: m3
selectedArrow=m3
arr}
data CommaMorphism o1 o2 m1 m2 m3 = CommaMorphism {forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM :: (CommaObject o1 o2 m3)
, forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM :: (CommaObject o1 o2 m3)
, forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow :: m1
, forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow :: m2}
deriving (CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
(CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool)
-> (CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool)
-> Eq (CommaMorphism o1 o2 m1 m2 m3)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall o1 o2 m1 m2 m3.
(Eq o1, Eq o2, Eq m3, Eq m1, Eq m2) =>
CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
$c== :: forall o1 o2 m1 m2 m3.
(Eq o1, Eq o2, Eq m3, Eq m1, Eq m2) =>
CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
== :: CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
$c/= :: forall o1 o2 m1 m2 m3.
(Eq o1, Eq o2, Eq m3, Eq m1, Eq m2) =>
CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
/= :: CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
Eq)
commaMorphism :: (Morphism m3 o3, Eq o1, Eq o2, Eq o3, Eq m1, Eq m2, Eq m3) => Diagram c1 m1 o1 c3 m3 o3 -> Diagram c2 m2 o2 c3 m3 o3 -> (CommaObject o1 o2 m3) -> (CommaObject o1 o2 m3) -> m1 -> m2 -> Maybe (CommaMorphism o1 o2 m1 m2 m3)
commaMorphism :: forall m3 o3 o1 o2 m1 m2 c1 c3 c2.
(Morphism m3 o3, Eq o1, Eq o2, Eq o3, Eq m1, Eq m2, Eq m3) =>
Diagram c1 m1 o1 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
-> CommaObject o1 o2 m3
-> CommaObject o1 o2 m3
-> m1
-> m2
-> Maybe (CommaMorphism o1 o2 m1 m2 m3)
commaMorphism Diagram c1 m1 o1 c3 m3 o3
d1 Diagram c2 m2 o2 c3 m3 o3
d2 CommaObject o1 o2 m3
s CommaObject o1 o2 m3
t m1
firstArr m2
secondArr
| Maybe m3 -> Bool
forall a. Maybe a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe m3
m1 Bool -> Bool -> Bool
|| Maybe m3 -> Bool
forall a. Maybe a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe m3
m2 Bool -> Bool -> Bool
|| Maybe m3
m1 Maybe m3 -> Maybe m3 -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe m3
m2 = Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. Maybe a
Nothing
| Bool
otherwise = CommaMorphism o1 o2 m1 m2 m3
-> Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. a -> Maybe a
Just CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s, tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
t, indexFirstArrow :: m1
indexFirstArrow=m1
firstArr, indexSecondArrow :: m2
indexSecondArrow=m2
secondArr}
where
m1 :: Maybe m3
m1 = (CommaObject o1 o2 m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o1 o2 m3
t) m3 -> m3 -> Maybe m3
forall m o. Morphism m o => m -> m -> Maybe m
@? (Diagram c1 m1 o1 c3 m3 o3
d1 Diagram c1 m1 o1 c3 m3 o3 -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
firstArr)
m2 :: Maybe m3
m2 = (Diagram c2 m2 o2 c3 m3 o3
d2 Diagram c2 m2 o2 c3 m3 o3 -> m2 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m2
secondArr) m3 -> m3 -> Maybe m3
forall m o. Morphism m o => m -> m -> Maybe m
@? (CommaObject o1 o2 m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o1 o2 m3
s)
unsafeCommaMorphism :: (CommaObject o1 o2 m3) -> (CommaObject o1 o2 m3) -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism :: forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism CommaObject o1 o2 m3
s CommaObject o1 o2 m3
t m1
firstArr m2
secondArr = CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s, tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
t, indexFirstArrow :: m1
indexFirstArrow=m1
firstArr, indexSecondArrow :: m2
indexSecondArrow=m2
secondArr}
instance (Show o1, Show o2, Show m1, Show m2, Show m3) =>
Show (CommaMorphism o1 o2 m1 m2 m3) where
show :: CommaMorphism o1 o2 m1 m2 m3 -> String
show CommaMorphism{srcCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s, tgtCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM =CommaObject o1 o2 m3
t, indexFirstArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow=m1
k, indexSecondArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow=m2
h} = String
"(unsafeCommaMorphism ("String -> String -> String
forall a. [a] -> [a] -> [a]
++CommaObject o1 o2 m3 -> String
forall a. Show a => a -> String
show CommaObject o1 o2 m3
sString -> String -> String
forall a. [a] -> [a] -> [a]
++String
") ("String -> String -> String
forall a. [a] -> [a] -> [a]
++CommaObject o1 o2 m3 -> String
forall a. Show a => a -> String
show CommaObject o1 o2 m3
tString -> String -> String
forall a. [a] -> [a] -> [a]
++String
") ("String -> String -> String
forall a. [a] -> [a] -> [a]
++m1 -> String
forall a. Show a => a -> String
show m1
kString -> String -> String
forall a. [a] -> [a] -> [a]
++String
") ("String -> String -> String
forall a. [a] -> [a] -> [a]
++m2 -> String
forall a. Show a => a -> String
show m2
hString -> String -> String
forall a. [a] -> [a] -> [a]
++String
"))"
instance (PrettyPrint m1, PrettyPrint m2) =>
PrettyPrint (CommaMorphism o1 o2 m1 m2 m3) where
pprint :: CommaMorphism o1 o2 m1 m2 m3 -> String
pprint CommaMorphism{srcCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
_, tgtCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM =CommaObject o1 o2 m3
_, indexFirstArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow=m1
k, indexSecondArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow=m2
h} = String
"<"String -> String -> String
forall a. [a] -> [a] -> [a]
++m1 -> String
forall a. PrettyPrint a => a -> String
pprint m1
kString -> String -> String
forall a. [a] -> [a] -> [a]
++String
", "String -> String -> String
forall a. [a] -> [a] -> [a]
++m2 -> String
forall a. PrettyPrint a => a -> String
pprint m2
hString -> String -> String
forall a. [a] -> [a] -> [a]
++String
">"
instance (Morphism m1 o1, Morphism m2 o2, Eq o1, Eq o2, Eq m3) => Morphism (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) where
@? :: CommaMorphism o1 o2 m1 m2 m3
-> CommaMorphism o1 o2 m1 m2 m3
-> Maybe (CommaMorphism o1 o2 m1 m2 m3)
(@?) CommaMorphism{srcCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s2,tgtCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
t2,indexFirstArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow=m1
k2,indexSecondArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow=m2
h2} CommaMorphism{srcCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s1,tgtCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
t1,indexFirstArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow=m1
k1,indexSecondArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow=m2
h1}
| CommaObject o1 o2 m3
t1 CommaObject o1 o2 m3 -> CommaObject o1 o2 m3 -> Bool
forall a. Eq a => a -> a -> Bool
/= CommaObject o1 o2 m3
s2 = Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. Maybe a
Nothing
| Maybe m1 -> Bool
forall a. Maybe a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe m1
compoK = Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. Maybe a
Nothing
| Maybe m2 -> Bool
forall a. Maybe a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe m2
compoH = Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. Maybe a
Nothing
| Bool
otherwise = CommaMorphism o1 o2 m1 m2 m3
-> Maybe (CommaMorphism o1 o2 m1 m2 m3)
forall a. a -> Maybe a
Just CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
s1,tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
t2,indexFirstArrow :: m1
indexFirstArrow=m1
k,indexSecondArrow :: m2
indexSecondArrow=m2
h}
where
compoK :: Maybe m1
compoK = m1
k2 m1 -> m1 -> Maybe m1
forall m o. Morphism m o => m -> m -> Maybe m
@? m1
k1
Just m1
k = Maybe m1
compoK
compoH :: Maybe m2
compoH = m2
h2 m2 -> m2 -> Maybe m2
forall m o. Morphism m o => m -> m -> Maybe m
@? m2
h1
Just m2
h = Maybe m2
compoH
source :: CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
source = CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM
target :: CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
target = CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM
data CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 = CommaCategory {forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram :: Diagram c1 m1 o1 c3 m3 o3
, forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram :: Diagram c2 m2 o2 c3 m3 o3}
deriving (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
(CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool)
-> Eq (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Eq c1, Eq c3, Eq o1, Eq o3, Eq m1, Eq m3, Eq c2, Eq o2, Eq m2) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
$c== :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Eq c1, Eq c3, Eq o1, Eq o3, Eq m1, Eq m3, Eq c2, Eq o2, Eq m2) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
== :: CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
$c/= :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Eq c1, Eq c3, Eq o1, Eq o3, Eq m1, Eq m3, Eq c2, Eq o2, Eq m2) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
/= :: CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> Bool
Eq, Int -> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String -> String
[CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3] -> String -> String
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String
(Int
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String -> String)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String)
-> ([CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3] -> String -> String)
-> Show (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3)
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
Int -> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String -> String
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
[CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3] -> String -> String
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String
$cshowsPrec :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
Int -> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String -> String
showsPrec :: Int -> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String -> String
$cshow :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String
show :: CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String
$cshowList :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
(Show c1, Show c3, Show o1, Show o3, Show m1, Show m3, Show c2,
Show o2, Show m2) =>
[CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3] -> String -> String
showList :: [CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3] -> String -> String
Show)
instance (Category c1 m1 o1, Morphism m1 o1, Eq m1, Eq o1,
Category c2 m2 o2, Morphism m2 o2, Eq m2, Eq o2,
Category c3 m3 o3, Morphism m3 o3, Eq m3, Eq o3) => Category (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3) (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) where
identity :: Morphism (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaObject o1 o2 m3 -> CommaMorphism o1 o2 m1 m2 m3
identity CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc CommaObject o1 o2 m3
co = CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM = CommaObject o1 o2 m3
co, tgtCM :: CommaObject o1 o2 m3
tgtCM = CommaObject o1 o2 m3
co, indexFirstArrow :: m1
indexFirstArrow = ((c1 -> o1 -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity(c1 -> o1 -> m1)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> c1)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> o1
-> m1
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Diagram c1 m1 o1 c3 m3 o3 -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src(Diagram c1 m1 o1 c3 m3 o3 -> c1)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> c1
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> o1 -> m1)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> o1 -> m1
forall a b. (a -> b) -> a -> b
$ CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc) (CommaObject o1 o2 m3 -> o1
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o1 o2 m3
co)), indexSecondArrow :: m2
indexSecondArrow = ((c2 -> o2 -> m2
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity(c2 -> o2 -> m2)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> c2)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> o2
-> m2
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Diagram c2 m2 o2 c3 m3 o3 -> c2
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src(Diagram c2 m2 o2 c3 m3 o3 -> c2)
-> (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> c2
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> o2 -> m2)
-> CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> o2 -> m2
forall a b. (a -> b) -> a -> b
$ CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc) (CommaObject o1 o2 m3 -> o2
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o1 o2 m3
co))}
ar :: Morphism (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaObject o1 o2 m3
-> CommaObject o1 o2 m3
-> Set (CommaMorphism o1 o2 m1 m2 m3)
ar CommaCategory{leftDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram = Diagram c1 m1 o1 c3 m3 o3
t, rightDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram = Diagram c2 m2 o2 c3 m3 o3
s} obj1 :: CommaObject o1 o2 m3
obj1@CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e1,indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d1,selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f1} obj2 :: CommaObject o1 o2 m3
obj2@CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e2,indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d2,selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f2}
= [CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
obj1,tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
obj2,indexFirstArrow :: m1
indexFirstArrow=m1
k,indexSecondArrow :: m2
indexSecondArrow=m2
h}| m1
k <- c1 -> o1 -> o1 -> Set m1
forall c m o.
(Category c m o, Morphism m o) =>
c -> o -> o -> Set m
ar (Diagram c1 m1 o1 c3 m3 o3 -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o1 c3 m3 o3
t) o1
e1 o1
e2, m2
h <- c2 -> o2 -> o2 -> Set m2
forall c m o.
(Category c m o, Morphism m o) =>
c -> o -> o -> Set m
ar (Diagram c2 m2 o2 c3 m3 o3 -> c2
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c2 m2 o2 c3 m3 o3
s) o2
d1 o2
d2, m3
f2 m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ (Diagram c1 m1 o1 c3 m3 o3
t Diagram c1 m1 o1 c3 m3 o3 -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
k) m3 -> m3 -> Bool
forall a. Eq a => a -> a -> Bool
== (Diagram c2 m2 o2 c3 m3 o3
s Diagram c2 m2 o2 c3 m3 o3 -> m2 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m2
h) m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ m3
f1]
genAr :: Morphism (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaObject o1 o2 m3
-> CommaObject o1 o2 m3
-> Set (CommaMorphism o1 o2 m1 m2 m3)
genAr CommaCategory{leftDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram = Diagram c1 m1 o1 c3 m3 o3
t, rightDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram = Diagram c2 m2 o2 c3 m3 o3
s} obj1 :: CommaObject o1 o2 m3
obj1@CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e1,indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d1,selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f1} obj2 :: CommaObject o1 o2 m3
obj2@CommaObject{indexSource :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource=o1
e2,indexTarget :: forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget=o2
d2,selectedArrow :: forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow=m3
f2}
| o2
d1 o2 -> o2 -> Bool
forall a. Eq a => a -> a -> Bool
== o2
d2 = [CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
obj1,tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
obj2,indexFirstArrow :: m1
indexFirstArrow=m1
k,indexSecondArrow :: m2
indexSecondArrow=c2 -> o2 -> m2
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c2 m2 o2 c3 m3 o3 -> c2
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c2 m2 o2 c3 m3 o3
s) o2
d1}| m1
k <- c1 -> o1 -> o1 -> Set m1
forall c m o.
(Category c m o, Morphism m o) =>
c -> o -> o -> Set m
genAr (Diagram c1 m1 o1 c3 m3 o3 -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o1 c3 m3 o3
t) o1
e1 o1
e2, m3
f2 m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ (Diagram c1 m1 o1 c3 m3 o3
t Diagram c1 m1 o1 c3 m3 o3 -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
k) m3 -> m3 -> Bool
forall a. Eq a => a -> a -> Bool
== m3
f1]
| o1
e1 o1 -> o1 -> Bool
forall a. Eq a => a -> a -> Bool
== o1
e2 = [CommaMorphism{srcCM :: CommaObject o1 o2 m3
srcCM=CommaObject o1 o2 m3
obj1,tgtCM :: CommaObject o1 o2 m3
tgtCM=CommaObject o1 o2 m3
obj2,indexFirstArrow :: m1
indexFirstArrow=c1 -> o1 -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c1 m1 o1 c3 m3 o3 -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o1 c3 m3 o3
t) o1
e1,indexSecondArrow :: m2
indexSecondArrow=m2
h}| m2
h <- c2 -> o2 -> o2 -> Set m2
forall c m o.
(Category c m o, Morphism m o) =>
c -> o -> o -> Set m
genAr (Diagram c2 m2 o2 c3 m3 o3 -> c2
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c2 m2 o2 c3 m3 o3
s) o2
d1 o2
d2, m3
f2 m3 -> m3 -> Bool
forall a. Eq a => a -> a -> Bool
== (Diagram c2 m2 o2 c3 m3 o3
s Diagram c2 m2 o2 c3 m3 o3 -> m2 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m2
h) m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ m3
f1]
| Bool
otherwise = [CommaMorphism o1 o2 m1 m2 m3]
-> Set (CommaMorphism o1 o2 m1 m2 m3)
forall a. [a] -> Set a
set []
decompose :: Morphism (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) =>
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaMorphism o1 o2 m1 m2 m3 -> [CommaMorphism o1 o2 m1 m2 m3]
decompose CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc CommaMorphism o1 o2 m1 m2 m3
cm
| [CommaMorphism o1 o2 m1 m2 m3] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [CommaMorphism o1 o2 m1 m2 m3]
hyp Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = [CommaMorphism o1 o2 m1 m2 m3]
hyp
| Bool
otherwise = (CommaMorphism o1 o2 m1 m2 m3 -> Bool)
-> [CommaMorphism o1 o2 m1 m2 m3] -> [CommaMorphism o1 o2 m1 m2 m3]
forall a. (a -> Bool) -> [a] -> [a]
filter (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaMorphism o1 o2 m1 m2 m3 -> Bool
forall c m o.
(Category c m o, Morphism m o, Eq m, Eq o) =>
c -> m -> Bool
isNotIdentity CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc) [CommaMorphism o1 o2 m1 m2 m3]
hyp
where
hyp :: [CommaMorphism o1 o2 m1 m2 m3]
hyp = CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> CommaMorphism o1 o2 m1 m2 m3 -> [CommaMorphism o1 o2 m1 m2 m3]
forall {o} {m3} {m1} {o} {m1} {o} {c2} {c1} {c}.
(Eq o, Eq m3, Eq m1, Eq o, Eq m1, Eq o, Category c2 m3 o,
Category c1 m1 o, Category c m1 o, Morphism m1 o, Morphism m3 o,
Morphism m1 o) =>
CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
decomposeHelper CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc CommaMorphism o1 o2 m1 m2 m3
cm
decomposeHelper :: CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
decomposeHelper cc :: CommaCategory c m1 o c1 m1 o c2 m3 o
cc@CommaCategory{leftDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram = Diagram c m1 o c2 m3 o
t, rightDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram = Diagram c1 m1 o c2 m3 o
s} cm :: CommaMorphism o o m1 m1 m3
cm@CommaMorphism{srcCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
srcCM=CommaObject o o m3
xfy,tgtCM :: forall o1 o2 m1 m2 m3.
CommaMorphism o1 o2 m1 m2 m3 -> CommaObject o1 o2 m3
tgtCM=CommaObject o o m3
x'gy',indexFirstArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m1
indexFirstArrow=m1
h,indexSecondArrow :: forall o1 o2 m1 m2 m3. CommaMorphism o1 o2 m1 m2 m3 -> m2
indexSecondArrow=m1
i}
| CommaObject o o m3
xfy CommaObject o o m3 -> CommaObject o o m3 -> Bool
forall a. Eq a => a -> a -> Bool
== CommaObject o o m3
x'gy' = [CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaObject o o m3 -> CommaMorphism o o m1 m1 m3
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity CommaCategory c m1 o c1 m1 o c2 m3 o
cc CommaObject o o m3
xfy]
| CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
xfy o -> o -> Bool
forall a. Eq a => a -> a -> Bool
== CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
x'gy' = CommaMorphism o o m1 m1 m3
resultTCommaMorphism o o m1 m1 m3
-> [CommaMorphism o o m1 m1 m3] -> [CommaMorphism o o m1 m1 m3]
forall a. a -> [a] -> [a]
:(CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose CommaCategory c m1 o c1 m1 o c2 m3 o
cc (CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism CommaObject o o m3
xfy (CommaMorphism o o m1 m1 m3 -> CommaObject o o m3
forall m o. Morphism m o => m -> o
source CommaMorphism o o m1 m1 m3
resultT) m1
composeAboveH (c1 -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c1 m1 o c2 m3 o -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o c2 m3 o
s) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
xfy))))
| CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy o -> o -> Bool
forall a. Eq a => a -> a -> Bool
== CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
x'gy' = (CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose CommaCategory c m1 o c1 m1 o c2 m3 o
cc (CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism (CommaMorphism o o m1 m1 m3 -> CommaObject o o m3
forall m o. Morphism m o => m -> o
target CommaMorphism o o m1 m1 m3
resultI) (CommaMorphism o o m1 m1 m3 -> CommaObject o o m3
forall m o. Morphism m o => m -> o
target CommaMorphism o o m1 m1 m3
cm) (c -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c m1 o c2 m3 o -> c
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c m1 o c2 m3 o
t) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy)) m1
composeBelowI))[CommaMorphism o o m1 m1 m3]
-> [CommaMorphism o o m1 m1 m3] -> [CommaMorphism o o m1 m1 m3]
forall a. [a] -> [a] -> [a]
++[CommaMorphism o o m1 m1 m3
resultI]
| Bool
otherwise = CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose CommaCategory c m1 o c1 m1 o c2 m3 o
cc (CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism (o -> o -> m3 -> CommaObject o o m3
forall o1 o2 m3. o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
x'gy') (Diagram c1 m1 o c2 m3 o
s Diagram c1 m1 o c2 m3 o -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
i m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ (CommaObject o o m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o o m3
xfy))) CommaObject o o m3
x'gy' m1
h (c1 -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c1 m1 o c2 m3 o -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o c2 m3 o
s) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
x'gy'))) [CommaMorphism o o m1 m1 m3]
-> [CommaMorphism o o m1 m1 m3] -> [CommaMorphism o o m1 m1 m3]
forall a. [a] -> [a] -> [a]
++ CommaCategory c m1 o c1 m1 o c2 m3 o
-> CommaMorphism o o m1 m1 m3 -> [CommaMorphism o o m1 m1 m3]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose CommaCategory c m1 o c1 m1 o c2 m3 o
cc (CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism CommaObject o o m3
xfy (o -> o -> m3 -> CommaObject o o m3
forall o1 o2 m3. o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
x'gy') (Diagram c1 m1 o c2 m3 o
s Diagram c1 m1 o c2 m3 o -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
i m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ CommaObject o o m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o o m3
xfy)) (c -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c m1 o c2 m3 o -> c
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c m1 o c2 m3 o
t) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy)) m1
i)
where
decompH :: [m1]
decompH = c -> m1 -> [m1]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose (Diagram c m1 o c2 m3 o -> c
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c m1 o c2 m3 o
t) m1
h [m1] -> [m1] -> [m1]
forall a. [a] -> [a] -> [a]
++ [c -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c m1 o c2 m3 o -> c
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c m1 o c2 m3 o
t) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy)]
genH :: m1
genH = [m1] -> m1
forall a. HasCallStack => [a] -> a
head [m1]
decompH
composeAboveH :: m1
composeAboveH = [m1] -> m1
forall m o. Morphism m o => [m] -> m
compose([m1] -> m1) -> ([m1] -> [m1]) -> [m1] -> m1
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[m1] -> [m1]
forall a. HasCallStack => [a] -> [a]
tail ([m1] -> m1) -> [m1] -> m1
forall a b. (a -> b) -> a -> b
$ [m1]
decompH
resultT :: CommaMorphism o o m1 m1 m3
resultT = CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism (o -> o -> m3 -> CommaObject o o m3
forall o1 o2 m3. o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject (m1 -> o
forall m o. Morphism m o => m -> o
source m1
genH) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
xfy) ((CommaObject o o m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o o m3
x'gy') m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ (Diagram c m1 o c2 m3 o
t Diagram c m1 o c2 m3 o -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
genH))) CommaObject o o m3
x'gy' m1
genH (c1 -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c1 m1 o c2 m3 o -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o c2 m3 o
s) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
xfy))
decompI :: [m1]
decompI = [c1 -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c1 m1 o c2 m3 o -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o c2 m3 o
s) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o2
indexTarget CommaObject o o m3
x'gy')] [m1] -> [m1] -> [m1]
forall a. [a] -> [a] -> [a]
++ c1 -> m1 -> [m1]
forall c m o. (Category c m o, Morphism m o) => c -> m -> [m]
decompose (Diagram c1 m1 o c2 m3 o -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o c2 m3 o
s) m1
i
genI :: m1
genI = [m1] -> m1
forall a. HasCallStack => [a] -> a
last [m1]
decompI
composeBelowI :: m1
composeBelowI = [m1] -> m1
forall m o. Morphism m o => [m] -> m
compose([m1] -> m1) -> ([m1] -> [m1]) -> [m1] -> m1
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[m1] -> [m1]
forall a. HasCallStack => [a] -> [a]
init ([m1] -> m1) -> [m1] -> m1
forall a b. (a -> b) -> a -> b
$ [m1]
decompI
resultI :: CommaMorphism o o m1 m1 m3
resultI = CommaObject o o m3
-> CommaObject o o m3 -> m1 -> m1 -> CommaMorphism o o m1 m1 m3
forall o1 o2 m3 m1 m2.
CommaObject o1 o2 m3
-> CommaObject o1 o2 m3 -> m1 -> m2 -> CommaMorphism o1 o2 m1 m2 m3
unsafeCommaMorphism CommaObject o o m3
xfy (o -> o -> m3 -> CommaObject o o m3
forall o1 o2 m3. o1 -> o2 -> m3 -> CommaObject o1 o2 m3
unsafeCommaObject (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy) (m1 -> o
forall m o. Morphism m o => m -> o
target m1
genI) ((Diagram c1 m1 o c2 m3 o
s Diagram c1 m1 o c2 m3 o -> m1 -> m3
forall m1 c1 o1 c2 m2 o2.
Eq m1 =>
Diagram c1 m1 o1 c2 m2 o2 -> m1 -> m2
->£ m1
genI) m3 -> m3 -> m3
forall m o. Morphism m o => m -> m -> m
@ (CommaObject o o m3 -> m3
forall o1 o2 m3. CommaObject o1 o2 m3 -> m3
selectedArrow CommaObject o o m3
xfy))) (c -> o -> m1
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity (Diagram c m1 o c2 m3 o -> c
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c m1 o c2 m3 o
t) (CommaObject o o m3 -> o
forall o1 o2 m3. CommaObject o1 o2 m3 -> o1
indexSource CommaObject o o m3
xfy)) m1
genI
instance (FiniteCategory c1 m1 o1, Morphism m1 o1, Eq m1, Eq o1,
FiniteCategory c2 m2 o2, Morphism m2 o2, Eq m2, Eq o2,
FiniteCategory c3 m3 o3, Morphism m3 o3, Eq m3, Eq o3) => FiniteCategory (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3) (CommaMorphism o1 o2 m1 m2 m3) (CommaObject o1 o2 m3) where
ob :: CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Set (CommaObject o1 o2 m3)
ob CommaCategory{leftDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram = Diagram c1 m1 o1 c3 m3 o3
t, rightDiagram :: forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram = Diagram c2 m2 o2 c3 m3 o3
s} = [CommaObject{indexSource :: o1
indexSource=o1
e,indexTarget :: o2
indexTarget=o2
d,selectedArrow :: m3
selectedArrow=m3
f}| o1
e <- (c1 -> Set o1
forall c m o. FiniteCategory c m o => c -> Set o
ob (Diagram c1 m1 o1 c3 m3 o3 -> c1
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c1 m1 o1 c3 m3 o3
t)), o2
d <- (c2 -> Set o2
forall c m o. FiniteCategory c m o => c -> Set o
ob (Diagram c2 m2 o2 c3 m3 o3 -> c2
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c1
src Diagram c2 m2 o2 c3 m3 o3
s)), m3
f <- c3 -> o3 -> o3 -> Set m3
forall c m o.
(Category c m o, Morphism m o) =>
c -> o -> o -> Set m
ar (Diagram c1 m1 o1 c3 m3 o3 -> c3
forall c1 m1 o1 c2 m2 o2. Diagram c1 m1 o1 c2 m2 o2 -> c2
tgt Diagram c1 m1 o1 c3 m3 o3
t) (Diagram c1 m1 o1 c3 m3 o3
t Diagram c1 m1 o1 c3 m3 o3 -> o1 -> o3
forall o1 c1 m1 c2 m2 o2.
Eq o1 =>
Diagram c1 m1 o1 c2 m2 o2 -> o1 -> o2
->$ o1
e) (Diagram c2 m2 o2 c3 m3 o3
s Diagram c2 m2 o2 c3 m3 o3 -> o2 -> o3
forall o1 c1 m1 c2 m2 o2.
Eq o1 =>
Diagram c1 m1 o1 c2 m2 o2 -> o1 -> o2
->$ o2
d)]
instance (PrettyPrint c1, PrettyPrint m1, PrettyPrint o1,
PrettyPrint c2, PrettyPrint m2, PrettyPrint o2,
PrettyPrint c3, PrettyPrint m3, PrettyPrint o3,
Eq m1, Eq o1, Eq m2, Eq o2, Eq m3, Eq o3) => PrettyPrint (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3) where
pprint :: CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3 -> String
pprint CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc = String
"CommaCategory("String -> String -> String
forall a. [a] -> [a] -> [a]
++ Diagram c1 m1 o1 c3 m3 o3 -> String
forall a. PrettyPrint a => a -> String
pprint (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c1 m1 o1 c3 m3 o3
leftDiagram CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", "String -> String -> String
forall a. [a] -> [a] -> [a]
++ Diagram c2 m2 o2 c3 m3 o3 -> String
forall a. PrettyPrint a => a -> String
pprint (CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
forall c1 m1 o1 c2 m2 o2 c3 m3 o3.
CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
-> Diagram c2 m2 o2 c3 m3 o3
rightDiagram CommaCategory c1 m1 o1 c2 m2 o2 c3 m3 o3
cc)String -> String -> String
forall a. [a] -> [a] -> [a]
++String
")"
sliceCategory :: (FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) => c -> o -> Maybe (CommaCategory c m o One One One c m o)
sliceCategory :: forall c m o.
(FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) =>
c -> o -> Maybe (CommaCategory c m o One One One c m o)
sliceCategory c
c o
o
| o
o o -> Set o -> Bool
forall a. Eq a => a -> Set a -> Bool
`isIn` c -> Set o
forall c m o. FiniteCategory c m o => c -> Set o
ob c
c = CommaCategory c m o One One One c m o
-> Maybe (CommaCategory c m o One One One c m o)
forall a. a -> Maybe a
Just CommaCategory{leftDiagram :: Diagram c m o c m o
leftDiagram=FinCat c m o -> c -> Diagram c m o c m o
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity FinCat c m o
forall c m o. FinCat c m o
FinCat c
c, rightDiagram :: Diagram One One One c m o
rightDiagram=c -> o -> Diagram One One One c m o
forall c m o.
(Category c m o, Morphism m o, Eq o) =>
c -> o -> Diagram One One One c m o
selectObject c
c o
o}
| Bool
otherwise = Maybe (CommaCategory c m o One One One c m o)
forall a. Maybe a
Nothing
cosliceCategory :: (FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) => c -> o -> Maybe (CommaCategory One One One c m o c m o)
cosliceCategory :: forall c m o.
(FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) =>
c -> o -> Maybe (CommaCategory One One One c m o c m o)
cosliceCategory c
c o
o
| o
o o -> Set o -> Bool
forall a. Eq a => a -> Set a -> Bool
`isIn` c -> Set o
forall c m o. FiniteCategory c m o => c -> Set o
ob c
c = CommaCategory One One One c m o c m o
-> Maybe (CommaCategory One One One c m o c m o)
forall a. a -> Maybe a
Just CommaCategory{leftDiagram :: Diagram One One One c m o
leftDiagram=c -> o -> Diagram One One One c m o
forall c m o.
(Category c m o, Morphism m o, Eq o) =>
c -> o -> Diagram One One One c m o
selectObject c
c o
o, rightDiagram :: Diagram c m o c m o
rightDiagram=FinCat c m o -> c -> Diagram c m o c m o
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity FinCat c m o
forall c m o. FinCat c m o
FinCat c
c}
| Bool
otherwise = Maybe (CommaCategory One One One c m o c m o)
forall a. Maybe a
Nothing
arrowCategory :: (FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) => c -> CommaCategory c m o c m o c m o
arrowCategory :: forall c m o.
(FiniteCategory c m o, Morphism m o, Eq c, Eq m, Eq o) =>
c -> CommaCategory c m o c m o c m o
arrowCategory c
c = CommaCategory{leftDiagram :: Diagram c m o c m o
leftDiagram=FinCat c m o -> c -> Diagram c m o c m o
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity FinCat c m o
forall c m o. FinCat c m o
FinCat c
c, rightDiagram :: Diagram c m o c m o
rightDiagram=FinCat c m o -> c -> Diagram c m o c m o
forall c m o. (Category c m o, Morphism m o) => c -> o -> m
identity FinCat c m o
forall c m o. FinCat c m o
FinCat c
c}