{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.FinCatNPermutedEmbedding where
open import Agda.Primitive using (Setω)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Level using (Lift; lift)
open import Relation.Nullary using (¬_)
open import Relation.Binary.PropositionalEquality.Core using (sym; cong; _≢_)
open import Relation.Binary.PropositionalEquality.Properties using (module ≡-Reasoning)
open ≡-Reasoning
open import Data.Nat using (ℕ; zero; suc)
open import Data.Product.Base using (proj₁; proj₂; Σ; _,_)
open import Data.Fin.Base using (Fin; splitAt; join; opposite) renaming (zero to fzero)
open import Data.Sum.Base using (_⊎_; inj₁; inj₂)
open import Data.Fin.Properties using (join-splitAt; splitAt-join; opposite-involutive)
open import Data.Unit.Polymorphic.Base using (tt)
open import Data.List.Base using (List; []; _∷_; length)
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)
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_; ≈C-refl; ≈C-trans)
open import ALMA.SecondPass.CumulativeHierarchy using (EmbeddingData; UniformEmbeddingFamily)
open import ALMA.SecondPass.StrictLift using (StrictLayer)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower)
open import ALMA.SecondPass.FinCatNWitness
open import ALMA.SecondPass.FinCatNTowerLemmas
open import ALMA.SecondPass.FinCatNDefaultUnif
module FinCatNPermutedEmbedding (m : ℕ) where
open FinCatN m
open FinCatNTowerLemmas m
open FinCatNDefaultUnif m using (default-unif)
invPow : (k : ℕ) (f f⁻¹ : Fin n → Fin n) → Fin n → Fin n
invPow zero f f⁻¹ a = a
invPow (suc k) f f⁻¹ a = invPow k f f⁻¹ (f⁻¹ a)
ShapeOf-const : ∀ k (X Y : Category.Obj (StrictLayer.C (Tower.layer nTower k)))
→ ShapeOf (StrictLayer.FC (Tower.layer nTower k)) X
≡ ShapeOf (StrictLayer.FC (Tower.layer nTower k)) Y
ShapeOf-const zero X Y = refl
ShapeOf-const (suc k) (X , _) (Y , _) =
cong (λ T → Lift _ T) (ShapeOf-const k X Y)
canonicalShape : ∀ k (A : Category.Obj (StrictLayer.C (Tower.layer nTower k)))
→ ShapeOf (StrictLayer.FC (Tower.layer nTower k)) A
canonicalShape zero A = lift tt
canonicalShape (suc k) (A , _) = lift (canonicalShape k A)
liftF : ∀ k → (f : Fin n → Fin n)
→ Category.Obj (StrictLayer.C (Tower.layer nTower k))
→ Category.Obj (StrictLayer.C (Tower.layer nTower k))
liftF zero f A = f A
liftF (suc k) f (A , _) = (liftF k f A , canonicalShape k (liftF k f A))
liftF-F₁ : ∀ k f {A B}
(g : Category._⇒_ (StrictLayer.C (Tower.layer nTower k)) A B)
→ Category._⇒_ (StrictLayer.C (Tower.layer nTower k))
(liftF k f A) (liftF k f B)
liftF-F₁ zero f g = g
liftF-F₁ (suc k) f (g , _) =
( liftF-F₁ k f g
, shape-singleton-at k _ _ _ )
proj-obj-liftF
: ∀ k (f : Fin n → Fin n)
(A : Category.Obj (StrictLayer.C (Tower.layer nTower k)))
→ proj-obj k (liftF k f A) ≡ f (proj-obj k A)
proj-obj-liftF zero f A = refl
proj-obj-liftF (suc k) f (A , s) = proj-obj-liftF k f A
permuted-F₀
: ∀ k (f : Fin n → Fin n)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ Category.Obj (ShapeCat
(StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
→ Category.Obj (StrictLayer.C (Tower.layer nTower (suc k)))
permuted-F₀ k f x z =
( liftF k f (Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z))
, canonicalShape k
(liftF k f (Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z))) )
permuted-F₁
: ∀ k (f : Fin n → Fin n)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ {u v : Category.Obj (ShapeCat
(StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))}
→ Category._⇒_ (ShapeCat
(StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k)))) u v
→ Category._⇒_ (StrictLayer.C (Tower.layer nTower (suc k)))
(permuted-F₀ k f x u) (permuted-F₀ k f x v)
permuted-F₁ k f x {u} {v} fmap =
( liftF-F₁ k f (Unfolding.unfoldFunctor (out x) .Functor.F₁ (proj₁ fmap))
, shape-singleton-at k _ _ _ )
permuted-embed
: ∀ k (f : Fin n → Fin n)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ EmbeddingData x
→ Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k)))
permuted-embed k f x ed .out =
let
C' = StrictLayer.C (Tower.layer nTower (suc k))
FC' = StrictLayer.FC (Tower.layer nTower (suc k))
SC' = ShapeCat C' FC'
id-SC' = Category.id SC'
id-C' = Category.id C'
pf₁ = permuted-F₁ k f x
in record
{ unfoldFunctor = record
{ F₀ = permuted-F₀ k f x
; F₁ = pf₁
; identity = λ {X} →
nTower-collapsible (suc k)
(permuted-F₁ k f x (Category.id SC' {A = X}))
(Category.id C' {A = permuted-F₀ k f x X})
; homomorphism = λ {X Y Z f₁ g₁} →
nTower-collapsible (suc k)
(pf₁ (Category._∘_ SC' g₁ f₁))
(Category._∘_ C' (pf₁ g₁) (pf₁ f₁))
; F-resp-≈ = λ {X Y f₁ g₁} _ →
nTower-collapsible (suc k) (pf₁ f₁) (pf₁ g₁)
}
; unfold-next = λ { {A} s →
permuted-embed k f
(Unfolding.unfold-next (out x) {A = proj₁ A} (proj₂ A))
(EmbeddingData.next ed {A = proj₁ A} (proj₂ A)) }
; pos-to-shape = λ { {A} s _ →
canonicalShape (suc k) (permuted-F₀ k f x (A , s)) }
; pos-actS-compat = λ { {A} {B} {s} {t} g eq p →
shape-singleton-at (suc k)
(permuted-F₀ k f x (B , t)) _ _ }
}
permuted-liftAt
: ∀ (f f⁻¹ : Fin n → Fin n) (f⁻¹∘f : ∀ a → f⁻¹ (f a) ≡ a)
→ ∀ k
→ Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
→ Cosmos FinCatN TrivialFCN
permuted-liftAt f f⁻¹ f⁻¹∘f zero x = x
permuted-liftAt f f⁻¹ f⁻¹∘f (suc k) x .out = record
{ unfoldFunctor = record
{ F₀ = λ { (A , _) →
invPow (suc k) f f⁻¹
(proj-obj (suc k)
(Unfolding.unfoldFunctor (out x) .Functor.F₀
(embed-obj (suc k) A ,
embed-shape (suc k) (embed-obj (suc k) A)))) }
; F₁ = λ _ → tt
; identity = refl ; homomorphism = refl ; F-resp-≈ = λ _ → refl
}
; unfold-next = λ { {A = A} _ →
permuted-liftAt f f⁻¹ f⁻¹∘f (suc k)
(Unfolding.unfold-next (out x)
{A = embed-obj (suc k) A}
(embed-shape (suc k) (embed-obj (suc k) A))) }
; pos-to-shape = λ _ _ → lift tt
; pos-actS-compat = λ _ _ _ → refl
}
proj-obj-permuted-F₀
: ∀ k (f : Fin n → Fin n)
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(z : Category.Obj (ShapeCat
(StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k)))))
→ proj-obj (suc k) (permuted-F₀ k f x z)
≡ f (proj-obj k (Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))
proj-obj-permuted-F₀ k f x z =
proj-obj-liftF k f
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z))
permuted-liftAt-step
: ∀ (f f⁻¹ : Fin n → Fin n) (f⁻¹∘f : ∀ a → f⁻¹ (f a) ≡ a)
→ ∀ k
(x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(ed : EmbeddingData x)
→ permuted-liftAt f f⁻¹ f⁻¹∘f (suc k) (permuted-embed k f x ed)
≈C permuted-liftAt f f⁻¹ f⁻¹∘f k x
permuted-liftAt-step f f⁻¹ f⁻¹∘f zero x ed
._≈C_.unfoldFunctor₀-eq {A} s =
let z = embed-obj 1 A , embed-shape 1 (embed-obj 1 A)
in begin
invPow 1 f f⁻¹ (proj-obj 1
(Unfolding.unfoldFunctor (out (permuted-embed zero f x ed))
.Functor.F₀ z))
≡⟨ refl ⟩
invPow 1 f f⁻¹ (proj-obj 1 (permuted-F₀ zero f x z))
≡⟨ cong (invPow 1 f f⁻¹) (proj-obj-permuted-F₀ zero f x z) ⟩
invPow 1 f f⁻¹ (f (proj-obj zero
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z))))
≡⟨ refl ⟩
invPow 0 f f⁻¹ (f⁻¹ (f (proj-obj zero
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))))
≡⟨ cong (invPow 0 f f⁻¹) (f⁻¹∘f (proj-obj zero
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))) ⟩
invPow 0 f f⁻¹ (proj-obj zero
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))
∎
permuted-liftAt-step f f⁻¹ f⁻¹∘f zero x ed ._≈C_.pos-to-shape-eq s p = refl
permuted-liftAt-step f f⁻¹ f⁻¹∘f zero x ed ._≈C_.unfold-next-eq {A} s =
permuted-liftAt-step f f⁻¹ f⁻¹∘f zero
(Unfolding.unfold-next (out x) {A = A} s)
(EmbeddingData.next ed {A = A} s)
permuted-liftAt-step f f⁻¹ f⁻¹∘f (suc m) x ed
._≈C_.unfoldFunctor₀-eq {A} s =
let z = embed-obj (suc (suc m)) A ,
embed-shape (suc (suc m)) (embed-obj (suc (suc m)) A)
in begin
invPow (suc (suc m)) f f⁻¹ (proj-obj (suc (suc m))
(Unfolding.unfoldFunctor (out (permuted-embed (suc m) f x ed))
.Functor.F₀ z))
≡⟨ refl ⟩
invPow (suc (suc m)) f f⁻¹ (proj-obj (suc (suc m))
(permuted-F₀ (suc m) f x z))
≡⟨ cong (invPow (suc (suc m)) f f⁻¹)
(proj-obj-permuted-F₀ (suc m) f x z) ⟩
invPow (suc (suc m)) f f⁻¹ (f (proj-obj (suc m)
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z))))
≡⟨ refl ⟩
invPow (suc m) f f⁻¹ (f⁻¹ (f (proj-obj (suc m)
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))))
≡⟨ cong (invPow (suc m) f f⁻¹) (f⁻¹∘f (proj-obj (suc m)
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))) ⟩
invPow (suc m) f f⁻¹ (proj-obj (suc m)
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)))
∎
permuted-liftAt-step f f⁻¹ f⁻¹∘f (suc m) x ed
._≈C_.pos-to-shape-eq s p = refl
permuted-liftAt-step f f⁻¹ f⁻¹∘f (suc m) x ed
._≈C_.unfold-next-eq {A} s =
permuted-liftAt-step f f⁻¹ f⁻¹∘f (suc m)
(Unfolding.unfold-next (out x)
{A = embed-obj (suc m) A}
(embed-shape (suc m) (embed-obj (suc m) A)))
(EmbeddingData.next ed
{A = embed-obj (suc m) A}
(embed-shape (suc m) (embed-obj (suc m) A)))
permuted-liftAt-resp
: ∀ (f f⁻¹ : Fin n → Fin n) (f⁻¹∘f : ∀ a → f⁻¹ (f a) ≡ a)
→ ∀ k {x y : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))}
→ _≈C_ {C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)} x y
→ _≈C_ {C = FinCatN} {FC = TrivialFCN}
(permuted-liftAt f f⁻¹ f⁻¹∘f k x)
(permuted-liftAt f f⁻¹ f⁻¹∘f k y)
permuted-liftAt-resp f f⁻¹ f⁻¹∘f zero eq = eq
permuted-liftAt-resp f f⁻¹ f⁻¹∘f (suc k) {x} {y} eq
._≈C_.unfoldFunctor₀-eq {A} s =
let a = embed-obj (suc k) A
sh = embed-shape (suc k) a
in cong (λ b → invPow (suc k) f f⁻¹ (proj-obj (suc k) b))
(eq ._≈C_.unfoldFunctor₀-eq {A = a} sh)
permuted-liftAt-resp f f⁻¹ f⁻¹∘f (suc k) eq
._≈C_.pos-to-shape-eq s p = refl
permuted-liftAt-resp f f⁻¹ f⁻¹∘f (suc k) {x} {y} eq
._≈C_.unfold-next-eq {A} s =
permuted-liftAt-resp f f⁻¹ f⁻¹∘f (suc k)
(eq ._≈C_.unfold-next-eq
{A = embed-obj (suc k) A}
(embed-shape (suc k) (embed-obj (suc k) A)))
PreservesF₀At
: (k : ℕ)
→ (embed : ∀ k
→ (x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ EmbeddingData x
→ Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
→ Set _
PreservesF₀At k embed =
∀ (x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(ed : EmbeddingData x)
(z : Category.Obj (ShapeCat
(StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k)))))
→ proj₁ (Unfolding.unfoldFunctor (out (embed k x ed)) .Functor.F₀ z)
≡ Unfolding.unfoldFunctor (out x) .Functor.F₀ (proj₁ z)
¬-preserves-permuted
: ∀ (f : Fin n → Fin n)
→ Σ (Fin n) (λ a → f a ≢ a)
→ ¬ PreservesF₀At 0 (λ k x ed → permuted-embed k f x ed)
¬-preserves-permuted f (a , fa≢a) pres =
fa≢a (pres x ed z)
where
x = cosmos-idN
ed = UniformEmbeddingFamily.getData (default-unif 0) x
z : Category.Obj (ShapeCat
(StrictLayer.C (Tower.layer nTower 1))
(StrictLayer.FC (Tower.layer nTower 1)))
z = (a , lift tt) , lift (lift tt)
NontrivialPerm : (Fin n → Fin n) → Set
NontrivialPerm f = Σ (Fin n) (λ a → f a ≢ a)
record PermutedPathWitness
(embed : ∀ k
→ (x : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
→ EmbeddingData x
→ Cosmos (StrictLayer.C (Tower.layer nTower (suc k)))
(StrictLayer.FC (Tower.layer nTower (suc k))))
: Setω where
field
liftAt : ∀ k
→ Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
→ Cosmos FinCatN TrivialFCN
liftAt-step : ∀ k x ed → liftAt (suc k) (embed k x ed) ≈C liftAt k x
liftAt-resp : ∀ k {x y}
→ _≈C_ {C = StrictLayer.C (Tower.layer nTower k)}
{FC = StrictLayer.FC (Tower.layer nTower k)} x y
→ liftAt k x ≈C liftAt k y
liftAt-0-inj : ∀ {x y} → liftAt 0 x ≈C liftAt 0 y → x ≈C y
not-preserves : ¬ PreservesF₀At 0 embed
permuted-path-exists
: (f f⁻¹ : Fin n → Fin n) (f⁻¹∘f : ∀ a → f⁻¹ (f a) ≡ a)
→ (nontriv : NontrivialPerm f)
→ PermutedPathWitness (λ k x ed → permuted-embed k f x ed)
permuted-path-exists f f⁻¹ f⁻¹∘f nontriv = record
{ liftAt = permuted-liftAt f f⁻¹ f⁻¹∘f
; liftAt-step = λ k x ed → permuted-liftAt-step f f⁻¹ f⁻¹∘f k x ed
; liftAt-resp = λ k {x} {y} eq → permuted-liftAt-resp f f⁻¹ f⁻¹∘f k eq
; liftAt-0-inj = λ eq → eq
; not-preserves = ¬-preserves-permuted f nontriv
}
swapSum : Fin 2 ⊎ Fin m → Fin 2 ⊎ Fin m
swapSum (inj₁ i) = inj₁ (opposite i)
swapSum (inj₂ k) = inj₂ k
swapSum-involutive : ∀ x → swapSum (swapSum x) ≡ x
swapSum-involutive (inj₁ i) = cong inj₁ (opposite-involutive i)
swapSum-involutive (inj₂ k) = refl
swap01 : Fin n → Fin n
swap01 i = join 2 m (swapSum (splitAt 2 i))
swap01-involutive : ∀ a → swap01 (swap01 a) ≡ a
swap01-involutive i =
begin
swap01 (swap01 i)
≡⟨ refl ⟩
join 2 m (swapSum (splitAt 2 (join 2 m (swapSum (splitAt 2 i)))))
≡⟨ cong (join 2 m)
(cong swapSum (splitAt-join 2 m (swapSum (splitAt 2 i)))) ⟩
join 2 m (swapSum (swapSum (splitAt 2 i)))
≡⟨ cong (join 2 m) (swapSum-involutive (splitAt 2 i)) ⟩
join 2 m (splitAt 2 i)
≡⟨ join-splitAt 2 m i ⟩
i
∎
swap01-nontrivial : NontrivialPerm swap01
swap01-nontrivial = fzero , fsuc-fzero≠fzero
nontrivial-path-exists
: PermutedPathWitness (λ k x ed → permuted-embed k swap01 x ed)
nontrivial-path-exists =
permuted-path-exists swap01 swap01 swap01-involutive swap01-nontrivial
listCompose : List (Fin n → Fin n) → (Fin n → Fin n)
listCompose [] = id
listCompose (f ∷ fs) = f ∘ listCompose fs
iterPermutedSeq
: (fs : List (Fin n → Fin n))
→ Cosmos FinCatN TrivialFCN
→ Cosmos (StrictLayer.C (Tower.layer nTower (length fs)))
(StrictLayer.FC (Tower.layer nTower (length fs)))
iterPermutedSeq [] x = x
iterPermutedSeq (f ∷ fs) x =
permuted-embed (length fs) f (iterPermutedSeq fs x)
(UniformEmbeddingFamily.getData (default-unif (length fs))
(iterPermutedSeq fs x))
iterPermutedSeq-F₀-accum
: ∀ (fs : List (Fin n → Fin n))
(x : Cosmos FinCatN TrivialFCN) (A : Fin n)
→ proj-obj (length fs)
(Unfolding.unfoldFunctor (out (iterPermutedSeq fs x)) .Functor.F₀
(embed-obj (length fs) A ,
embed-shape (length fs) (embed-obj (length fs) A)))
≡ listCompose fs
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
iterPermutedSeq-F₀-accum [] x A = refl
iterPermutedSeq-F₀-accum (f ∷ fs) x A =
let
k = length fs
z = embed-obj (suc k) A , embed-shape (suc k) (embed-obj (suc k) A)
y = iterPermutedSeq fs x
in begin
proj-obj (suc k)
(Unfolding.unfoldFunctor (out (iterPermutedSeq (f ∷ fs) x)) .Functor.F₀ z)
≡⟨ refl ⟩
proj-obj (suc k) (permuted-F₀ k f y z)
≡⟨ proj-obj-permuted-F₀ k f y z ⟩
f (proj-obj k
(Unfolding.unfoldFunctor (out y) .Functor.F₀
(embed-obj k A , embed-shape k (embed-obj k A))))
≡⟨ cong f (iterPermutedSeq-F₀-accum fs x A) ⟩
f (listCompose fs
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt)))
≡⟨ refl ⟩
listCompose (f ∷ fs)
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
∎
iterPow : ℕ → (Fin n → Fin n) → (Fin n → Fin n)
iterPow zero f = λ a → a
iterPow (suc k) f = f ∘ iterPow k f
iterPermuted
: (f : Fin n → Fin n)
→ ∀ k
→ Cosmos FinCatN TrivialFCN
→ Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
iterPermuted f zero x = x
iterPermuted f (suc k) x =
permuted-embed k f (iterPermuted f k x)
(UniformEmbeddingFamily.getData (default-unif k) (iterPermuted f k x))
iterPermuted-F₀-accum
: ∀ (f : Fin n → Fin n) k
(x : Cosmos FinCatN TrivialFCN) (A : Fin n)
→ proj-obj k
(Unfolding.unfoldFunctor (out (iterPermuted f k x)) .Functor.F₀
(embed-obj k A , embed-shape k (embed-obj k A)))
≡ iterPow k f
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
iterPermuted-F₀-accum f zero x A = refl
iterPermuted-F₀-accum f (suc k) x A =
let
z = embed-obj (suc k) A , embed-shape (suc k) (embed-obj (suc k) A)
y = iterPermuted f k x
in begin
proj-obj (suc k)
(Unfolding.unfoldFunctor (out (iterPermuted f (suc k) x)) .Functor.F₀ z)
≡⟨ refl ⟩
proj-obj (suc k)
(Unfolding.unfoldFunctor (out (permuted-embed k f y
(UniformEmbeddingFamily.getData (default-unif k) y))) .Functor.F₀ z)
≡⟨ refl ⟩
proj-obj (suc k) (permuted-F₀ k f y z)
≡⟨ proj-obj-permuted-F₀ k f y z ⟩
f (proj-obj k (Unfolding.unfoldFunctor (out y) .Functor.F₀ (proj₁ z)))
≡⟨ refl ⟩
f (proj-obj k
(Unfolding.unfoldFunctor (out y) .Functor.F₀
(embed-obj k A , embed-shape k (embed-obj k A))))
≡⟨ cong f (iterPermuted-F₀-accum f k x A) ⟩
f (iterPow k f
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt)))
≡⟨ refl ⟩
iterPow (suc k) f
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
∎
permuted-liftAt-iterPermuted
: ∀ (f f⁻¹ : Fin n → Fin n) (f⁻¹∘f : ∀ a → f⁻¹ (f a) ≡ a)
(k : ℕ) (x : Cosmos FinCatN TrivialFCN)
→ permuted-liftAt f f⁻¹ f⁻¹∘f k (iterPermuted f k x) ≈C x
permuted-liftAt-iterPermuted f f⁻¹ f⁻¹∘f zero x = ≈C-refl
permuted-liftAt-iterPermuted f f⁻¹ f⁻¹∘f (suc k) x =
≈C-trans
(permuted-liftAt-step f f⁻¹ f⁻¹∘f k (iterPermuted f k x)
(UniformEmbeddingFamily.getData (default-unif k) (iterPermuted f k x)))
(permuted-liftAt-iterPermuted f f⁻¹ f⁻¹∘f k x)
iterPow-involution-period2
: ∀ (f : Fin n → Fin n)
→ (∀ a → f (f a) ≡ a)
→ ∀ k a → iterPow (suc (suc k)) f a ≡ iterPow k f a
iterPow-involution-period2 f inv k a =
begin
iterPow (suc (suc k)) f a
≡⟨ refl ⟩
f (f (iterPow k f a))
≡⟨ inv (iterPow k f a) ⟩
iterPow k f a
∎
iterPermuted-swap01-F₀-period2
: ∀ k (x : Cosmos FinCatN TrivialFCN) (A : Fin n)
→ proj-obj (suc (suc k))
(Unfolding.unfoldFunctor (out (iterPermuted swap01 (suc (suc k)) x))
.Functor.F₀
(embed-obj (suc (suc k)) A ,
embed-shape (suc (suc k)) (embed-obj (suc (suc k)) A)))
≡ proj-obj k
(Unfolding.unfoldFunctor (out (iterPermuted swap01 k x))
.Functor.F₀
(embed-obj k A , embed-shape k (embed-obj k A)))
iterPermuted-swap01-F₀-period2 k x A =
begin
proj-obj (suc (suc k))
(Unfolding.unfoldFunctor (out (iterPermuted swap01 (suc (suc k)) x))
.Functor.F₀
(embed-obj (suc (suc k)) A ,
embed-shape (suc (suc k)) (embed-obj (suc (suc k)) A)))
≡⟨ iterPermuted-F₀-accum swap01 (suc (suc k)) x A ⟩
iterPow (suc (suc k)) swap01
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
≡⟨ iterPow-involution-period2 swap01 swap01-involutive k
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt)) ⟩
iterPow k swap01
(Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , lift tt))
≡⟨ sym (iterPermuted-F₀-accum swap01 k x A) ⟩
proj-obj k
(Unfolding.unfoldFunctor (out (iterPermuted swap01 k x))
.Functor.F₀
(embed-obj k A , embed-shape k (embed-obj k A)))
∎