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