{-# OPTIONS --without-K --rewriting #-} module Pi.Experiments.CoxeterHIT where open import lib.Base open import lib.Base open import lib.NType open import lib.NType2 open import lib.PathOver open import lib.types.Nat open import lib.types.Sigma open import lib.PathGroupoid open import lib.Funext open import lib.types.Pi open import lib.types.Fin ⟨_⟩ : ∀ {n} → Fin n → Fin (S n) ⟨_⟩ = Fin-S S⟨_⟩ : ∀ {n} → Fin n → Fin (S n) S⟨ k , kltn ⟩ = S k , <-ap-S kltn infixr 35 _::_ postulate CList : ℕ → Type₀ nil : ∀ {m} → CList m _::_ : ∀ {m} → Fin (S m) → CList m → CList m cancel : ∀ {m} → {n : Fin (S m)} {w : CList m} → (n :: n :: w) == w swap : ∀ {m} → {n : Fin (S m)} {k : Fin (S m)} → (S (k .fst) < (n .fst)) → {w : CList m} → (n :: k :: w) == (k :: n :: w) braid : ∀ {m} → {n : Fin m} {w : CList m} → (S⟨ n ⟩ :: ⟨ n ⟩ :: S⟨ n ⟩ :: w) == (⟨ n ⟩ :: S⟨ n ⟩ :: ⟨ n ⟩ :: w) instance trunc : ∀ {m} → is-set (CList m) [_] : ∀ {m} → Fin (S m) → CList m [ n ] = n :: nil module CListElim {i} {m} {P : CList m → Type i} (nil* : P nil) (_::*_ : (n : Fin (S m)) {w : CList m} (w* : P w) → P (n :: w)) (cancel* : {n : Fin (S m)} {w : CList m} {w* : P w} → (n ::* (n ::* w*)) == w* [ P ↓ cancel ]) (swap* : {n : Fin (S m)} {k : Fin (S m)} → (p : S (k .fst) < (n .fst)) → {w : CList m} {w* : P w} → (n ::* (k ::* w*)) == (k ::* (n ::* w*)) [ P ↓ swap p ]) (braid* : {n : Fin m} {w : CList m} {w* : P w} → (S⟨ n ⟩ ::* (⟨ n ⟩ ::* (S⟨ n ⟩ ::* w*))) == (⟨ n ⟩ ::* (S⟨ n ⟩ ::* (⟨ n ⟩ ::* w*))) [ P ↓ braid ]) {{trunc* : {w : CList m} → is-set (P w)}} where postulate f : (w : CList m) → P w f-nil-β : f nil ↦ nil* {-# REWRITE f-nil-β #-} f-::-β : {n : Fin (S m)} {w : CList m} → f (n :: w) ↦ (n ::* (f w)) {-# REWRITE f-::-β #-} postulate f-cancel-β : {n : Fin (S m)} {w : CList m} → apd f (cancel {m} {n} {w}) == cancel* {n} {w} f-swap-β : {n : Fin (S m)} {k : Fin (S m)} {w : CList m} → (p : S (k .fst) < (n .fst)) → apd f (swap {m} {n} {k} p {w}) == swap* p {w} f-braid-β : {n : Fin m} {w : CList m} → apd f (braid {m} {n} {w}) == braid* {n} {w} module CListElimProp {i} {m} {P : CList m → Type i} (nil* : P nil) (_::*_ : (n : Fin (S m)) {w : CList m} (w* : P w) → P (n :: w)) {{trunc* : {w : CList m} → is-prop (P w)}} where private module E = CListElim {P = P} nil* _::*_ prop-has-all-paths-↓ (λ p → prop-has-all-paths-↓) prop-has-all-paths-↓ f : (w : CList m) → P w f = E.f {{raise-level -1 trunc*}} module CListRec {i} {m} {P : Type i} (nil* : P) (_::*_ : (n : Fin (S m)) (w* : P) → P) (cancel* : {n : Fin (S m)} {w* : P} → (n ::* (n ::* w*)) == w*) (swap* : {n : Fin (S m)} {k : Fin (S m)} → (p : S (k .fst) < (n .fst)) → {w* : P} → (n ::* (k ::* w*)) == (k ::* (n ::* w*))) (braid* : {n : Fin m} {w* : P} → (S⟨ n ⟩ ::* (⟨ n ⟩ ::* (S⟨ n ⟩ ::* w*))) == (⟨ n ⟩ ::* (S⟨ n ⟩ ::* (⟨ n ⟩ ::* w*)))) {{trunc* : is-set P}} where private module E = CListElim {P = λ _ → P} nil* (λ n p → n ::* p) (↓-cst-in cancel*) (λ p → ↓-cst-in (swap* p)) (↓-cst-in braid*) f : CList m → P f = E.f f-cancel-β : {n : Fin (S m)} {w : CList m} → ap f (cancel {m} {n} {w}) == cancel* {n} {f w} f-cancel-β = apd=cst-in E.f-cancel-β f-swap-β : {n : Fin (S m)} {k : Fin (S m)} → (p : S (k .fst) < (n .fst)) {w : CList m} → ap f (swap {m} {n} {k} p {w}) == swap* p {f w} f-swap-β p = apd=cst-in (E.f-swap-β p) f-braid-β : {n : Fin m} {w : CList m} → ap f (braid {m} {n} {w}) == braid* {n} {f w} f-braid-β = apd=cst-in E.f-braid-β infixr 50 _++_ _++_ : ∀ {m} → CList m → CList m → CList m _++_ {m} = CListRec.f (λ w → w) (λ n f w → n :: f w) (λ= λ _ → cancel) (λ p → λ= λ _ → swap p) (λ= λ _ → braid) instance clist-paths-prop : ∀ {m} → {w1 w2 : CList m} → is-prop (w1 == w2) clist-paths-prop = has-level-apply trunc _ _ ++-unit-r : ∀ {m} (l : CList m) → l ++ nil == l ++-unit-r = CListElimProp.f idp (λ n {w} p → ap (n ::_) p) {{clist-paths-prop}} ++-assoc : ∀ {m} (l₁ l₂ l₃ : CList m) → (l₁ ++ l₂) ++ l₃ == l₁ ++ (l₂ ++ l₃) ++-assoc = CListElimProp.f (λ _ _ → idp) (λ n {w} f l₂ l₃ → ap (n ::_) (f l₂ l₃)) {{Π-level λ _ → Π-level λ _ → clist-paths-prop}}