--------------------------------------------------------------------------------
Ettore Aldrovandi ealdrovandi@fsu.edu
Keri D'Angelo kd349@cornell.edu

June 2022
--------------------------------------------------------------------------------

If X is a set, Aut X, defined in UF-Equiv, is a group.

We assume functional extensionality at level ๐“ค.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import Groups.Type renaming (_โ‰…_ to _โ‰ฃ_)
open import MLTT.Spartan
open import UF.Base hiding (_โ‰ˆ_)
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.FunExt
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons-Properties

module Groups.Aut where

\end{code}

In the group structure below the definition matches that of function
composition. This notation is used in UF.Equiv.

Note, however, that writing the variables this way introduces an
"opposite" operation. We define it formally in Groups.Opposite and we
must take it into account whenever using this group structure on
Aut(X).

\begin{code}
module _ (fe : funext ๐“ค ๐“ค) (X : ๐“ค ฬ‡ )(i : is-set X) where

  is-set-Aut : is-set (Aut X)
  is-set-Aut = ฮฃ-is-set
                  (ฮ -is-set fe (ฮป _ โ†’ i))
                  ฮป f โ†’ props-are-sets (being-equiv-is-prop'' fe f)


  group-structure-Aut : Aut X โ†’ Aut X โ†’ Aut X
  group-structure-Aut f g = f โ— g

  private
    _ยท_ = group-structure-Aut

\end{code}

In the following proof of the group axioms, the associativity proof
reproduces that of โ‰ƒ-assoc in UF-Equiv-FunExt, instead of calling
โ‰ƒ-assoc directly, because the latter uses FunExt and we use funext ๐“ค ๐“ค
here.  Similarly for the proof of the inverse, which reproduces those
of โ‰ƒ-sym-is-linv and โ‰ƒ-sym-is-rinv.

In both cases the key is to use being-equiv-is-prop'' in place of
being-equiv-is-prop.

\begin{code}
  group-axioms-Aut : group-axioms (Aut X) _ยท_
  group-axioms-Aut = is-set-Aut , assoc-Aut , e , ln-e , rn-e , ฯ†
    where
      assoc-Aut : associative _ยท_
      assoc-Aut (f , i) (g , j) (h , k) = to-ฮฃ-๏ผ (p , q)
        where
          p : (h โˆ˜ g) โˆ˜ f ๏ผ h โˆ˜ (g โˆ˜ f)
          p = refl

          d e : is-equiv (h โˆ˜ g โˆ˜ f)
          d = โˆ˜-is-equiv i (โˆ˜-is-equiv j k)
          e = โˆ˜-is-equiv (โˆ˜-is-equiv i j) k

          q : transport is-equiv p e ๏ผ d
          q = being-equiv-is-prop'' fe (h โˆ˜ g โˆ˜ f) _ _

      e : Aut X
      e = id , id-is-equiv X

      ln-e : left-neutral e _ยท_
      ln-e = ฮป f โ†’ โ‰ƒ-refl-left' fe fe fe f

      rn-e : right-neutral e _ยท_
      rn-e = ฮป f โ†’ โ‰ƒ-refl-right' fe fe fe f

      ฯ† : (f : Aut X)
        โ†’ (ฮฃ f' ๊ž‰ Aut X , (f' ยท f ๏ผ e) ร— (f ยท f' ๏ผ e))
      prโ‚ (ฯ† f) = โ‰ƒ-sym f
      prโ‚ (prโ‚‚ (ฯ† (โˆฃfโˆฃ , is))) = to-ฮฃ-๏ผ (p  , being-equiv-is-prop'' fe _ _ _)
        where
          p : โˆฃfโˆฃ โˆ˜ inverse โˆฃfโˆฃ is ๏ผ id
          p = dfunext fe (inverses-are-sections โˆฃfโˆฃ is)
      prโ‚‚ (prโ‚‚ (ฯ† (โˆฃfโˆฃ , is))) = to-ฮฃ-๏ผ (p , being-equiv-is-prop'' fe _ _ _)
        where
          p : inverse โˆฃfโˆฃ is โˆ˜ โˆฃfโˆฃ ๏ผ id
          p = dfunext fe (inverses-are-retractions โˆฃfโˆฃ is)

  Group-structure-Aut : Group-structure (Aut X)
  Group-structure-Aut = _ยท_ , group-axioms-Aut

  ๐”ธut : Group ๐“ค
  ๐”ธut = Aut X , Group-structure-Aut

\end{code}

If ฯ† is an equivalence between X and Y, then it induces a morphism
from Aut X to Aut Y.

\begin{code}

๐“ut : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ (X โ‰ƒ Y) โ†’ Aut X โ†’ Aut Y
๐“ut ฯ† = ฮป f โ†’ (โ‰ƒ-sym ฯ† โ— f ) โ— ฯ†

\end{code}

This morphism is a homomorphism for the group
structures defined above.

\begin{code}

module _ (fe : FunExt)
         (X : ๐“ค ฬ‡ )(i : is-set X)
         (Y : ๐“ฅ ฬ‡ )(j : is-set Y)
         (ฯ† : X โ‰ƒ Y)  where

   is-hom-๐“ut : is-hom (๐”ธut (fe ๐“ค ๐“ค) X i) (๐”ธut (fe ๐“ฅ ๐“ฅ) Y j) (๐“ut ฯ†)
   is-hom-๐“ut {g} {f} = (โ‰ƒ-sym ฯ† โ— (g โ— f )) โ— ฯ†                   ๏ผโŸจ  ap (_โ— ฯ†) (ap (โ‰ƒ-sym ฯ† โ—_) p) โŸฉ
                         (โ‰ƒ-sym ฯ† โ— ((g โ— ฯ†) โ— (โ‰ƒ-sym ฯ† โ— f))) โ— ฯ† ๏ผโŸจ  ap (_โ— ฯ†) (โ‰ƒ-assoc fe (โ‰ƒ-sym ฯ†) (g โ— ฯ†) (โ‰ƒ-sym ฯ† โ— f)) โŸฉ
                         ((โ‰ƒ-sym ฯ† โ— (g โ— ฯ†)) โ— (โ‰ƒ-sym ฯ† โ— f)) โ— ฯ† ๏ผโŸจ  (โ‰ƒ-assoc fe (โ‰ƒ-sym ฯ† โ— (g โ— ฯ†)) (โ‰ƒ-sym ฯ† โ— f) ฯ†) โปยน โŸฉ
                         (โ‰ƒ-sym ฯ† โ— (g โ— ฯ†)) โ— ((โ‰ƒ-sym ฯ† โ— f) โ— ฯ†) ๏ผโŸจ  ap (_โ— ((โ‰ƒ-sym ฯ† โ— f) โ— ฯ†)) (โ‰ƒ-assoc fe (โ‰ƒ-sym ฯ†) g ฯ†) โŸฉ
                         ((โ‰ƒ-sym ฯ† โ— g) โ— ฯ†) โ— ((โ‰ƒ-sym ฯ† โ— f) โ— ฯ†) โˆŽ
     where
       p = g โ— f                    ๏ผโŸจ ap (_โ— f) (โ‰ƒ-refl-right fe g) โปยน โŸฉ
           (g โ— โ‰ƒ-refl X) โ— f       ๏ผโŸจ ap (_โ— f) (ap (g โ—_) (โ‰ƒ-sym-right-inverse fe ฯ†) โปยน) โŸฉ
           (g โ— (ฯ† โ— โ‰ƒ-sym ฯ†)) โ— f  ๏ผโŸจ ap (_โ— f) (โ‰ƒ-assoc fe g ฯ† (โ‰ƒ-sym ฯ†) ) โŸฉ
           ((g โ— ฯ†) โ— โ‰ƒ-sym ฯ†) โ— f  ๏ผโŸจ (โ‰ƒ-assoc fe (g โ— ฯ†) (โ‰ƒ-sym ฯ†) f) โปยน   โŸฉ
           (g โ— ฯ†) โ— (โ‰ƒ-sym ฯ† โ— f) โˆŽ

\end{code}