{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.M.ListSwapDef where
open import Agda.Primitive using (lzero)
open import Data.Unit.Polymorphic.Base using (⊤; tt)
open import Data.Nat using (ℕ; _+_)
open import Data.Fin.Base using (Fin; zero; toℕ)
open import Data.Sum.Base using (_⊎_; inj₁; inj₂)
open import Data.Product.Base using (proj₁; _,_)
open import Data.Container.Core using (Container)
open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl; cong)
open import Relation.Nullary.Negation using (¬_)
open import Categories.Category.Core using (Category)
open import Categories.Category.Instance.One using (One)
open import Categories.Functor using () renaming (id to idF)
open import Categories.Functor.Core using (Functor)
open Functor using (F₀)
open import ALMA.Cosmos.ContCategory using (ContCat; ≈sr-refl)
open import ALMA.Cosmos.ContCatEquiv using (ShapeCat)
open import ALMA.Base.MCorrSetoid using (FiberAdjˢ; propEqOn)
open import ALMA.Base.MCorrSetoidCat using (FMˢ; FMapˢ)
import ALMA.Cosmos.M.Object as MO
import ALMA.Cosmos.M.GenCongruence as GC
C₀ : Category lzero lzero lzero
C₀ = One
SumContainer : Container lzero lzero
SumContainer = record { Shape = ℕ ; Position = λ n → Fin n ⊎ Fin n }
idSum : ∀ {n : ℕ} → Fin n ⊎ Fin n → Fin n ⊎ Fin n
idSum z = z
SumFC : Functor C₀ (ContCat lzero lzero)
SumFC = record
{ F₀ = λ _ → SumContainer
; F₁ = λ _ → record { shape = λ n → n ; position = idSum }
; identity = ≈sr-refl
; homomorphism = ≈sr-refl
; F-resp-≈ = λ _ → ≈sr-refl
}
open GC using (GenDet; genFMˢ)
S-I : Set lzero
S-I = MO.I C₀ SumFC
SData : Set lzero
SData = MO.CosmosData C₀ SumFC
SE : (i : S-I) (d : SData) (j : S-I) → Set lzero
SE = MO.E C₀ SumFC
uf0 : Functor (ShapeCat C₀ SumFC) C₀
uf0 = record
{ F₀ = proj₁
; F₁ = proj₁
; identity = Category.Equiv.refl C₀
; homomorphism = Category.Equiv.refl C₀
; F-resp-≈ = λ p → p
}
flip : ∀ {n : ℕ} → Fin n ⊎ Fin n → Fin n ⊎ Fin n
flip (inj₁ x) = inj₂ x
flip (inj₂ x) = inj₁ x
route : (n : ℕ) → Fin n ⊎ Fin n → ℕ
route n (inj₁ k) = toℕ k
route n (inj₂ k) = toℕ k + n
dStd : SData
dStd = record { uf = uf0 ; pts = λ { {A} n z → route n z } }
σlabel : SData → SData
σlabel d = record
{ uf = MO.CosmosData.uf d
; pts = λ { {A} n q → MO.CosmosData.pts d n (flip q) }
}
private
toAdj : ∀ {n m} (d : SData)
→ SE (tt , n) d (tt , m) → SE (tt , n) (σlabel d) (tt , m)
toAdj d (inj₁ x , eq) = inj₂ x , eq
toAdj d (inj₂ x , eq) = inj₁ x , eq
froAdj : ∀ {n m} (d : SData)
→ SE (tt , n) (σlabel d) (tt , m) → SE (tt , n) d (tt , m)
froAdj d (inj₁ x , eq) = inj₂ x , eq
froAdj d (inj₂ x , eq) = inj₁ x , eq
adjη : ∀ {n m} d (e : SE (tt , n) d (tt , m))
→ froAdj d (toAdj d e) ≡ e
adjη d (inj₁ x , eq) = refl
adjη d (inj₂ x , eq) = refl
adjε : ∀ {n m} d (e : SE (tt , n) (σlabel d) (tt , m))
→ toAdj d (froAdj d e) ≡ e
adjε d (inj₁ x , eq) = refl
adjε d (inj₂ x , eq) = refl
flipAdj : ∀ {n m} (d : SData)
→ FiberAdjˢ (propEqOn (SE (tt , n) (σlabel d) (tt , m)))
(propEqOn (SE (tt , n) d (tt , m)))
flipAdj {n = n} {m = m} d = record
{ to = toAdj d
; fro = froAdj d
; to-cong = λ eq → cong (toAdj d) eq
; fro-cong = λ eq → cong (froAdj d) eq
; η = adjη d
; ε = adjε d
}
flipGen : GenDet C₀ SumFC (idF {C = ShapeCat C₀ SumFC})
GenDet.σ flipGen _ d = σlabel d
GenDet.pb flipGen v = v , refl
GenDet.adj flipGen (tt , n) d (tt , m) = flipAdj {n = n} {m = m} d
flipFMˢ : FMˢ (MO.sys C₀ SumFC (λ _ → propEqOn _))
(MO.sys C₀ SumFC (λ _ → propEqOn _))
flipFMˢ = genFMˢ C₀ SumFC (idF {C = ShapeCat C₀ SumFC}) flipGen
private
e0 : SE (tt , 1) dStd (tt , 0)
e0 = inj₁ zero , refl
e1 : SE (tt , 1) (σlabel dStd) (tt , 0)
e1 = inj₂ zero , refl
adjAt : FiberAdjˢ (propEqOn (SE (tt , 1) (σlabel dStd) (tt , 0)))
(propEqOn (SE (tt , 1) dStd (tt , 0)))
adjAt = FMapˢ.adjFˢ (FMˢ.mor flipFMˢ) (tt , 1) dStd (tt , 0)
fwd : SE (tt , 1) dStd (tt , 0) → SE (tt , 1) (σlabel dStd) (tt , 0)
fwd = FiberAdjˢ.to adjAt
flip-sends-0→1 : fwd e0 ≡ e1
flip-sends-0→1 = refl
flip-nonidentity : ¬ (proj₁ (fwd e0) ≡ inj₁ zero)
flip-nonidentity ()