{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.Carried.NontrivialPullTowerS 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.Nat.Base using (ℕ; zero; suc)
open import Data.Unit.Polymorphic.Base using (⊤; tt)
open import Data.Empty.Polymorphic using (⊥; ⊥-elim)
import Data.Empty
open import Relation.Nullary.Negation using (¬_)
open import Relation.Binary.PropositionalEquality.Core using (cong; sym; trans; _≢_)
open import Relation.Binary.Structures using (IsEquivalence)
open import Categories.Category.Core using (Category)
open import Categories.Functor using (Functor)
open import ALMA.Base.MCorr using (M)
open import ALMA.Base.MCorrSetoid using (SysEq; EqOn; propEqOn; idAdjˢ; _≈Mˢ_)
open import ALMA.Base.MCorrSetoidCat using (FMapˢ; FMˢ)
open import ALMA.Cosmos.Carried.SameIndexCatS using
(LabelSys; dsys; Idx⇒; idxi; compi; _≈i_; SameIndexCat
; ≈i-refl; ≈i-sym; ≈i-trans; ∘-resp-≈i)
open import ALMA.Cosmos.Carried.SeqColimitCat using (Chain⇒; stop; step; ωCat)
import ALMA.Cosmos.Carried.SeqColimitCat as SQC
open SysEq
record LabeledInverseTower (ℓ : Level) : Set (lsuc ℓ) where
field
d : ℕ → ℕ
L : (m v : ℕ) → Set ℓ
l-emb : (m v : ℕ) → L m v → L (suc m) v
l-proj : (m v : ℕ) → L (suc m) v → L m v
proj-emb : (m v : ℕ) (a : L m v) → l-proj m v (l-emb m v a) ≡ a
module PullTower {ℓ : Level} (T : LabeledInverseTower ℓ) where
open LabeledInverseTower T
private
s = d
sYS = dsys s
stageLS : ℕ → LabelSys ℓ
stageLS m = record
{ A₀ = L m
; ≈A₀ = λ v → propEqOn (L m v)
}
module _ (X : LabelSys ℓ) (Q : ℕ → Set ℓ) where
private
YQ : LabelSys ℓ
YQ = record { A₀ = Q ; ≈A₀ = λ v → propEqOn (Q v) }
sx = sYS X
sy = sYS YQ
edgeEQ : (v w : ℕ) → Set lzero
edgeEQ v w = Σ (⊤ {lzero}) λ _ → w ≡ s v
fmap : ((v : ℕ) → LabelSys.A₀ X v → Q v) → FMapˢ sx sy
fmap sh = record
{ u = λ z → z
; shape = sh
; childF = λ z _ w → w , refl
; adjFˢ = λ z _ w → idAdjˢ (propEqOn (edgeEQ z w))
}
img : ((v : ℕ) → LabelSys.A₀ X v → Q v)
→ (v : ℕ) → M (A sx) (E sx) v → M (A sy) (E sy) v
img sh v t = FMapˢ.mapFˢ (fmap sh) v t
pointwise→≈i
: (shf shg : (v : ℕ) → LabelSys.A₀ X v → Q v)
→ ((v : ℕ) (a : LabelSys.A₀ X v) → shf v a ≡ shg v a)
→ (v : ℕ) (t : M (A sx) (E sx) v)
→ _≈Mˢ_ (≈A sy) (≈E sy) (img shf v t) (img shg v t)
pointwise→≈i shf shg eq v t = go v t
where
edgeAdj : (v w : ℕ) → _
edgeAdj v w = idAdjˢ (propEqOn (edgeEQ v w))
mutual
go : (v : ℕ) (u : M (A sx) (E sx) v)
→ _≈Mˢ_ (≈A sy) (≈E sy) (img shf v u) (img shg 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 sx) (E sx) v)
→ _≈Mˢ_ (≈A sy) (≈E sy) (img shg v u) (img shf v u)
go˘ v u ._≈Mˢ_.here-eq = EqOn.sym (≈A sy 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)) )
pointwise-i : {X Y : LabelSys ℓ} (f g : Idx⇒ s X Y)
→ (∀ (v : ℕ) (a : LabelSys.A₀ X v)
→ EqOn._≈_ (LabelSys.≈A₀ Y v)
(Idx⇒.shape f v a) (Idx⇒.shape g v a))
→ _≈i_ s f g
pointwise-i {X = X} {Y = Y} f g eq v t = go v t
where
sx = sYS X
sy = sYS Y
edgeAdj : (v w : ℕ) → _
edgeAdj v w =
idAdjˢ (propEqOn (Σ (⊤ {lzero}) λ _ → w ≡ s v))
mutual
go : (v : ℕ) (u : M (A sx) (E sx) v)
→ _≈Mˢ_ (≈A sy) (≈E sy)
(FMapˢ.mapFˢ (FMˢ.mor (Idx⇒.mor f)) v u)
(FMapˢ.mapFˢ (FMˢ.mor (Idx⇒.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 sx) (E sx) v)
→ _≈Mˢ_ (≈A sy) (≈E sy)
(FMapˢ.mapFˢ (FMˢ.mor (Idx⇒.mor g)) v u)
(FMapˢ.mapFˢ (FMˢ.mor (Idx⇒.mor f)) v u)
go˘ v u ._≈Mˢ_.here-eq =
EqOn.sym (≈A sy 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)) )
embIdx : (m : ℕ) → Idx⇒ s (stageLS m) (stageLS (suc m))
embIdx m = record
{ shape = λ v a → l-emb m v a
; shape-cong = λ e → cong (l-emb m _) e
}
resIdx : (m : ℕ) → Idx⇒ s (stageLS (suc m)) (stageLS m)
resIdx m = record
{ shape = λ v b → l-proj m v b
; shape-cong = λ e → cong (l-proj m _) e
}
res-emb : (m : ℕ)
→ _≈i_ s (compi s (resIdx m) (embIdx m)) (idxi s (stageLS m))
res-emb m =
pointwise→≈i (stageLS m) (L m)
(λ v a → l-proj m v (l-emb m v a))
(λ v a → a)
(λ v a → proj-emb m v a)
record LimLabel (v : ℕ) : Set ℓ where
field
at : (m : ℕ) → L m v
coh : (m : ℕ) → l-proj m v (at (suc m)) ≡ at m
open LimLabel
apex≈ : (v : ℕ) → EqOn (LimLabel v)
apex≈ v = record
{ _≈_ = λ a b → (m : ℕ) → at a m ≡ at b m
; isEquivalence = record
{ refl = λ m → refl
; sym = λ h m → sym (h m)
; trans = λ h k m → trans (h m) (k m)
}
}
apexLS : LabelSys ℓ
apexLS = record
{ A₀ = LimLabel
; ≈A₀ = apex≈
}
projLeg : (m : ℕ) → Idx⇒ s apexLS (stageLS m)
projLeg m = record
{ shape = λ v a → at a m
; shape-cong = λ h → h m
}
cone-coh : (m : ℕ)
→ _≈i_ s (compi s (resIdx m) (projLeg (suc m))) (projLeg m)
cone-coh m =
pointwise→≈i apexLS (L m)
(λ v a → l-proj m v (at a (suc m)))
(λ v a → at a m)
(λ v a → coh a m)
private
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 {F₁ = F₁} {F₂ = F₂} {G₁ = G₁} {G₂ = G₂} p q =
∘-resp-≈i s {ℓ = ℓ} {F₁ = F₁} {F₂ = F₂} {G₁ = G₁} {G₂ = G₂} p q
fold-res : {n m : ℕ} → Chain⇒ n m → Idx⇒ s (stageLS m) (stageLS n)
fold-res stop = idxi s (stageLS _)
fold-res (step {n = k} p) = compi s (fold-res p) (resIdx k)
fold-res-comp : {x y z : ℕ} (f : Chain⇒ y x) (g : Chain⇒ z y)
→ _≈i_ s (fold-res (f SQC.∘ch g))
(compi s (fold-res g) (fold-res f))
fold-res-comp {y = y} {z = z} f g = go f
where
go : ∀ {k : ℕ} (p : Chain⇒ y k)
→ _≈i_ s (fold-res (p SQC.∘ch g))
(compi s (fold-res g) (fold-res p))
go stop =
reflc {X = stageLS y} {Y = stageLS z} {f = fold-res g}
go (step {n = k} p) =
transc {X = stageLS (suc k)} {Y = stageLS z}
{f = compi s (fold-res (p SQC.∘ch g)) (resIdx k)}
{g = compi s (compi s (fold-res g) (fold-res p)) (resIdx k)}
{h = compi s (fold-res g) (compi s (fold-res p) (resIdx k))}
(respc {X = stageLS (suc k)} {Y = stageLS k} {Z = stageLS z}
{F₁ = resIdx k} {F₂ = resIdx k}
{G₁ = fold-res (p SQC.∘ch g)}
{G₂ = compi s (fold-res g) (fold-res p)}
(reflc {X = stageLS (suc k)} {Y = stageLS k}
{f = resIdx k})
(go p))
(reflc {X = stageLS (suc k)} {Y = stageLS z}
{f = compi s (fold-res g)
(compi s (fold-res p) (resIdx k))})
private
ωOp : Category lzero lzero lzero
ωOp = Category.op ωCat
subst-resp : ∀ {n m} {p q : Chain⇒ n m} → p ≡ q
→ _≈i_ s (fold-res p) (fold-res q)
subst-resp {n = n} {m = m} {p = p} refl =
reflc {X = stageLS m} {Y = stageLS n} {f = fold-res p}
cochainFun : Functor ωOp cat
cochainFun = record
{ F₀ = stageLS
; F₁ = λ {A} {B} p → fold-res p
; identity = reflc {f = idxi s (stageLS _)}
; homomorphism = λ {X} {Y} {Z} {f} {g} → fold-res-comp f g
; F-resp-≈ = λ {_ _ p q} eq → subst-resp {p = p} {q = q} eq
}
projPath : {n m : ℕ} (p : Chain⇒ n m)
→ _≈i_ s (compi s (fold-res p) (projLeg m)) (projLeg n)
projPath {n = n} stop =
reflc {X = apexLS} {Y = stageLS n}
{f = compi s (idxi s (stageLS n)) (projLeg n)}
projPath {n = n} (step {n = k} p) =
transc {X = apexLS} {Y = stageLS n}
{f = compi s (compi s (fold-res p) (resIdx k)) (projLeg (suc k))}
{g = compi s (fold-res p) (projLeg k)}
{h = projLeg n}
(respc {X = apexLS} {Y = stageLS k} {Z = stageLS n}
{F₁ = compi s (resIdx k) (projLeg (suc k))}
{F₂ = projLeg k}
{G₁ = fold-res p} {G₂ = fold-res p}
(cone-coh k)
(reflc {X = stageLS k} {Y = stageLS n} {f = fold-res p}))
(projPath p)
open import Categories.Diagram.Cone cochainFun
nCone : Cone
nCone = record
{ apex = record
{ ψ = projLeg
; commute = λ {X} {Y} f → projPath f
}
}
module PLimit where
record PCone (N : LabelSys ℓ) : Set (lsuc ℓ) where
field
ψ : (m : ℕ) → Idx⇒ s N (stageLS m)
coh : (m : ℕ) (v : ℕ) (a : LabelSys.A₀ N v)
→ l-proj m v (Idx⇒.shape (ψ (suc m)) v a)
≡ Idx⇒.shape (ψ m) v a
open PCone public
_≈h_ : {X Y : LabelSys ℓ} (f g : Idx⇒ s X Y) → Set ℓ
_≈h_ {X = X} f g =
(v : ℕ) (a : LabelSys.A₀ X v)
→ Idx⇒.shape f v a ≡ Idx⇒.shape g v a
nPCone : PCone apexLS
nPCone = record
{ ψ = projLeg
; coh = λ m v a → coh a m
}
mediate : {N : LabelSys ℓ} (K : PCone N) → Idx⇒ s N apexLS
mediate K = record
{ shape = λ v a → record
{ at = λ m → Idx⇒.shape (ψ K m) v a
; coh = λ m → coh K m v a
}
; shape-cong = λ {v} {a} {b} e m →
Idx⇒.shape-cong (ψ K m) e
}
triangle : {N : LabelSys ℓ} (K : PCone N) (m : ℕ)
→ _≈h_ (compi s (projLeg m) (mediate K)) (ψ K m)
triangle K m v a = refl
unique : {N : LabelSys ℓ} (h : Idx⇒ s N apexLS) (K : PCone N)
→ ((m : ℕ) → _≈h_ (compi s (projLeg m) h) (ψ K m))
→ (v : ℕ) (a : LabelSys.A₀ N v)
→ EqOn._≈_ (LabelSys.≈A₀ apexLS v)
(Idx⇒.shape h v a)
(Idx⇒.shape (mediate K) v a)
unique h K ht v a m = ht m v a
cone-thread : {N : LabelSys ℓ} (K : PCone N) (v : ℕ)
(a : LabelSys.A₀ N v) → LimLabel v
cone-thread K v a = Idx⇒.shape (mediate K) v a
module NoThreadObstruction
(b : (m : ℕ) → L m 0)
(d0≢0 : s 0 ≢ 0)
(no-thread : ¬ LimLabel 0)
where
deadA : ℕ → Set ℓ
deadA zero = ⊤ {ℓ}
deadA (suc _) = ⊥ {ℓ}
Ndead : LabelSys ℓ
Ndead = record
{ A₀ = deadA
; ≈A₀ = λ w → propEqOn (deadA w)
}
private sysN = sYS Ndead
noA0 : (w : ℕ) → w ≢ 0 → deadA w → ⊥ {ℓ}
noA0 zero ne tt = Data.Empty.⊥-elim (ne refl)
noA0 (suc _) _ ()
no-tree : (w : ℕ) → M (A sysN) (E sysN) w → ⊥ {ℓ}
no-tree zero t =
noA0 (s 0) d0≢0 (M.here (M.below t (s 0) (tt , refl)))
no-tree (suc _) t = ⊥-elim (M.here t)
legShape : (m w : ℕ) → deadA w → L m w
legShape m zero tt = b m
legShape m (suc _) ()
legCong : (m : ℕ) {w : ℕ} {a a' : deadA w}
→ a ≡ a' → legShape m w a ≡ legShape m w a'
legCong m {zero} {tt} {tt} refl = refl
legCong m {suc _} {()}
ψK : (m : ℕ) → Idx⇒ s Ndead (stageLS m)
ψK m = record { shape = legShape m ; shape-cong = legCong m }
vacuous-i : {Y : LabelSys ℓ} (f g : Idx⇒ s Ndead Y) → _≈i_ s f g
vacuous-i f g w t with no-tree w t
... | ()
deadCone : Cone
deadCone = record
{ apex = record
{ ψ = ψK
; commute = λ {X} {Y} f →
vacuous-i (compi s (fold-res f) (ψK X)) (ψK Y)
}
}
no-mediate : Cone⇒ deadCone nCone → ⊥ {ℓ}
no-mediate mk =
Data.Empty.⊥-elim
(no-thread (Idx⇒.shape (Cone⇒.arr mk) 0 tt))
module StandardLimit where
open PLimit
private res-arrow : ∀ {m} → SQC.Chain⇒ m (suc m)
res-arrow = SQC.step SQC.stop
module _ (K : Cone)
(tree : (v : ℕ) (a : LabelSys.A₀ (Cone.N K) v)
→ M (A (sYS (Cone.N K))) (E (sYS (Cone.N K))) v)
(tree-here : (v : ℕ) (a : LabelSys.A₀ (Cone.N K) v)
→ M.here (tree v a) ≡ a)
where
private Nk = Cone.N K
ψk = Cone.ψ K
private
relocate : {Q : Set ℓ} (v : ℕ)
(f g : LabelSys.A₀ Nk v → Q)
(a : LabelSys.A₀ Nk v)
→ f (M.here (tree v a)) ≡ g (M.here (tree v a))
→ f a ≡ g a
relocate v f g a h0 =
trans (cong f (sym (tree-here v a)))
(trans h0 (cong g (tree-here v a)))
kcoh : (m : ℕ) (v : ℕ) (a : LabelSys.A₀ Nk v)
→ l-proj m v (Idx⇒.shape (ψk (suc m)) v a)
≡ Idx⇒.shape (ψk m) v a
kcoh m v a =
relocate v
(λ x → l-proj m v (Idx⇒.shape (ψk (suc m)) v x))
(Idx⇒.shape (ψk m) v) a
(_≈Mˢ_.here-eq
(Cone.commute K {X = suc m} {Y = m} res-arrow
v (tree v a)))
Kpc : PCone Nk
Kpc = record { ψ = ψk ; coh = kcoh }
mediate-i : Idx⇒ s Nk apexLS
mediate-i = mediate Kpc
!K : Cone⇒ K nCone
!K = record
{ arr = mediate-i
; commute = λ {X} →
pointwise-i (compi s (projLeg X) mediate-i) (ψk X)
(triangle Kpc X)
}
!K-unique : (h : Cone⇒ K nCone)
→ _≈i_ s (Cone⇒.arr h) mediate-i
!K-unique h =
pointwise-i (Cone⇒.arr h) mediate-i
(unique (Cone⇒.arr h) Kpc
(λ X v a →
relocate v
(Idx⇒.shape (compi s (projLeg X) (Cone⇒.arr h)) v)
(Idx⇒.shape (ψk X) v) a
(_≈Mˢ_.here-eq
(Cone⇒.commute h {X = X} v (tree v a)))))