{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.Carried.FinPushColimitS where
open import Agda.Primitive using (lzero)
open import Agda.Builtin.Sigma using (Σ; _,_)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Data.Nat.Base using (ℕ; suc)
open import Data.Fin.Base using (Fin; inject₁; toℕ)
open import Data.Fin.Properties using (toℕ-inject₁)
open import Data.Unit.Polymorphic.Base using (⊤; tt)
open import Data.Product.Base using (_×_)
open import Relation.Binary.PropositionalEquality.Core using (cong; trans; sym)
open import ALMA.Base.MCorr using (M)
open import ALMA.Base.MCorrSetoid using (SysEq)
open import ALMA.Base.MCorrSetoidPush using (PushSimˢ)
open import ALMA.Base.MCorrSetoidPushComp using (R∘S; H∘G; push-comp)
open import ALMA.Base.MCorrSetoidPushMap using (push-map)
open import ALMA.Cosmos.Carried.LimitSystemS using (TrivDetˢ; n-at)
import ALMA.Cosmos.Carried.LimitSystemS as LS
open SysEq
module PushColimit
(t : (m : ℕ) → Fin (n-at m) → Fin (n-at m))
(embed-compat :
(m : ℕ) (x : Fin (n-at m))
→ t (suc m) (inject₁ x) ≡ inject₁ (t m x))
where
open LS.LimitSystemS t embed-compat
Stage : ℕ → SysEq lzero lzero lzero lzero lzero
Stage m = TrivDetˢ (Fin (n-at m)) (t m)
orbit-fin : (m : ℕ) (x : Fin (n-at m))
→ M (A (Stage m)) (E (Stage m)) x
orbit-fin m x .M.here = tt
orbit-fin m x .M.below y _ = orbit-fin m y
R-emb : (m : ℕ) → Fin (n-at m) → Fin (n-at (suc m)) → Set lzero
R-emb m x y = inject₁ x ≡ y
H-emb : (m : ℕ) (x : Fin (n-at m)) (y : Fin (n-at (suc m)))
→ R-emb m x y → A (Stage m) x → A (Stage (suc m)) y → Set lzero
H-emb _ _ _ _ _ _ = ⊤ {lzero}
emb-sim : (m : ℕ) (x : Fin (n-at m))
→ PushSimˢ (Stage m) (Stage (suc m)) (R-emb m) (H-emb m)
refl (orbit-fin m x) (orbit-fin (suc m) (inject₁ x))
emb-sim m x .PushSimˢ.here-eq = tt
emb-sim m x .PushSimˢ.push y (_ , eq) =
inject₁ y , ((tt , edge) , (refl , emb-sim m y))
where
edge : inject₁ y ≡ t (suc m) (inject₁ x)
edge = trans (cong inject₁ eq) (sym (embed-compat m x))
Rₘ : (m : ℕ) → Fin (n-at m) → ℕ → Set lzero
Rₘ m x v = toℕ x ≡ v
Hₘ : (m : ℕ) (x : Fin (n-at m)) (v : ℕ)
→ Rₘ m x v → A (Stage m) x → A L∞ v → Set lzero
Hₘ _ _ _ _ _ _ = ⊤ {lzero}
legₘ : (m : ℕ) (x : Fin (n-at m)) (v : ℕ) (r : Rₘ m x v)
→ PushSimˢ (Stage m) L∞ (Rₘ m) (Hₘ m)
r (orbit-fin m x) (orbit∞ v)
legₘ m x v r .PushSimˢ.here-eq = tt
legₘ m x v r .PushSimˢ.push y (_ , eq) =
s∞ v , ((tt , refl) , (r' , legₘ m y (s∞ v) r'))
where
r' : toℕ y ≡ s∞ v
r' = trans (cong toℕ eq)
(trans (read-coh m x) (cong s∞ r))
module _ (m : ℕ) where
private
Rc = R∘S {X = Stage m} {Y = Stage (suc m)} {Z = L∞}
(R-emb m) (Rₘ (suc m)) (H-emb m) (Hₘ (suc m))
Hc = H∘G {X = Stage m} {Y = Stage (suc m)} {Z = L∞}
(R-emb m) (Rₘ (suc m)) (H-emb m) (Hₘ (suc m))
fR : ∀ {x : Fin (n-at m)} {v : ℕ} → Rc x v → Rₘ m x v
fR {x = x} (y , e , r₁) =
trans (sym (toℕ-inject₁ x)) (trans (cong toℕ e) r₁)
fH : ∀ {x : Fin (n-at m)} {v : ℕ} (w : Rc x v)
{a : A (Stage m) x} {c : A L∞ v}
→ Hc x v w a c → Hₘ m x v (fR w) a c
fH _ _ = tt
leg-factor : (x : Fin (n-at m)) (v : ℕ) (r : Rₘ m x v)
→ PushSimˢ (Stage m) L∞ (Rₘ m) (Hₘ m)
(fR {x = x} {v = v}
(inject₁ x , refl , trans (toℕ-inject₁ x) r))
(orbit-fin m x) (orbit∞ v)
leg-factor x v r =
push-map Rc (Rₘ m) Hc (Hₘ m) fR fH
(push-comp (R-emb m) (Rₘ (suc m)) (H-emb m) (Hₘ (suc m))
(emb-sim m x)
(legₘ (suc m) (inject₁ x) v
(trans (toℕ-inject₁ x) r)))