bsc-leon-vatthauer/src/Monad/ElgotMonad.lagda.md

150 lines
8.7 KiB
Markdown
Raw Normal View History

<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
2023-08-16 17:29:13 +02:00
open import Level
open import Category.Instance.AmbientCategory using (Ambient)
open import Categories.Monad
open import Categories.Functor
```
-->
## Summary
This file introduces Elgot Monads.
2023-11-13 09:22:52 +01:00
TODO: Probably only Pre-Elgot is needed
- [X] *Definition 13* Pre-Elgot Monads
- [ ] *Definition 13* strong pre-Elgot
- [X] *Definition 14* Elgot Monads
- [ ] *Definition 14* strong Elgot
- [ ] *Proposition 15* (Strong) Elgot monads are (strong) pre-Elgot
## Code
2023-08-16 17:29:13 +02:00
```agda
module Monad.ElgotMonad {o e} (ambient : Ambient o e) where
open Ambient ambient
2023-08-16 17:29:13 +02:00
open HomReasoning
open MR C
open Equiv
open import Algebra.ElgotAlgebra ambient
```
### *Definition 13*: Pre-Elgot Monads
2023-08-16 17:29:13 +02:00
```agda
2023-08-16 17:29:13 +02:00
record IsPreElgot (T : Monad C) : Set (o ⊔ ⊔ e) where
open Monad T
open Functor F renaming (F₀ to T₀; F₁ to T₁)
-- every TX needs to be equipped with an elgot algebra structure
field
elgotalgebras : ∀ {X} → Elgot-Algebra-on (T₀ X)
2023-08-16 17:29:13 +02:00
module elgotalgebras {X} = Elgot-Algebra-on (elgotalgebras {X})
-- with the following associativity
field
2023-08-17 18:07:26 +02:00
assoc : ∀ {X Y Z} (f : Z ⇒ T₀ X + Z) (h : X ⇒ T₀ Y)
→ elgotalgebras._# (((μ.η _ ∘ T₁ h) +₁ idC) ∘ f) ≈ (μ.η _ ∘ T₁ h) ∘ (elgotalgebras._# {X}) f
2023-08-16 17:29:13 +02:00
record PreElgotMonad : Set (o ⊔ ⊔ e) where
field
T : Monad C
isPreElgot : IsPreElgot T
open IsPreElgot isPreElgot public
```
### *Definition 14*: Elgot Monads
2023-08-16 17:29:13 +02:00
```agda
2023-08-16 17:29:13 +02:00
record IsElgot (T : Monad C) : Set (o ⊔ ⊔ e) where
open Monad T
open Functor F renaming (F₀ to T₀; F₁ to T₁)
-- iteration operator
field
_† : ∀ {X Y} → X ⇒ T₀ (Y + X) → X ⇒ T₀ Y
2023-08-17 18:07:26 +02:00
†-resp-≈ : ∀ {X Y} {f g : X ⇒ T₀ (Y + X)} → f ≈ g → f † ≈ g †
2023-08-16 17:29:13 +02:00
-- laws
field
2023-08-17 18:07:26 +02:00
Fixpoint : ∀ {X Y} {f : X ⇒ T₀ (Y + X)}
→ f † ≈ (μ.η _ ∘ T₁ [ η.η _ , f † ]) ∘ f
Naturality : ∀ {X Y Z} {f : X ⇒ T₀ (Y + X)} {g : Y ⇒ T₀ Z}
→ (μ.η _ ∘ T₁ g) ∘ f † ≈ ((μ.η _ ∘ T₁ [ (T₁ i₁) ∘ g , η.η _ ∘ i₂ ]) ∘ f)†
Codiagonal : ∀ {X Y} {f : X ⇒ T₀ ((Y + X) + X)}
→ (T₁ [ idC , i₂ ] ∘ f )† ≈ f † †
Uniformity : ∀ {X Y Z} {f : X ⇒ T₀ (Y + X)} {g : Z ⇒ T₀ (Y + Z)} {h : Z ⇒ X}
→ f ∘ h ≈ (T₁ (idC +₁ h)) ∘ g → f † ∘ h ≈ g †
2023-08-16 17:29:13 +02:00
record ElgotMonad : Set (o ⊔ ⊔ e) where
field
T : Monad C
isElgot : IsElgot T
open IsElgot isElgot public
```
### *Proposition 15*: (Strong) Elgot monads are (strong) pre-Elgot
2023-08-16 17:29:13 +02:00
```agda
2023-08-16 17:29:13 +02:00
-- elgot monads are pre-elgot
Elgot⇒PreElgot : ElgotMonad → PreElgotMonad
Elgot⇒PreElgot EM = record
{ T = T
; isPreElgot = record
{ elgotalgebras = λ {X} → record
{ _# = λ f → ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) †
; #-Fixpoint = λ {Y} {f} → begin
2023-08-17 18:07:26 +02:00
([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ≈⟨ Fixpoint ⟩
2023-08-16 17:29:13 +02:00
(μ.η _ ∘ T₁ [ η.η _ , ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ]) ∘ ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) ≈⟨ pullˡ ∘[] ⟩
[ (μ.η _ ∘ T₁ [ η.η _ , ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ]) ∘ T₁ i₁
2023-08-17 18:07:26 +02:00
, (μ.η _ ∘ T₁ [ η.η _
, ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ]) ∘ η.η _ ∘ i₂ ] ∘ f ≈˘⟨ []-cong₂
(pushʳ (homomorphism))
(pushˡ (pushʳ (η.commute _)))
⟩∘⟨refl ⟩
2023-08-16 17:29:13 +02:00
[ μ.η _ ∘ T₁ ([ η.η _ , ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ] ∘ i₁)
2023-08-17 18:07:26 +02:00
, (μ.η _ ∘ (η.η _ ∘ [ η.η _ , ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ])) ∘ i₂ ] ∘ f ≈⟨ []-cong₂ (∘-resp-≈ʳ (F-resp-≈ inject₁)) (pullʳ (pullʳ inject₂)) ⟩∘⟨refl ⟩
2023-08-16 17:29:13 +02:00
[ μ.η _ ∘ (T₁ (η.η _))
2023-08-17 18:07:26 +02:00
, μ.η _ ∘ η.η _ ∘ ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ] ∘ f ≈⟨ []-cong₂ (T.identityˡ) (cancelˡ T.identityʳ) ⟩∘⟨refl ⟩
[ idC , ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † ] ∘ f ∎
; #-Uniformity = λ {X} {Y} {f} {g} {h} H → sym (Uniformity (begin
([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ g) ∘ h ≈˘⟨ pushʳ H ⟩
[ T₁ i₁ , η.η _ ∘ i₂ ] ∘ (idC +₁ h) ∘ f ≈⟨ pullˡ []∘+₁ ⟩
[ T₁ i₁ ∘ idC , (η.η _ ∘ i₂) ∘ h ] ∘ f ≈⟨ []-cong₂ (trans identityʳ (F-resp-≈ (sym identityʳ))) assoc ⟩∘⟨refl ⟩
[ T₁ (i₁ ∘ idC) , η.η _ ∘ i₂ ∘ h ] ∘ f ≈˘⟨ []-cong₂ (F-resp-≈ +₁∘i₁) (pullʳ +₁∘i₂) ⟩∘⟨refl ⟩
[ T₁ ((idC +₁ h) ∘ i₁) , (η.η _ ∘ (idC +₁ h)) ∘ i₂ ] ∘ f ≈⟨ []-cong₂ homomorphism ( pushˡ (η.commute _)) ⟩∘⟨refl ⟩
[ T₁ (idC +₁ h) ∘ T₁ i₁ , T₁ (idC +₁ h) ∘ η.η _ ∘ i₂ ] ∘ f ≈˘⟨ pullˡ ∘[] ⟩
T₁ (idC +₁ h) ∘ [ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f ∎))
; #-Folding = λ {X} {Y} {f} {h} → begin
([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ ((([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) †) +₁ h))† ≈⟨ †-resp-≈ []∘+₁ ⟩
[ T₁ i₁ ∘ ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f) † , (η.η _ ∘ i₂) ∘ h ] † ≈⟨ {! !} ⟩
{! !} ≈⟨ {! !} ⟩
[ [ T₁ i₁ ∘ idC , (η.η _ ∘ i₂) ∘ i₁ ] ∘ f , (η.η _ ∘ i₂) ∘ h ] † ≈˘⟨ †-resp-≈ ([]-cong₂ (pullˡ []∘+₁) (pullˡ inject₂)) ⟩
[ [ T₁ i₁ , η.η _ ∘ i₂ ] ∘ (idC +₁ i₁) ∘ f , [ T₁ i₁ , η.η _ ∘ i₂ ] ∘ i₂ ∘ h ] † ≈˘⟨ †-resp-≈ ∘[] ⟩
([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ [ (idC +₁ i₁) ∘ f , i₂ ∘ h ])† ∎
; #-resp-≈ = λ fg → †-resp-≈ (∘-resp-≈ʳ fg)
}
; assoc = λ {X} {Y} {Z} f h → begin
-- TODO tidy up by moving doing sym outside, apply Naturality and then do `†-resp-≈ pullˡ` once.
([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ (μ.η Y ∘ T₁ h +₁ idC) ∘ f)† ≈⟨ †-resp-≈ (pullˡ []∘+₁) ⟩
(([ T₁ i₁ ∘ μ.η _ ∘ T₁ h , (η.η _ ∘ i₂) ∘ idC ] ∘ f)†) ≈˘⟨ †-resp-≈ (∘-resp-≈ˡ ([]-cong₂ assoc (sym identityʳ))) ⟩
([ (T₁ i₁ ∘ μ.η _) ∘ T₁ h , η.η _ ∘ i₂ ] ∘ f)† ≈˘⟨ †-resp-≈ (∘-resp-≈ˡ ([]-congʳ (pullˡ (μ.commute _)))) ⟩
([ μ.η _ ∘ T₁ (T₁ i₁) ∘ T₁ h , η.η _ ∘ i₂ ] ∘ f)† ≈˘⟨ †-resp-≈ (∘-resp-≈ˡ ([]-cong₂ (∘-resp-≈ʳ homomorphism) (cancelˡ T.identityʳ))) ⟩
([ μ.η _ ∘ T₁ (T₁ i₁ ∘ h) , μ.η _ ∘ η.η _ ∘ η.η _ ∘ i₂ ] ∘ f)† ≈˘⟨ †-resp-≈ (∘-resp-≈ˡ ([]-cong₂ (∘-resp-≈ʳ (F-resp-≈ inject₁)) (∘-resp-≈ʳ (pullʳ inject₂)))) ⟩
([ μ.η _ ∘ T₁ ([ T₁ i₁ ∘ h , η.η _ ∘ i₂ ] ∘ i₁) , μ.η _ ∘ (η.η _ ∘ [ T₁ i₁ ∘ h , η.η _ ∘ i₂ ]) ∘ i₂ ] ∘ f)† ≈˘⟨ †-resp-≈ (∘-resp-≈ˡ ([]-cong₂ (pullʳ (sym homomorphism)) (pullʳ (pullˡ (η.sym-commute _))))) ⟩
([ (μ.η _ ∘ T₁ [ T₁ i₁ ∘ h , η.η _ ∘ i₂ ]) ∘ T₁ i₁ , (μ.η _ ∘ T₁ [ T₁ i₁ ∘ h , η.η _ ∘ i₂ ]) ∘ η.η _ ∘ i₂ ] ∘ f)† ≈˘⟨ †-resp-≈ (pullˡ ∘[]) ⟩
((μ.η _ ∘ T₁ [ T₁ i₁ ∘ h , η.η _ ∘ i₂ ]) ∘ [ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f)† ≈˘⟨ Naturality ⟩
(μ.η Y ∘ T₁ h) ∘ ([ T₁ i₁ , η.η _ ∘ i₂ ] ∘ f)† ∎
2023-08-16 17:29:13 +02:00
}
}
where
open ElgotMonad EM
module T = Monad T
2023-08-17 18:07:26 +02:00
open T using (F; η; μ)
2023-08-16 17:29:13 +02:00
open Functor F renaming (F₀ to T₀; F₁ to T₁)
```