{-# 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