{-# OPTIONS --without-K --rewriting #-}
module Pi.Coxeter.Coxeter where
open import lib.Base
open import lib.types.Nat using (_+_; <-ap-S; _<_; _≤_)
open import lib.NType
open import lib.PathGroupoid
open import lib.types.Fin
open import lib.types.List
open import Pi.Common.Extra
open import Pi.Common.FinHelpers
data _≈'_ {m : ℕ} : List (Fin (S m)) → List (Fin (S m)) → Type₀ where
swap : {n : Fin (S m)} {k : Fin (S m)} → (S (k .fst) < (n .fst)) → (n :: k :: nil) ≈' (k :: n :: nil)
braid : {n : Fin m} → (S⟨ n ⟩ :: ⟨ n ⟩ :: S⟨ n ⟩ :: nil) ≈' (⟨ n ⟩ :: S⟨ n ⟩ :: ⟨ n ⟩ :: nil)
cancel : {n : Fin (S m)} → (n :: n :: nil) ≈' nil
data _≈*_ : {m : ℕ} → List (Fin m) → List (Fin m) → Type₀ where
idp : {m : ℕ} {l : List (Fin m)} -> l ≈* l
comm : {m : ℕ} {l1 l2 : List (Fin m)} -> (l1 ≈* l2) -> l2 ≈* l1
trans : {m : ℕ} {l1 l2 l3 : List (Fin m)} -> (l1 ≈* l2) -> (l2 ≈* l3) -> l1 ≈* l3
respects-++ : {m : ℕ} {l l' r r' : List (Fin m)} → (l ≈* l') → (r ≈* r') → l ++ r ≈* l' ++ r'
≈-rel : {m : ℕ} {l1 l2 : List (Fin (S m))} → l1 ≈' l2 → l1 ≈* l2
infixl 20 _■_
_■_ : {m : ℕ} {l1 l2 l3 : List (Fin m)} -> (l1 ≈* l2) -> (l2 ≈* l3) -> l1 ≈* l3
_■_ = trans