{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.Carried.ChainColimitPropS where
open import Agda.Primitive using (Level; lzero; lsuc)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Relation.Binary.PropositionalEquality.Core using (sym; trans; cong)
open import Data.Nat.Base using (ℕ; zero; suc; _+_)
open import Data.Nat.Properties using (+-comm)
open import ALMA.Base.MCorr using (M)
open import ALMA.Base.MCorrSetoid using (SysEq; EqOn; propEqOn; _≈Mˢ_)
open SysEq
open import ALMA.Cosmos.Carried.SameIndexCatS using
(LabelSys; dsys; Idx⇒; idxi; compi; _≈i_; SameIndexCat; ≈i-refl; ≈i-sym
; ≈i-trans; ∘-resp-≈i; pointwise-i)
open import Categories.Category.Core using (Category)
open import Categories.Functor using (Functor)
open import ALMA.Cosmos.Carried.SeqColimitCat using (Chain⇒; stop; step; ωCat; _∘ch_)
import ALMA.Cosmos.Carried.SeqColimitCat as SQC
module _ (d : ℕ → ℕ) {ℓ : Level} where
record ChainProp : Set (lsuc ℓ) where
field
L₀ : (m v : ℕ) → Set ℓ
emb : (m v : ℕ) → L₀ m v → L₀ (suc m) v
module Build (C : ChainProp) where
open ChainProp C
private
s = d
stageLS : ℕ → LabelSys ℓ
stageLS m = record { A₀ = L₀ m ; ≈A₀ = λ v → propEqOn (L₀ m v) }
embIdx : (m : ℕ) → Idx⇒ s (stageLS m) (stageLS (suc m))
embIdx m = record
{ shape = λ v a → emb m v a
; shape-cong = λ {v} e → cong (emb m v) e
}
record Thread (v : ℕ) : Set ℓ where
inductive
constructor mk
field
stage : ℕ
tlabel : L₀ stage v
open Thread public
extend : {v : ℕ} → Thread v → Thread v
extend {v} (mk m a) = mk (suc m) (emb m v a)
extend^ : {v : ℕ} → ℕ → Thread v → Thread v
extend^ zero t = t
extend^ (suc n) t = extend (extend^ n t)
record _≈Thread_ {v : ℕ} (t u : Thread v) : Set ℓ where
field
dl : ℕ
dr : ℕ
same : extend^ dl t ≡ extend^ dr u
open _≈Thread_
extend^-comp : {v : ℕ} (a b : ℕ) (t : Thread v)
→ extend^ a (extend^ b t) ≡ extend^ (a + b) t
extend^-comp zero b t = refl
extend^-comp (suc a) b t = cong extend (extend^-comp a b t)
iter-add-comm : {v : ℕ} (a b : ℕ) (t : Thread v)
→ extend^ (a + b) t ≡ extend^ (b + a) t
iter-add-comm a b t rewrite +-comm a b = refl
≈Thread-refl : {v : ℕ} {t : Thread v} → t ≈Thread t
≈Thread-refl = record { dl = zero ; dr = zero ; same = refl }
≈Thread-sym : {v : ℕ} {t u : Thread v} → t ≈Thread u → u ≈Thread t
≈Thread-sym p = record { dl = dr p ; dr = dl p ; same = sym (same p) }
≈Thread-trans : {v : ℕ} {t u w : Thread v}
→ t ≈Thread u → u ≈Thread w → t ≈Thread w
≈Thread-trans {u = u} p q = record
{ dl = c + a
; dr = b + r
; same =
trans (sym (extend^-comp c a _))
(trans (cong (extend^ c) (same p))
(trans (extend^-comp c b u)
(trans (iter-add-comm c b u)
(trans (sym (extend^-comp b c u))
(trans (cong (extend^ b) (same q))
(extend^-comp b r _))))))
}
where
a = dl p ; b = dr p ; c = dl q ; r = dr q
≈A∞ : (v : ℕ) → EqOn (Thread v)
≈A∞ v = record
{ _≈_ = _≈Thread_
; isEquivalence = record
{ refl = ≈Thread-refl
; sym = ≈Thread-sym
; trans = ≈Thread-trans
}
}
apexLS : LabelSys ℓ
apexLS = record { A₀ = Thread ; ≈A₀ = ≈A∞ }
legIdx : (m : ℕ) → Idx⇒ s (stageLS m) apexLS
legIdx m = record
{ shape = λ v a → mk m a
; shape-cong = λ {v} {a} {a'} e →
record { dl = zero ; dr = zero
; same = cong (λ x → mk m x) e }
}
private
cat : Category (lsuc ℓ) ℓ ℓ
cat = SameIndexCat s {ℓ = ℓ}
reflc : {X Y : LabelSys ℓ} {f : Idx⇒ s X Y} → _≈i_ s f f
reflc {f = f} = ≈i-refl s {ℓ = ℓ} f
symc : {X Y : LabelSys ℓ} {f g : Idx⇒ s X Y}
→ _≈i_ s f g → _≈i_ s g f
symc {f = f} {g = g} p = ≈i-sym s {ℓ = ℓ} {f = f} {g = g} p
transc : {X Y : LabelSys ℓ} {f g h : Idx⇒ s X Y}
→ _≈i_ s f g → _≈i_ s g h → _≈i_ s f h
transc {f = f} {g = g} {h = h} p q =
≈i-trans s {ℓ = ℓ} {f = f} {g = g} {h = h} p q
respc : {X Y Z : LabelSys ℓ}
{F₁ F₂ : Idx⇒ s X Y} {G₁ G₂ : Idx⇒ s Y Z}
→ _≈i_ s F₁ F₂ → _≈i_ s G₁ G₂
→ _≈i_ s (compi s G₁ F₁) (compi s G₂ F₂)
respc {X = X} {Y = Y} {Z = Z}
{F₁ = F₁} {F₂ = F₂} {G₁ = G₁} {G₂ = G₂} p q =
∘-resp-≈i s {ℓ = ℓ} {X = X} {Y = Y} {Z = Z}
{F₁ = F₁} {F₂ = F₂} {G₁ = G₁} {G₂ = G₂} p q
fold-emb : {m n : ℕ} → Chain⇒ m n
→ Idx⇒ s (stageLS m) (stageLS n)
fold-emb SQC.stop = idxi s (stageLS _)
fold-emb (SQC.step {n = n} p) = compi s (embIdx n) (fold-emb p)
fold-hom : {m y n : ℕ} (g : Chain⇒ y n) (f : Chain⇒ m y)
→ _≈i_ s (fold-emb (g ∘ch f))
(compi s (fold-emb g) (fold-emb f))
fold-hom {m} {y} {.y} SQC.stop f =
symc {X = stageLS m} {Y = stageLS y}
{f = compi s (idxi s (stageLS y)) (fold-emb f)}
{g = fold-emb f}
(reflc {f = compi s (idxi s (stageLS y)) (fold-emb f)})
fold-hom {m} {y} {.(suc t)} (SQC.step {n = t} g) f =
transc {X = stageLS m} {Y = stageLS (suc t)}
{f = compi s (embIdx t) (fold-emb (g ∘ch f))}
{g = compi s (embIdx t) (compi s (fold-emb g) (fold-emb f))}
{h = compi s (compi s (embIdx t) (fold-emb g)) (fold-emb f)}
(respc {X = stageLS m} {Y = stageLS t} {Z = stageLS (suc t)}
{F₁ = fold-emb (g ∘ch f)}
{F₂ = compi s (fold-emb g) (fold-emb f)}
{G₁ = embIdx t} {G₂ = embIdx t}
(fold-hom g f) (reflc {f = embIdx t}))
(reflc {f = compi s (embIdx t)
(compi s (fold-emb g) (fold-emb f))})
fold-resp-i : {m n : ℕ} {p q : Chain⇒ m n} → p ≡ q
→ _≈i_ s (fold-emb p) (fold-emb q)
fold-resp-i {p = p} refl = reflc {f = fold-emb p}
chainFun : Functor ωCat cat
chainFun = record
{ F₀ = stageLS
; F₁ = fold-emb
; identity = λ {m} → reflc {f = fold-emb {m = m} SQC.stop}
; homomorphism = λ {m y n f g} → fold-hom g f
; F-resp-≈ = λ {m n p q} eq → fold-resp-i {p = p} {q = q} eq
}
open import Categories.Diagram.Cocone chainFun
one-ray : (m v : ℕ) (a : L₀ m v)
→ mk (suc m) (emb m v a) ≈Thread mk m a
one-ray m v a = record { dl = 0 ; dr = 1 ; same = refl }
one-coh-i : (m : ℕ)
→ _≈i_ s (compi s (legIdx (suc m)) (embIdx m)) (legIdx m)
one-coh-i m =
pointwise-i s
(compi s (legIdx (suc m)) (embIdx m)) (legIdx m)
(λ v a → one-ray m v a)
leg-path : {m n : ℕ} (p : Chain⇒ m n)
→ _≈i_ s (compi s (legIdx n) (fold-emb p)) (legIdx m)
leg-path {m} {.m} SQC.stop =
reflc {f = compi s (legIdx m) (idxi s (stageLS m))}
leg-path {m} {.(suc t)} (SQC.step {n = t} p) =
transc {X = stageLS m} {Y = apexLS}
{f = compi s (legIdx (suc t))
(compi s (embIdx t) (fold-emb p))}
{g = compi s (compi s (legIdx (suc t)) (embIdx t)) (fold-emb p)}
{h = legIdx m}
(reflc {f = compi s (legIdx (suc t))
(compi s (embIdx t) (fold-emb p))})
(transc {X = stageLS m} {Y = apexLS}
{f = compi s (compi s (legIdx (suc t)) (embIdx t)) (fold-emb p)}
{g = compi s (legIdx t) (fold-emb p)}
{h = legIdx m}
(respc {X = stageLS m} {Y = stageLS t} {Z = apexLS}
{F₁ = fold-emb p} {F₂ = fold-emb p}
{G₁ = compi s (legIdx (suc t)) (embIdx t)} {G₂ = legIdx t}
(reflc {f = fold-emb p}) (one-coh-i t))
(leg-path p))
nCocone : Cocone
nCocone = record
{ coapex = record { ψ = legIdx ; commute = λ {m n} p → leg-path p } }
record PFCocone (Z : LabelSys ℓ) : Set (lsuc ℓ) where
field
ψc : (m : ℕ) → Idx⇒ s (stageLS m) Z
coh : (m v : ℕ) (a : L₀ m v)
→ EqOn._≈_ (LabelSys.≈A₀ Z v)
(Idx⇒.shape (ψc (suc m)) v (emb m v a))
(Idx⇒.shape (ψc m) v a)
open PFCocone
module _ {Z : LabelSys ℓ} (K : PFCocone Z) where
private ≈Z = LabelSys.≈A₀ Z
eval-ray : {v : ℕ} → Thread v → LabelSys.A₀ Z v
eval-ray (mk m a) = Idx⇒.shape (ψc K m) _ a
eval-ext : {v : ℕ} (τ : Thread v)
→ EqOn._≈_ (≈Z v) (eval-ray (extend τ)) (eval-ray τ)
eval-ext (mk m a) = coh K m _ a
eval-ext^ : (k : ℕ) {v : ℕ} (τ : Thread v)
→ EqOn._≈_ (≈Z v) (eval-ray (extend^ k τ)) (eval-ray τ)
eval-ext^ zero τ = EqOn.refl (≈Z _)
eval-ext^ (suc k) τ =
EqOn.trans (≈Z _) (eval-ext (extend^ k τ)) (eval-ext^ k τ)
med-shape-cong : {v : ℕ} {τ τ' : Thread v}
→ τ ≈Thread τ'
→ EqOn._≈_ (≈Z v) (eval-ray τ) (eval-ray τ')
med-shape-cong {v = v} r =
EqOn.trans (≈Z v)
(EqOn.sym (≈Z v) (eval-ext^ (dl r) _))
(EqOn.trans (≈Z v)
(EqOn.reflexive (≈Z v) (cong eval-ray (same r)))
(eval-ext^ (dr r) _))
mediate : Idx⇒ s apexLS Z
mediate = record
{ shape = λ v τ → eval-ray τ
; shape-cong = med-shape-cong
}
triangle : (m v : ℕ) (a : L₀ m v)
→ EqOn._≈_ (≈Z v)
(Idx⇒.shape (ψc K m) v a)
(Idx⇒.shape (ψc K m) v a)
triangle m v a = EqOn.refl (≈Z v)
unique : (h : Idx⇒ s apexLS Z)
→ ((m v : ℕ) (a : L₀ m v)
→ EqOn._≈_ (≈Z v)
(Idx⇒.shape h v (mk m a))
(Idx⇒.shape (ψc K m) v a))
→ (v : ℕ) (τ : Thread v)
→ EqOn._≈_ (≈Z v)
(Idx⇒.shape h v τ) (eval-ray τ)
unique h ht v (mk m a) = ht m v a
module StandardColimit where
private
succ-arrow : ∀ {m} → Chain⇒ m (suc m)
succ-arrow = SQC.step SQC.stop
module _ (K : Cocone)
(tree : (m v : ℕ) (a : L₀ m v)
→ M (A (dsys s (stageLS m)))
(E (dsys s (stageLS m))) v)
(tree-here : (m v : ℕ) (a : L₀ m v)
→ M.here (tree m v a) ≡ a)
where
private
Zk = Cocone.N K
ψk = Cocone.ψ K
relocate : (m v : ℕ)
(F G : Idx⇒ s (stageLS m) Zk)
(a : L₀ m v)
→ EqOn._≈_ (LabelSys.≈A₀ Zk v)
(Idx⇒.shape F v (M.here (tree m v a)))
(Idx⇒.shape G v (M.here (tree m v a)))
→ EqOn._≈_ (LabelSys.≈A₀ Zk v)
(Idx⇒.shape F v a)
(Idx⇒.shape G v a)
relocate m v F G a h0 =
EqOn.trans (LabelSys.≈A₀ Zk v)
(EqOn.sym (LabelSys.≈A₀ Zk v)
(Idx⇒.shape-cong F (tree-here m v a)))
(EqOn.trans (LabelSys.≈A₀ Zk v)
h0
(Idx⇒.shape-cong G (tree-here m v a)))
kcoh : (m v : ℕ) (a : L₀ m v)
→ EqOn._≈_ (LabelSys.≈A₀ Zk v)
(Idx⇒.shape (ψk (suc m)) v (emb m v a))
(Idx⇒.shape (ψk m) v a)
kcoh m v a =
relocate m v
(compi s (ψk (suc m)) (embIdx m)) (ψk m) a
(_≈Mˢ_.here-eq
(Cocone.commute K {X = m} {Y = suc m} succ-arrow
v (tree m v a)))
Kpf : PFCocone Zk
Kpf = record { ψc = ψk ; coh = kcoh }
mediate-i : Idx⇒ s apexLS Zk
mediate-i = mediate Kpf
!K : Cocone⇒ nCocone K
!K = record
{ arr = mediate-i
; commute = λ {m} →
pointwise-i s
(compi s mediate-i (legIdx m)) (ψk m)
(triangle Kpf m)
}
!K-unique : (h : Cocone⇒ nCocone K)
→ _≈i_ s (Cocone⇒.arr h) mediate-i
!K-unique h =
pointwise-i s (Cocone⇒.arr h) mediate-i
(unique Kpf (Cocone⇒.arr h)
(λ m v a →
relocate m v
(compi s (Cocone⇒.arr h) (legIdx m)) (ψk m) a
(_≈Mˢ_.here-eq
(Cocone⇒.commute h {X = m} v (tree m v a)))))