{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.FinCatNTowerLemmas where
open import Agda.Builtin.Equality using (_≡_; refl)
open import Level using (Lift; lift; lower)
open import Relation.Binary.PropositionalEquality.Core using (sym; cong; trans)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Fin using (Fin)
open import Data.Unit.Polymorphic.Base using (tt)
open import Data.Product.Base using (_,_; proj₁; proj₂)
open import Function.Bundles using (_⇔_; mk⇔)
open import Function.Base using (id)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; PosOf; actSOf)
open import ALMA.SecondPass.Unfolding using (Unfolding)
open import ALMA.SecondPass.Cosmos using (Cosmos; out)
open import ALMA.SecondPass.StrictLift using (StrictLayer)
open import ALMA.SecondPass.CumulativeHierarchy
using (Collapsible; collapsible→ShapeCat-collapsible)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower)
open import ALMA.SecondPass.FinCatNWitness
open Function.Bundles.Equivalence using (to; from)
open StrictLayer
open Tower
module FinCatNTowerLemmas (m : ℕ) where
open FinCatN m
shape-inhabited-at
: ∀ k (A : Category.Obj (C (layer nTower k)))
→ ShapeOf (FC (layer nTower k)) A
shape-inhabited-at zero A = lift tt
shape-inhabited-at (suc k) (A , s) = lift (shape-inhabited-at k A)
shape-singleton-at
: ∀ k (A : Category.Obj (C (layer nTower k)))
→ (s t : ShapeOf (FC (layer nTower k)) A) → s ≡ t
shape-singleton-at zero A (lift tt) (lift tt) = refl
shape-singleton-at (suc k) (A , _) (lift u) (lift v) =
cong lift (shape-singleton-at k A u v)
proj-obj : ∀ k → Category.Obj (C (layer nTower k)) → Fin n
proj-obj zero A = A
proj-obj (suc k) (A , _) = proj-obj k A
mutual
embed-obj : ∀ k → Fin n → Category.Obj (C (layer nTower k))
embed-obj zero A = A
embed-obj (suc k) A = (embed-obj k A , embed-shape k (embed-obj k A))
embed-shape : ∀ k (A : Category.Obj (C (layer nTower k)))
→ ShapeOf (FC (layer nTower k)) A
embed-shape zero _ = lift tt
embed-shape (suc k) (A , _) = lift (embed-shape k A)
layer-obj-bijection
: ∀ k → Category.Obj (C (layer nTower k)) ⇔ Fin n
layer-obj-bijection zero = mk⇔ id id
layer-obj-bijection (suc k) =
mk⇔ (λ { (A , _) → to (layer-obj-bijection k) A })
(λ A → from (layer-obj-bijection k) A
, shape-inhabited-at k (from (layer-obj-bijection k) A))
hom : (k : ℕ) (X Y : Category.Obj (StrictLayer.C (Tower.layer nTower k)))
→ Category._⇒_ (StrictLayer.C (Tower.layer nTower k)) X Y
hom zero X Y = tt
hom (suc k) (A , s) (B , t) = (hom k A B , eq)
where
FC_k = StrictLayer.FC (Tower.layer nTower k)
eq = shape-singleton-at k B (actSOf FC_k (hom k A B) s) t
nTower-collapsible : (k : ℕ)
→ Collapsible (StrictLayer.C (Tower.layer nTower k))
nTower-collapsible zero = λ _ _ → refl
nTower-collapsible (suc k) =
collapsible→ShapeCat-collapsible
{C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)}
(nTower-collapsible k)
nTower-retract : (k : ℕ)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
{A : Category.Obj (StrictLayer.C (Tower.layer nTower k))}
(s : ShapeOf (StrictLayer.FC (Tower.layer nTower k)) A)
→ Category._⇒_ (StrictLayer.C (Tower.layer nTower k))
(Functor.₀ (Unfolding.unfoldFunctor (out x)) (A , s)) A
nTower-retract k x {A} s =
hom k (Functor.₀ (Unfolding.unfoldFunctor (out x)) (A , s)) A
x-pos-eq : ∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
(A : Category.Obj (StrictLayer.C (Tower.layer nTower k)))
(s : ShapeOf (StrictLayer.FC (Tower.layer nTower k)) A)
(s' : ShapeOf (StrictLayer.FC (Tower.layer nTower (suc k))) (A , s))
(p : PosOf (StrictLayer.FC (Tower.layer nTower (suc k))) {A = (A , s)} s')
→ Unfolding.pos-to-shape (out x) {A = (A , s)} s' p
≡ lift (proj₂ (Unfolding.unfoldFunctor (out x) .Functor.F₀ ((A , s) , s')))
x-pos-eq k x A s s' p =
trans (sym (lower-lift-eq (Unfolding.pos-to-shape (out x) {A = (A , s)} s' p)))
(cong lift (shape-singleton-at k
(proj₁ (Unfolding.unfoldFunctor (out x) .Functor.F₀ ((A , s) , s')))
(lower (Unfolding.pos-to-shape (out x) {A = (A , s)} s' p))
(proj₂ (Unfolding.unfoldFunctor (out x) .Functor.F₀ ((A , s) , s')))))
where
lower-lift-eq : ∀ {a b} {A : Set a} (u : Lift b A) → lift (lower u) ≡ u
lower-lift-eq (lift _) = refl