{-# OPTIONS --without-K --rewriting #-} open import lib.Basics open import lib.NType2 open import lib.types.TLevel open import lib.types.Sigma open import lib.types.Pi module lib.types.Groupoid where record GroupoidStructure {i j} {El : Type i} (Arr : El → El → Type j) (_ : ∀ x y → has-level 0 (Arr x y)) : Type (lmax i j) where field ident : ∀ {x} → Arr x x inv : ∀ {x y} → Arr x y → Arr y x comp : ∀ {x y z} → Arr x y → Arr y z → Arr x z unit-l : ∀ {x y} (a : Arr x y) → comp ident a == a assoc : ∀ {x y z w} (a : Arr x y) (b : Arr y z) (c : Arr z w) → comp (comp a b) c == comp a (comp b c) inv-l : ∀ {x y} (a : Arr x y) → comp (inv a) a == ident private infix 80 _⊙_ _⊙_ = comp abstract inv-r : ∀ {x y} (a : Arr x y) → a ⊙ inv a == ident inv-r a = a ⊙ inv a =⟨ ! $ unit-l (a ⊙ inv a) ⟩ ident ⊙ (a ⊙ inv a) =⟨ ! $ inv-l (inv a) |in-ctx _⊙ (a ⊙ inv a) ⟩ (inv (inv a) ⊙ inv a) ⊙ (a ⊙ inv a) =⟨ assoc (inv (inv a)) (inv a) (a ⊙ inv a) ⟩ inv (inv a) ⊙ (inv a ⊙ (a ⊙ inv a)) =⟨ ! $ assoc (inv a) a (inv a) |in-ctx inv (inv a) ⊙_ ⟩ inv (inv a) ⊙ ((inv a ⊙ a) ⊙ inv a) =⟨ inv-l a |in-ctx (λ h → inv (inv a) ⊙ (h ⊙ inv a)) ⟩ inv (inv a) ⊙ (ident ⊙ inv a) =⟨ unit-l (inv a) |in-ctx inv (inv a) ⊙_ ⟩ inv (inv a) ⊙ inv a =⟨ inv-l (inv a) ⟩ ident =∎ unit-r : ∀ {x y} (a : Arr x y) → a ⊙ ident == a unit-r a = a ⊙ ident =⟨ ! (inv-l a) |in-ctx a ⊙_ ⟩ a ⊙ (inv a ⊙ a) =⟨ ! $ assoc a (inv a) a ⟩ (a ⊙ inv a) ⊙ a =⟨ inv-r a |in-ctx _⊙ a ⟩ ident ⊙ a =⟨ unit-l a ⟩ a =∎ record PreGroupoid i j : Type (lsucc (lmax i j)) where constructor groupoid field El : Type i Arr : El → El → Type j Arr-level : ∀ x y → has-level 0 (Arr x y) groupoid-struct : GroupoidStructure Arr Arr-level