{-# OPTIONS --cubical --safe #-} open import Algebra open import Prelude open import HITs.PropositionalTruncation open import HITs.PropositionalTruncation.Sugar module Algebra.Construct.Cayley {a} {π : Type a} (mon : Monoid π) where open Monoid mon π : Type a π = Ξ£[ f β¦ (π β π) ] Γ β x β β₯ f Ξ΅ β x β‘ f x β₯ β¦_ββ§ : π β π β¦ x ββ§ = x .fst Ξ΅ β¦_ββ§ : π β π β¦ x ββ§ .fst y = x β y β¦ x ββ§ .snd y = β£ cong (_β y) (βΞ΅ x) β£ β : π β .fst x = x β .snd x = β£ Ξ΅β x β£ open import Relation.Binary open import HITs.PropositionalTruncation.Equivalence open import Relation.Binary.Equivalence.Reasoning (trunc-equivalence (β‘-equivalence {A = π})) _β_ : π β π β π (x β y) .fst z = x .fst (y .fst z) (x β y) .snd z = x .fst (y .fst Ξ΅) β z βΛβ¨ cong (_β z) β₯$β₯ (x .snd (y .fst Ξ΅)) β© x .fst Ξ΅ β y .fst Ξ΅ β z β‘β¨ assoc (x .fst Ξ΅) (y .fst Ξ΅) z β© x .fst Ξ΅ β (y .fst Ξ΅ β z) ββ¨ cong (x .fst Ξ΅ β_) β₯$β₯ (y .snd z) β© x .fst Ξ΅ β y .fst z ββ¨ x .snd (y .fst z) β© x .fst (y .fst z) β β-assoc : Associative _β_ β-assoc x y z i .fst k = x .fst (y .fst (z .fst k)) β-assoc x y z i .snd k = squash (((x β y) β z) .snd k) ((x β (y β z)) .snd k) i ββ : β x β β β x β‘ x ββ x i .fst y = x .fst y ββ x i .snd y = squash ((β β x) .snd y) (x .snd y) i ββ : β x β x β β β‘ x ββ x i .fst y = x .fst y ββ x i .snd y = squash ((x β β) .snd y) (x .snd y) i cayleyMonoid : Monoid π Monoid._β_ cayleyMonoid = _β_ Monoid.Ξ΅ cayleyMonoid = β Monoid.assoc cayleyMonoid = β-assoc Monoid.Ξ΅β cayleyMonoid = ββ Monoid.βΞ΅ cayleyMonoid = ββ open import Data.Sigma.Properties module _ (sIsSet : isSet π) where π-leftInv-fst : β x y β β¦ β¦ x ββ§ ββ§ .fst y β‘ x .fst y π-leftInv-fst x y = rec (sIsSet (x .fst Ξ΅ β y) (x .fst y)) id (x .snd y) π-leftInv : β x β β¦ β¦ x ββ§ ββ§ β‘ x π-leftInv x = Ξ£β‘Prop (Ξ» f xs ys β funExt Ξ» x β squash (xs x) (ys x)) (funExt (π-leftInv-fst x)) π-iso : π β π fun π-iso = β¦_ββ§ inv π-iso = β¦_ββ§ rightInv π-iso = βΞ΅ leftInv π-iso = π-leftInv