Show that Setoids is an instance of our ambient category

This commit is contained in:
Leon Vatthauer 2023-12-01 18:56:07 +01:00
parent a0ba49ff2e
commit 1a4b9135fc
Signed by: leonv
SSH key fingerprint: SHA256:G4+ddwoZmhLPRB1agvXzZMXIzkVJ36dUYZXf5NxT+u8
2 changed files with 117 additions and 10 deletions

View file

@ -1,3 +1,111 @@
<!--
```agda
module Category.Ambient.Setoid where
```
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

@ -16,9 +16,8 @@ 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)
```
@ -37,9 +36,9 @@ Assuming the axiom of choice, the maybe monad is an instance of K in the categor
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
@ -47,7 +46,7 @@ Assuming the axiom of choice, the maybe monad is an instance of K in the categor
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
@ -57,7 +56,7 @@ Assuming the axiom of choice, the maybe monad is an instance of K in the categor
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} = λ ()