{-# OPTIONS --without-K --safe #-} module Categories.Category.Instance.Globe where open import Level using (Level; zero) open import Relation.Binary using (IsEquivalence; module IsEquivalence) open import Data.Nat.Base using (ℕ; zero; suc; _<_; _≤_; z≤n; s≤s) open import Categories.Category.Core data GlobeHom : (m n : ℕ) → Set where I : ∀ {place : ℕ} → GlobeHom place place σ : ∀ {n m : ℕ} → GlobeHom (suc n) m → GlobeHom n m τ : ∀ {n m : ℕ} → GlobeHom (suc n) m → GlobeHom n m data GlobeEq : {m n : ℕ} → GlobeHom m n → GlobeHom m n → Set where both-I : ∀ {m} → GlobeEq {m} {m} I I both-σ : ∀ {m n x y} → GlobeEq {m} {n} (σ x) (σ y) both-τ : ∀ {m n x y} → GlobeEq {m} {n} (τ x) (τ y) GlobeEquiv : ∀ {m n} → IsEquivalence (GlobeEq {m} {n}) GlobeEquiv = record { refl = refl; sym = sym; trans = trans } where refl : ∀ {m n} {x : GlobeHom m n} → GlobeEq x x refl {x = I} = both-I refl {x = σ y} = both-σ refl {x = τ y} = both-τ sym : ∀ {m n} {x y : GlobeHom m n} → GlobeEq x y → GlobeEq y x sym both-I = both-I sym both-σ = both-σ sym both-τ = both-τ trans : ∀ {m n} {x y z : GlobeHom m n} → GlobeEq x y → GlobeEq y z → GlobeEq x z trans both-I y∼z = y∼z trans both-σ both-σ = both-σ trans both-τ both-τ = both-τ infixl 7 _⊚_ _⊚_ : ∀ {l m n} → GlobeHom m n → GlobeHom l m → GlobeHom l n x ⊚ I = x x ⊚ σ y = σ (x ⊚ y) x ⊚ τ y = τ (x ⊚ y) Globe : Category Level.zero Level.zero Level.zero Globe = record { Obj = ℕ ; _⇒_ = GlobeHom ; _≈_ = GlobeEq ; id = I ; _∘_ = _⊚_ ; assoc = λ {_ _ _ _ f g h} → assoc {f = f} {g} {h} ; sym-assoc = λ {_ _ _ _ f g h} → GlobeEquiv.sym (assoc {f = f} {g} {h}) ; identityˡ = identityˡ ; identityʳ = identityʳ ; identity² = identity² ; equiv = GlobeEquiv ; ∘-resp-≈ = ∘-resp-≡ } where module GlobeEquiv {m n} = IsEquivalence (GlobeEquiv {m} {n}) assoc : ∀ {A B C D} {f : GlobeHom A B} {g : GlobeHom B C} {h : GlobeHom C D} → GlobeEq ((h ⊚ g) ⊚ f) (h ⊚ (g ⊚ f)) assoc {f = I} = refl where open IsEquivalence GlobeEquiv assoc {f = σ y} = both-σ assoc {f = τ y} = both-τ identityˡ : ∀ {A B} {f : GlobeHom A B} → GlobeEq (I ⊚ f) f identityˡ {f = I} = both-I identityˡ {f = σ y} = both-σ identityˡ {f = τ y} = both-τ identityʳ : ∀ {A B} {f : GlobeHom A B} → GlobeEq (f ⊚ I) f identityʳ = IsEquivalence.refl GlobeEquiv identity² : {m : ℕ} → GlobeEq {m} (I ⊚ I) I identity² = both-I ∘-resp-≡ : ∀ {A B C} {f h : GlobeHom B C} {g i : GlobeHom A B} → GlobeEq f h → GlobeEq g i → GlobeEq (f ⊚ g) (h ⊚ i) ∘-resp-≡ f∼h both-I = f∼h ∘-resp-≡ f∼h both-σ = both-σ ∘-resp-≡ f∼h both-τ = both-τ