{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.LayerZeroMediator where
open import Agda.Primitive using (lzero; Setω)
open import Agda.Builtin.Equality using (refl)
open import Level using (lift; lower)
open import Relation.Binary.PropositionalEquality.Core using (cong; sym)
open import Relation.Nullary using (¬_)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Unit.Polymorphic.Base using (tt)
open import Data.Product.Base using (_,_; proj₁; proj₂)
open import Data.Fin using (Fin) renaming (zero to fzero; suc to fsuc)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; PosOf)
open import ALMA.Cosmos.ContCatEquiv using (ShapeCat)
open import ALMA.SecondPass.Unfolding using (Unfolding)
open import ALMA.SecondPass.Cosmos using (Cosmos; out)
open import ALMA.SecondPass.Terminal using (_≈C_; ≈C-refl)
open import ALMA.SecondPass.CumulativeHierarchy using (EmbeddingData)
open import ALMA.SecondPass.StrictLift using (StrictLayer; strictStep-suc)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower; LimitLayer)
open import ALMA.SecondPass.FinCatNWitness
open import ALMA.SecondPass.FinCatNTowerLemmas
open StrictLayer
open EmbeddingData
open Unfolding
open Tower
open LimitLayer
open _≈C_
module LayerZeroMediator (m : ℕ) where
open FinCatN m
open FinCatNTowerLemmas m
pos-inhabited-trivial
: ∀ {A : Category.Obj (FinCatN)}
→ (s : ShapeOf TrivialFCN A) → PosOf TrivialFCN {A = A} s
pos-inhabited-trivial _ = lift tt
private
CL = C nLayer
FCL = FC nLayer
CL′ = C (strictStep-suc nLayer)
FCL′ = FC (strictStep-suc nLayer)
dependent-F₀
: (x : Cosmos CL FCL)
→ Category.Obj (ShapeCat CL′ FCL′) → Category.Obj CL′
dependent-F₀ x ((A , s) , _) =
( x .out .unfoldFunctor .Functor.F₀ (A , s)
, x .out .pos-to-shape {A = A} s (pos-inhabited-trivial {A = A} s) )
dependent-F₁
: (x : Cosmos CL FCL)
→ {u₀ u₁ : Category.Obj (ShapeCat CL′ FCL′)}
→ Category._⇒_ (ShapeCat CL′ FCL′) u₀ u₁
→ Category._⇒_ CL′ (dependent-F₀ x u₀) (dependent-F₀ x u₁)
dependent-F₁ x {u₀ = u₀} {u₁ = u₁} f =
( x .out .unfoldFunctor .Functor.F₁ {A = proj₁ u₀} {B = proj₁ u₁}
(proj₁ f)
, sym (x .out .pos-actS-compat
{A = proj₁ (proj₁ u₀)} {B = proj₁ (proj₁ u₁)}
{s = proj₂ (proj₁ u₀)} {t = proj₂ (proj₁ u₁)}
(proj₁ (proj₁ f)) (proj₂ (proj₁ f)) (lift tt)) )
dependent-unfoldFunctor
: (x : Cosmos CL FCL) → Functor (ShapeCat CL′ FCL′) CL′
dependent-unfoldFunctor x = record
{ F₀ = dependent-F₀ x
; F₁ = λ {A} {B} f → dependent-F₁ x {u₀ = A} {u₁ = B} f
; identity = λ {A} → x .out .unfoldFunctor .Functor.identity {A = proj₁ A}
; homomorphism = λ {X} {Y} {Z} {f} {g} →
x .out .unfoldFunctor .Functor.homomorphism
{X = proj₁ X} {Y = proj₁ Y} {Z = proj₁ Z}
{f = proj₁ f} {g = proj₁ g}
; F-resp-≈ = λ {A} {B} {f} {g} f≈g →
x .out .unfoldFunctor .Functor.F-resp-≈
{A = proj₁ A} {B = proj₁ B}
{f = proj₁ f} {g = proj₁ g} f≈g
}
strictEmbed-dependent
: (x : Cosmos CL FCL)
→ EmbeddingData x
→ Cosmos CL′ FCL′
strictEmbed-dependent x ed .out = record
{ unfoldFunctor = dependent-unfoldFunctor x
; unfold-next = λ { {A} u →
strictEmbed-dependent
(x .out .unfold-next {A = proj₁ A} (lower u))
(next ed {A = proj₁ A} (lower u)) }
; pos-to-shape = λ {A} _ _ →
lift (x .out .pos-to-shape {A = proj₁ A} (proj₂ A) (lift tt))
; pos-actS-compat = λ _ _ _ → refl
}
strictEmbed-dependent-id≉const0
: (ed-id : EmbeddingData cosmos-idN)
→ (ed-const0 : EmbeddingData cosmos-const0N)
→ ¬ (strictEmbed-dependent cosmos-idN ed-id
≈C strictEmbed-dependent cosmos-const0N ed-const0)
strictEmbed-dependent-id≉const0 ed-id ed-const0 eq =
fsuc-fzero≠fzero
(cong proj₁
(unfoldFunctor₀-eq eq
{A = (fsuc {n = suc m} (fzero {n = m}) , lift tt)}
(lift (lift tt))))
record LayerZeroCocone
(D : StrictLayer lzero lzero lzero lzero lzero) : Setω where
private
C0 = C (layer nTower 0)
FC0 = FC (layer nTower 0)
CD = C D
FCD = FC D
field
map : ∀ k → Cosmos (C (layer nTower k)) (FC (layer nTower k))
→ Cosmos CD FCD
map-resp : ∀ k {x y}
→ _≈C_ {C = C (layer nTower k)} {FC = FC (layer nTower k)} x y
→ _≈C_ {C = CD} {FC = FCD} (map k x) (map k y)
step-compat :
∀ (x : Cosmos C0 FC0) (ed : EmbeddingData x) →
_≈C_ {C = CD} {FC = FCD}
(map 1 (strictEmbed-dependent x ed))
(map 0 x)
record LayerZeroMediator : Setω where
field
liftAt : ∀ k
→ Cosmos (C (layer nTower k)) (FC (layer nTower k))
→ Cosmos FinCatN TrivialFCN
liftAt-resp : ∀ k {x y}
→ _≈C_ {C = C (layer nTower k)} {FC = FC (layer nTower k)} x y
→ _≈C_ {C = FinCatN} {FC = TrivialFCN} (liftAt k x) (liftAt k y)
liftAt-step :
∀ (x : Cosmos (C (layer nTower 0)) (FC (layer nTower 0)))
(ed : EmbeddingData x) →
_≈C_ {C = FinCatN} {FC = TrivialFCN}
(liftAt 1 (strictEmbed-dependent x ed))
(liftAt 0 x)
mediate : ∀ (D : StrictLayer lzero lzero lzero lzero lzero)
→ LayerZeroCocone D
→ Cosmos FinCatN TrivialFCN → Cosmos (C D) (FC D)
mediate-resp : ∀ {D} (cone : LayerZeroCocone D) {x y}
→ _≈C_ {C = FinCatN} {FC = TrivialFCN} x y
→ _≈C_ {C = C D} {FC = FC D} (mediate D cone x) (mediate D cone y)
mediate-coh : ∀ {D} (cone : LayerZeroCocone D)
→ (x : Cosmos (C (layer nTower 0)) (FC (layer nTower 0)))
→ _≈C_ {C = C D} {FC = FC D}
(mediate D cone (liftAt 0 x))
(LayerZeroCocone.map cone 0 x)
mediate-unique : ∀ {D} (cone : LayerZeroCocone D)
→ (g : Cosmos FinCatN TrivialFCN → Cosmos (C D) (FC D))
→ (∀ {x y} → _≈C_ {C = FinCatN} {FC = TrivialFCN} x y
→ _≈C_ {C = C D} {FC = FC D} (g x) (g y))
→ (∀ (x : Cosmos (C (layer nTower 0)) (FC (layer nTower 0))) →
_≈C_ {C = C D} {FC = FC D}
(g (liftAt 0 x)) (LayerZeroCocone.map cone 0 x))
→ ∀ z → _≈C_ {C = C D} {FC = FC D} (g z) (mediate D cone z)
liftAt-dependent : ∀ k
→ Cosmos (C (layer nTower k)) (FC (layer nTower k))
→ Cosmos FinCatN TrivialFCN
liftAt-dependent zero x = x
liftAt-dependent (suc k) x .out = record
{ unfoldFunctor = record
{ F₀ = λ { (A , _) →
proj-obj (suc k)
(Functor.F₀ (Unfolding.unfoldFunctor (x .out))
( embed-obj (suc k) A
, embed-shape (suc k) (embed-obj (suc k) A))) }
; F₁ = λ _ → tt
; identity = refl
; homomorphism = refl
; F-resp-≈ = λ _ → refl
}
; unfold-next = λ { {A} _ →
liftAt-dependent (suc k)
(Unfolding.unfold-next (x .out)
{A = embed-obj (suc k) A}
(embed-shape (suc k) (embed-obj (suc k) A))) }
; pos-to-shape = λ _ _ → lift tt
; pos-actS-compat = λ _ _ _ → refl
}
liftAt-step-dependent
: (x : Cosmos (C (layer nTower 0)) (FC (layer nTower 0)))
→ (ed : EmbeddingData x)
→ liftAt-dependent 1 (strictEmbed-dependent x ed)
≈C liftAt-dependent 0 x
liftAt-step-dependent x ed = bisim
where
bisim : _ ≈C _
bisim .unfoldFunctor₀-eq {A} s = refl
bisim .pos-to-shape-eq {A} s p = refl
bisim .unfold-next-eq {A} s =
liftAt-step-dependent
(Unfolding.unfold-next (x .out) {A = A} s)
(next ed {A = A} s)
liftAt-resp-dependent
: ∀ k {x y : Cosmos (C (layer nTower k)) (FC (layer nTower k))}
→ _≈C_ {C = C (layer nTower k)} {FC = FC (layer nTower k)} x y
→ _≈C_ {C = FinCatN} {FC = TrivialFCN}
(liftAt-dependent k x) (liftAt-dependent k y)
liftAt-resp-dependent zero eq = eq
liftAt-resp-dependent (suc k) eq = bisim
where
bisim : _ ≈C _
bisim .unfoldFunctor₀-eq {A} s =
cong (proj-obj (suc k))
(unfoldFunctor₀-eq eq
{A = embed-obj (suc k) A}
(embed-shape (suc k) (embed-obj (suc k) A)))
bisim .pos-to-shape-eq {A} s p = refl
bisim .unfold-next-eq {A} s =
liftAt-resp-dependent (suc k)
(unfold-next-eq eq
{A = embed-obj (suc k) A}
(embed-shape (suc k) (embed-obj (suc k) A)))
dependentLimit : LimitLayer nIdx nTower
dependentLimit = record
{ o∞ = lzero ; h∞ = lzero ; e∞ = lzero ; s∞ = lzero ; p∞ = lzero
; layer∞ = nLayer
; projC = λ k → record
{ F₀ = proj-obj k
; F₁ = λ _ → tt
; identity = refl
; homomorphism = refl
; F-resp-≈ = λ _ → refl
}
}
dependentLayerZeroMediator : LayerZeroMediator
dependentLayerZeroMediator = record
{ liftAt = liftAt-dependent
; liftAt-resp = liftAt-resp-dependent
; liftAt-step = liftAt-step-dependent
; mediate = λ D cone z → LayerZeroCocone.map cone 0 z
; mediate-resp = λ {D} cone {x} {y} eq → LayerZeroCocone.map-resp cone 0 eq
; mediate-coh = λ {D} cone x → ≈C-refl
; mediate-unique = λ {D} cone g g-resp g-coh z → g-coh z
}
record LayerZeroNontrivialLimit (UL : LayerZeroMediator) : Setω where
field
k : ℕ
x : Cosmos (C (layer nTower k)) (FC (layer nTower k))
y : Cosmos (C (layer nTower k)) (FC (layer nTower k))
x≉y : ¬ (LayerZeroMediator.liftAt UL k x
≈C LayerZeroMediator.liftAt UL k y)
dependent-nontrivial : LayerZeroNontrivialLimit dependentLayerZeroMediator
dependent-nontrivial = record
{ k = 0
; x = cosmos-idN
; y = cosmos-const0N
; x≉y = cosmos-idN≉cosmos-const0N
}