Compare commits

...

4 commits

Author SHA1 Message Date
1a4b9135fc
Show that Setoids is an instance of our ambient category 2023-12-01 18:56:07 +01:00
a0ba49ff2e
Updated structure 2023-12-01 17:19:12 +01:00
b63d5455be
Work on maybe 2023-12-01 15:34:21 +01:00
7be2f41196
minor 2023-12-01 14:46:36 +01:00
21 changed files with 196 additions and 64 deletions

View file

@ -1,10 +1,9 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Categories.Functor renaming (id to idF)
open import Categories.Functor.Algebra
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
```
-->

View file

@ -1,8 +1,7 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Categories.FreeObjects.Free
open import Categories.Functor.Core
open import Categories.Functor.Algebra

View file

@ -36,14 +36,14 @@ We work in an ambient category that
- has exponentials `X^`
```agda
module Category.Instance.AmbientCategory where
module Category.Ambient where
record Ambient (o e : Level) : Set (suc o ⊔ suc ⊔ suc e) where
field
C : Category o e
extensive : Extensive C
cartesian : Cartesian C
: ParametrizedNNO (record { U = C ; cartesian = cartesian })
_^ : ∀ X → Exponential C (ParametrizedNNO.N ) X
-- _^ : ∀ X → Exponential C (ParametrizedNNO.N ) X
cartesianCategory : CartesianCategory o e
cartesianCategory = record { U = C ; cartesian = cartesian }

View file

@ -0,0 +1,111 @@
<!--
```agda
open import Level using (lift; Lift) renaming (suc to -suc)
open import Category.Ambient
open import Categories.Category.Instance.Setoids
open import Categories.Category.Instance.Properties.Setoids.Extensive
open import Categories.Category.Instance.Properties.Setoids.CCC
open import Categories.Category.Monoidal.Instance.Setoids
open import Categories.Category.Instance.SingletonSet
open import Categories.Object.NaturalNumbers
open import Relation.Binary
open import Data.Unit.Polymorphic using (tt; )
open import Data.Empty.Polymorphic using (⊥)
open import Function.Equality as SΠ renaming (id to idₛ)
open import Categories.Object.NaturalNumbers.Properties.Parametrized
open import Categories.Category.Cocartesian
import Relation.Binary.Reasoning.Setoid as SetoidR
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_)
```
-->
# The category of Setoids can be used as instance for ambient category
Most of the required properties are already proven in the agda-categories library, we are only left to construct the natural numbers object.
```agda
module Category.Ambient.Setoid {} where
-- equality on setoid functions
_≋_ : ∀ {A B : Setoid } → A ⟶ B → A ⟶ B → Set
_≋_ {A} {B} f g = Setoid._≈_ (A ⇨ B) f g
≋-sym : ∀ {A B : Setoid } {f g : A ⟶ B} → f ≋ g → g ≋ f
≋-sym {A} {B} {f} {g} = IsEquivalence.sym (Setoid.isEquivalence (A ⇨ B)) {f} {g}
≋-trans : ∀ {A B : Setoid } {f g h : A ⟶ B} → f ≋ g → g ≋ h → f ≋ h
≋-trans {A} {B} {f} {g} {h} = IsEquivalence.trans (Setoid.isEquivalence (A ⇨ B)) {f} {g} {h}
-- we define ourselves, instead of importing it, to avoid lifting the universe lifting (builtin Nats are defined on Set₀)
data : Set where
zero :
suc :
suc-cong : ∀ {n m} → n ≡ m → suc n ≡ suc m
suc-cong n≡m rewrite n≡m = Eq.refl
suc-inj : ∀ {n m} → suc n ≡ suc m → n ≡ m
suc-inj Eq.refl = Eq.refl
-eq : Rel
-eq zero zero =
-eq zero (suc m) = ⊥
-eq (suc n) zero = ⊥
-eq (suc n) (suc m) = -eq n m
-setoid : Setoid
-setoid = record { Carrier = ; _≈_ = _≡_ ; isEquivalence = Eq.isEquivalence }
-setoid : Setoid
-setoid = record
{ Carrier =
; _≈_ = _≡_ -- -eq
; isEquivalence = Eq.isEquivalence
}
zero⟶ : SingletonSetoid {} {} ⟶ -setoid
zero⟶ = record { _⟨$⟩_ = λ _ → zero ; cong = λ x → Eq.refl }
suc⟶ : -setoid ⟶ -setoid
suc⟶ = record { _⟨$⟩_ = suc ; cong = suc-cong }
-universal : ∀ {A : Setoid } → SingletonSetoid {} {} ⟶ A → A ⟶ A → -setoid ⟶ A
-universal {A} z s = record { _⟨$⟩_ = app ; cong = cong' }
where
app : → Setoid.Carrier A
app zero = z ⟨$⟩ tt
app (suc n) = s ⟨$⟩ (app n)
cong' : ∀ {n m : } → n ≡ m → Setoid._≈_ A (app n) (app m)
cong' Eq.refl = IsEquivalence.refl (Setoid.isEquivalence A)
-z-commute : ∀ {A : Setoid } {q : SingletonSetoid {} {} ⟶ A} {f : A ⟶ A} → q ≋ (-universal q f ∘ zero⟶)
-z-commute {A} {q} {f} {lift tt} _ = IsEquivalence.refl (Setoid.isEquivalence A)
-s-commute : ∀ {A : Setoid } {q : SingletonSetoid {} {} ⟶ A} {f : A ⟶ A} → (f ∘ (-universal q f)) ≋ (-universal q f ∘ suc⟶)
-s-commute {A} {q} {f} {n} {m} n≡m rewrite n≡m = IsEquivalence.refl (Setoid.isEquivalence A)
-unique : ∀ {A : Setoid } {q : SingletonSetoid {} {} ⟶ A} {f : A ⟶ A} {u : -setoid ⟶ A} → q ≋ (u ∘ zero⟶) → (f ∘ u) ≋ (u ∘ suc⟶) → u ≋ -universal q f
-unique {A} {q} {f} {u} qz fs {zero} {zero} Eq.refl = (≋-sym {SingletonSetoid} {A} {q} {u ∘ zero⟶} qz) tt
-unique {A} {q} {f} {u} qz fs {suc n} {suc m} Eq.refl = AR.begin
u ⟨$⟩ suc n AR.≈⟨ ≋-sym {-setoid} {A} {f ∘ u} {u ∘ suc⟶} fs Eq.refl ⟩
f ∘ u ⟨$⟩ m AR.≈⟨ cong f (-unique {A} {q} {f} {u} qz fs {n} {m} Eq.refl) ⟩
f ∘ -universal q f ⟨$⟩ n AR.≈⟨ -s-commute {A} {q} {f} {n} Eq.refl ⟩
-universal q f ⟨$⟩ suc m AR.∎
where module AR = SetoidR A
setoidNNO : NNO (Setoids ) SingletonSetoid-
setoidNNO = record
{ N = -setoid
; isNNO = record
{ z = zero⟶
; s = suc⟶
; universal = -universal
; z-commute = λ {A} {q} {f} → -z-commute {A} {q} {f}
; s-commute = λ {A} {q} {f} → -s-commute {A} {q} {f}
; unique = λ {A} {q} {f} {u} qz fs → -unique {A} {q} {f} {u} qz fs
}
}
-- TODO might need explicit PNNO definition if we later have to work with them
setoidAmbient : Ambient (-suc )
setoidAmbient = record { C = Setoids ; extensive = Setoids-Extensive ; cartesian = Setoids-Cartesian ; = NNO×CCC⇒PNNO (record { U = Setoids ; cartesianClosed = Setoids-CCC }) (Cocartesian.coproducts (Setoids-Cocartesian {} {})) setoidNNO }
```

View file

@ -1,6 +1,5 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Categories.Category.Cocartesian using (Cocartesian)
open import Categories.Category.Cartesian using (Cartesian)
@ -14,7 +13,7 @@ open import Categories.Category
open import Categories.Category.Distributive
open import Categories.Category.Extensive.Bundle
open import Categories.Category.Extensive
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
```
-->
@ -210,21 +209,21 @@ module Category.Construction.ElgotAlgebras {o e} (ambient : Ambient o e)
## Exponentials of Elgot Algebras TODO
```agda
-- if the carriers of the algebra form a exponential, so do the algebras
B^A-Helper : ∀ {EA : Elgot-Algebra} {X : Obj} → Exponential C X (Elgot-Algebra.A EA) → Elgot-Algebra
B^A-Helper {EA} {X} exp = record
{ A = A^X
; algebra = record
{ _# = λ {Z} f → λg product (((((eval +₁ idC) ∘ (Categories.Object.Product.repack C product product' +₁ idC)) ∘ dstl) ∘ (f ⁂ idC)) #ᵃ)
; #-Fixpoint = {! !}
; #-Uniformity = {! !}
; #-Folding = {! !}
; #-resp-≈ = {! !}
}
}
where
open Exponential exp renaming (B^A to A^X; product to product')
open Elgot-Algebra EA using (A) renaming (_# to _#ᵃ; #-Fixpoint to #ᵃ-Fixpoint; #-Uniformity to #ᵃ-Uniformity; #-Folding to #ᵃ-Folding; #-resp-≈ to #ᵃ-resp-≈)
dstr = λ {X Y Z} → IsIso.inv (isIsoˡ {X} {Y} {Z})
dstl = λ {X Y Z} → IsIso.inv (isIsoʳ {X} {Y} {Z})
-- -- if the carriers of the algebra form a exponential, so do the algebras
-- B^A-Helper : ∀ {EA : Elgot-Algebra} {X : Obj} → Exponential C X (Elgot-Algebra.A EA) → Elgot-Algebra
-- B^A-Helper {EA} {X} exp = record
-- { A = A^X
-- ; algebra = record
-- { _# = λ {Z} f → λg product (((((eval +₁ idC) ∘ (Categories.Object.Product.repack C product product' +₁ idC)) ∘ dstl) ∘ (f ⁂ idC)) #ᵃ)
-- ; #-Fixpoint = {! !}
-- ; #-Uniformity = {! !}
-- ; #-Folding = {! !}
-- ; #-resp-≈ = {! !}
-- }
-- }
-- where
-- open Exponential exp renaming (B^A to A^X; product to product')
-- open Elgot-Algebra EA using (A) renaming (_# to _#ᵃ; #-Fixpoint to #ᵃ-Fixpoint; #-Uniformity to #ᵃ-Uniformity; #-Folding to #ᵃ-Folding; #-resp-≈ to #ᵃ-resp-≈)
-- dstr = λ {X Y Z} → IsIso.inv (isIsoˡ {X} {Y} {Z})
-- dstl = λ {X Y Z} → IsIso.inv (isIsoʳ {X} {Y} {Z})
```

View file

@ -1,7 +1,7 @@
<!--
```agda
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.NaturalTransformation
open import Categories.NaturalTransformation.Equivalence
open import Categories.Monad

View file

@ -1,7 +1,7 @@
<!--
```agda
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.NaturalTransformation
open import Categories.NaturalTransformation.Equivalence
open import Categories.Monad

View file

@ -12,7 +12,7 @@ open import Categories.Functor.Algebra
open import Categories.Monad.Construction.Kleisli
open import Categories.Category.Construction.F-Coalgebras
open import Categories.NaturalTransformation
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Data.Product using (∃-syntax; _,_; Σ-syntax)
```
-->

View file

@ -1,13 +1,12 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Data.Product using (_,_; proj₁; proj₂)
open import Categories.Category.Core
open import Categories.Functor
open import Categories.Functor.Coalgebra
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Monad.Commutative
open import Monad.Instance.Delay
open import Categories.Monad

View file

@ -4,7 +4,7 @@
open import Level
open import Categories.Functor
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Categories.Monad
open import Categories.Monad.Construction.Kleisli
open import Categories.Monad.Relative renaming (Monad to RMonad)

View file

@ -4,7 +4,7 @@ open import Level
open import Data.Product using (_,_; proj₁; proj₂)
open import Categories.Category
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.Functor
open import Categories.Functor.Coalgebra
open import Monad.Instance.Delay

View file

@ -7,7 +7,7 @@ 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)
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Categories.Monad.Construction.Kleisli
```
-->

View file

@ -1,8 +1,7 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Monad.Commutative
open import Categories.Monad.Strong
open import Data.Product using (_,_) renaming (_×_ to _×f_)

View file

@ -2,7 +2,7 @@
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Data.Product using (_,_)
open import Categories.FreeObjects.Free
open import Categories.Category.Construction.Kleisli

View file

@ -3,7 +3,7 @@
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.Category
open import Categories.Category.Instance.Setoids
open import Categories.Monad
@ -16,32 +16,29 @@ open import Relation.Binary
open import Data.Sum using (_⊎_; inj₁; inj₂)
open import Data.Sum.Function.Setoid
open import Data.Sum.Relation.Binary.Pointwise
open import Agda.Builtin.Unit using (tt)
open import Data.Unit.Polymorphic using () renaming ( to ⊤ₚ)
open import Data.Empty.Polymorphic using () renaming (⊥ to ⊥ₚ)
open import Data.Unit.Polymorphic using (tt; )
open import Data.Empty.Polymorphic using (⊥)
open import Categories.NaturalTransformation using (ntHelper)
open import Function.Base using (id)
```
-->
```agda
module Monad.Instance.K.Instance.Maybe {o e} (ambient : Ambient o e) where
open Ambient ambient using ()
module Monad.Instance.K.Instance.Maybe {c } where
```
# The Maybe Monad as instance of K
Assuming the axiom of choice, the maybe monad is an instance of K in the category of setoids.
```agda
module _ {c : Level} where
data Maybe (A : Set c) : Set c where
nothing : Maybe A
just : A → Maybe A
maybe-eq : ∀ (A : Setoid c ) → Maybe (Setoid.Carrier A) → Maybe (Setoid.Carrier A) → Set
maybe-eq _ nothing nothing =
maybe-eq _ nothing (just y) = ⊥
maybe-eq _ (just x) nothing = ⊥
maybe-eq _ nothing nothing =
maybe-eq _ nothing (just y) = ⊥
maybe-eq _ (just x) nothing = ⊥
maybe-eq A (just x) (just y) = Setoid._≈_ A x y
maybeSetoid : Setoid c → Setoid c
@ -49,7 +46,7 @@ module _ {c : Level} where
where
module A = Setoid A
refl' : Reflexive (maybe-eq A)
refl' {nothing} = lift tt
refl' {nothing} = tt
refl' {just x} = IsEquivalence.refl A.isEquivalence
sym' : Symmetric (maybe-eq A)
sym' {nothing} {nothing} = id
@ -59,7 +56,7 @@ module _ {c : Level} where
trans' : Transitive (maybe-eq A)
trans' {nothing} {nothing} {nothing} = λ _ → id
trans' {nothing} {nothing} {just z} = λ _ → id
trans' {nothing} {just y} {nothing} = λ _ _ lift tt
trans' {nothing} {just y} {nothing} = λ _ _ → tt
trans' {nothing} {just y} {just z} = λ ()
trans' {just x} {nothing} {nothing} = λ ()
trans' {just x} {nothing} {just z} = λ ()
@ -78,15 +75,27 @@ module _ {c : Level} where
_≋_ : ∀ {A B : Setoid c } → A ⟶ B → A ⟶ B → Set (c ⊔ )
_≋_ {A} {B} f g = Setoid._≈_ (A ⇨ B) f g
≋-sym : ∀ {A B : Setoid c } {f g : A ⟶ B} → f ≋ g → g ≋ f
≋-sym {A} {B} {f} {g} = IsEquivalence.sym (Setoid.isEquivalence (A ⇨ B)) {f} {g}
maybeFun-id : ∀ {A : Setoid c } → (maybeFun idₛ) ≋ idₛ {A = maybeSetoid A}
maybeFun-id {A} {nothing} {nothing} i≈j = i≈j
maybeFun-id {A} {just _} {just _} i≈j = i≈j
maybeFun-comp : ∀ {A B C : Setoid c } (f : A ⟶ B) (g : B ⟶ C) → maybeFun (g ∘ f) ≋ ((maybeFun g) ∘ (maybeFun f))
maybeFun-comp {A} {B} {C} f g {nothing} {nothing} i≈j = i≈j
maybeFun-comp {A} {B} {C} f g {just _} {just _} i≈j = cong g (cong f i≈j)
maybeFun-resp-≈ : ∀ {A B : Setoid c } {f g : A ⟶ B} → f ≋ g → maybeFun f ≋ maybeFun g
maybeFun-resp-≈ {A} {B} {f} {g} f≈g {nothing} {nothing} i≈j = i≈j
maybeFun-resp-≈ {A} {B} {f} {g} f≈g {just _} {just _} i≈j = f≈g i≈j
η : ∀ (A : Setoid c ) → A ⟶ maybeSetoid A
η A = record { _⟨$⟩_ = just ; cong = id }
η-natural : ∀ {A B : Setoid c } (f : A ⟶ B) → (η B ∘ f) ≋ (maybeFun f ∘ η A)
η-natural {A} {B} f {i} {j} i≈j = cong f i≈j
μ : ∀ (A : Setoid c ) → maybeSetoid (maybeSetoid A) ⟶ maybeSetoid A
μ A = record { _⟨$⟩_ = app ; cong = λ {i} {j} → cong' i j }
where
@ -96,6 +105,25 @@ module _ {c : Level} where
cong' : ∀ (i j : Maybe (Maybe (Setoid.Carrier A))) → maybe-eq (maybeSetoid A) i j → maybe-eq A (app i) (app j)
cong' nothing nothing i≈j = i≈j
cong' (just i) (just j) i≈j = i≈j
μ-natural : ∀ {A B : Setoid c } (f : A ⟶ B) → (μ B ∘ maybeFun (maybeFun f)) ≋ (maybeFun f ∘ μ A)
μ-natural {A} {B} f {nothing} {nothing} i≈j = i≈j
μ-natural {A} {B} f {just i} {just j} i≈j = cong (maybeFun f) {i} {j} i≈j
μ-assoc : ∀ {A : Setoid c } → (μ A ∘ maybeFun (μ A)) ≋ (μ A ∘ μ (maybeSetoid A))
μ-assoc {A} {nothing} {nothing} i≈j = i≈j
μ-assoc {A} {just i} {just j} i≈j = cong (μ A) {i} {j} i≈j
μ-sym-assoc : ∀ {A : Setoid c } → (μ A ∘ μ (maybeSetoid A)) ≋ (μ A ∘ maybeFun (μ A))
μ-sym-assoc {A} {nothing} {nothing} i≈j = i≈j
μ-sym-assoc {A} {just i} {just j} i≈j = cong (μ A) {i} {j} i≈j
identityˡ : ∀ {A : Setoid c } → (μ A ∘ maybeFun (η A)) ≋ idₛ
identityˡ {A} {nothing} {nothing} i≈j = i≈j
identityˡ {A} {just _} {just _} i≈j = i≈j
identityʳ : ∀ {A : Setoid c } → (μ A ∘ η (maybeSetoid A)) ≋ idₛ
identityʳ {A} {i} {j} i≈j = i≈j
maybeMonad : Monad (Setoids c )
maybeMonad = record
@ -103,21 +131,21 @@ module _ {c : Level} where
{ F₀ = maybeSetoid
; F₁ = maybeFun
; identity = λ {A} {x} {y} → maybeFun-id {A = A} {x} {y}
; homomorphism = {! !}
; F-resp-≈ = {! !}
; homomorphism = λ {A} {B} {C} {f} {g} {i} {j} → maybeFun-comp {A} {B} {C} f g {i} {j}
; F-resp-≈ = maybeFun-resp-≈
}
; η = ntHelper (record
{ η = η
; commute = {! !}
; commute = η-natural
})
; μ = ntHelper (record
{ η = μ
; commute = {! !}
; commute = μ-natural
})
; assoc = {! !}
; sym-assoc = {! !}
; identityˡ = {! !}
; identityʳ = {! !}
; assoc = λ {A} {i} {j} → μ-assoc {A} {i} {j}
; sym-assoc = λ {A} {i} {j} → μ-sym-assoc {A} {i} {j}
; identityˡ = λ {A} {i} {j} → identityˡ {A} {i} {j}
; identityʳ = λ {A} {i} {j} → identityʳ {A} {i} {j}
}

View file

@ -3,7 +3,7 @@
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Data.Product using (_,_)
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.Object.Terminal
open import Categories.Functor.Algebra
open import Categories.Object.Initial

View file

@ -1,7 +1,7 @@
<!--
```agda
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.FreeObjects.Free
open import Categories.Object.Initial
open import Categories.NaturalTransformation

View file

@ -11,7 +11,7 @@ open import Categories.Adjoint.Properties
open import Categories.Monad
open import Categories.Monad.Strong
open import Categories.Monad.Relative renaming (Monad to RMonad)
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Categories.NaturalTransformation
open import Categories.Object.Terminal

View file

@ -1,7 +1,7 @@
<!--
```agda
open import Level
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
open import Categories.FreeObjects.Free
open import Categories.Object.Initial
open import Categories.NaturalTransformation

View file

@ -1,9 +1,7 @@
<!--
```agda
{-# OPTIONS --allow-unsolved-metas #-}
open import Level
open import Category.Instance.AmbientCategory using (Ambient)
open import Category.Ambient using (Ambient)
open import Categories.Monad.Construction.Kleisli
open import Categories.Monad
open import Categories.Monad.Strong

View file

@ -16,7 +16,7 @@ This is an implementation of this paper by Sergey Goncharov: [arxiv](https://arx
The work takes place in an ambient category that fits our needs:
```agda
open import Category.Instance.AmbientCategory
open import Category.Ambient using (Ambient)
```
### Delay Monad