{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.Carried.SameIndexCatS where
open import Agda.Primitive using (Level; lzero; lsuc)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Agda.Builtin.Sigma using (Σ; _,_)
open import Data.Unit.Polymorphic.Base using (⊤; tt)
open import Data.Nat.Base using (ℕ)
open import Relation.Binary.Structures using (IsEquivalence)
open import Categories.Category.Core using (Category)
open import ALMA.Base.MCorr using (M)
open import ALMA.Base.MCorrSetoid using
(SysEq; EqOn; propEqOn; idAdjˢ; _≈Mˢ_; ≈Mˢ-refl; ≈Mˢ-sym; ≈Mˢ-trans)
open import ALMA.Base.MCorrSetoidCat using (FMapˢ; FMˢ)
open SysEq
record LabelSys (ℓ : Level) : Set (lsuc ℓ) where
field
A₀ : ℕ → Set ℓ
≈A₀ : (v : ℕ) → EqOn {ℓ = ℓ} (A₀ v)
open LabelSys public
dsys : (d : ℕ → ℕ) {ℓ : Level} (X : LabelSys ℓ)
→ SysEq lzero ℓ lzero ℓ lzero
dsys d X = record
{ I = ℕ
; A = A₀ X
; E = λ v _ w → Σ (⊤ {lzero}) λ _ → w ≡ d v
; ≈A = ≈A₀ X
; ≈E = λ v _ w → propEqOn (Σ (⊤ {lzero}) λ _ → w ≡ d v)
}
module _ (d : ℕ → ℕ) {ℓ : Level} where
private
s = dsys d
idxFM : (X Y : LabelSys ℓ)
(sh : (v : ℕ) → A₀ X v → A₀ Y v)
(shc : ∀ {v : ℕ} {a a' : A₀ X v}
→ EqOn._≈_ (≈A₀ X v) a a'
→ EqOn._≈_ (≈A₀ Y v) (sh v a) (sh v a'))
→ FMˢ (s X) (s Y)
idxFM X Y sh shc = record
{ mor = fmor
; shape-cong = λ e → shc e
; map-cong = go
}
where
fmor : FMapˢ (s X) (s Y)
fmor = record
{ u = λ v → v
; shape = sh
; childF = λ v _ w → w , refl
; adjFˢ = λ v a w → idAdjˢ (≈E (s Y) v (sh v a) w)
}
mutual
go : ∀ {v : ℕ} {t t' : M (A (s X)) (E (s X)) v}
→ _≈Mˢ_ (≈A (s X)) (≈E (s X)) t t'
→ _≈Mˢ_ (≈A (s Y)) (≈E (s Y))
(FMapˢ.mapFˢ fmor v t) (FMapˢ.mapFˢ fmor v t')
go p ._≈Mˢ_.here-eq = shc (_≈Mˢ_.here-eq p)
go p ._≈Mˢ_.below-eq w =
let adj , fs = _≈Mˢ_.below-eq p w
fwd , bwd = fs
in adj , ((λ e₁ → go (fwd e₁)) , (λ e₂ → go (bwd e₂)))
record Idx⇒ (X Y : LabelSys ℓ) : Set ℓ where
field
shape : (v : ℕ) → A₀ X v → A₀ Y v
shape-cong : ∀ {v : ℕ} {a a' : A₀ X v}
→ EqOn._≈_ (≈A₀ X v) a a'
→ EqOn._≈_ (≈A₀ Y v) (shape v a) (shape v a')
mor : FMˢ (s X) (s Y)
mor = idxFM X Y shape shape-cong
open Idx⇒ public
idxi : (X : LabelSys ℓ) → Idx⇒ X X
idxi X = record
{ shape = λ _ a → a
; shape-cong = λ e → e
}
compi : {X Y Z : LabelSys ℓ} → Idx⇒ Y Z → Idx⇒ X Y → Idx⇒ X Z
compi g f = record
{ shape = λ v a → shape g v (shape f v a)
; shape-cong = λ e → shape-cong g (shape-cong f e)
}
_≈i_ : {X Y : LabelSys ℓ} → Idx⇒ X Y → Idx⇒ X Y → Set ℓ
_≈i_ {X = X} {Y = Y} f g =
∀ (v : ℕ) (t : M (A (s X)) (E (s X)) v)
→ _≈Mˢ_ (≈A (s Y)) (≈E (s Y))
(FMapˢ.mapFˢ (FMˢ.mor (mor f)) v t)
(FMapˢ.mapFˢ (FMˢ.mor (mor g)) v t)
≈i-refl : {X Y : LabelSys ℓ} (f : Idx⇒ X Y) → f ≈i f
≈i-refl {Y = Y} f v t =
≈Mˢ-refl (≈A (s Y)) (≈E (s Y))
(FMapˢ.mapFˢ (FMˢ.mor (mor f)) v t)
≈i-sym : {X Y : LabelSys ℓ} {f g : Idx⇒ X Y} → f ≈i g → g ≈i f
≈i-sym {Y = Y} p v t =
≈Mˢ-sym (≈A (s Y)) (≈E (s Y)) (p v t)
≈i-trans : {X Y : LabelSys ℓ} {f g h : Idx⇒ X Y}
→ f ≈i g → g ≈i h → f ≈i h
≈i-trans {Y = Y} p q v t =
≈Mˢ-trans (≈A (s Y)) (≈E (s Y)) (p v t) (q v t)
≈i-isEquivalence : {X Y : LabelSys ℓ} → IsEquivalence (_≈i_ {X} {Y})
≈i-isEquivalence = record
{ refl = λ {f} → ≈i-refl f
; sym = λ {f g} → ≈i-sym {f = f} {g = g}
; trans = λ {f g h} → ≈i-trans {f = f} {g = g} {h = h}
}
∘-resp-≈i : {X Y Z : LabelSys ℓ}
{F₁ F₂ : Idx⇒ X Y} {G₁ G₂ : Idx⇒ Y Z}
→ F₁ ≈i F₂ → G₁ ≈i G₂
→ compi G₁ F₁ ≈i compi G₂ F₂
∘-resp-≈i {X = X} {Y = Y} {Z = Z}
{F₁ = F₁} {F₂ = F₂} {G₁ = G₁} {G₂ = G₂} eqF eqG = go
where
mutual
go : (v : ℕ) (t : M (A (s X)) (E (s X)) v)
→ _≈Mˢ_ (≈A (s Z)) (≈E (s Z))
(FMapˢ.mapFˢ (FMˢ.mor (mor (compi G₁ F₁))) v t)
(FMapˢ.mapFˢ (FMˢ.mor (mor (compi G₂ F₂))) v t)
go v t ._≈Mˢ_.here-eq =
EqOn.trans (≈A (s Z) v)
(shape-cong G₁ (_≈Mˢ_.here-eq (eqF v t)))
(_≈Mˢ_.here-eq
(eqG v (FMapˢ.mapFˢ (FMˢ.mor (mor F₂)) v t)))
go v t ._≈Mˢ_.below-eq w =
idAdjˢ (propEqOn (Σ (⊤ {lzero}) λ _ → w ≡ d v))
, ( (λ e₁ → go w (M.below t w e₁))
, (λ e₂ → go˘ w (M.below t w e₂)) )
go˘ : (v : ℕ) (t : M (A (s X)) (E (s X)) v)
→ _≈Mˢ_ (≈A (s Z)) (≈E (s Z))
(FMapˢ.mapFˢ (FMˢ.mor (mor (compi G₂ F₂))) v t)
(FMapˢ.mapFˢ (FMˢ.mor (mor (compi G₁ F₁))) v t)
go˘ v t ._≈Mˢ_.here-eq =
EqOn.trans (≈A (s Z) v)
(EqOn.sym (≈A (s Z) v)
(_≈Mˢ_.here-eq
(eqG v (FMapˢ.mapFˢ (FMˢ.mor (mor F₂)) v t))))
(EqOn.sym (≈A (s Z) v)
(shape-cong G₁ (_≈Mˢ_.here-eq (eqF v t))))
go˘ v t ._≈Mˢ_.below-eq w =
idAdjˢ (propEqOn (Σ (⊤ {lzero}) λ _ → w ≡ d v))
, ( (λ e₁ → go˘ w (M.below t w e₁))
, (λ e₂ → go w (M.below t w e₂)) )
pointwise-i : {X Y : LabelSys ℓ} (f g : Idx⇒ X Y)
→ (∀ (v : ℕ) (a : A₀ X v)
→ EqOn._≈_ (≈A₀ Y v) (shape f v a) (shape g v a))
→ f ≈i g
pointwise-i {X = X} {Y = Y} f g eq v t = go v t
where
edgeAdj : (v w : ℕ) → _
edgeAdj v w = idAdjˢ (propEqOn (Σ (⊤ {lzero}) λ _ → w ≡ d v))
mutual
go : (v : ℕ) (u : M (A (s X)) (E (s X)) v)
→ _≈Mˢ_ (≈A (s Y)) (≈E (s Y))
(FMapˢ.mapFˢ (FMˢ.mor (mor f)) v u)
(FMapˢ.mapFˢ (FMˢ.mor (mor g)) v u)
go v u ._≈Mˢ_.here-eq = eq v (M.here u)
go v u ._≈Mˢ_.below-eq w =
edgeAdj v w
, ( (λ e → go w (M.below u w e))
, (λ e → go˘ w (M.below u w e)) )
go˘ : (v : ℕ) (u : M (A (s X)) (E (s X)) v)
→ _≈Mˢ_ (≈A (s Y)) (≈E (s Y))
(FMapˢ.mapFˢ (FMˢ.mor (mor g)) v u)
(FMapˢ.mapFˢ (FMˢ.mor (mor f)) v u)
go˘ v u ._≈Mˢ_.here-eq =
EqOn.sym (≈A (s Y) v) (eq v (M.here u))
go˘ v u ._≈Mˢ_.below-eq w =
edgeAdj v w
, ( (λ e → go˘ w (M.below u w e))
, (λ e → go w (M.below u w e)) )
assoc-i : {A B C D : LabelSys ℓ}
{f : Idx⇒ A B} {g : Idx⇒ B C} {h : Idx⇒ C D}
→ compi (compi h g) f ≈i compi h (compi g f)
assoc-i {f = f} {g = g} {h = h} = ≈i-refl (compi (compi h g) f)
sym-assoc-i : {A B C D : LabelSys ℓ}
{f : Idx⇒ A B} {g : Idx⇒ B C} {h : Idx⇒ C D}
→ compi h (compi g f) ≈i compi (compi h g) f
sym-assoc-i {f = f} {g = g} {h = h} = ≈i-refl (compi h (compi g f))
identityˡ-i : {X Y : LabelSys ℓ} {g : Idx⇒ X Y}
→ compi (idxi Y) g ≈i g
identityˡ-i {g = g} = ≈i-refl g
identityʳ-i : {X Y : LabelSys ℓ} {g : Idx⇒ X Y}
→ compi g (idxi X) ≈i g
identityʳ-i {g = g} = ≈i-refl g
identity²-i : {X : LabelSys ℓ} → compi (idxi X) (idxi X) ≈i idxi X
identity²-i {X = X} = ≈i-refl (idxi X)
SameIndexCat : Category (lsuc ℓ) ℓ ℓ
SameIndexCat = record
{ Obj = LabelSys ℓ
; _⇒_ = Idx⇒
; _≈_ = λ {X} {Y} → _≈i_ {X} {Y}
; id = λ {X} → idxi X
; _∘_ = λ {X} {Y} {Z} g f → compi {X} {Y} {Z} g f
; equiv = λ {X} {Y} → ≈i-isEquivalence {X} {Y}
; ∘-resp-≈ = λ {X} {Y} {Z} {f} {h} {g} {k} fh gk →
∘-resp-≈i {X} {Y} {Z}
{F₁ = g} {F₂ = k}
{G₁ = f} {G₂ = h} gk fh
; assoc = λ {W} {X} {Y} {Z} {f} {g} {h} →
assoc-i {A = W} {B = X} {C = Y} {D = Z}
{f = f} {g = g} {h = h}
; sym-assoc = λ {W} {X} {Y} {Z} {f} {g} {h} →
sym-assoc-i {A = W} {B = X} {C = Y} {D = Z}
{f = f} {g = g} {h = h}
; identityˡ = λ {X} {Y} {f} → identityˡ-i {X} {Y} {g = f}
; identityʳ = λ {X} {Y} {f} → identityʳ-i {X} {Y} {g = f}
; identity² = λ {X} → identity²-i {X = X}
}