{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.FinCatNColimitWithDep where
open import Agda.Primitive using (Level; Setω)
open import Agda.Builtin.Equality using (refl)
open import Agda.Builtin.Sigma using (Σ; _,_)
open import Relation.Nullary using (¬_)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Product.Base using (proj₁; proj₂)
open import ALMA.SecondPass.Unfolding using (Unfolding)
open import ALMA.SecondPass.Cosmos using (Cosmos; out)
open import ALMA.SecondPass.Terminal using (_≈C_; ≈C-refl; ≈C-sym; ≈C-trans)
open import ALMA.SecondPass.CumulativeHierarchy using (EmbeddingData; UniformEmbeddingFamily)
open import ALMA.SecondPass.StrictLift using (StrictLayer)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower; LimitLayer)
open import ALMA.SecondPass.FinCatNWitness
open import ALMA.SecondPass.FinCatNTowerLemmas
open import ALMA.SecondPass.FinCatNColimit
open import ALMA.SecondPass.DependentEmbedding using (DependentEmbeddingRule; dep-rule)
open DependentEmbeddingRule
module FinCatNColimitWithDep (m : ℕ) where
open FinCatN m
open FinCatNTowerLemmas m
open FinCatNColimit m
dep-embed-tower
: ∀ k (x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ EmbeddingData x
→ Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k)))
dep-embed-tower k =
EmbedDep dep-rule
(Tower.layer nTower k)
(λ {A} → pos-inhabited-tower k A)
(λ {A} → pos-singleton-tower k A)
(shape-singleton-at (suc k))
dep-embed-tower-≈-dep-embed
: ∀ k x ed → dep-embed-tower k x ed ≈C dep-embed k x ed
dep-embed-tower-≈-dep-embed k x ed ._≈C_.unfoldFunctor₀-eq {A} s = refl
dep-embed-tower-≈-dep-embed k x ed ._≈C_.pos-to-shape-eq s p = refl
dep-embed-tower-≈-dep-embed k x ed ._≈C_.unfold-next-eq {A = A} s =
dep-embed-tower-≈-dep-embed k
(Unfolding.unfold-next (out x) {A = proj₁ A} (proj₂ A))
(EmbeddingData.next ed {A = proj₁ A} (proj₂ A))
record CoconeDep {oD hD eD sD pD : Level}
(unif : ∀ k → UniformEmbeddingFamily
{C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)})
(D : StrictLayer oD hD eD sD pD) : Setω where
field
map : ∀ k → Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
→ Cosmos (StrictLayer.C D) (StrictLayer.FC D)
map-resp : ∀ k {x y}
→ _≈C_ {C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)} x y
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D} (map k x) (map k y)
step-compat : ∀ k x
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(map (suc k)
(dep-embed-tower k x (UniformEmbeddingFamily.getData (unif k) x)))
(map k x)
open CoconeDep
module WithDepSurjectivity
(unif : ∀ k → UniformEmbeddingFamily
{C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)})
(surj : ∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
→ Σ (Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(λ y → x ≈C dep-embed-tower k y
(UniformEmbeddingFamily.getData (unif k) y)))
where
liftAt-step-tower
: ∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ dep-liftAt (suc k)
(dep-embed-tower k x
(UniformEmbeddingFamily.getData (unif k) x))
≈C dep-liftAt k x
liftAt-step-tower k x =
≈C-trans
(dep-liftAt-resp (suc k)
(dep-embed-tower-≈-dep-embed k x
(UniformEmbeddingFamily.getData (unif k) x)))
(dep-liftAt-step k x (UniformEmbeddingFamily.getData (unif k) x))
dep-mediate-coh
: ∀ {oD hD eD sD pD}
{D : StrictLayer oD hD eD sD pD}
(cone : CoconeDep unif D) (k : ℕ)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(map cone 0 (dep-liftAt k x))
(map cone k x)
dep-mediate-coh cone zero x = ≈C-refl
dep-mediate-coh cone (suc k) x =
let (y , p) = surj k x
q1 = map-resp cone 0 (dep-liftAt-resp (suc k) p)
q2 = map-resp cone 0 (liftAt-step-tower k y)
q3 = dep-mediate-coh cone k y
q4 = ≈C-trans (≈C-sym (step-compat cone k y))
(map-resp cone (suc k) (≈C-sym p))
in ≈C-trans q1 (≈C-trans q2 (≈C-trans q3 q4))
record UniversalLimitDep
(unif : ∀ k → UniformEmbeddingFamily
{C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)})
: Setω where
field
limit : LimitLayer nIdx nTower
liftAt : ∀ k
→ Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
→ Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit))
liftAt-resp : ∀ k {x y}
→ _≈C_ {C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)} x y
→ _≈C_ {C = StrictLayer.C (LimitLayer.layer∞ limit)}
{FC = StrictLayer.FC (LimitLayer.layer∞ limit)}
(liftAt k x) (liftAt k y)
liftAt-step : ∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ _≈C_ {C = StrictLayer.C (LimitLayer.layer∞ limit)}
{FC = StrictLayer.FC (LimitLayer.layer∞ limit)}
(liftAt (suc k)
(dep-embed-tower k x
(UniformEmbeddingFamily.getData (unif k) x)))
(liftAt k x)
mediate : ∀ {oD hD eD sD pD : Level}
→ (D : StrictLayer oD hD eD sD pD)
→ CoconeDep unif D
→ Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit))
→ Cosmos (StrictLayer.C D) (StrictLayer.FC D)
mediate-resp : ∀ {oD hD eD sD pD : Level}
→ {D : StrictLayer oD hD eD sD pD}
→ (cone : CoconeDep unif D)
→ {x y : Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit))}
→ _≈C_ {C = StrictLayer.C (LimitLayer.layer∞ limit)}
{FC = StrictLayer.FC (LimitLayer.layer∞ limit)} x y
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(mediate D cone x) (mediate D cone y)
mediate-coh : ∀ {oD hD eD sD pD : Level}
→ {D : StrictLayer oD hD eD sD pD}
→ (cone : CoconeDep unif D) (k : ℕ)
→ (x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(mediate D cone (liftAt k x))
(CoconeDep.map cone k x)
mediate-unique : ∀ {oD hD eD sD pD : Level}
→ {D : StrictLayer oD hD eD sD pD}
→ (cone : CoconeDep unif D)
→ (g : Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit))
→ Cosmos (StrictLayer.C D) (StrictLayer.FC D))
→ (g-resp : ∀ {x y : Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit))}
→ _≈C_ {C = StrictLayer.C (LimitLayer.layer∞ limit)}
{FC = StrictLayer.FC (LimitLayer.layer∞ limit)} x y
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(g x) (g y))
→ (g-coh : ∀ (k : ℕ)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(g (liftAt k x))
(CoconeDep.map cone k x))
→ ∀ (z : Cosmos (StrictLayer.C (LimitLayer.layer∞ limit))
(StrictLayer.FC (LimitLayer.layer∞ limit)))
→ _≈C_ {C = StrictLayer.C D} {FC = StrictLayer.FC D}
(g z) (mediate D cone z)
open UniversalLimitDep
UniformEmbeddingFamilyForTower : Setω
UniformEmbeddingFamilyForTower =
∀ k → UniformEmbeddingFamily
{C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)}
SurjectivityForTower : UniformEmbeddingFamilyForTower → Setω
SurjectivityForTower unif =
∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
→ Σ (Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(λ y → x ≈C dep-embed-tower k y
(UniformEmbeddingFamily.getData (unif k) y))
dependentUniversalLimitDep
: (unif : UniformEmbeddingFamilyForTower)
→ (surj : SurjectivityForTower unif)
→ UniversalLimitDep unif
dependentUniversalLimitDep unif surj = record
{ limit = colimitLayer
; liftAt = dep-liftAt
; liftAt-resp = λ k {x} {y} → dep-liftAt-resp k
; liftAt-step = λ k x →
WithDepSurjectivity.liftAt-step-tower unif surj k x
; mediate = λ D cone z → CoconeDep.map cone 0 z
; mediate-resp = λ {D} cone {x} {y} eq → CoconeDep.map-resp cone 0 eq
; mediate-coh = λ {D} cone k x →
WithDepSurjectivity.dep-mediate-coh unif surj cone k x
; mediate-unique = λ {D} cone g g-resp g-coh z → g-coh 0 z
}
record NontrivialLimitDep
{unif : UniformEmbeddingFamilyForTower}
(UL : UniversalLimitDep unif) : Setω where
field
k : ℕ
x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
y : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
x≉y : ¬ (_≈C_
{C = StrictLayer.C (LimitLayer.layer∞ (limit UL))}
{FC = StrictLayer.FC (LimitLayer.layer∞ (limit UL))}
(liftAt UL k x) (liftAt UL k y))
open NontrivialLimitDep
dependentNontrivialDep
: (unif : UniformEmbeddingFamilyForTower)
→ (surj : SurjectivityForTower unif)
→ NontrivialLimitDep (dependentUniversalLimitDep unif surj)
dependentNontrivialDep unif surj = record
{ k = 0
; x = cosmos-idN
; y = cosmos-const0N
; x≉y = cosmos-idN≉cosmos-const0N
}