Martin Escardo, Paulo Oliva, May 2024
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import Notation.General
open import MLTT.Spartan
open import UF.Equiv
open import UF.FunExt
open import RelativeMonadOnStructuredTypes.OneSigmaStructure
module RelativeMonadOnStructuredTypes.Definition
{{Ο : π-Ξ£-structure}}
where
open π-Ξ£-structure Ο
record Relative-Monad {β : Universe β Universe} : π€Ο where
field
functor : {π€ : Universe} β π π€ β β π€ Μ
private
T = functor
field
Ξ· : {π€ : Universe} {π§ : π π€}
β β¨ π§ β© β T π§
ext : {π€ π₯ : Universe} {π§ : π π€} {π¨ : π π₯}
β (β¨ π§ β© β T π¨)
β T π§ β T π¨
ext-Ξ· : {π€ : Universe} {π§ : π π€}
β ext (Ξ· {π€} {π§}) βΌ ππ (T π§)
unit : {π€ π₯ : Universe} {π§ : π π€} {π¨ : π π₯}
(f : β¨ π§ β© β T π¨)
(x : β¨ π§ β©)
β ext {π€} {π₯} {π§} {π¨} f (Ξ· x) οΌ f x
assoc : {π€ π₯ π¦ : Universe}
{π§ : π π€} {π¨ : π π₯} {π© : π π¦}
(g : β¨ π¨ β© β T π©)
(f : β¨ π§ β© β T π¨)
(t : T π§)
β ext (Ξ» x β ext g (f x)) t οΌ ext g (ext f t)
map : {π§ : π π€} {π¨ : π π₯} β (β¨ π§ β© β β¨ π¨ β©) β T π§ β T π¨
map f = ext (Ξ· β f)
_βα΅£_ : {π§ : π π€} {π¨ : β¨ π§ β© β π π₯}
β T π§
β ((x : β¨ π§ β©) β T (π¨ x))
β T (Ξ£β x κ π§ , π¨ x)
t βα΅£ f = ext (Ξ» x β map (Ξ» y β x , y) (f x)) t
open Relative-Monad public
\end{code}
TODO. Is "tensor" an appropriate terminology? Would (left)
convolution, in the sense of Day, be better?
https://ncatlab.org/nlab/show/tensorial+strength
https://ncatlab.org/nlab/show/Day+convolution
\begin{code}
tensorα΅£ : {β : Universe β Universe}
(π : Relative-Monad {β})
{π§ : π π€} {π¨ : β¨ π§ β© β π π₯}
β functor π π§
β ((x : β¨ π§ β©) β functor π (π¨ x))
β functor π (Ξ£β x κ π§ , π¨ x)
tensorα΅£ π = _βα΅£_ π
syntax tensorα΅£ π t f = t βα΅£[ π ] f
\end{code}
If we want to call a Relative-Monad T, then we can use the following
module:
\begin{code}
module relative-T-definitions
{β : Universe β Universe}
(π : Relative-Monad {β})
where
T : {π€ : Universe}
β π π€ β β π€ Μ
T {π€} = functor π
Ξ·α΅ : {π§ : π π€}
β β¨ π§ β© β T π§
Ξ·α΅ = Ξ· π
extα΅ : {π§ : π π€} {π¨ : π π₯}
β (β¨ π§ β© β T π¨) β T π§ β T π¨
extα΅ = ext π
extα΅-Ξ· : {π§ : π π€} β extα΅ (Ξ·α΅ {π€} {π§}) βΌ ππ (T π§)
extα΅-Ξ· = ext-Ξ· π
unitα΅ : {π§ : π π€} {π¨ : π π₯} (f : β¨ π§ β© β T π¨)
β extα΅ {π€} {π₯} {π§} {π¨} f β Ξ·α΅ βΌ f
unitα΅ = unit π
assocα΅ : {π§ : π π€} {π¨ : π π₯} {π© : π π¦}
(g : β¨ π¨ β© β T π©) (f : β¨ π§ β© β T π¨)
β extα΅ {_} {_} {π§} {π©} (extα΅ g β f) βΌ extα΅ g β extα΅ f
assocα΅ = assoc π
mapα΅ : {π§ : π π€} {π¨ : π π₯} β (β¨ π§ β© β β¨ π¨ β©) β T π§ β T π¨
mapα΅ = map π
_βα΅_ : {π§ : π π€} {π¨ : β¨ π§ β© β π π₯}
β T π§
β ((x : β¨ π§ β©) β T (π¨ x))
β T (Ξ£β x κ π§ , π¨ x)
_βα΅_ = _βα΅£_ π
\end{code}
For some results, we need our monad to satisfy the condition
extα΅-const defined below. Ohad Kammar pointed out to us that this
condition is equivalent to the monad being affine. We include his
proof here.
References given by Ohad Kammar and Alex Simpson:
[1] Anders Kock, Bilinearity and Cartesian closed monads,
Math. Stand. 29 (1971) 161-174.
https://users-math.au.dk/kock/BCCM.pdf
[2]
https://www.denotational.co.uk/publications/kammar-plotkin-algebraic-foundations-for-effect-dependent-optimisations.pdf
[3] https://www.denotational.co.uk/publications/kammar-ohad-thesis.pdf
[4] Gavin Wraith mentions affine theories in his lecture notes form
1969 (Prop. 3.5 here:
https://www.denotational.co.uk/scans/wraith-algebraic-theories.pdf)
[5] Bart Jacobs' "Semantics of weakening and contraction".
https://doi.org/10.1016/0168-0072(94)90020-5
\begin{code}
module _ {β : Universe β Universe}
(π : Relative-Monad {β})
where
open relative-T-definitions π
is-affine : π€Ο
is-affine = {π€ : Universe} β is-equiv (Ξ·α΅ {π€} {πβ})
ext-const' : π π€ β π€Ο
ext-const' π§ = {π₯ : Universe} {π¨ : π π₯} (u : T π¨)
β extα΅ (Ξ» (x : β¨ π§ β©) β u) βΌ Ξ» (t : T π§) β u
where
remark : {π₯ : Universe} {π¨ : π π₯} (u : T π¨) β functor π π§ β functor π π¨
remark u = extα΅ (Ξ» (x : β¨ π§ β©) β u)
ext-const : π€Ο
ext-const = {π€ : Universe} {π§ : π π€} β ext-const' π§
affine-gives-ext-const' : Fun-Ext β is-affine β ext-const' (πβ {π€})
affine-gives-ext-const' {π€} fe a {π¨} u t = Ξ³
where
f = Ξ» (x : π) β u
I : f β inverse (Ξ·α΅ {π€} {πβ}) a βΌ extα΅ f
I s = (f β inverse Ξ·α΅ a) s οΌβ¨ Iβ β©
extα΅ f (Ξ·α΅ (inverse Ξ·α΅ a s)) οΌβ¨ Iβ β©
extα΅ f s β
where
Iβ = (unitα΅ f (inverse Ξ·α΅ a s))β»ΒΉ
Iβ = ap (extα΅ f) (inverses-are-sections Ξ·α΅ a s)
Ξ³ : extα΅ f t οΌ u
Ξ³ = extα΅ f t οΌβ¨ (ap (Ξ» - β - t) (dfunext fe I))β»ΒΉ β©
(f β inverse (Ξ·α΅ {π€} {πβ}) a) t οΌβ¨reflβ©
u β
affine-gives-ext-const : Fun-Ext β is-affine β ext-const
affine-gives-ext-const fe a {π€} {π§} {π₯} {π¨} u t = Ξ³
where
g : β¨ π§ β© β T π¨
g _ = u
f : T πβ β T π¨
f _ = u
h : π β T π¨
h _ = u
k : β¨ π§ β© β T πβ
k = Ξ·α΅ {π€} {πβ} β unique-to-π
I : extα΅ h οΌ f
I = dfunext fe (affine-gives-ext-const' fe a u)
Ξ³ = extα΅ g t οΌβ¨reflβ©
extα΅ (f β k) t οΌβ¨ ap (Ξ» - β extα΅ (- β k) t) (I β»ΒΉ) β©
extα΅ (extα΅ h β k) t οΌβ¨ assocα΅ h k t β©
extα΅ h (extα΅ k t) οΌβ¨ ap (Ξ» - β - (extα΅ k t)) I β©
f (extα΅ k t) οΌβ¨reflβ©
u β
ext-const-gives-affine : ext-const β is-affine
ext-const-gives-affine Ο {π€} = Ξ³
where
Ξ·β»ΒΉ : T πβ β π
Ξ·β»ΒΉ t = β
I : Ξ·β»ΒΉ β Ξ·α΅ βΌ id
I β = refl
II : Ξ·α΅ β Ξ·β»ΒΉ βΌ id
II t = (Ξ·α΅ β Ξ·β»ΒΉ) t οΌβ¨reflβ©
Ξ·α΅ β οΌβ¨ (Ο {π€} {πβ} (Ξ·α΅ β) t)β»ΒΉ β©
extα΅ (Ξ» x β Ξ·α΅ β) t οΌβ¨reflβ©
extα΅ Ξ·α΅ t οΌβ¨ extα΅-Ξ· t β©
t β
Ξ³ : is-equiv (Ξ·α΅ {π€} {πβ})
Ξ³ = qinvs-are-equivs Ξ·α΅ (Ξ·β»ΒΉ , I , II)
\end{code}
Relative-Monad algebras.
\begin{code}
record Relative-Algebra
{π¦β : Universe}
{β : Universe β Universe}
(π : Relative-Monad {β})
(R : π¦β Μ ) : π€Ο where
field
aext : {π€ : Universe} {π§ : π π€}
β (β¨ π§ β© β R)
β functor π π§ β R
aunit : {π€ : Universe} {π§ : π π€}
(f : β¨ π§ β© β R)
(x : β¨ π§ β©)
β aext {π€} {π§} f (Ξ· π x) οΌ f x
aassoc : {π€ π₯ : Universe}
{π§ : π π€} {π¨ : π π₯}
(g : β¨ π¨ β© β R)
(f : β¨ π§ β© β functor π π¨)
(t : functor π π§)
β aext (Ξ» x β aext g (f x)) t οΌ aext g (ext π f t)
open Relative-Algebra public
\end{code}
If we want to call an algebra (literally) Ξ±, we can used this module:
\begin{code}
module relative-Ξ±-definitions
{β : Universe β Universe}
(π : Relative-Monad {β})
{π¦β : Universe}
(π‘ : π π¦β)
(π : Relative-Algebra {π¦β} {β} π β¨ π‘ β©)
where
open relative-T-definitions π
Ξ± : T π‘ β β¨ π‘ β©
Ξ± = aext π id
Ξ±-unitα΅ : Ξ± β Ξ·α΅ βΌ id
Ξ±-unitα΅ = aunit π id
extᴬ : {π§ : π π€} β (β¨ π§ β© β β¨ π‘ β©) β T π§ β β¨ π‘ β©
extᴬ = aext π
extᴬ-alternative : {π§ : π π€} β (β¨ π§ β© β β¨ π‘ β©) β T π§ β β¨ π‘ β©
extᴬ-alternative q = Ξ± β mapα΅ q
extᴬ-agreement
: funext π€ π¦β
β {π§ : π π€} (f : β¨ π§ β© β β¨ π‘ β©) (t : T π§)
β extᴬ f t οΌ extᴬ-alternative f t
extᴬ-agreement {π€} fe {π§} f t =
extᴬ f t οΌβ¨reflβ©
aext π f t οΌβ¨ I β©
aext π (Ξ» x β aext π id (Ξ·α΅ (f x))) t οΌβ¨ II β©
aext π (Ξ» x β x) (ext π (Ξ» x β Ξ· π (f x)) t) οΌβ¨reflβ©
extᴬ-alternative f t β
where
I = ap (Ξ» - β aext π - t) (dfunext fe (Ξ» x β (aunit π id (f x))β»ΒΉ))
II = aassoc π id (Ξ·α΅ β f) t
unitᴬ : {π§ : π π€}
(f : β¨ π§ β© β β¨ π‘ β©)
(x : β¨ π§ β©)
β aext π {π€} {π§} f (Ξ·α΅ x) οΌ f x
unitᴬ = aunit π
\end{code}
Free algebras.
\begin{code}
module _ {π£β : Universe}
{β : Universe β Universe}
(π : Relative-Monad {β})
(π : π π£β)
where
open relative-T-definitions π
free-relative-algebra : Relative-Algebra π (T π)
free-relative-algebra =
record {
aext = extα΅
; aunit = unitα΅
; aassoc = assocα΅
}
\end{code}
TODO. Define Relative-Monad morphism (for example overline is a
Relative-Monad morphism from J to K).