{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.CumulativeHierarchy where
open import Agda.Primitive using (Level; _⊔_; lsuc)
open import Agda.Builtin.Equality using (_≡_)
open import Agda.Builtin.Sigma using (_,_)
open import Data.Product.Base using (proj₁; proj₂)
open import Relation.Binary.PropositionalEquality.Core using (cong; sym; subst)
open import Relation.Binary.PropositionalEquality.Properties using (module ≡-Reasoning)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import Categories.Functor using (_∘F_)
open import ALMA.Cosmos.ContCategory using (ContCat; _≈sr_)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; PosOf; actSOf; actPOf)
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.Lambek using (in-F; in∘out≈id)
π : ∀ {o h e s p : Level} (C : Category o h e) (FC : Functor C (ContCat s p))
→ Functor (ShapeCat C FC) C
π C FC = record
{ F₀ = proj₁
; F₁ = proj₁
; identity = λ {A} → Equiv.refl
; homomorphism = λ {X} {Y} {Z} {f} {g} → Equiv.refl
; F-resp-≈ = λ f≈g → f≈g
}
where open Category C
FC∘π : ∀ {o h e s p} {C : Category o h e} (FC : Functor C (ContCat s p))
→ Functor (ShapeCat C FC) (ContCat s p)
FC∘π {C = C} FC = FC ∘F π C FC
record Layer (o h e s p : Level) : Set (lsuc (o ⊔ h ⊔ e ⊔ s ⊔ p)) where
field
C : Category o h e
FC : Functor C (ContCat s p)
open Layer public
step : ∀ {o h e s p} → Layer o h e s p → Layer (o ⊔ s) (h ⊔ s) e s p
step L = record
{ C = ShapeCat (Layer.C L) (Layer.FC L)
; FC = FC∘π (Layer.FC L)
}
embed-unfoldFunctor : ∀ {o h e s p} {C : Category o h e}
→ (FC : Functor C (ContCat s p))
→ Functor (ShapeCat (ShapeCat C FC) (FC∘π FC)) (ShapeCat C FC)
embed-unfoldFunctor {C = C} FC = record
{ F₀ = λ z → (proj₁ (proj₁ z) , proj₂ z)
; F₁ = λ f → (proj₁ (proj₁ f) , proj₂ f)
; identity = λ {A} → Equiv.refl {proj₁ (proj₁ A)} {proj₁ (proj₁ A)}
; homomorphism = λ {X} {Y} {Z} {f} {g} →
Equiv.refl {proj₁ (proj₁ X)} {proj₁ (proj₁ Z)}
{proj₁ (proj₁ g) ∘ proj₁ (proj₁ f)}
; F-resp-≈ = λ f≈g → f≈g
}
where open Category C
record EmbeddingData {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
(x : Cosmos C FC) : Set (o ⊔ h ⊔ e ⊔ s ⊔ p) where
coinductive
private
module C = Category C
UX = out x
module UX = Unfolding UX
field
retract : ∀ {A} (s : ShapeOf FC A)
→ C._⇒_ (Functor.₀ UX.unfoldFunctor (A , s)) A
retract-natural : ∀ {A B} {s : ShapeOf FC A} {t : ShapeOf FC B}
→ (f : A C.⇒ B) (eq : actSOf FC f s ≡ t)
→ C._≈_ (f C.∘ retract s)
(retract t C.∘ Functor.₁ UX.unfoldFunctor (f , eq))
next : ∀ {A} (s : ShapeOf FC A) → EmbeddingData (UX.unfold-next s)
ShapeCat-id-comm
: ∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
→ (X Y : Category.Obj (ShapeCat C FC))
→ (g : Category._⇒_ (ShapeCat C FC) X Y)
→ Category._≈_ C
(Category._∘_ C (proj₁ g) (Category.id C))
(Category._∘_ C (Category.id C) (proj₁ g))
ShapeCat-id-comm {C = C} X Y g =
C.Equiv.trans
(C.identityʳ {f = proj₁ g})
(C.Equiv.sym (C.identityˡ {f = proj₁ g}))
where
module C = Category C
embed-compat :
∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
{x : Cosmos C FC} (ed : EmbeddingData x)
{A B : Category.Obj C} {s : ShapeOf FC A} {t : ShapeOf FC B}
→ (f : Category._⇒_ C A B) (eq : actSOf FC f s ≡ t)
→ (p : PosOf FC (actSOf FC f s))
→ actSOf FC (EmbeddingData.retract ed t)
(Unfolding.pos-to-shape (out x) t (subst (PosOf FC) eq p))
≡ actSOf FC f
(actSOf FC (EmbeddingData.retract ed s)
(Unfolding.pos-to-shape (out x) s (actPOf FC f s p)))
embed-compat {C = C} {FC = FC} {x = x} ed {A} {B} {s} {t} f eq p =
begin
actSOf FC (retract t) (UX.pos-to-shape t (subst (PosOf FC) eq p))
≡⟨ cong (actSOf FC (retract t)) (UX.pos-actS-compat f eq p) ⟩
actSOf FC (retract t) (actSOf FC g₁ x₀)
≡⟨ sym (_≈sr_.shape-eq
(FC.homomorphism {X = X₀} {Y = Y₀} {Z = B}
{f = g₁} {g = retract t}) x₀) ⟩
actSOf FC (retract t C.∘ g₁) x₀
≡⟨ sym (_≈sr_.shape-eq
(FC.F-resp-≈ {A = X₀} {B = B}
{f = f C.∘ retract s}
{g = retract t C.∘ g₁}
(retract-natural f eq)) x₀) ⟩
actSOf FC (f C.∘ retract s) x₀
≡⟨ _≈sr_.shape-eq
(FC.homomorphism {X = X₀} {Y = A} {Z = B}
{f = retract s} {g = f}) x₀ ⟩
actSOf FC f (actSOf FC (retract s) x₀)
∎
where
open EmbeddingData ed
open ≡-Reasoning
module C = Category C
module FC = Functor FC
UX = out x
module UX = Unfolding UX
x₀ = UX.pos-to-shape s (actPOf FC f s p)
g₁ = Functor.₁ UX.unfoldFunctor (f , eq)
X₀ = Functor.₀ UX.unfoldFunctor (A , s)
Y₀ = Functor.₀ UX.unfoldFunctor (B , t)
embed : ∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
→ (x : Cosmos C FC) → EmbeddingData x
→ Cosmos (ShapeCat C FC) (FC∘π FC)
embed {C = C} {FC = FC} x ed .out = record
{ unfoldFunctor = embed-unfoldFunctor FC
; unfold-next = λ { {A , _} p → embed (UX.unfold-next p) (next p) }
; pos-to-shape = λ { {A , _} p q → actSOf FC (retract p) (UX.pos-to-shape p q) }
; pos-actS-compat = λ { {A , _} {B , _} {s} {t} (f , _) eq p →
embed-compat ed f eq p }
}
where
open EmbeddingData ed
module C = Category C
module FC = Functor FC
UX = out x
module UX = Unfolding UX
record EmbeddingFamily {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
: Set (lsuc (o ⊔ h ⊔ e ⊔ s ⊔ p)) where
field
getData : (x : Cosmos C FC) → EmbeddingData x
embed′ : Cosmos C FC → Cosmos (ShapeCat C FC) (FC∘π FC)
embed′ x = embed x (getData x)
record UniformEmbeddingFamily {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
: Set (lsuc (o ⊔ h ⊔ e ⊔ s ⊔ p)) where
field
family : EmbeddingFamily {C = C} {FC = FC}
open EmbeddingFamily family public
field
next-consistent : ∀ (x : Cosmos C FC) {A} (s : ShapeOf FC A)
→ getData x .EmbeddingData.next s
≡ getData (Unfolding.unfold-next (out x) s)
record FunctorialEmbeddingFamily {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
: Set (lsuc (o ⊔ h ⊔ e ⊔ s ⊔ p)) where
field
uniform : UniformEmbeddingFamily {C = C} {FC = FC}
open UniformEmbeddingFamily uniform public
field
embed′-resp-≈C : ∀ {x y} → x ≈C y → embed′ x ≈C embed′ y
liftUnfolding : ∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
(x : Cosmos C FC) (ed : EmbeddingData x)
→ Unfolding (FC∘π FC) (Cosmos (ShapeCat C FC) (FC∘π FC))
liftUnfolding x ed = out (embed x ed)
mkEmbeddingData : ∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
→ (retract : ∀ (x : Cosmos C FC) {A} (s : ShapeOf FC A)
→ Category._⇒_ C (Functor.₀ (Unfolding.unfoldFunctor (out x)) (A , s)) A)
→ (unique : ∀ {A B} (f g : Category._⇒_ C A B) → Category._≈_ C f g)
→ (x : Cosmos C FC) → EmbeddingData x
mkEmbeddingData retract unique x .EmbeddingData.retract = retract x
mkEmbeddingData retract unique x .EmbeddingData.retract-natural = λ _ _ → unique _ _
mkEmbeddingData retract unique x .EmbeddingData.next =
λ s → mkEmbeddingData retract unique (Unfolding.unfold-next (out x) s)
Collapsible : ∀ {o h e} → Category o h e → Set (o ⊔ h ⊔ e)
Collapsible C = ∀ {A B} (f g : Category._⇒_ C A B) → Category._≈_ C f g
collapsible→ShapeCat-collapsible : ∀ {o h e s p}
{C : Category o h e} {FC : Functor C (ContCat s p)}
→ Collapsible C → Collapsible (ShapeCat C FC)
collapsible→ShapeCat-collapsible collapse (f , _) (g , _) = collapse f g
record LambekConsistency {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
(fam : UniformEmbeddingFamily {C = C} {FC = FC})
: Set (lsuc (o ⊔ h ⊔ e ⊔ s ⊔ p)) where
open UniformEmbeddingFamily fam
private
C′ = ShapeCat C FC
FC′ = FC∘π FC
in-F′ : Unfolding FC′ (Cosmos C′ FC′) → Cosmos C′ FC′
in-F′ = in-F {C = C′} {FC = FC′}
in∘out≈id′ : ∀ (z : Cosmos C′ FC′) → in-F′ (out z) ≈C z
in∘out≈id′ = in∘out≈id {C = C′} {FC = FC′}
UX-next : (x : Cosmos C FC) {A₀ : Category.Obj C} (s : ShapeOf FC A₀)
→ Cosmos C FC
UX-next x {A₀} s = Unfolding.unfold-next (out x) {A = A₀} s
field
in-F-consistency : ∀ (y : Unfolding FC (Cosmos C FC))
→ in-F′ (out (embed′ (in-F y))) ≈C embed′ (in-F y)
out-consistency : ∀ (x : Cosmos C FC) {A₀ : Category.Obj C} (s : ShapeOf FC A₀)
→ Unfolding.unfold-next (out (embed′ x)) {A = (A₀ , s)} s
≡ embed′ (UX-next x s)
mkLambekConsistency : ∀ {o h e s p} {C : Category o h e} {FC : Functor C (ContCat s p)}
→ (fam : UniformEmbeddingFamily {C = C} {FC = FC})
→ LambekConsistency fam
mkLambekConsistency {C = C} {FC = FC} fam =
let
open UniformEmbeddingFamily fam
C′ = ShapeCat C FC
FC′ = FC∘π FC
in-F′ = in-F {C = C′} {FC = FC′}
in∘out≈id′ = in∘out≈id {C = C′} {FC = FC′}
UX-next : (x : Cosmos C FC) {A₀ : Category.Obj C} (s : ShapeOf FC A₀)
→ Cosmos C FC
UX-next x {A₀} s = Unfolding.unfold-next (out x) {A = A₀} s
in record
{ in-F-consistency = λ y → in∘out≈id′ (embed′ (in-F y))
; out-consistency = λ x {A₀} s → cong (λ ed → embed (UX-next x s) ed) (next-consistent x s)
}