{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.ListCosmos where
open import Agda.Primitive using (lzero)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Fin.Base using (Fin; toℕ; splitAt; join; opposite)
renaming (zero to fzero; suc to fsuc)
open import Data.Unit.Polymorphic.Base using (tt)
open import Data.Sum using (_⊎_; inj₁; inj₂)
open import Data.Product.Base using (∃)
open import Relation.Binary.PropositionalEquality.Core using (_≢_; sym; cong; subst)
open import Relation.Nullary.Negation using (¬_)
open import Data.Container.Core using (Container)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import Categories.Functor using (id)
open import ALMA.Cosmos.ContCategory using (ContCat; ≈sr-refl)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; PosOf; actSOf; actPOf)
open import ALMA.Cosmos.ContCatEquiv using (ShapeCat)
open import ALMA.SecondPass.Unfolding using (Unfolding; mapUnfolding)
open import ALMA.SecondPass.MorphismObject using (MorphismObject)
open import ALMA.SecondPass.MorphismMorphism using (actP-from-S)
open import ALMA.SecondPass.Cosmos using (Cosmos; out; _⇒ℱ[_]_; _⇒ℱ_; ⇒ℱLayer[_]; UnitCat)
open import ALMA.SecondPass.MorphismCorrespondence using (StructuredFunc; NontrivialCosmos; not-full)
module _ where
C₀ : Category lzero lzero lzero
C₀ = UnitCat {lzero}
ListContainer : Container lzero lzero
ListContainer = record { Shape = ℕ ; Position = Fin }
ListFC : Functor C₀ (ContCat lzero lzero)
ListFC = record
{ F₀ = λ _ → ListContainer
; F₁ = λ _ → Category.id (ContCat lzero lzero)
; identity = ≈sr-refl
; homomorphism = ≈sr-refl
; F-resp-≈ = λ _ → ≈sr-refl
}
T = Cosmos C₀ ListFC
private
TrivialUnfoldFunctor : Functor (ShapeCat C₀ ListFC) C₀
TrivialUnfoldFunctor = record
{ F₀ = λ _ → tt
; F₁ = λ _ → tt
; identity = tt
; homomorphism = tt
; F-resp-≈ = λ _ → tt
}
ListCosmos : T
ListCosmos .out = record
{ unfoldFunctor = TrivialUnfoldFunctor
; unfold-next = λ _ → ListCosmos
; pos-to-shape = λ {A} n i → toℕ i
; pos-actS-compat = λ { f refl p → refl }
}
OtherCosmos : T
OtherCosmos .out = record
{ unfoldFunctor = TrivialUnfoldFunctor
; unfold-next = λ _ → OtherCosmos
; pos-to-shape = λ {A} n i → 0
; pos-actS-compat = λ _ _ _ → refl
}
swapFin2 : Fin 2 → Fin 2
swapFin2 = opposite
swap01 : (n : ℕ) → Fin n → Fin n
swap01 zero ()
swap01 (suc zero) i = i
swap01 (suc (suc n)) i =
join 2 n (swapSum (splitAt 2 i))
where
swapSum : Fin 2 ⊎ Fin n → Fin 2 ⊎ Fin n
swapSum (inj₁ i) = inj₁ (swapFin2 i)
swapSum (inj₂ k) = inj₂ k
swap01-fzero≠fzero : ∀ {n} → swap01 (suc (suc n)) fzero ≢ fzero
swap01-fzero≠fzero ()
swap-⇒ℱ : ListCosmos ⇒ℱ ListCosmos
swap-⇒ℱ ._⇒ℱ[_]_.out = record
{ shapeTrans = λ {A} {n} i → toℕ (swap01 n i)
; morphismObj = record
{ onPos = λ {A} {n} i → swap01 n i
; pts-compat = λ _ → refl
}
; morphismMor = record { onActP = onActP-swapped }
; onunfold-next = λ _ → swap-⇒ℱ
}
where
onActP-swapped : ∀ {A B} (f : Category._⇒_ C₀ A B) {s : ShapeOf ListFC A} {t : ShapeOf ListFC B}
→ (p : actSOf ListFC f s ≡ t) (q : PosOf ListFC t)
→ swap01 s (actPOf ListFC f s (subst (PosOf ListFC) (sym p) q))
≡ actP-from-S ListFC ListFC id f p (swap01 t q)
onActP-swapped f {s} {t} refl q = refl
swap-⇒ℱ-nonstandard : ∀ {n}
→ let open MorphismObject
open ⇒ℱLayer[_] (swap-⇒ℱ .out)
in onPos morphismObj {s = suc (suc n)} fzero ≢ fzero
swap-⇒ℱ-nonstandard = swap01-fzero≠fzero
toOther : ∀ x → x ⇒ℱ OtherCosmos
toOther x ._⇒ℱ[_]_.out = record
{ shapeTrans = λ {A} {n} i → 0
; morphismObj = record
{ onPos = λ {A} {n} i → i
; pts-compat = λ _ → refl
}
; morphismMor = record
{ onActP = λ _ _ _ → refl
}
; onunfold-next = λ {A} s →
toOther (Unfolding.unfold-next (out x) s)
}
otherSF : StructuredFunc {C = C₀} {FC = ListFC}
otherSF = record { f = λ _ → OtherCosmos ; witness = toOther }
pos2 : Fin 2
pos2 = fsuc {n = 1} (fzero {n = 0})
otherSF-not-commute-ListCosmos :
¬ (mapUnfolding (λ _ → OtherCosmos) (out ListCosmos) ≡ out OtherCosmos)
otherSF-not-commute-ListCosmos eq
with cong (λ c → Unfolding.pos-to-shape c (suc (suc zero)) pos2) eq
... | ()
listNontrivial : NontrivialCosmos {C = C₀} {FC = ListFC}
listNontrivial = record
{ sf = otherSF
; x = ListCosmos
; not-commute = otherSF-not-commute-ListCosmos
}
listNotFull : ∃ λ (sf : StructuredFunc {C = C₀} {FC = ListFC})
→ ¬ (∀ z → mapUnfolding (StructuredFunc.f sf) (out z)
≡ out (StructuredFunc.f sf z))
listNotFull = not-full listNontrivial