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

open import Algebra.Bundles using (Group)

module Algebra.Group.Symmetric.Inclusion {g₁ g₂} (𝓖 : Group g₁ g₂) where

open Group 𝓖

open import Algebra.Group.Symmetric 𝓖
open import Algebra.Group.Symmetric.Equality 𝓖
open import Algebra.Morphism
open import Function.Inverse using (Inverse; _∘_; _InverseOf_)
open import Function.LeftInverse using (_LeftInverseOf_)
open import Function.Equality using (_⟶_; Π)
open import Function using (_$_)
open import Function.Definitions _≈_ _≣_
open import Relation.Binary using (Setoid)

open Π
open Inverse
open _InverseOf_

open import Relation.Binary.Reasoning.Setoid setoid

open import Algebra.Morphism.Group
open GroupMorphism

⟦_⟧ : Carrier  Sym
 a  .to ⟨$⟩ x = a  x
 a  .to .cong i≈j = ∙-congˡ i≈j
 a  .from ⟨$⟩ x = a ⁻¹  x
 a  .from .cong i≈j = ∙-congˡ i≈j
 a  .inverse-of .left-inverse-of x = begin
  a ⁻¹  (a  x) ≈˘⟨ assoc (a ⁻¹) a x     
  (a ⁻¹  a)  x ≈⟨  ∙-congʳ $ inverseˡ a 
  ε  x          ≈⟨  identityˡ x          
  x              
 a  .inverse-of .right-inverse-of x = begin
  a  (a ⁻¹  x) ≈˘⟨ assoc a (a ⁻¹) x      
  (a  a ⁻¹)  x ≈⟨  ∙-congʳ $ inverseʳ a  
  ε  x          ≈⟨  identityˡ x           
  x              

open IsGroupMorphism
open IsMonoidMorphism
open IsSemigroupMorphism

⟦⟧-IsGroupMorphism : ⟦_⟧ Is 𝓖 -Group⟶ SymGroup
⟦⟧-IsGroupMorphism .mn-homo .sm-homo .⟦⟧-cong g≈h .eq = ∙-cong g≈h
⟦⟧-IsGroupMorphism .mn-homo .sm-homo .∙-homo g h .eq {x} {y} x≈y = begin
  g  h  x   ≈⟨ ∙-congˡ x≈y 
  g  h  y   ≈⟨ assoc g h y 
  g  (h  y) 
⟦⟧-IsGroupMorphism .mn-homo .ε-homo .eq {x} {y} x≈y = begin
  ε  x ≈⟨ identityˡ x 
  x     ≈⟨ x≈y 
  y     

⟦⟧-injective : Injective ⟦_⟧
⟦⟧-injective {x} {y} ⟦x⟧≣⟦y⟧ = begin
  x ≈˘⟨ identityʳ x 
  (to  x  ⟨$⟩ ε) ≈⟨ eq ⟦x⟧≣⟦y⟧ S.refl 
  (to  y  ⟨$⟩ ε) ≈⟨ identityʳ y 
  y 

⟦⟧ : GroupMorphism 𝓖 SymGroup
⟦⟧ .morphism = ⟦_⟧
⟦⟧ .isGroupMorphism = ⟦⟧-IsGroupMorphism