From 7de733feae4f391cc4738e23906e7d1f48bd2e0d Mon Sep 17 00:00:00 2001 From: Jacques Comeaux Date: Wed, 24 Apr 2024 14:26:35 -0500 Subject: Add base case coequalizers in Nat --- Nat/Properties.agda | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 Nat/Properties.agda (limited to 'Nat') diff --git a/Nat/Properties.agda b/Nat/Properties.agda new file mode 100644 index 0000000..3e1e0b4 --- /dev/null +++ b/Nat/Properties.agda @@ -0,0 +1,123 @@ +{-# OPTIONS --without-K --safe #-} +module Nat.Properties where + +open import Data.Empty using (⊥-elim) +open import Data.Fin using (Fin; #_; toℕ) +open import Data.Fin.Properties using (¬Fin0) +open import Data.Nat using (ℕ; s≤s) +open import Data.Product using (_,_; proj₁; proj₂; Σ-syntax) +open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; cong) +open import Relation.Binary.PropositionalEquality.Properties using (module ≡-Reasoning) + +open import Categories.Category.Core using (Category) +open import Categories.Category.Instance.Nat using (Nat) +open import Categories.Diagram.Coequalizer Nat using (IsCoequalizer; Coequalizer) +open import Categories.Object.Coproduct Nat using (Coproduct; IsCoproduct; IsCoproduct⇒Coproduct) + +open import Coeq using (iterated-coequalizer) +open import FinMerge using (glue-iter; glue-unglue-once) +open import FinMerge.Properties using (lemma₂; merge-unmerge; unmerge-merge) +open import Util using (compare; less; equal; greater; _<_<_) + + +open Category Nat + +makeZeroCoequalizer + : {B : ℕ} + → (f g : 0 ⇒ B) + → Coequalizer f g +makeZeroCoequalizer f g = record + { arr = id + ; isCoequalizer = record + { equality = λ() + ; coequalize = λ {_} {h} _ → h + ; universal = λ _ → refl + ; unique = λ h≈i∘id → Equiv.sym h≈i∘id + } + } + +makeSimpleCoequalizer + : {B : ℕ} + → (f g : 1 ⇒ B) + → Coequalizer f g +makeSimpleCoequalizer {ℕ.zero} f g = ⊥-elim (¬Fin0 (f (# 0))) +makeSimpleCoequalizer {ℕ.suc B} f g = record + { arr = proj₂ (glue-iter f g id) + ; isCoequalizer = record + { equality = λ { Fin.zero → lemma₂ f g } + ; coequalize = λ {_} {h} h∘f≈h∘g → h ∘ proj₂ (proj₂ (glue-unglue-once (compare (f (# 0)) (g (# 0))))) + ; universal = λ { {C} {h} {eq} → univ {C} {h} {eq} } + ; unique = λ { {C} {h} {i} {eq} h≈i∘m → uniq {C} {h} {i} {eq} h≈i∘m } + } + } + where + univ + : {C : Obj} {h : ℕ.suc B ⇒ C} {eq : h ∘ f ≈ h ∘ g} + → ∀ x + → h x + ≡ h ((proj₂ (proj₂ (glue-unglue-once (compare (f (# 0)) (g (# 0)))))) + (proj₂ (glue-iter f g id) x)) + univ {C} {h} {eq} x with compare (f ( # 0)) (g (# 0)) + ... | less (f0