[WIP] Proving other fusion law

Also set up framework for equality principle for monads
This commit is contained in:
Frederik Hanghøj Iversen 2018-02-25 03:09:25 +01:00
parent a6b01929f0
commit 4c298855e0

View file

@ -61,12 +61,21 @@ module Monoidal {a b : Level} ( : Category a b) where
isMonad : IsMonad raw isMonad : IsMonad raw
open IsMonad isMonad public open IsMonad isMonad public
postulate propIsMonad : {raw} isProp (IsMonad raw)
Monad≡ : {m n : Monad} Monad.raw m Monad.raw n m n
Monad.raw (Monad≡ eq i) = eq i
Monad.isMonad (Monad≡ {m} {n} eq i) = res i
where
-- TODO: PathJ nightmare + `propIsMonad`.
res : (λ i IsMonad (eq i)) [ Monad.isMonad m Monad.isMonad n ]
res = {!!}
-- "A monad in the Kleisli form" [voe] -- "A monad in the Kleisli form" [voe]
module Kleisli {a b : Level} ( : Category a b) where module Kleisli {a b : Level} ( : Category a b) where
private private
= a b = a b
open Category hiding (IsIdentity) open Category using (Arrow ; 𝟙 ; Object ; _∘_)
record RawMonad : Set where record RawMonad : Set where
field field
RR : Object Object RR : Object Object
@ -87,6 +96,8 @@ module Kleisli {a b : Level} ( : Category a b) where
-- --
pure : {X : Object} [ X , RR X ] pure : {X : Object} [ X , RR X ]
pure = ζ pure = ζ
fmap : {A B} [ A , B ] [ RR A , RR B ]
fmap f = rr (ζ f)
-- Why is (>>=) not implementable? -- Why is (>>=) not implementable?
-- --
-- (>>=) : m a -> (a -> m b) -> m b -- (>>=) : m a -> (a -> m b) -> m b
@ -101,25 +112,8 @@ module Kleisli {a b : Level} ( : Category a b) where
rr f ζ f rr f ζ f
IsDistributive = {X Y Z : Object} (g : [ Y , RR Z ]) (f : [ X , RR Y ]) IsDistributive = {X Y Z : Object} (g : [ Y , RR Z ]) (f : [ X , RR Y ])
rr g rr f rr (rr g f) rr g rr f rr (rr g f)
-- I assume `Fusion` is admissable - it certainly looks more like the Fusion = {X Y Z : Object} {g : [ Y , Z ]} {f : [ X , Y ]}
-- distributive law for monads I know from Haskell. fmap (g f) fmap g fmap f
Fusion = {X Y Z : Object} (g : [ Y , Z ]) (f : [ X , Y ])
rr (ζ g f) rr (ζ g) rr (ζ f)
-- NatDist2Fus : IsNatural → IsDistributive → Fusion
-- NatDist2Fus isNatural isDistributive g f =
-- let
-- ζf = ζ ∘ f
-- ζg = ζ ∘ g
-- Nζf : rr (ζ ∘ f) ∘ ζ ≡ ζ ∘ f
-- Nζf = isNatural ζf
-- Nζg : rr (ζ ∘ g) ∘ ζ ≡ ζ ∘ g
-- Nζg = isNatural ζg
-- ζgf = ζ ∘ g ∘ f
-- Nζgf : rr (ζ ∘ g ∘ f) ∘ ζ ≡ ζ ∘ g ∘ f
-- Nζgf = isNatural ζgf
-- res : rr (ζ ∘ g ∘ f) ≡ rr (ζ ∘ g) ∘ rr (ζ ∘ f)
-- res = {!!}
-- in res
record IsMonad (raw : RawMonad) : Set where record IsMonad (raw : RawMonad) : Set where
open RawMonad raw public open RawMonad raw public
@ -127,6 +121,16 @@ module Kleisli {a b : Level} ( : Category a b) where
isIdentity : IsIdentity isIdentity : IsIdentity
isNatural : IsNatural isNatural : IsNatural
isDistributive : IsDistributive isDistributive : IsDistributive
fusion : Fusion
fusion {g = g} {f} = begin
fmap (g f) ≡⟨⟩
rr (ζ (g f)) ≡⟨ {!!}
rr (rr (ζ g) (ζ f)) ≡⟨ sym lem
rr (ζ g) rr (ζ f) ≡⟨⟩
fmap g fmap f
where
lem : rr (ζ g) rr (ζ f) rr (rr (ζ g) (ζ f))
lem = isDistributive (ζ g) (ζ f)
record Monad : Set where record Monad : Set where
field field
@ -134,6 +138,15 @@ module Kleisli {a b : Level} ( : Category a b) where
isMonad : IsMonad raw isMonad : IsMonad raw
open IsMonad isMonad public open IsMonad isMonad public
postulate propIsMonad : {raw} isProp (IsMonad raw)
Monad≡ : {m n : Monad} Monad.raw m Monad.raw n m n
Monad.raw (Monad≡ eq i) = eq i
Monad.isMonad (Monad≡ {m} {n} eq i) = res i
where
-- TODO: PathJ nightmare + `propIsMonad`.
res : (λ i IsMonad (eq i)) [ Monad.isMonad m Monad.isMonad n ]
res = {!!}
-- Problem 2.3 -- Problem 2.3
module _ {a b : Level} { : Category a b} where module _ {a b : Level} { : Category a b} where
private private
@ -163,69 +176,70 @@ module _ {a b : Level} { : Category a b} where
Kraw.rr forthRaw = rr Kraw.rr forthRaw = rr
module _ {raw : M.RawMonad} (m : M.IsMonad raw) where module _ {raw : M.RawMonad} (m : M.IsMonad raw) where
open M.IsMonad m private
open K.RawMonad (forthRaw raw) open M.IsMonad m
module Kis = K.IsMonad open K.RawMonad (forthRaw raw)
module Kis = K.IsMonad
isIdentity : IsIdentity isIdentity : IsIdentity
isIdentity {X} = begin isIdentity {X} = begin
rr ζ ≡⟨⟩ rr ζ ≡⟨⟩
rr (η X) ≡⟨⟩ rr (η X) ≡⟨⟩
μ X func→ R (η X) ≡⟨ proj₂ isInverse μ X func→ R (η X) ≡⟨ proj₂ isInverse
𝟙 𝟙
module R = Functor R module R = Functor R
isNatural : IsNatural isNatural : IsNatural
isNatural {X} {Y} f = begin isNatural {X} {Y} f = begin
rr f ζ ≡⟨⟩ rr f ζ ≡⟨⟩
rr f η X ≡⟨⟩ rr f η X ≡⟨⟩
μ Y R.func→ f η X ≡⟨ sym .isAssociative μ Y R.func→ f η X ≡⟨ sym .isAssociative
μ Y (R.func→ f η X) ≡⟨ cong (λ φ μ Y φ) (sym (ηN f)) μ Y (R.func→ f η X) ≡⟨ cong (λ φ μ Y φ) (sym (ηN f))
μ Y (η (R.func* Y) f) ≡⟨ .isAssociative μ Y (η (R.func* Y) f) ≡⟨ .isAssociative
μ Y η (R.func* Y) f ≡⟨ cong (λ φ φ f) (proj₁ isInverse) μ Y η (R.func* Y) f ≡⟨ cong (λ φ φ f) (proj₁ isInverse)
𝟙 f ≡⟨ proj₂ .isIdentity 𝟙 f ≡⟨ proj₂ .isIdentity
f f
where where
open NaturalTransformation open NaturalTransformation
module = Category module = Category
ηN : Natural F.identity R η ηN : Natural F.identity R η
ηN = proj₂ ηNat ηN = proj₂ ηNat
isDistributive : IsDistributive isDistributive : IsDistributive
isDistributive {X} {Y} {Z} g f = begin isDistributive {X} {Y} {Z} g f = begin
rr g rr f ≡⟨⟩ rr g rr f ≡⟨⟩
μ Z R.func→ g (μ Y R.func→ f) ≡⟨ sym lem2 μ Z R.func→ g (μ Y R.func→ f) ≡⟨ sym lem2
μ Z R.func→ (μ Z R.func→ g f) ≡⟨⟩ μ Z R.func→ (μ Z R.func→ g f) ≡⟨⟩
μ Z R.func→ (rr g f) μ Z R.func→ (rr g f)
where where
-- Proved it in reverse here... otherwise it could be neatly inlined. -- Proved it in reverse here... otherwise it could be neatly inlined.
lem2 lem2
: μ Z R.func→ (μ Z R.func→ g f) : μ Z R.func→ (μ Z R.func→ g f)
μ Z R.func→ g (μ Y R.func→ f) μ Z R.func→ g (μ Y R.func→ f)
lem2 = begin lem2 = begin
μ Z R.func→ (μ Z R.func→ g f) ≡⟨ cong (λ φ μ Z φ) distrib μ Z R.func→ (μ Z R.func→ g f) ≡⟨ cong (λ φ μ Z φ) distrib
μ Z (R.func→ (μ Z) R.func→ (R.func→ g) R.func→ f) ≡⟨⟩ μ Z (R.func→ (μ Z) R.func→ (R.func→ g) R.func→ f) ≡⟨⟩
μ Z (R.func→ (μ Z) RR.func→ g R.func→ f) ≡⟨ {!!} -- ●-solver? μ Z (R.func→ (μ Z) RR.func→ g R.func→ f) ≡⟨ {!!} -- ●-solver?
(μ Z R.func→ (μ Z)) (RR.func→ g R.func→ f) ≡⟨ cong (λ φ φ (RR.func→ g R.func→ f)) lemmm (μ Z R.func→ (μ Z)) (RR.func→ g R.func→ f) ≡⟨ cong (λ φ φ (RR.func→ g R.func→ f)) lemmm
(μ Z μ (R.func* Z)) (RR.func→ g R.func→ f) ≡⟨ {!!} -- ●-solver? (μ Z μ (R.func* Z)) (RR.func→ g R.func→ f) ≡⟨ {!!} -- ●-solver?
μ Z μ (R.func* Z) RR.func→ g R.func→ f ≡⟨ {!!} -- ●-solver + lem4 μ Z μ (R.func* Z) RR.func→ g R.func→ f ≡⟨ {!!} -- ●-solver + lem4
μ Z R.func→ g μ Y R.func→ f ≡⟨ sym (Category.isAssociative ) μ Z R.func→ g μ Y R.func→ f ≡⟨ sym (Category.isAssociative )
μ Z R.func→ g (μ Y R.func→ f) μ Z R.func→ g (μ Y R.func→ f)
where where
module RR = Functor F[ R R ] module RR = Functor F[ R R ]
distrib : {A B C D} {a : Arrow C D} {b : Arrow B C} {c : Arrow A B} distrib : {A B C D} {a : Arrow C D} {b : Arrow B C} {c : Arrow A B}
R.func→ (a b c) R.func→ (a b c)
R.func→ a R.func→ b R.func→ c R.func→ a R.func→ b R.func→ c
distrib = {!!} distrib = {!!}
comm : {A B C D E} comm : {A B C D E}
{a : Arrow D E} {b : Arrow C D} {c : Arrow B C} {d : Arrow A B} {a : Arrow D E} {b : Arrow C D} {c : Arrow B C} {d : Arrow A B}
a (b c d) a b c d a (b c d) a b c d
comm = {!!} comm = {!!}
μN = proj₂ μNat μN = proj₂ μNat
lemmm : μ Z R.func→ (μ Z) μ Z μ (R.func* Z) lemmm : μ Z R.func→ (μ Z) μ Z μ (R.func* Z)
lemmm = isAssociative lemmm = isAssociative
lem4 : μ (R.func* Z) RR.func→ g R.func→ g μ Y lem4 : μ (R.func* Z) RR.func→ g R.func→ g μ Y
lem4 = μN g lem4 = μN g
forthIsMonad : K.IsMonad (forthRaw raw) forthIsMonad : K.IsMonad (forthRaw raw)
Kis.isIdentity forthIsMonad = isIdentity Kis.isIdentity forthIsMonad = isIdentity
@ -233,17 +247,79 @@ module _ {a b : Level} { : Category a b} where
Kis.isDistributive forthIsMonad = isDistributive Kis.isDistributive forthIsMonad = isDistributive
forth : M.Monad K.Monad forth : M.Monad K.Monad
Kleisli.Monad.raw (forth m) = forthRaw (M.Monad.raw m) Kleisli.Monad.raw (forth m) = forthRaw (M.Monad.raw m)
Kleisli.Monad.isMonad (forth m) = forthIsMonad (M.Monad.isMonad m) Kleisli.Monad.isMonad (forth m) = forthIsMonad (M.Monad.isMonad m)
module _ (m : K.Monad) where
private
module = Category
open K.Monad m
module Mraw = M.RawMonad
open NaturalTransformation
rawR : RawFunctor
RawFunctor.func* rawR = RR
RawFunctor.func→ rawR f = rr (ζ f)
isFunctorR : IsFunctor rawR
IsFunctor.isIdentity isFunctorR = begin
rr (ζ 𝟙) ≡⟨ cong rr (proj₁ .isIdentity)
rr ζ ≡⟨ isIdentity
𝟙
IsFunctor.isDistributive isFunctorR {f = f} {g} = begin
rr (ζ (g f)) ≡⟨⟩
fmap (g f) ≡⟨ fusion
fmap g fmap f ≡⟨⟩
rr (ζ g) rr (ζ f)
R : Functor
Functor.raw R = rawR
Functor.isFunctor R = isFunctorR
R2 : Functor
R2 = F[ R R ]
ηNat : NaturalTransformation F.identity R
ηNat = {!!}
μNat : NaturalTransformation R2 R
μNat = {!!}
backRaw : M.RawMonad
Mraw.R backRaw = R
Mraw.ηNat backRaw = ηNat
Mraw.μNat backRaw = μNat
module _ (m : K.Monad) where
open K.Monad m
open M.RawMonad (backRaw m)
module Mis = M.IsMonad
backIsMonad : M.IsMonad (backRaw m)
backIsMonad = {!!}
back : K.Monad M.Monad back : K.Monad M.Monad
back = {!!} Monoidal.Monad.raw (back m) = backRaw m
Monoidal.Monad.isMonad (back m) = backIsMonad m
forthRawEq : (m : K.Monad) forthRaw (backRaw m) K.Monad.raw m
K.RawMonad.RR (forthRawEq m _) = K.RawMonad.RR (K.Monad.raw m)
K.RawMonad.ζ (forthRawEq m _) = K.RawMonad.ζ (K.Monad.raw m)
-- stuck
K.RawMonad.rr (forthRawEq m i) = {!!}
fortheq : (m : K.Monad) forth (back m) m fortheq : (m : K.Monad) forth (back m) m
fortheq m = {!!} fortheq m = K.Monad≡ (forthRawEq m)
backRawEq : (m : M.Monad) backRaw (forth m) M.Monad.raw m
-- stuck
M.RawMonad.R (backRawEq m _) = ?
M.RawMonad.ηNat (backRawEq m x) = {!!}
M.RawMonad.μNat (backRawEq m x) = {!!}
backeq : (m : M.Monad) back (forth m) m backeq : (m : M.Monad) back (forth m) m
backeq = {!!} backeq m = M.Monad≡ (backRawEq m)
open import Cubical.GradLemma open import Cubical.GradLemma
eqv : isEquiv M.Monad K.Monad forth eqv : isEquiv M.Monad K.Monad forth