#line 1 "/tmp/ghc4538.lpp"
{-# LINE 30 "Category.lhs" #-}
#line 1 "./Macros.h"
{-# LINE 29 "Macros.lhs" #-}
{-# OPTIONS_GHC -fglasgow-exts -fno-implicit-prelude -W -Werror #-}
module Category where
{-# LINE 37 "Macros.lhs" #-}
{-# LINE 43 "Macros.lhs" #-}
{-# LINE 51 "Macros.lhs" #-}
{-# LINE 57 "Macros.lhs" #-}
#line 2 "/tmp/ghc4538.lpp"
{-# LINE 51 "Category.lhs" #-}
data UnivObjectEquality (eqR :: ((* -> *) -> (* -> *) -> *))
= UnivObjectEquality
{ univObEqReflexive :: UnivObReflexive eqR
, univObEqSymmetric :: UnivObSymmetric eqR
, univObEqTransitive :: UnivObTransitive eqR
}
type UnivObReflexive (eqR :: ((* -> *) -> (* -> *) -> *))
= forall (a :: (* -> *)). eqR a a
type UnivObSymmetric (eqR :: ((* -> *) -> (* -> *) -> *))
= forall (a :: (* -> *)) (b :: (* -> *)). eqR a b -> eqR b a
type UnivObTransitive (eqR :: ((* -> *) -> (* -> *) -> *))
= forall (a :: (* -> *)) (b :: (* -> *)) (c :: (* -> *)). eqR a b -> eqR b c -> eqR a c
{-# LINE 71 "Category.lhs" #-}
data Equality (eqR :: (* -> * -> *)) (a :: (* -> *)) = Equality
{ eqReflexive :: Reflexive eqR a
, eqSymmetric :: Symmetric eqR a
, eqTransitive :: Transitive eqR a
}
type Reflexive (eqR :: (* -> * -> *)) (a :: (* -> *))
= forall a1. a a1 -> eqR a1 a1
type Symmetric (eqR :: (* -> * -> *)) (a :: (* -> *))
= forall a1 a2. a a1 -> a a2 -> eqR a1 a2 -> eqR a2 a1
type Transitive (eqR :: (* -> * -> *)) (a :: (* -> *))
= forall a1 a2 a3. a a1 -> a a2 -> a a3 -> eqR a1 a2 -> eqR a2 a3 -> eqR a1 a3
type UnivReflexive (eqR :: (* -> * -> *))
= forall a1. eqR a1 a1
type UnivSymmetric (eqR :: (* -> * -> *))
= forall a1 a2. eqR a1 a2 -> eqR a2 a1
type UnivTransitive (eqR :: (* -> * -> *))
= forall a1 a2 a3. eqR a1 a2 -> eqR a2 a3 -> eqR a1 a3
newtype Identity a = Identity {runIdentity :: a}
{-# LINE 118 "Category.lhs" #-}
data LogEq (x :: *) (y :: *) = LogEq (x -> y) (y -> x)
id :: UnivReflexive (->)
id x = x
comp :: UnivTransitive (->)
comp g f x = f (g x)
(.) = (flip comp) :: (b -> c) -> (a -> b) -> a -> c
flip f x y = f y x
logEqUnivReflexive :: UnivReflexive LogEq
logEqUnivReflexive = LogEq id id
logEqUnivSymmetric :: UnivSymmetric LogEq
logEqUnivSymmetric (LogEq xy yx) = LogEq yx xy
logEqUnivTransitive :: UnivTransitive LogEq
logEqUnivTransitive (LogEq xy yx) (LogEq yz zy) = LogEq (yz . xy) (yx . zy)
{-# LINE 147 "Category.lhs" #-}
data Category (ob :: ((* -> *) -> *))
(objectEquality :: ((* -> *) -> (* -> *) -> *))
(hom :: ((* -> *) -> (* -> *) -> (* -> * -> *) -> *))
(morphismEquality :: (* -> * -> *))
(morphismComposition :: (* -> * -> *) -> (* -> * -> *) -> (* -> * -> *))
(identityRelation :: (* -> * -> *))
= Category
{ mtCategoryObjectEquality :: UnivObjectEquality objectEquality
, mtCategoryMorphismEquality :: Equality morphismEquality (IsAnyRelInstance hom)
, objectEqualityType :: forall a b. objectEquality a b -> Pair (ob a) (ob b)
, morphismType :: forall a b pcf. hom a b pcf -> Pair (ob a) (ob b)
, morphismEqualityType :: forall f g. morphismEquality f g -> MorphismEqualityRes hom f g
, composeOp :: forall a b c pcf pcg. hom b c pcf -> hom a b pcg -> hom a c (morphismComposition pcf pcg)
, identityMorphism :: forall a. ob a -> hom a a identityRelation
, leftIdentityLaw :: forall a b pcf. ob a -> ob b -> morphismEquality
(hom a b (morphismComposition identityRelation pcf))
(hom a b pcf)
, rightIdentityLaw :: forall a b pcf. ob a -> ob b -> morphismEquality
(hom a b (morphismComposition pcf identityRelation))
(hom a b pcf)
}
data IsAnyRelInstance (fn :: ((* -> *) -> (* -> *) -> (* -> * -> *) -> *)) (r :: *)
= forall a b. IsAnyRelInstance (IsRelInstance (fn a b) r)
data Pair a b = Pair { fst_ :: a, snd_ :: b }
data IsRelInstance (rc :: ((* -> * -> *) -> *)) (r :: *) = forall pcf. IsRelInstance (IdR (rc pcf) r)
data MorphismEqualityRes hom f g = forall a b. MorphismEqualityRes (IsRelInstance (hom a b) f) (IsRelInstance (hom a b) g)
{-# LINE 182 "Category.lhs" #-}
type DthUniverse = Category StdObjects StdUnivObjectEquality Fn FnEq ComposeR IdR
dthUniverse :: DthUniverse
dthUniverse = Category
{ mtCategoryObjectEquality = stdUnivObjectEquality
, mtCategoryMorphismEquality = fnEq
, objectEqualityType = \_ -> Pair StdObjects StdObjects
, morphismType = \_ -> Pair StdObjects StdObjects
, morphismEqualityType = \(FnEq _) -> MorphismEqualityRes (IsRelInstance IdR) (IsRelInstance IdR)
, composeOp = compose
, identityMorphism = \_ -> idFn
, leftIdentityLaw = \_ _ -> FnEq (\_ _ -> LogEq (\(ComposeR IdR pcf) -> pcf) (ComposeR IdR))
, rightIdentityLaw = \_ _ -> FnEq (\_ _ -> LogEq (\(ComposeR pcf IdR) -> pcf) (\pcf -> ComposeR pcf IdR))
}
{-# LINE 210 "Category.lhs" #-}
data StdObjects (o :: (* -> *)) = StdObjects
{-# LINE 218 "Category.lhs" #-}
data StdUnivObjectEquality (a :: (* -> *)) (b :: (* -> *)) where
StdUnivObjectEquality :: StdUnivObjectEquality a a
stdUnivObjectEquality :: UnivObjectEquality StdUnivObjectEquality
stdUnivObjectEquality = UnivObjectEquality
{ univObEqReflexive = StdUnivObjectEquality
, univObEqSymmetric = \StdUnivObjectEquality -> StdUnivObjectEquality
, univObEqTransitive = \StdUnivObjectEquality StdUnivObjectEquality -> StdUnivObjectEquality
}
{-# LINE 244 "Category.lhs" #-}
type FnImpl (a :: (* -> *)) (b :: (* -> *)) (pc :: (* -> * -> *)) = PrImp a (FnRes b pc)
newtype Fn (a :: (* -> *)) (b :: (* -> *)) (pc :: (* -> * -> *)) = Fn (FnImpl a b pc)
-- FnRes is short for function result
-- FnRes b pc a1 = exists b1. pc a1 b1 && b b1
data FnRes (b :: (* -> *)) (pc :: (* -> * -> *)) (a1 :: *) = forall (b1 :: *). FnRes (pc a1 b1) (b b1)
-- Predicate implication
type PrImp p q = forall (b1 :: *). p b1 -> q b1
{-# LINE 267 "Category.lhs" #-}
data FnEq (f :: *) (g :: *) where
FnEq :: (forall a1 b1. a a1 -> b b1 -> LogEq (pc1 a1 b1) (pc2 a1 b1))
-> FnEq (Fn a b pc1) (Fn a b pc2)
fnEq :: Equality FnEq (IsAnyRelInstance Fn)
fnEq = Equality
{ eqReflexive = \(IsAnyRelInstance (IsRelInstance IdR)) -> FnEq (\_ _ -> logEqUnivReflexive)
, eqSymmetric = \(IsAnyRelInstance (IsRelInstance IdR)) (IsAnyRelInstance (IsRelInstance IdR)) (FnEq eqAt)
-> FnEq (logEqUnivSymmetric |<<| eqAt)
, eqTransitive = \(IsAnyRelInstance (IsRelInstance IdR)) (IsAnyRelInstance (IsRelInstance IdR))
(IsAnyRelInstance (IsRelInstance IdR)) (FnEq eq1At) (FnEq eq2At)
-> FnEq (\a1 b1 -> logEqUnivTransitive (eq1At a1 b1) (eq2At a1 b1))
}
(|<<|) = (.) . (.)
{-# LINE 303 "Category.lhs" #-}
data ComposeR (pcf :: * -> * -> *) (pcg :: * -> * -> *) (a1 :: *) (c1 :: *) where
ComposeR :: pcf b1 c1 -> pcg a1 b1 -> ComposeR pcf pcg a1 c1
compose :: Fn b c pcf -> Fn a b pcg -> Fn a c (ComposeR pcf pcg)
compose (Fn f) (Fn g) = Fn (\a -> case g a of (FnRes gab b) -> case f b of (FnRes fbc c) -> FnRes (ComposeR fbc gab) c)
{-# LINE 324 "Category.lhs" #-}
data IdR (a :: *) (b :: *) where
IdR :: IdR a a
idFn :: Fn a a IdR
idFn = Fn (FnRes IdR)
{-# LINE 334 "Category.lhs" #-}
type Functor c d cHom dHom pcSub ret
= forall a b. Fn (Hom cHom a b)
(Hom dHom (ret a) (ret b))
(FunctorPC c d cHom dHom a b pcSub ret)
data Hom hom a b h where
Hom :: hom a b pc -> Hom hom a b (hom a b pc)
data FunctorPC c d cHom dHom a b pcSub ret g r where
{-# LINE 351 "Category.lhs" #-}
FunctorPC ::
Category cOb cObEq cHom cHomEq cHomComp cId
{-# LINE 357 "Category.lhs" #-}
-> Category dOb dObEq dHom dHomEq dHomComp dId
{-# LINE 362 "Category.lhs" #-}
-> dHomEq (dHom (ret a) (ret a) dId) (dHom (ret a) (ret a) (pcSub a a cId))
{-# LINE 367 "Category.lhs" #-}
-> (cOb e
-> dHomEq (dHom (ret a) (ret e) (dHomComp (pcSub a b pcg) (pcSub b e pch)))
(dHom (ret a) (ret e) (pcSub a e (cHomComp pcg pch))))
-> FunctorPC (Category cOb cObEq cHom cHomEq cHomComp cId) (Category dOb dObEq dHom dHomEq dHomComp dId) cHom dHom a b pcSub ret (cHom a b pcg) (dHom (ret a) (ret b) (pcSub a b pcg))
{-# LINE 379 "Category.lhs" #-}
type UnivFunctor pcSub ret
= forall a b. Fn (Hom Fn a b)
(Hom Fn (ret a) (ret b))
(UnivFunctorPC a b pcSub ret)
data UnivFunctorPC a b pcSub ret g r where
UnivFunctorPC ::
{-# LINE 390 "Category.lhs" #-}
FnEq (Fn (ret a) (ret a) IdR) (Fn (ret a) (ret a) (pcSub a a IdR))
{-# LINE 395 "Category.lhs" #-}
-> FnEq (Fn (ret a) (ret e) (ComposeR (pcSub a b pcg) (pcSub b e pch)))
(dHom (ret a) (ret e) (pcSub a e (ComposeR pcg pch)))
-> UnivFunctorPC a b pcSub ret (Fn a b pcg) (Fn (ret a) (ret b) (pcSub a b pcg))
{-# LINE 403 "Category.lhs" #-}
univFunctorToFunctor :: UnivFunctor pcSub ret -> Functor DthUniverse DthUniverse Fn Fn pcSub ret
univFunctorToFunctor uf = Fn (foo uf)
foo :: UnivFunctor pcSub ret
-> FnImpl (Hom Fn a b)
(Hom Fn (ret a) (ret b))
(FunctorPC DthUniverse DthUniverse Fn Fn a b pcSub ret)
foo (Fn uf) gab = case uf gab of
FnRes (UnivFunctorPC idLaw compLaw) r
-> FnRes (FunctorPC dthUniverse dthUniverse idLaw compLaw) r