changeset 284:69645d667f45

rename
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 29 Jan 2023 11:40:29 +0900
parents b89af4300407
children 515de7624a0c
files src/Fundamental.agda src/FundamentalHomorphism.agda
diffstat 2 files changed, 259 insertions(+), 256 deletions(-) [+]
line wrap: on
line diff
--- a/src/Fundamental.agda	Sun Jan 29 11:28:56 2023 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,256 +0,0 @@
--- fundamental homomorphism theorem
---
-
-open import Level hiding ( suc ; zero )
-module Fundamental (c : Level) where
-
-open import Algebra
-open import Algebra.Structures
-open import Algebra.Definitions
-open import Algebra.Core
-open import Algebra.Bundles
-
-open import Data.Product
-open import Relation.Binary.PropositionalEquality
-open import Gutil0
-import Gutil
-import Function.Definitions as FunctionDefinitions
-
-import Algebra.Morphism.Definitions as MorphismDefinitions
-open import Algebra.Morphism.Structures
-
-open import Tactic.MonoidSolver using (solve; solve-macro)
-
---
--- Given two groups G and H and a group homomorphism f : G → H,
--- let K be a normal subgroup in G and φ the natural surjective homomorphism G → G/K
--- (where G/K is the quotient group of G by K).
--- If K is a subset of ker(f) then there exists a unique homomorphism h: G/K → H such that f = h∘φ.
---     https://en.wikipedia.org/wiki/Fundamental_theorem_on_homomorphisms
---
---       f
---    G --→ H
---    |   /
---  φ |  / h
---    ↓ /
---    G/K
---
-
-import Relation.Binary.Reasoning.Setoid as EqReasoning
-
-_<_∙_> :  (m : Group c c )  →    Group.Carrier m →  Group.Carrier m →  Group.Carrier m
-m < x ∙ y > =  Group._∙_ m x y
-
-_<_≈_> :  (m : Group c c )  →    (f  g : Group.Carrier m ) → Set c
-m < x ≈ y > =  Group._≈_ m x y
-
-infixr 9 _<_∙_>
-
---
---  Coset : N : NormalSubGroup →  { a ∙ n | G ∋ a , N ∋ n }
---
-
-open GroupMorphisms
-
-import Axiom.Extensionality.Propositional
-postulate f-extensionality : { n m : Level}  → Axiom.Extensionality.Propositional.Extensionality n m
-open import Tactic.MonoidSolver using (solve; solve-macro)
-
-
-record NormalSubGroup (A : Group c c )  : Set c  where
-   open Group A
-   field
-       ⟦_⟧ : Group.Carrier A → Group.Carrier A
-       normal :  IsGroupHomomorphism (GR A) (GR A)  ⟦_⟧
-       comm : {a b :  Carrier } → b ∙ ⟦ a ⟧  ≈ ⟦ a ⟧  ∙ b
-       --
-       factor : (a b : Carrier) → Carrier
-       is-factor : (a b : Carrier) →  b ∙ ⟦ factor a b ⟧ ≈ a
-
--- Set of a ∙ ∃ n ∈ N
---
-record an {A : Group c c }  (N : NormalSubGroup A ) (n x : Group.Carrier A  ) : Set c where
-    open Group A
-    open NormalSubGroup N
-    field
-        a : Group.Carrier A
-        aN=x :  a ∙ ⟦ n ⟧ ≈ x
-
-record aN {A : Group c c }  (N : NormalSubGroup A )  : Set c where
-    field
-        n : Group.Carrier A
-        is-an : (x : Group.Carrier A) → an N n x
-
-qid : {A : Group c c }  (N : NormalSubGroup A )  → aN N
-qid {A} N = record { n = ε ; is-an = λ x → record { a = x ; aN=x = ? } } where
-       open Group A
-       open NormalSubGroup N
-
-_/_ : (A : Group c c ) (N  : NormalSubGroup A ) → Group c c
-_/_ A N  = record {
-    Carrier  = aN N
-    ; _≈_      = λ f g → ⟦ n f ⟧ ≈ ⟦ n g ⟧
-    ; _∙_      = qadd
-    ; ε        = qid N
-    ; _⁻¹      = ?
-    ; isGroup = record { isMonoid  = record { isSemigroup = record { isMagma = record {
-       isEquivalence = record {refl = grefl ; trans = gtrans ; sym = gsym }
-       ; ∙-cong = λ {x} {y} {u} {v} x=y u=v → ? }
-       ; assoc = ? }
-       ; identity =  ? , (λ q → ? )  }
-       ; inverse   = ( (λ x → ? ) , (λ x → ? ))
-       ; ⁻¹-cong   = λ i=j → ?
-      }
-   } where
-       open Group A
-       open aN
-       open an
-       open NormalSubGroup N
-       open IsGroupHomomorphism normal
-       open EqReasoning (Algebra.Group.setoid A)
-       open Gutil A
-       qadd : (f g : aN N) → aN N
-       qadd f g = record { n = n f ∙ n g  ; is-an = λ x → record { a = x ⁻¹ ∙ ( a (is-an f x) ∙ a (is-an g x))  ; aN=x = qadd0 }  } where
-           qadd0 : {x : Carrier} →   x ⁻¹ ∙ (a (is-an f x) ∙ a (is-an g x)) ∙ ⟦ n f ∙ n g ⟧ ≈ x
-           qadd0 {x} = begin
-              x ⁻¹ ∙ (a (is-an f x) ∙ a (is-an g x)) ∙ ⟦ n f ∙ n g ⟧ ≈⟨ ? ⟩
-              x ⁻¹ ∙  (a (is-an f x) ∙ a (is-an g x) ∙ ⟦ n f ∙ n g ⟧) ≈⟨ ? ⟩
-              x ⁻¹ ∙  (a (is-an f x) ∙ a (is-an g x) ∙ ( ⟦ n f ⟧  ∙ ⟦ n g ⟧ )) ≈⟨ ? ⟩
-              x ⁻¹ ∙  (a (is-an f x) ∙ ( a (is-an g x) ∙  ⟦ n f ⟧)  ∙ ⟦ n g ⟧)  ≈⟨ ? ⟩
-              x ⁻¹ ∙  (a (is-an f x) ∙ ( ⟦ n f ⟧ ∙ a (is-an g x) )  ∙ ⟦ n g ⟧)  ≈⟨ ? ⟩
-              x ⁻¹ ∙  ((a (is-an f x) ∙ ⟦ n f ⟧ ) ∙ ( a (is-an g x)   ∙ ⟦ n g ⟧))  ≈⟨ ? ⟩
-              x ⁻¹ ∙  ((a (is-an f x) ∙ ⟦ n f ⟧ ) ∙ ( a (is-an g x)   ∙ ⟦ n g ⟧))  ≈⟨ ? ⟩
-              x ⁻¹ ∙  (x ∙ x)  ≈⟨ ? ⟩
-             x ∎
-
--- K ⊂ ker(f)
-K⊆ker : (G H : Group c c)  (K : NormalSubGroup G) (f : Group.Carrier G → Group.Carrier H ) → Set c
-K⊆ker G H K f = (x : Group.Carrier G ) → f ( ⟦ x ⟧ ) ≈ ε   where
-  open Group H
-  open NormalSubGroup K
-
-open import Function.Surjection
-open import Function.Equality
-
-module GK (G : Group c c) (K : NormalSubGroup G) where
-    open Group G
-    open aN
-    open an
-    open NormalSubGroup K
-    open IsGroupHomomorphism normal
-    open EqReasoning (Algebra.Group.setoid G)
-    open Gutil G
-
-    φ : Group.Carrier G → Group.Carrier (G / K )
-    φ g = record { n = factor ε g ; is-an = λ x → record { a = x ∙ ( ⟦ factor ε g ⟧ ⁻¹)   ; aN=x = ?  } }
-
-    φ-homo : IsGroupHomomorphism (GR G) (GR (G / K)) φ
-    φ-homo = record {⁻¹-homo = λ g → ?  ; isMonoidHomomorphism = record { ε-homo = ? ; isMagmaHomomorphism = record { homo = ? ; isRelHomomorphism =
-       record { cong = ? } }}}
-
-    φe : (Algebra.Group.setoid G)  Function.Equality.⟶ (Algebra.Group.setoid (G / K))
-    φe = record { _⟨$⟩_ = φ ; cong = ?  }  where
-           φ-cong : {f g : Carrier } → f ≈ g  → ⟦ n (φ f ) ⟧ ≈ ⟦ n (φ g ) ⟧
-           φ-cong = ?
-
-    -- inverse ofφ
-    --  f = λ x → record { a = af ; n = fn ; aN=x = x ≈ af ∙ ⟦ fn ⟧  )   = (af)K  , fn ≡ factor x af , af ≡ a (f x)
-    --        (inv-φ f)K ≡ (af)K
-    --           φ (inv-φ f) x → f (h0 x)
-    --           f x → φ (inv-φ f) (h1 x)
-
-    inv-φ : Group.Carrier (G / K ) → Group.Carrier G
-    inv-φ f = ⟦ n f ⟧ ⁻¹
-
-
-    cong-i : {f g : Group.Carrier (G / K ) } → ⟦ n f ⟧ ≈ ⟦ n g ⟧ → inv-φ f ≈ inv-φ g
-    cong-i = ?
-
-    is-inverse : (f : aN K  ) →  ⟦ n (φ (inv-φ f) ) ⟧ ≈ ⟦ n f ⟧
-    is-inverse f = begin
-       ⟦ n (φ (inv-φ f) ) ⟧  ≈⟨ grefl  ⟩
-       ⟦ n (φ (⟦ n f  ⟧ ⁻¹) ) ⟧  ≈⟨ grefl  ⟩
-       ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧  ≈⟨ ? ⟩
-       ( ⟦ n f ⟧ ∙ ⟦ n f  ⟧ ⁻¹) ∙  ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧  ≈⟨ ? ⟩
-       ⟦ n f ⟧ ∙ ( ⟦ n f  ⟧ ⁻¹ ∙  ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧ ) ≈⟨ ∙-cong grefl (is-factor ε _ ) ⟩
-       ⟦ n f ⟧ ∙ ε  ≈⟨ ? ⟩
-       ⟦ n f ⟧ ∎
-
-    φ-surjective : Surjective φe
-    φ-surjective = record { from = record { _⟨$⟩_ = inv-φ ; cong = λ {f} {g} → cong-i {f} {g} }  ; right-inverse-of = is-inverse }
-
-    gk00 : {x : Carrier } → ⟦ factor ε x ⟧ ⁻¹ ≈ x
-    gk00 {x} = begin
-        ⟦ factor ε x ⟧ ⁻¹ ≈⟨ ? ⟩ 
-        ( x ⁻¹ ∙ ( x ∙ ⟦ factor ε x ⟧) ) ⁻¹ ≈⟨ ? ⟩ 
-        ( x ⁻¹ ∙ ( x ∙ ⟦ factor ε x ⟧) ) ⁻¹ ≈⟨ ⁻¹-cong (∙-cong grefl (is-factor ε x))  ⟩ 
-        ( x ⁻¹ ∙ ε ) ⁻¹ ≈⟨ ? ⟩ 
-        ( x ⁻¹  ) ⁻¹ ≈⟨ ? ⟩ 
-        x ∎
-
-    gk01 : (x : Group.Carrier (G / K ) ) → (G / K) < φ ( inv-φ x ) ≈ x >
-    gk01 x = begin
-        ⟦ factor ε ( inv-φ x) ⟧  ≈⟨ ? ⟩ 
-        ⟦ n x ⟧ ∎
-
-
-record FundamentalHomomorphism (G H : Group c c )
-    (f : Group.Carrier G → Group.Carrier H )
-    (homo : IsGroupHomomorphism (GR G) (GR H) f )
-    (K : NormalSubGroup G ) (kf : K⊆ker G H K f) :  Set c where
-  open Group H
-  open GK G K
-  field
-    h : Group.Carrier (G / K ) → Group.Carrier H
-    h-homo :  IsGroupHomomorphism (GR (G / K) ) (GR H) h
-    is-solution : (x : Group.Carrier G)  →  f x ≈ h ( φ x )
-    unique : (h1 : Group.Carrier (G / K ) → Group.Carrier H)  → (homo : IsGroupHomomorphism (GR (G / K)) (GR H) h1 )
-       → ( (x : Group.Carrier G)  →  f x ≈ h1 ( φ x ) ) → ( ( x : Group.Carrier (G / K)) → h x ≈ h1 x )
-
-FundamentalHomomorphismTheorm : (G H : Group c c)
-    (f : Group.Carrier G → Group.Carrier H )
-    (homo : IsGroupHomomorphism (GR G) (GR H) f )
-    (K : NormalSubGroup G ) → (kf : K⊆ker G H K f)   → FundamentalHomomorphism G H f homo K kf
-FundamentalHomomorphismTheorm G H f homo K kf = record {
-     h = h
-   ; h-homo = h-homo
-   ; is-solution = is-solution
-   ; unique = unique
-  } where
-    open GK G K
-    open Group H
-    open Gutil H
-    open NormalSubGroup K
-    open IsGroupHomomorphism homo
-    open aN
-    h : Group.Carrier (G / K ) → Group.Carrier H
-    h r = f ( inv-φ r )
-    h03 : (x y : Group.Carrier (G / K ) ) →  h ( (G / K) < x ∙ y > ) ≈ h x ∙ h y
-    h03 x y = {!!}
-    h-homo :  IsGroupHomomorphism (GR (G / K ) ) (GR H) h
-    h-homo = record {
-     isMonoidHomomorphism = record {
-          isMagmaHomomorphism = record {
-             isRelHomomorphism = record { cong = λ {x} {y} eq → {!!} }
-           ; homo = h03 }
-        ; ε-homo = {!!} }
-       ; ⁻¹-homo = {!!} }
-    open EqReasoning (Algebra.Group.setoid H)
-    is-solution : (x : Group.Carrier G)  →  f x ≈ h ( φ x )
-    is-solution x = begin
-         f x ≈⟨ gsym ( ⟦⟧-cong (gk00 ))  ⟩
-         f ( Group._⁻¹ G  ⟦ factor (Group.ε G) x  ⟧   ) ≈⟨ grefl  ⟩
-         h ( φ x ) ∎ 
-    unique : (h1 : Group.Carrier (G / K ) → Group.Carrier H)  → (h1-homo : IsGroupHomomorphism (GR (G / K)) (GR H) h1 )
-       → ( (x : Group.Carrier G)  →  f x ≈ h1 ( φ x ) ) → ( ( x : Group.Carrier (G / K)) → h x ≈ h1 x )
-    unique h1 h1-homo h1-is-solution x = begin
-         h x ≈⟨ grefl ⟩
-         f ( inv-φ x ) ≈⟨ h1-is-solution _ ⟩
-         h1 ( φ ( inv-φ x ) ) ≈⟨ IsGroupHomomorphism.⟦⟧-cong h1-homo (gk01 x)  ⟩
-         h1 x ∎
-
-
-
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/FundamentalHomorphism.agda	Sun Jan 29 11:40:29 2023 +0900
@@ -0,0 +1,259 @@
+-- fundamental homomorphism theorem
+--
+
+open import Level hiding ( suc ; zero )
+module FundamentalHomorphism (c : Level) where
+
+open import Algebra
+open import Algebra.Structures
+open import Algebra.Definitions
+open import Algebra.Core
+open import Algebra.Bundles
+
+open import Data.Product
+open import Relation.Binary.PropositionalEquality
+open import Gutil0
+import Gutil
+import Function.Definitions as FunctionDefinitions
+
+import Algebra.Morphism.Definitions as MorphismDefinitions
+open import Algebra.Morphism.Structures
+
+open import Tactic.MonoidSolver using (solve; solve-macro)
+
+--
+-- Given two groups G and H and a group homomorphism f : G → H,
+-- let K be a normal subgroup in G and φ the natural surjective homomorphism G → G/K
+-- (where G/K is the quotient group of G by K).
+-- If K is a subset of ker(f) then there exists a unique homomorphism h: G/K → H such that f = h∘φ.
+--     https://en.wikipedia.org/wiki/Fundamental_theorem_on_homomorphisms
+--
+--       f
+--    G --→ H
+--    |   /
+--  φ |  / h
+--    ↓ /
+--    G/K
+--
+
+import Relation.Binary.Reasoning.Setoid as EqReasoning
+
+_<_∙_> :  (m : Group c c )  →    Group.Carrier m →  Group.Carrier m →  Group.Carrier m
+m < x ∙ y > =  Group._∙_ m x y
+
+_<_≈_> :  (m : Group c c )  →    (f  g : Group.Carrier m ) → Set c
+m < x ≈ y > =  Group._≈_ m x y
+
+infixr 9 _<_∙_>
+
+--
+--  Coset : N : NormalSubGroup →  { a ∙ n | G ∋ a , N ∋ n }
+--
+
+open GroupMorphisms
+
+import Axiom.Extensionality.Propositional
+postulate f-extensionality : { n m : Level}  → Axiom.Extensionality.Propositional.Extensionality n m
+open import Tactic.MonoidSolver using (solve; solve-macro)
+
+
+record NormalSubGroup (A : Group c c )  : Set c  where
+   open Group A
+   field
+       ⟦_⟧ : Group.Carrier A → Group.Carrier A
+       normal :  IsGroupHomomorphism (GR A) (GR A)  ⟦_⟧
+       comm : {a b :  Carrier } → b ∙ ⟦ a ⟧  ≈ ⟦ a ⟧  ∙ b
+       --
+       factor : (a b : Carrier) → Carrier
+       is-factor : (a b : Carrier) →  b ∙ ⟦ factor a b ⟧ ≈ a
+
+-- Set of a ∙ ∃ n ∈ N
+--
+record an {A : Group c c }  (N : NormalSubGroup A ) (n x : Group.Carrier A  ) : Set c where
+    open Group A
+    open NormalSubGroup N
+    field
+        a : Group.Carrier A
+        aN=x :  a ∙ ⟦ n ⟧ ≈ x
+
+record aN {A : Group c c }  (N : NormalSubGroup A )  : Set c where
+    field
+        n : Group.Carrier A
+        is-an : (x : Group.Carrier A) → an N n x
+
+qid : {A : Group c c }  (N : NormalSubGroup A )  → aN N
+qid {A} N = record { n = ε ; is-an = λ x → record { a = x ; aN=x = ? } } where
+       open Group A
+       open NormalSubGroup N
+
+_/_ : (A : Group c c ) (N  : NormalSubGroup A ) → Group c c
+_/_ A N  = record {
+    Carrier  = aN N
+    ; _≈_      = λ f g → ⟦ n f ⟧ ≈ ⟦ n g ⟧
+    ; _∙_      = qadd
+    ; ε        = qid N
+    ; _⁻¹      = ?
+    ; isGroup = record { isMonoid  = record { isSemigroup = record { isMagma = record {
+       isEquivalence = record {refl = grefl ; trans = gtrans ; sym = gsym }
+       ; ∙-cong = λ {x} {y} {u} {v} x=y u=v → ? }
+       ; assoc = ? }
+       ; identity =  ? , (λ q → ? )  }
+       ; inverse   = ( (λ x → ? ) , (λ x → ? ))
+       ; ⁻¹-cong   = λ i=j → ?
+      }
+   } where
+       open Group A
+       open aN
+       open an
+       open NormalSubGroup N
+       open IsGroupHomomorphism normal
+       open EqReasoning (Algebra.Group.setoid A)
+       open Gutil A
+       qadd : (f g : aN N) → aN N
+       qadd f g = record { n = n f ∙ n g  ; is-an = λ x → record { a = x ⁻¹ ∙ ( a (is-an f x) ∙ a (is-an g x))  ; aN=x = qadd0 }  } where
+           qadd0 : {x : Carrier} →   x ⁻¹ ∙ (a (is-an f x) ∙ a (is-an g x)) ∙ ⟦ n f ∙ n g ⟧ ≈ x
+           qadd0 {x} = begin
+              x ⁻¹ ∙ (a (is-an f x) ∙ a (is-an g x)) ∙ ⟦ n f ∙ n g ⟧ ≈⟨ ? ⟩
+              x ⁻¹ ∙  (a (is-an f x) ∙ a (is-an g x) ∙ ⟦ n f ∙ n g ⟧) ≈⟨ ? ⟩
+              x ⁻¹ ∙  (a (is-an f x) ∙ a (is-an g x) ∙ ( ⟦ n f ⟧  ∙ ⟦ n g ⟧ )) ≈⟨ ? ⟩
+              x ⁻¹ ∙  (a (is-an f x) ∙ ( a (is-an g x) ∙  ⟦ n f ⟧)  ∙ ⟦ n g ⟧)  ≈⟨ ? ⟩
+              x ⁻¹ ∙  (a (is-an f x) ∙ ( ⟦ n f ⟧ ∙ a (is-an g x) )  ∙ ⟦ n g ⟧)  ≈⟨ ? ⟩
+              x ⁻¹ ∙  ((a (is-an f x) ∙ ⟦ n f ⟧ ) ∙ ( a (is-an g x)   ∙ ⟦ n g ⟧))  ≈⟨ ? ⟩
+              x ⁻¹ ∙  ((a (is-an f x) ∙ ⟦ n f ⟧ ) ∙ ( a (is-an g x)   ∙ ⟦ n g ⟧))  ≈⟨ ? ⟩
+              x ⁻¹ ∙  (x ∙ x)  ≈⟨ ? ⟩
+             x ∎
+
+-- K ⊂ ker(f)
+K⊆ker : (G H : Group c c)  (K : NormalSubGroup G) (f : Group.Carrier G → Group.Carrier H ) → Set c
+K⊆ker G H K f = (x : Group.Carrier G ) → f ( ⟦ x ⟧ ) ≈ ε   where
+  open Group H
+  open NormalSubGroup K
+
+open import Function.Surjection
+open import Function.Equality
+
+module GK (G : Group c c) (K : NormalSubGroup G) where
+    open Group G
+    open aN
+    open an
+    open NormalSubGroup K
+    open IsGroupHomomorphism normal
+    open EqReasoning (Algebra.Group.setoid G)
+    open Gutil G
+
+    φ : Group.Carrier G → Group.Carrier (G / K )
+    φ g = record { n = factor ε g ; is-an = λ x → record { a = x ∙ ( ⟦ factor ε g ⟧ ⁻¹)   ; aN=x = ?  } }
+
+    φ-homo : IsGroupHomomorphism (GR G) (GR (G / K)) φ
+    φ-homo = record {⁻¹-homo = λ g → ?  ; isMonoidHomomorphism = record { ε-homo = ? ; isMagmaHomomorphism = record { homo = ? ; isRelHomomorphism =
+       record { cong = ? } }}}
+
+    φe : (Algebra.Group.setoid G)  Function.Equality.⟶ (Algebra.Group.setoid (G / K))
+    φe = record { _⟨$⟩_ = φ ; cong = ?  }  where
+           φ-cong : {f g : Carrier } → f ≈ g  → ⟦ n (φ f ) ⟧ ≈ ⟦ n (φ g ) ⟧
+           φ-cong = ?
+
+    -- inverse ofφ
+    --  f = λ x → record { a = af ; n = fn ; aN=x = x ≈ af ∙ ⟦ fn ⟧  )   = (af)K  , fn ≡ factor x af , af ≡ a (f x)
+    --        (inv-φ f)K ≡ (af)K
+    --           φ (inv-φ f) x → f (h0 x)
+    --           f x → φ (inv-φ f) (h1 x)
+
+    inv-φ : Group.Carrier (G / K ) → Group.Carrier G
+    inv-φ f = ⟦ n f ⟧ ⁻¹
+
+
+    cong-i : {f g : Group.Carrier (G / K ) } → ⟦ n f ⟧ ≈ ⟦ n g ⟧ → inv-φ f ≈ inv-φ g
+    cong-i = ?
+
+    is-inverse : (f : aN K  ) →  ⟦ n (φ (inv-φ f) ) ⟧ ≈ ⟦ n f ⟧
+    is-inverse f = begin
+       ⟦ n (φ (inv-φ f) ) ⟧  ≈⟨ grefl  ⟩
+       ⟦ n (φ (⟦ n f  ⟧ ⁻¹) ) ⟧  ≈⟨ grefl  ⟩
+       ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧  ≈⟨ ? ⟩
+       ( ⟦ n f ⟧ ∙ ⟦ n f  ⟧ ⁻¹) ∙  ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧  ≈⟨ ? ⟩
+       ⟦ n f ⟧ ∙ ( ⟦ n f  ⟧ ⁻¹ ∙  ⟦ factor ε (⟦ n f  ⟧ ⁻¹) ⟧ ) ≈⟨ ∙-cong grefl (is-factor ε _ ) ⟩
+       ⟦ n f ⟧ ∙ ε  ≈⟨ ? ⟩
+       ⟦ n f ⟧ ∎
+
+    φ-surjective : Surjective φe
+    φ-surjective = record { from = record { _⟨$⟩_ = inv-φ ; cong = λ {f} {g} → cong-i {f} {g} }  ; right-inverse-of = is-inverse }
+
+    gk00 : {x : Carrier } → ⟦ factor ε x ⟧ ⁻¹ ≈ x
+    gk00 {x} = begin
+        ⟦ factor ε x ⟧ ⁻¹ ≈⟨ ? ⟩ 
+        ( x ⁻¹ ∙ ( x ∙ ⟦ factor ε x ⟧) ) ⁻¹ ≈⟨ ? ⟩ 
+        ( x ⁻¹ ∙ ( x ∙ ⟦ factor ε x ⟧) ) ⁻¹ ≈⟨ ⁻¹-cong (∙-cong grefl (is-factor ε x))  ⟩ 
+        ( x ⁻¹ ∙ ε ) ⁻¹ ≈⟨ ? ⟩ 
+        ( x ⁻¹  ) ⁻¹ ≈⟨ ? ⟩ 
+        x ∎
+
+    gk01 : (x : Group.Carrier (G / K ) ) → (G / K) < φ ( inv-φ x ) ≈ x >
+    gk01 x = begin
+        ⟦ factor ε ( inv-φ x) ⟧  ≈⟨ ? ⟩ 
+        ( inv-φ x ) ⁻¹ ∙ ( inv-φ x ∙ ⟦ factor ε ( inv-φ x) ⟧)  ≈⟨ ∙-cong grefl (is-factor ε _ ) ⟩ 
+        ( inv-φ x ) ⁻¹ ∙ ε  ≈⟨ ? ⟩ 
+        ( ⟦ n x ⟧  ⁻¹) ⁻¹   ≈⟨ ? ⟩ 
+        ⟦ n x ⟧ ∎
+
+
+record FundamentalHomomorphism (G H : Group c c )
+    (f : Group.Carrier G → Group.Carrier H )
+    (homo : IsGroupHomomorphism (GR G) (GR H) f )
+    (K : NormalSubGroup G ) (kf : K⊆ker G H K f) :  Set c where
+  open Group H
+  open GK G K
+  field
+    h : Group.Carrier (G / K ) → Group.Carrier H
+    h-homo :  IsGroupHomomorphism (GR (G / K) ) (GR H) h
+    is-solution : (x : Group.Carrier G)  →  f x ≈ h ( φ x )
+    unique : (h1 : Group.Carrier (G / K ) → Group.Carrier H)  → (homo : IsGroupHomomorphism (GR (G / K)) (GR H) h1 )
+       → ( (x : Group.Carrier G)  →  f x ≈ h1 ( φ x ) ) → ( ( x : Group.Carrier (G / K)) → h x ≈ h1 x )
+
+FundamentalHomomorphismTheorm : (G H : Group c c)
+    (f : Group.Carrier G → Group.Carrier H )
+    (homo : IsGroupHomomorphism (GR G) (GR H) f )
+    (K : NormalSubGroup G ) → (kf : K⊆ker G H K f)   → FundamentalHomomorphism G H f homo K kf
+FundamentalHomomorphismTheorm G H f homo K kf = record {
+     h = h
+   ; h-homo = h-homo
+   ; is-solution = is-solution
+   ; unique = unique
+  } where
+    open GK G K
+    open Group H
+    open Gutil H
+    open NormalSubGroup K
+    open IsGroupHomomorphism homo
+    open aN
+    h : Group.Carrier (G / K ) → Group.Carrier H
+    h r = f ( inv-φ r )
+    h03 : (x y : Group.Carrier (G / K ) ) →  h ( (G / K) < x ∙ y > ) ≈ h x ∙ h y
+    h03 x y = {!!}
+    h-homo :  IsGroupHomomorphism (GR (G / K ) ) (GR H) h
+    h-homo = record {
+     isMonoidHomomorphism = record {
+          isMagmaHomomorphism = record {
+             isRelHomomorphism = record { cong = λ {x} {y} eq → {!!} }
+           ; homo = h03 }
+        ; ε-homo = {!!} }
+       ; ⁻¹-homo = {!!} }
+    open EqReasoning (Algebra.Group.setoid H)
+    is-solution : (x : Group.Carrier G)  →  f x ≈ h ( φ x )
+    is-solution x = begin
+         f x ≈⟨ gsym ( ⟦⟧-cong (gk00 ))  ⟩
+         f ( Group._⁻¹ G  ⟦ factor (Group.ε G) x  ⟧   ) ≈⟨ grefl  ⟩
+         h ( φ x ) ∎ 
+    unique : (h1 : Group.Carrier (G / K ) → Group.Carrier H)  → (h1-homo : IsGroupHomomorphism (GR (G / K)) (GR H) h1 )
+       → ( (x : Group.Carrier G)  →  f x ≈ h1 ( φ x ) ) → ( ( x : Group.Carrier (G / K)) → h x ≈ h1 x )
+    unique h1 h1-homo h1-is-solution x = begin
+         h x ≈⟨ grefl ⟩
+         f ( inv-φ x ) ≈⟨ h1-is-solution _ ⟩
+         h1 ( φ ( inv-φ x ) ) ≈⟨ IsGroupHomomorphism.⟦⟧-cong h1-homo (gk01 x)  ⟩
+         h1 x ∎
+
+
+
+
+
+