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

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

This only exists to use the subgroups code from UF-SIP-Examples with
Groups interface. The code is almost literally imported from the
subgroup module in UF-SIP-Examples with minor adaptations, since the
interface defined by Groups is different. This relies on the proof
that the group axioms, as defined in Groups, form a proposition.


\begin{code}

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

open import MLTT.Spartan
open import UF.Base hiding (_≈_)
open import UF.Classifiers
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Powerset
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.UA-FunExt
open import UF.Univalence

open import Groups.Type renaming (_≅_ to _≣_)

module Groups.Subgroups
       (𝓤 : Universe)
       (ua : Univalence) where


fe :  {𝓥} {𝓦}  funext 𝓥 𝓦
fe {𝓥} {𝓦} = univalence-gives-funext' 𝓥 𝓦 (ua 𝓥) (ua (𝓥  𝓦))

module _ (G : Group 𝓤) where

  private
    _·_ :  G    G    G 
    _·_ = multiplication G

    e :  G 
    e = unit G

    infixl 42 _·_

  group-closed : ( G   𝓥 ̇ )  𝓤  𝓥 ̇
  group-closed 𝓐 = 𝓐 (unit G)
                 × ((x y :  G )  𝓐 x  𝓐 y  𝓐 (x · y))
                 × ((x :  G )  𝓐 x  𝓐 (inv G x))

  Subgroup : 𝓤  ̇
  Subgroup = Σ A  𝓟  G  , group-closed (_∈ A)

  ⟪_⟫ : Subgroup  𝓟  G 
   A , u , c , ι  = A

  being-group-closed-subset-is-prop : (A : 𝓟  G )
                                     is-prop (group-closed (_∈ A))
  being-group-closed-subset-is-prop A = ×-is-prop
                                            (∈-is-prop A (unit G))
                                         (×-is-prop
                                            (Π-is-prop fe
                                                x  Π-is-prop fe
                                                y  Π-is-prop fe
                                                _  Π-is-prop fe
                                                _  ∈-is-prop A (x · y))))))
                                            (Π-is-prop fe
                                                x  Π-is-prop fe
                                                _  ∈-is-prop A (inv G x)))))

  ⟪⟫-is-embedding : is-embedding ⟪_⟫
  ⟪⟫-is-embedding = pr₁-is-embedding being-group-closed-subset-is-prop

  ap-⟪⟫ : (S T : Subgroup)  S  T   S    T 
  ap-⟪⟫ S T = ap ⟪_⟫

  ap-⟪⟫-is-equiv : (S T : Subgroup)  is-equiv (ap-⟪⟫ S T)
  ap-⟪⟫-is-equiv = embedding-gives-embedding' ⟪_⟫ ⟪⟫-is-embedding

  subgroups-form-a-set : is-set Subgroup
  subgroups-form-a-set {S} {T} = equiv-to-prop
                                  (ap-⟪⟫ S T , ap-⟪⟫-is-equiv S T)
                                  (𝓟-is-set ua)

  subgroup-equality : (S T : Subgroup)
                     (S  T)
                     ((x :  G )  (x   S )  (x   T ))

  subgroup-equality S T = γ
   where
    f : S  T  (x :  G )  x   S   x   T 
    f p x = transport  -  x   - ) p , transport  -  x   - ) (p ⁻¹)

    h : ((x :  G )  x   S   x   T )   S    T 
    h φ = subset-extensionality' ua α β
     where
      α :  S    T 
      α x = lr-implication (φ x)

      β :  T    S 
      β x = rl-implication (φ x)

    g : ((x :  G )  x   S   x   T )  S  T
    g = inverse (ap-⟪⟫ S T) (ap-⟪⟫-is-equiv S T)  h

    γ : (S  T)  ((x :  G )  x   S   x   T )
    γ = logically-equivalent-props-are-equivalent
         subgroups-form-a-set
         (Π-is-prop fe
            x  ×-is-prop
                   (Π-is-prop fe  _  ∈-is-prop  T  x))
                   (Π-is-prop fe  _  ∈-is-prop  S  x)))) f g

  T : 𝓤 ̇  𝓤 ̇
  T X = Σ _·_   group-structure X , group-axioms X _·_

  module _ {X : 𝓤 ̇ } (h : X   G ) (e : is-embedding h) where

   private
    h-lc : left-cancellable h
    h-lc = embeddings-are-lc h e

   having-group-closed-fiber-is-prop : is-prop (group-closed (fiber h))
   having-group-closed-fiber-is-prop = being-group-closed-subset-is-prop
                                         x  (fiber h x , e x))

   at-most-one-homomorphic-structure : is-prop (Σ τ  T X , is-hom (X , τ) G h)
   at-most-one-homomorphic-structure ((_*_ , gaxiom) , pmult) ((_*'_ , gaxiom') , pmult')
     = to-subtype-=  τ  being-hom-is-prop fe ((X , τ)) G h) δ
    where
     τ τ' : T X
     τ  = _*_ , gaxiom
     τ' = _*'_ , gaxiom'

     p : _*_  _*'_
     p = dfunext fe  x  dfunext fe  y  h-lc ( h (x * y)  =⟨ pmult 
                                                    h x · h y  =⟨ pmult' ⁻¹ 
                                                    h (x *' y) )))
     δ : τ  τ'
     δ = to-subtype-=  _  group-axioms-is-prop fe X _) p

   group-closed-fiber-gives-homomorphic-structure : funext 𝓤 𝓤
                                                   group-closed (fiber h)
                                                   (Σ τ  T X , is-hom (X , τ) G h)

   group-closed-fiber-gives-homomorphic-structure fe (unitc , mulc , invc) = τ , i
    where
     φ : (x : X)  fiber h (h x)
     φ x = (x , 𝓻𝓮𝒻𝓵 (h x))

     unitH : X
     unitH = fiber-point unitc

     _*_ : X  X  X
     x * y = fiber-point (mulc (h x) (h y) (φ x) (φ y))

     invH : X  X
     invH x = fiber-point (invc (h x) (φ x))

     pmul : (x y : X)  h (x * y)  h x · h y
     pmul x y = fiber-identification (mulc (h x) (h y) (φ x) (φ y))

     punit : h unitH  unit G
     punit = fiber-identification unitc

     pinv : (x : X)  h (invH x)  inv G (h x)
     pinv x = fiber-identification (invc (h x) (φ x))

     unitH-left : (x : X)  unitH * x  x
     unitH-left x = h-lc (h (unitH * x) =⟨ pmul unitH x 
                          h unitH · h x =⟨ ap ( h x) punit 
                          unit G · h x  =⟨ unit-left G (h x) 
                          h x           )

     unitH-right : (x : X)  x * unitH  x
     unitH-right x = h-lc (h (x * unitH) =⟨ pmul x unitH 
                           h x · h unitH =⟨ ap (h x ·_) punit 
                           h x · unit G  =⟨ unit-right G (h x) 
                           h x           )

     assocH : (x y z : X)  ((x * y) * z)  (x * (y * z))
     assocH x y z = h-lc (h ((x * y) * z)   =⟨ pmul (x * y) z 
                          h (x * y) · h z   =⟨ ap ( h z) (pmul x y) 
                          (h x · h y) · h z =⟨ assoc G (h x) (h y) (h z) 
                          h x · (h y · h z) =⟨ (ap (h x ·_) (pmul y z))⁻¹ 
                          h x · h (y * z)   =⟨ (pmul x (y * z))⁻¹ 
                          h (x * (y * z))   )

     group-axiomH : (x : X)  Σ x'  X , (x' * x  unitH) × (x * x'  unitH)
     group-axiomH x = invH x , h-lc (h (invH x * x)    =⟨ pmul (invH x) x 
                                     h (invH x) · h x  =⟨ ap ( h x) (pinv x) 
                                     inv G (h x) · h x =⟨ inv-left G (h x)  
                                     unit G            =⟨ punit ⁻¹ 
                                     h unitH ) ,

                               h-lc (h (x * invH x)    =⟨ pmul x (invH x) 
                                     h x · h (invH x)  =⟨ ap (h x ·_) (pinv x) 
                                     h x · inv G (h x) =⟨ inv-right G (h x) 
                                     unit G            =⟨ punit ⁻¹ 
                                     h unitH )

     j : is-set X
     j = subtypes-of-sets-are-sets' h h-lc (groups-are-sets G)

     τ : T X
     τ = _*_ , (j , (assocH , unitH , (unitH-left , (unitH-right , group-axiomH))))


     i : is-hom (X , τ) G h
     i {x} {y} = pmul x y


   homomorphic-structure-gives-group-closed-fiber : (Σ τ  T X , is-hom (X , τ) G h)
                                                   group-closed (fiber h)

   homomorphic-structure-gives-group-closed-fiber ((_*_ , gaxiom) , pmult) = (unitc , mulc , invc)
    where
     H : Group 𝓤
     H = X , (_*_ , gaxiom)

     unitH : X
     unitH = pr₁ (pr₂ (pr₂ gaxiom))

     unitc : fiber h (unit G)
     unitc = unitH , (homs-preserve-unit H G h pmult)


     mulc : ((x y :  G )  fiber h x  fiber h y  fiber h (x · y))
     mulc x y (a , p) (b , q) = (a * b) ,
                                (h (a * b) =⟨ pmult {a} {b} 
                                 h a · h b =⟨ ap₂  - -'  - · -') p q 
                                 x · y     )

     invc : ((x :  G )  fiber h x  fiber h (inv G x))
     invc x (a , p) = inv H a ,
                      (h (inv H a) =⟨ homs-preserve-invs H G h pmult a 
                       inv G (h a) =⟨ ap (inv G) p 
                       inv G x     )


   fiber-structure-lemma : funext 𝓤 𝓤
                          group-closed (fiber h)
                          (Σ τ  T X , is-hom (X , τ) G h)

   fiber-structure-lemma fe = logically-equivalent-props-are-equivalent
                               having-group-closed-fiber-is-prop
                               at-most-one-homomorphic-structure
                               (group-closed-fiber-gives-homomorphic-structure fe)
                               homomorphic-structure-gives-group-closed-fiber


  characterization-of-the-type-of-subgroups : Subgroup  (Σ H  Group 𝓤
                                                         , Σ h  ( H    G )
                                                         , is-embedding h
                                                         × is-hom H G h)
  characterization-of-the-type-of-subgroups =

   Subgroup                                                                           ≃⟨ i 
   (Σ A  𝓟  G  , group-closed (_∈ A))                                                ≃⟨ ii 
   (Σ (X , h , e)  Subtype  G  , group-closed (fiber h))                              ≃⟨ iii 
   (Σ X  𝓤 ̇ , Σ (h , e)  X   G  , group-closed (fiber h))                          ≃⟨ iv 
   (Σ X  𝓤 ̇ , Σ (h , e)  X   G  , Σ τ  T X , is-hom (X , τ) G h)                   ≃⟨ v 
   (Σ X  𝓤 ̇ , Σ h  (X   G ) , Σ e  is-embedding h , Σ τ  T X , is-hom (X , τ) G h) ≃⟨ vi 
   (Σ X  𝓤 ̇ , Σ h  (X   G ) , Σ τ  T X , Σ e  is-embedding h , is-hom (X , τ) G h) ≃⟨ vii 
   (Σ X  𝓤 ̇ , Σ τ  T X , Σ h  (X   G ) , is-embedding h × is-hom (X , τ) G h)       ≃⟨ viii 
   (Σ H  Group 𝓤 , Σ h  ( H    G ) , is-embedding h × is-hom H G h)                  

      where
       open special-classifier-single-universe 𝓤

       φ : Subtype  G   𝓟  G 
       φ = χ-special is-prop  G 

       j : is-equiv φ
       j = χ-special-is-equiv (ua 𝓤) fe is-prop  G 

       i    = ≃-refl Subgroup
       ii   = ≃-sym (Σ-change-of-variable  (A : 𝓟  G )  group-closed (_∈ A)) φ j)
       iii  = Σ-assoc
       iv   = Σ-cong  X  Σ-cong  (h , e)  fiber-structure-lemma h e fe))
       v    = Σ-cong  X  Σ-assoc)
       vi   = Σ-cong  X  Σ-cong  h  Σ-flip))
       vii  = Σ-cong  X  Σ-flip)
       viii = ≃-sym Σ-assoc


  induced-group : Subgroup  Group 𝓤
  induced-group S = pr₁ ( characterization-of-the-type-of-subgroups  S)

\end{code}