{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.FinCatNFunctorial where
open import Agda.Primitive using (Setω)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Relation.Binary.PropositionalEquality.Core using (sym; cong; subst; trans)
open import Relation.Binary.PropositionalEquality.Properties
using (module ≡-Reasoning; subst-∘; subst-subst)
open ≡-Reasoning
open import Level using (lift; lower)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Product.Base using (proj₁; _,_)
open import Data.Container.Core using (Container; Shape)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; actSOf)
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_)
open import ALMA.SecondPass.CumulativeHierarchy
using (UniformEmbeddingFamily; EmbeddingData; FC∘π)
open import ALMA.SecondPass.StrictLift
using (StrictLayer; LiftContainer; strictEmbed; strictStep-suc; outer-rule; EmbedFamily)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower; EnrichedTower)
open import ALMA.SecondPass.FinCatNWitness
open import ALMA.SecondPass.FinCatNColimitWithDep
open import ALMA.SecondPass.FinCatNDefaultUnif
subst-Shape-LiftContainer : ∀ {s p s′ p′} {X Y : Container s p}
(eq : X ≡ Y) (u : Shape X)
→ subst Shape (cong (LiftContainer s′ p′) eq) (lift u)
≡ lift (subst Shape eq u)
subst-Shape-LiftContainer refl u = refl
module FinCatNFunctorial (m : ℕ) where
open FinCatN m
open FinCatNColimitWithDep m using (UniformEmbeddingFamilyForTower)
open FinCatNDefaultUnif m using (default-unif)
tower-F₀-irrelevant : ∀ k →
let L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
in
∀ {A B} (f : Category._⇒_ CN A B)
→ Functor.F₀ FCN A ≡ Functor.F₀ FCN B
tower-F₀-irrelevant zero f = refl
tower-F₀-irrelevant (suc k) (f , _) =
cong (LiftContainer _ _) (tower-F₀-irrelevant k f)
tower-actSOf-id : ∀ k →
let L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
in
∀ {A B} (f : Category._⇒_ CN A B)
(s : ShapeOf FCN A)
→ actSOf FCN f s ≡ subst Shape (tower-F₀-irrelevant k f) s
tower-actSOf-id zero f s = refl
tower-actSOf-id (suc k) (f , _) (lift s) =
trans (cong lift (tower-actSOf-id k f s))
(sym (subst-Shape-LiftContainer (tower-F₀-irrelevant k f) s))
tower-F₀-irrelevant-irrelevant : ∀ k →
let L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
in
∀ {A B} (f g : Category._⇒_ CN A B)
→ tower-F₀-irrelevant k f ≡ tower-F₀-irrelevant k g
tower-F₀-irrelevant-irrelevant zero f g = refl
tower-F₀-irrelevant-irrelevant (suc k) (f , _) (g , _) =
cong (cong (LiftContainer _ _))
(tower-F₀-irrelevant-irrelevant k f g)
tower-F₀-irrelevant-decomp : ∀ k →
let L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
in
∀ {X Y A₀ : Category.Obj CN}
(eq₀ : X ≡ Y)
(retract-x : Category._⇒_ CN X A₀)
(retract-y : Category._⇒_ CN Y A₀)
→ tower-F₀-irrelevant k retract-x
≡ trans (cong (Functor.F₀ FCN) eq₀)
(tower-F₀-irrelevant k retract-y)
tower-F₀-irrelevant-decomp k refl rx ry =
tower-F₀-irrelevant-irrelevant k rx ry
record FunctorialEmbeddingFamilyForTower : Setω where
field
uniform : UniformEmbeddingFamilyForTower
module Fam (k : ℕ) = UniformEmbeddingFamily (uniform k)
field
embed′-resp-≈C : ∀ k →
let L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
in
∀ {x y : Cosmos CN FCN}
→ _≈C_ {C = CN} {FC = FCN} x y
→ _≈C_ {C = ShapeCat CN FCN} {FC = FC∘π FCN}
(Fam.embed′ k x) (Fam.embed′ k y)
module _ (k : ℕ) where
private
L = Tower.layer nTower k
CN = StrictLayer.C L
FCN = StrictLayer.FC L
CN1 = ShapeCat CN FCN
FCN1 = FC∘π FCN
embed′-default = UniformEmbeddingFamily.embed′ (default-unif k)
default-resp-≈C : ∀ {x y : Cosmos CN FCN}
→ _≈C_ {C = CN} {FC = FCN} x y
→ _≈C_ {C = CN1} {FC = FCN1} (embed′-default x) (embed′-default y)
default-resp-≈C {x} {y} = go x y
where
go : (x y : Cosmos CN FCN)
→ _≈C_ {C = CN} {FC = FCN} x y
→ _≈C_ {C = CN1} {FC = FCN1} (embed′-default x) (embed′-default y)
go x y x≈y ._≈C_.unfoldFunctor₀-eq {A} s = refl
go x y x≈y ._≈C_.pos-to-shape-eq {A} s p =
begin
Unfolding.pos-to-shape (out (embed′-default x)) {A = A} s p
≡⟨ refl ⟩
actSOf FCN retract-x x-pts
≡⟨ tower-actSOf-id k retract-x x-pts ⟩
subst Shape (tower-F₀-irrelevant k retract-x) x-pts
≡⟨ cong (λ q → subst Shape q x-pts)
(tower-F₀-irrelevant-decomp k eq₀ retract-x retract-y) ⟩
subst Shape
(trans (cong (Functor.F₀ FCN) eq₀) (tower-F₀-irrelevant k retract-y))
x-pts
≡⟨ sym (subst-subst (cong (Functor.F₀ FCN) eq₀)
{y≡z = tower-F₀-irrelevant k retract-y}
{p = x-pts}) ⟩
subst Shape (tower-F₀-irrelevant k retract-y)
(subst Shape (cong (Functor.F₀ FCN) eq₀) x-pts)
≡⟨ cong (λ z → subst Shape (tower-F₀-irrelevant k retract-y) z)
(sym (subst-∘ {P = Shape} {f = Functor.F₀ FCN}
eq₀ {p = x-pts})) ⟩
subst Shape (tower-F₀-irrelevant k retract-y)
(subst (ShapeOf FCN) eq₀ x-pts)
≡⟨ cong (λ z → subst Shape (tower-F₀-irrelevant k retract-y) z) pts-eq ⟩
subst Shape (tower-F₀-irrelevant k retract-y) y-pts
≡⟨ sym (tower-actSOf-id k retract-y y-pts) ⟩
actSOf FCN retract-y y-pts
≡⟨ sym refl ⟩
Unfolding.pos-to-shape (out (embed′-default y)) {A = A} s p
∎
where
A₀ = proj₁ A
eq₀ = _≈C_.unfoldFunctor₀-eq x≈y {A = A₀} s
pts-eq = _≈C_.pos-to-shape-eq x≈y {A = A₀} s p
x-pts = Unfolding.pos-to-shape (out x) {A = A₀} s p
y-pts = Unfolding.pos-to-shape (out y) {A = A₀} s p
retract-x = EmbeddingData.retract
(UniformEmbeddingFamily.getData (default-unif k) x) s
retract-y = EmbeddingData.retract
(UniformEmbeddingFamily.getData (default-unif k) y) s
go x y x≈y ._≈C_.unfold-next-eq {A} s =
go (Unfolding.unfold-next (out x) {A = proj₁ A} s)
(Unfolding.unfold-next (out y) {A = proj₁ A} s)
(_≈C_.unfold-next-eq x≈y {A = proj₁ A} s)
default-strictEmbed-resp-≈C : ∀ {x y : Cosmos CN FCN}
→ _≈C_ {C = CN} {FC = FCN} x y
→ _≈C_ {C = StrictLayer.C (strictStep-suc L)}
{FC = StrictLayer.FC (strictStep-suc L)}
(strictEmbed L x
(UniformEmbeddingFamily.getData (default-unif k) x))
(strictEmbed L y
(UniformEmbeddingFamily.getData (default-unif k) y))
default-strictEmbed-resp-≈C {x} {y} = go x y
where
go : (x y : Cosmos CN FCN)
→ _≈C_ {C = CN} {FC = FCN} x y
→ _≈C_ {C = StrictLayer.C (strictStep-suc L)}
{FC = StrictLayer.FC (strictStep-suc L)}
(strictEmbed L x
(UniformEmbeddingFamily.getData (default-unif k) x))
(strictEmbed L y
(UniformEmbeddingFamily.getData (default-unif k) y))
go x y x≈y ._≈C_.unfoldFunctor₀-eq {A} s = refl
go x y x≈y ._≈C_.pos-to-shape-eq {A} s p =
cong lift
(default-resp-≈C x≈y ._≈C_.pos-to-shape-eq {A = A} (lower s) (lower p))
go x y x≈y ._≈C_.unfold-next-eq {A} s =
go (Unfolding.unfold-next (out x) {A = proj₁ A} (lower s))
(Unfolding.unfold-next (out y) {A = proj₁ A} (lower s))
(_≈C_.unfold-next-eq x≈y {A = proj₁ A} (lower s))
functorial-default : FunctorialEmbeddingFamilyForTower
functorial-default = record
{ uniform = default-unif
; embed′-resp-≈C = λ k → default-resp-≈C k
}
fams-default : ∀ k → EmbedFamily outer-rule (Tower.layer nTower k)
fams-default k = record
{ uniform = default-unif k
; resp-≈C = λ {x} {y} x≈y → default-strictEmbed-resp-≈C k x≈y
}
enriched-default : EnrichedTower outer-rule nIdx
enriched-default = record
{ tower = nTower
; fams = fams-default
}