cat/src/Cat/Category/Monad/Voevodsky.agda

214 lines
6.4 KiB
Agda
Raw Normal View History

2018-03-12 13:38:52 +00:00
{-
This module provides construction 2.3 in [voe]
-}
{-# OPTIONS --cubical --caching #-}
module Cat.Category.Monad.Voevodsky where
2018-03-21 13:56:43 +00:00
open import Cat.Prelude
open import Cat.Category
open import Cat.Category.Functor as F
import Cat.Category.NaturalTransformation
open import Cat.Category.Monad
2018-05-11 11:20:03 +00:00
import Cat.Category.Monad.Monoidal as Monoidal
import Cat.Category.Monad.Kleisli as Kleisli
open import Cat.Categories.Fun
open import Cat.Equivalence
2018-03-12 13:38:52 +00:00
module voe {a b : Level} ( : Category a b) where
open Cat.Category.NaturalTransformation
private
= a b
module = Category
2018-03-12 13:38:52 +00:00
open using (Object ; Arrow)
module M = Monoidal
module K = Kleisli
module §2-3 (omap : Object Object) (pure : {X : Object} Arrow X (omap X)) where
2018-03-12 13:38:52 +00:00
record §1 : Set where
open M
field
fmap : Fmap omap
join : {A : Object} [ omap (omap A) , omap A ]
Rraw : RawFunctor
Rraw = record
{ omap = omap
; fmap = fmap
}
field
RisFunctor : IsFunctor Rraw
R : EndoFunctor
R = record
{ raw = Rraw
; isFunctor = RisFunctor
}
pureT : (X : Object) Arrow X (omap X)
pureT X = pure {X}
field
pureN : Natural Functors.identity R pureT
pureNT : NaturalTransformation Functors.identity R
pureNT = pureT , pureN
joinT : (A : Object) [ omap (omap A) , omap A ]
joinT A = join {A}
field
joinN : Natural F[ R R ] R joinT
joinNT : NaturalTransformation F[ R R ] R
joinNT = joinT , joinN
rawMnd : RawMonad
rawMnd = record
{ R = R
; pureNT = pureNT
; joinNT = joinNT
}
field
2018-03-23 09:08:28 +00:00
isMonad : IsMonad rawMnd
toMonad : Monad
toMonad = record
{ raw = rawMnd
2018-03-23 09:08:28 +00:00
; isMonad = isMonad
}
2018-03-12 13:38:52 +00:00
record §2 : Set where
open K
field
bind : {X Y : Object} [ X , omap Y ] [ omap X , omap Y ]
rawMnd : RawMonad
rawMnd = record
{ omap = omap
; pure = pure
; bind = bind
}
field
2018-03-23 09:08:28 +00:00
isMonad : IsMonad rawMnd
toMonad : Monad
toMonad = record
{ raw = rawMnd
2018-03-23 09:08:28 +00:00
; isMonad = isMonad
}
2018-03-12 13:43:43 +00:00
§1-fromMonad : (m : M.Monad) §2-3.§1 (M.Monad.Romap m) (λ {X} M.Monad.pureT m X)
§1-fromMonad m = record
2018-03-23 09:08:28 +00:00
{ fmap = Functor.fmap R
; RisFunctor = Functor.isFunctor R
2018-03-23 09:08:28 +00:00
; pureN = pureN
; join = λ {X} joinT X
; joinN = joinN
; isMonad = M.Monad.isMonad m
}
where
2018-03-23 09:08:28 +00:00
open M.Monad m
2018-03-12 13:43:43 +00:00
§2-fromMonad : (m : K.Monad) §2-3.§2 (K.Monad.omap m) (K.Monad.pure m)
§2-fromMonad m = record
2018-03-23 09:08:28 +00:00
{ bind = K.Monad.bind m
; isMonad = K.Monad.isMonad m
}
-- | In the following we seek to transform the equivalence `Monoidal≃Kleisli`
-- | to talk about voevodsky's construction.
module _ (omap : Omap ) (pure : {X : Object} Arrow X (omap X)) where
private
module E = AreInverses {f = (fst (Monoidal≊Kleisli ))} {fst (snd (Monoidal≊Kleisli ))}(Monoidal≊Kleisli .snd .snd)
Monoidal→Kleisli : M.Monad K.Monad
Monoidal→Kleisli = E.obverse
Kleisli→Monoidal : K.Monad M.Monad
Kleisli→Monoidal = E.reverse
ve-re : Kleisli→Monoidal Monoidal→Kleisli idFun _
ve-re = E.verso-recto
re-ve : Monoidal→Kleisli Kleisli→Monoidal idFun _
re-ve = E.recto-verso
2018-03-12 13:38:52 +00:00
forth : §2-3.§1 omap pure §2-3.§2 omap pure
2018-03-12 13:43:43 +00:00
forth = §2-fromMonad Monoidal→Kleisli §2-3.§1.toMonad
2018-03-12 13:38:52 +00:00
back : §2-3.§2 omap pure §2-3.§1 omap pure
2018-03-12 13:43:43 +00:00
back = §1-fromMonad Kleisli→Monoidal §2-3.§2.toMonad
forthEq : m (forth back) m m
forthEq m = begin
(forth back) m ≡⟨⟩
-- In full gory detail:
2018-03-12 13:43:43 +00:00
( §2-fromMonad
Monoidal→Kleisli
2018-03-12 13:38:52 +00:00
§2-3.§1.toMonad
2018-03-12 13:43:43 +00:00
§1-fromMonad
Kleisli→Monoidal
2018-03-12 13:38:52 +00:00
§2-3.§2.toMonad
) m ≡⟨⟩ -- fromMonad and toMonad are inverses
2018-03-12 13:43:43 +00:00
( §2-fromMonad
Monoidal→Kleisli
Kleisli→Monoidal
2018-03-12 13:38:52 +00:00
§2-3.§2.toMonad
) m ≡⟨ cong (λ φ φ m) t
-- Monoidal→Kleisli and Kleisli→Monoidal are inverses
-- I should be able to prove this using congruence and `lem` below.
2018-03-12 13:43:43 +00:00
( §2-fromMonad
2018-03-12 13:38:52 +00:00
§2-3.§2.toMonad
) m ≡⟨⟩
2018-03-12 13:43:43 +00:00
( §2-fromMonad
2018-03-12 13:38:52 +00:00
§2-3.§2.toMonad
) m ≡⟨⟩ -- fromMonad and toMonad are inverses
m
where
t' : ((Monoidal→Kleisli Kleisli→Monoidal) §2-3.§2.toMonad {omap} {pure})
§2-3.§2.toMonad
t' = cong (\ φ φ §2-3.§2.toMonad) re-ve
t : (§2-fromMonad (Monoidal→Kleisli Kleisli→Monoidal) §2-3.§2.toMonad {omap} {pure})
(§2-fromMonad §2-3.§2.toMonad)
t = cong-d (\ f §2-fromMonad f) t'
u : (§2-fromMonad (Monoidal→Kleisli Kleisli→Monoidal) §2-3.§2.toMonad) m
(§2-fromMonad §2-3.§2.toMonad) m
u = cong (\ φ φ m) t
backEq : m (back forth) m m
backEq m = begin
(back forth) m ≡⟨⟩
2018-03-12 13:43:43 +00:00
( §1-fromMonad
Kleisli→Monoidal
2018-03-12 13:38:52 +00:00
§2-3.§2.toMonad
2018-03-12 13:43:43 +00:00
§2-fromMonad
Monoidal→Kleisli
2018-03-12 13:38:52 +00:00
§2-3.§1.toMonad
) m ≡⟨⟩ -- fromMonad and toMonad are inverses
2018-03-12 13:43:43 +00:00
( §1-fromMonad
Kleisli→Monoidal
Monoidal→Kleisli
2018-03-12 13:38:52 +00:00
§2-3.§1.toMonad
) m ≡⟨ cong (λ φ φ m) t -- Monoidal→Kleisli and Kleisli→Monoidal are inverses
2018-03-12 13:43:43 +00:00
( §1-fromMonad
2018-03-12 13:38:52 +00:00
§2-3.§1.toMonad
) m ≡⟨⟩ -- fromMonad and toMonad are inverses
m
where
t : §1-fromMonad Kleisli→Monoidal Monoidal→Kleisli §2-3.§1.toMonad
§1-fromMonad §2-3.§1.toMonad
-- Why does `re-ve` not satisfy this goal?
t i m = §1-fromMonad (ve-re i (§2-3.§1.toMonad m))
2018-03-12 13:38:52 +00:00
voe-isEquiv : isEquiv (§2-3.§1 omap pure) (§2-3.§2 omap pure) forth
voe-isEquiv = gradLemma forth back forthEq backEq
2018-03-12 13:38:52 +00:00
equiv-2-3 : §2-3.§1 omap pure §2-3.§2 omap pure
equiv-2-3 = forth , voe-isEquiv