2023-08-19 12:15:34 +02:00
|
|
|
|
<!--
|
|
|
|
|
```agda
|
|
|
|
|
open import Level
|
2023-10-28 13:59:23 +02:00
|
|
|
|
open import Categories.FreeObjects.Free using (FreeObject; FO⇒Functor; FO⇒LAdj)
|
|
|
|
|
open import Categories.Functor.Core using (Functor)
|
|
|
|
|
open import Categories.Adjoint using (_⊣_)
|
|
|
|
|
open import Categories.Adjoint.Properties using (adjoint⇒monad)
|
|
|
|
|
open import Categories.Monad using (Monad)
|
|
|
|
|
open import Categories.Monad.Relative using () renaming (Monad to RMonad)
|
2023-12-01 17:15:38 +01:00
|
|
|
|
open import Category.Ambient using (Ambient)
|
2023-10-28 13:59:23 +02:00
|
|
|
|
open import Categories.Monad.Construction.Kleisli
|
2024-02-18 18:15:15 +01:00
|
|
|
|
open import Categories.Category.Cartesian using (Cartesian)
|
|
|
|
|
open import Categories.Category.BinaryProducts using (BinaryProducts)
|
2023-08-19 12:15:34 +02:00
|
|
|
|
```
|
|
|
|
|
-->
|
|
|
|
|
|
2024-02-20 15:09:58 +01:00
|
|
|
|
# The Monad K
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
|
|
|
|
```agda
|
2023-09-12 16:03:20 +02:00
|
|
|
|
module Monad.Instance.K {o ℓ e} (ambient : Ambient o ℓ e) where
|
|
|
|
|
open Ambient ambient
|
2024-02-06 11:37:52 +01:00
|
|
|
|
open import Category.Construction.ElgotAlgebras cocartesian
|
2024-02-04 18:49:12 +01:00
|
|
|
|
open import Algebra.Elgot cocartesian using (Elgot-Algebra)
|
|
|
|
|
open import Algebra.Elgot.Free cocartesian using (FreeElgotAlgebra; elgotForgetfulF)
|
2024-02-18 18:15:15 +01:00
|
|
|
|
open import Algebra.Elgot.Stable distributive using (IsStableFreeElgotAlgebra; IsStableFreeElgotAlgebraˡ; isStable⇒isStableˡ)
|
|
|
|
|
|
|
|
|
|
-- open Cartesian cartesian
|
|
|
|
|
-- open BinaryProducts products
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
2023-10-05 16:22:05 +02:00
|
|
|
|
open Equiv
|
2023-10-25 18:18:30 +02:00
|
|
|
|
open MR C
|
|
|
|
|
open M C
|
2023-10-12 18:11:28 +02:00
|
|
|
|
open HomReasoning
|
2023-08-19 12:15:34 +02:00
|
|
|
|
```
|
|
|
|
|
|
2024-02-18 18:15:15 +01:00
|
|
|
|
Existence of stable free Elgot algebras yields the monad K
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
|
|
|
|
```agda
|
|
|
|
|
record MonadK : Set (suc o ⊔ suc ℓ ⊔ suc e) where
|
|
|
|
|
field
|
2023-11-22 08:48:53 +01:00
|
|
|
|
freealgebras : ∀ X → FreeElgotAlgebra X
|
|
|
|
|
stable : ∀ X → IsStableFreeElgotAlgebra (freealgebras X)
|
2023-10-28 13:59:23 +02:00
|
|
|
|
|
2023-11-22 08:48:53 +01:00
|
|
|
|
-- helper for accessing elgot algebras
|
|
|
|
|
algebras : ∀ (X : Obj) → Elgot-Algebra
|
2023-10-28 13:59:23 +02:00
|
|
|
|
algebras X = FreeObject.FX (freealgebras X)
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
2023-11-22 08:48:53 +01:00
|
|
|
|
freeF : Functor C Elgot-Algebras
|
|
|
|
|
freeF = FO⇒Functor elgotForgetfulF freealgebras
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
2023-11-22 08:48:53 +01:00
|
|
|
|
adjoint : freeF ⊣ elgotForgetfulF
|
|
|
|
|
adjoint = FO⇒LAdj elgotForgetfulF freealgebras
|
2023-08-19 12:15:34 +02:00
|
|
|
|
|
2023-10-28 13:59:23 +02:00
|
|
|
|
monadK : Monad C
|
|
|
|
|
monadK = adjoint⇒monad adjoint
|
|
|
|
|
module monadK = Monad monadK
|
2023-10-25 18:18:30 +02:00
|
|
|
|
|
2023-10-28 13:59:23 +02:00
|
|
|
|
kleisliK : KleisliTriple C
|
|
|
|
|
kleisliK = Monad⇒Kleisli C monadK
|
|
|
|
|
module kleisliK = RMonad kleisliK
|
2023-10-25 18:18:30 +02:00
|
|
|
|
|
2023-10-28 13:59:23 +02:00
|
|
|
|
module K = Functor monadK.F
|
2023-10-09 16:45:55 +02:00
|
|
|
|
```
|
2024-02-18 18:15:15 +01:00
|
|
|
|
|
2024-02-19 18:07:46 +01:00
|
|
|
|
Some helper definitions to make our life easier
|
|
|
|
|
|
|
|
|
|
```agda
|
|
|
|
|
open Elgot-Algebra using (#-resp-≈; #-Fixpoint; #-Compositionality; #-Uniformity; #-Folding; #-Diamond; #-Stutter) renaming (A to ⟦_⟧) public
|
|
|
|
|
stableˡ = λ X → isStable⇒isStableˡ (freealgebras X) (stable X)
|
|
|
|
|
η = λ Z → FreeObject.η (freealgebras Z)
|
|
|
|
|
_♯ = λ {A X Y} f → IsStableFreeElgotAlgebra.[_,_]♯ {Y = X} (stable X) {X = A} (algebras Y) f
|
|
|
|
|
_♯ˡ = λ {A X Y} f → IsStableFreeElgotAlgebraˡ.[_,_]♯ˡ {Y = X} (stableˡ X) {X = A} (algebras Y) f
|
|
|
|
|
_# = λ {A} {X} f → Elgot-Algebra._# (algebras A) {X = X} f
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The kleisli star is iteration preserving:
|
|
|
|
|
|
|
|
|
|
```agda
|
|
|
|
|
open kleisliK using (extend)
|
|
|
|
|
open monadK using (μ)
|
|
|
|
|
|
|
|
|
|
extend-preserve : ∀ {X Y Z} (f : X ⇒ K.₀ Y) (h : Z ⇒ K.₀ X + Z) → extend f ∘ h # ≈ ((extend f +₁ idC) ∘ h) #
|
|
|
|
|
extend-preserve {X} {Y} {Z} f h = begin
|
|
|
|
|
(μ.η _ ∘ K.₁ f) ∘ h # ≈⟨ pullʳ (Elgot-Algebra-Morphism.preserves (((freealgebras _) FreeObject.*) (η _ ∘ f))) ⟩
|
|
|
|
|
μ.η _ ∘ ((K.₁ f +₁ idC) ∘ h) # ≈⟨ Elgot-Algebra-Morphism.preserves (((freealgebras _) FreeObject.*) idC) ⟩
|
|
|
|
|
((μ.η _ +₁ idC) ∘ (K.₁ f +₁ idC) ∘ h) # ≈⟨ #-resp-≈ (algebras _) (pullˡ (+₁∘+₁ ○ +₁-cong₂ refl identity²)) ⟩
|
|
|
|
|
((extend f +₁ idC) ∘ h) # ∎
|
|
|
|
|
```
|
|
|
|
|
|
2024-02-18 18:15:15 +01:00
|
|
|
|
Uniqueness of the stability operator gives us the following proof principle:
|
|
|
|
|
|
|
|
|
|
```agda
|
2024-02-19 18:07:46 +01:00
|
|
|
|
by-stability : ∀ {X Y} (A : Elgot-Algebra) {f g : X × ⟦ algebras Y ⟧ ⇒ ⟦ A ⟧} (i : X × Y ⇒ ⟦ A ⟧)
|
2024-02-18 18:15:15 +01:00
|
|
|
|
→ i ≈ f ∘ (idC ⁂ η Y)
|
|
|
|
|
→ i ≈ g ∘ (idC ⁂ η Y)
|
2024-02-19 18:07:46 +01:00
|
|
|
|
→ (∀ {Z} (h : Z ⇒ ⟦ algebras Y ⟧ + Z) → f ∘ (idC ⁂ (Elgot-Algebra._# (algebras Y) h)) ≈ Elgot-Algebra._# A ((f +₁ idC) ∘ distributeˡ⁻¹ ∘ (idC ⁂ h)))
|
|
|
|
|
→ (∀ {Z} (h : Z ⇒ ⟦ algebras Y ⟧ + Z) → g ∘ (idC ⁂ (Elgot-Algebra._# (algebras Y) h)) ≈ Elgot-Algebra._# A ((g +₁ idC) ∘ distributeˡ⁻¹ ∘ (idC ⁂ h)))
|
2024-02-18 18:15:15 +01:00
|
|
|
|
→ f ≈ g
|
2024-02-19 18:07:46 +01:00
|
|
|
|
by-stability {X} {Y} A {f} {g} i f-law g-law f-pres g-pres = begin
|
|
|
|
|
f ≈⟨ ♯-unique i f f-law f-pres ⟩
|
|
|
|
|
[ A , i ]♯ ≈⟨ sym (♯-unique i g g-law g-pres) ⟩
|
|
|
|
|
g ∎
|
2024-02-18 18:15:15 +01:00
|
|
|
|
where
|
|
|
|
|
open IsStableFreeElgotAlgebra (stable Y) using ([_,_]♯; ♯-unique)
|
|
|
|
|
|
2024-02-19 18:07:46 +01:00
|
|
|
|
by-stabilityˡ : ∀ {X Y} (A : Elgot-Algebra) {f g : ⟦ algebras Y ⟧ × X ⇒ ⟦ A ⟧} (i : Y × X ⇒ ⟦ A ⟧)
|
2024-02-18 18:15:15 +01:00
|
|
|
|
→ i ≈ f ∘ (η Y ⁂ idC)
|
|
|
|
|
→ i ≈ g ∘ (η Y ⁂ idC)
|
2024-02-19 18:07:46 +01:00
|
|
|
|
→ (∀ {Z} (h : Z ⇒ ⟦ algebras Y ⟧ + Z) → f ∘ ((Elgot-Algebra._# (algebras Y) h) ⁂ idC) ≈ Elgot-Algebra._# A ((f +₁ idC) ∘ distributeʳ⁻¹ ∘ (h ⁂ idC)))
|
|
|
|
|
→ (∀ {Z} (h : Z ⇒ ⟦ algebras Y ⟧ + Z) → g ∘ ((Elgot-Algebra._# (algebras Y) h) ⁂ idC) ≈ Elgot-Algebra._# A ((g +₁ idC) ∘ distributeʳ⁻¹ ∘ (h ⁂ idC)))
|
2024-02-18 18:15:15 +01:00
|
|
|
|
→ f ≈ g
|
2024-02-19 18:07:46 +01:00
|
|
|
|
by-stabilityˡ {X} {Y} A {f} {g} i f-law g-law f-pres g-pres = begin
|
|
|
|
|
f ≈⟨ ♯ˡ-unique i f f-law f-pres ⟩
|
2024-02-18 18:15:15 +01:00
|
|
|
|
[ A , i ]♯ˡ ≈⟨ sym (♯ˡ-unique i g g-law g-pres) ⟩
|
2024-02-19 18:07:46 +01:00
|
|
|
|
g ∎
|
2024-02-18 18:15:15 +01:00
|
|
|
|
where
|
|
|
|
|
open IsStableFreeElgotAlgebraˡ (stableˡ Y) using ([_,_]♯ˡ; ♯ˡ-unique)
|
|
|
|
|
```
|