diff src/free-monoid.agda @ 949:ac53803b3b2a

reorganization for apkg
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 21 Dec 2020 16:40:15 +0900
parents free-monoid.agda@3d41a8edbf63
children 40c39d3e6a75
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/free-monoid.agda	Mon Dec 21 16:40:15 2020 +0900
@@ -0,0 +1,352 @@
+-- Free Monoid and it's Universal Mapping 
+---- using Sets and forgetful functor
+
+-- Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+open import Category -- https://github.com/konn/category-agda                                                                                     
+open import Level
+module free-monoid { c c₁ c₂ ℓ : Level }   where
+
+open import Category.Sets
+open import Category.Cat
+open import HomReasoning
+open import cat-utility
+open import Relation.Binary.Core
+open import universal-mapping 
+open import  Relation.Binary.PropositionalEquality 
+
+-- from https://github.com/danr/Agda-projects/blob/master/Category-Theory/FreeMonoid.agda
+
+open import Algebra.FunctionProperties using (Op₁; Op₂)
+open import Algebra.Structures
+open import Data.Product
+
+
+record ≡-Monoid : Set (suc c) where
+  infixr 9 _∙_
+  field
+    Carrier  : Set c
+    _∙_      : Op₂ Carrier
+    ε        : Carrier
+    isMonoid : IsMonoid _≡_ _∙_ ε
+
+open ≡-Monoid
+
+≡-cong = Relation.Binary.PropositionalEquality.cong 
+
+-- module ≡-reasoning (m : ≡-Monoid ) where
+
+infixr 40 _::_
+data  List  (A : Set c ) : Set c where
+   [] : List A
+   _::_ : A → List A → List A
+
+
+infixl 30 _++_
+_++_ :   {A : Set c } → List A → List A → List A
+[]        ++ ys = ys
+(x :: xs) ++ ys = x :: (xs ++ ys)
+
+list-id-l : { A : Set c } → { x : List A } →  [] ++ x ≡ x
+list-id-l {_} {_} = refl
+list-id-r : { A : Set c } → { x : List A } →  x ++ [] ≡ x
+list-id-r {_} {[]} =   refl
+list-id-r {A} {x :: xs} =  ≡-cong ( λ y → x :: y ) ( list-id-r {A} {xs} ) 
+list-assoc : {A : Set c} → { xs ys zs : List A } →
+      ( xs ++ ( ys ++ zs ) ) ≡ ( ( xs ++ ys ) ++ zs )
+list-assoc  {_} {[]} {_} {_} = refl
+list-assoc  {A} {x :: xs}  {ys} {zs} = ≡-cong  ( λ y  → x :: y ) 
+         ( list-assoc {A} {xs} {ys} {zs} )
+list-o-resp-≈ :  {A : Set c} →  {f g : List A } → {h i : List A } → 
+                  f ≡  g → h ≡  i → (h ++ f) ≡  (i ++ g)
+list-o-resp-≈  {A} refl refl = refl
+list-isEquivalence : {A : Set c} → IsEquivalence {_} {_} {List A }  _≡_ 
+list-isEquivalence {A} =      -- this is the same function as A's equivalence but has different types
+   record { refl  = refl
+     ; sym   = sym
+     ; trans = trans
+     } 
+
+
+_<_∙_> :  (m : ≡-Monoid)  →   Carrier m → Carrier m → Carrier m
+m < x ∙ y > = _∙_ m x y
+
+infixr 9 _<_∙_>
+
+record Monomorph ( a b : ≡-Monoid )  : Set c where
+  field
+      morph : Carrier a → Carrier b  
+      identity     :  morph (ε a)  ≡  ε b
+      homo :  ∀{x y} → morph ( a < x ∙ y > ) ≡ b < morph  x  ∙ morph  y >
+
+open Monomorph
+
+_+_ : { a b c : ≡-Monoid } → Monomorph b c → Monomorph a b → Monomorph a c
+_+_ {a} {b} {c} f g =  record {
+      morph = λ x →  morph  f ( morph g x ) ;
+      identity  = identity1 ;
+      homo  = homo1 
+   } where
+      identity1 : morph f ( morph g (ε a) )  ≡  ε c
+      identity1 = let open ≡-Reasoning in begin
+             morph f (morph g (ε a))
+         ≡⟨  ≡-cong (morph f ) ( identity g )  ⟩
+             morph f (ε b)
+         ≡⟨  identity f  ⟩
+             ε c
+         ∎ 
+      homo1 :  ∀{x y} → morph f ( morph g ( a < x ∙  y > )) ≡ ( c <   (morph f (morph  g x )) ∙(morph f (morph  g y) ) > )
+      homo1 {x} {y} = let open ≡-Reasoning in begin
+             morph f (morph g (a < x ∙ y >))
+         ≡⟨  ≡-cong (morph f ) ( homo g) ⟩
+             morph f (b < morph g x ∙ morph g y >)
+         ≡⟨  homo f ⟩
+              c < morph f (morph g x) ∙ morph f (morph g y) >
+         ∎ 
+
+M-id : { a : ≡-Monoid } → Monomorph a a 
+M-id = record { morph = λ x → x  ; identity = refl ; homo = refl }
+
+_==_ : { a b : ≡-Monoid } → Monomorph a b → Monomorph a b → Set c 
+_==_  f g =  morph f ≡ morph g
+
+-- Functional Extensionality Axiom (We cannot prove this in Agda / Coq, just assumming )
+-- postulate extensionality : { a b : Obj A } {f g : Hom A a b } → (∀ {x} → (f x ≡ g x))  → ( f ≡ g ) 
+postulate extensionality : Relation.Binary.PropositionalEquality.Extensionality c c 
+
+isMonoids : IsCategory ≡-Monoid Monomorph _==_  _+_  (M-id)
+isMonoids  = record  { isEquivalence =  isEquivalence1 
+                    ; identityL =  refl
+                    ; identityR =  refl
+                    ; associative = refl
+                    ; o-resp-≈ =    λ {a} {b} {c} {f} {g} {h} {i} → o-resp-≈ {a} {b} {c} {f} {g} {h} {i}
+                    }
+     where
+        isEquivalence1 : { a b : ≡-Monoid } → IsEquivalence {_} {_} {Monomorph a b}  _==_ 
+        isEquivalence1  =      -- this is the same function as A's equivalence but has different types
+           record { refl  = refl
+             ; sym   = sym
+             ; trans = trans
+             } 
+        o-resp-≈ :  {a b c :  ≡-Monoid } {f g : Monomorph a b } → {h i : Monomorph b c }  → 
+                          f ==  g → h ==  i → (h + f) ==  (i + g)
+        o-resp-≈ {a} {b} {c} {f} {g} {h} {i} f==g h==i =  let open ≡-Reasoning in begin
+             morph ( h + f )
+         ≡⟨ ≡-cong ( λ  g → ( ( λ (x : Carrier a ) →  g x ) )) (extensionality {Carrier a} lemma11) ⟩
+             morph ( i + g )
+         ∎  
+             where
+                lemma11 : (x : Carrier a) → morph (h + f) x ≡ morph (i + g) x
+                lemma11 x =   let open ≡-Reasoning in begin
+                          morph ( h + f ) x
+                     ≡⟨⟩
+                          morph h ( ( morph f ) x )
+                     ≡⟨  ≡-cong ( \y -> morph h ( y x ) )  f==g ⟩
+                          morph h ( morph g x )
+                     ≡⟨  ≡-cong ( \y -> y ( morph g  x ) )  h==i ⟩
+                          morph i ( morph g x )
+                     ≡⟨⟩
+                          morph ( i + g ) x
+                     ∎
+
+
+
+
+Monoids : Category _ _ _
+Monoids  =
+  record { Obj =  ≡-Monoid 
+         ; Hom = Monomorph
+         ; _o_ = _+_  
+         ; _≈_ = _==_
+         ; Id  =  M-id
+         ; isCategory = isMonoids 
+           }
+
+A = Sets {c}
+B = Monoids  
+
+open Functor
+
+U : Functor B A
+U = record {
+       FObj = λ m → Carrier m ;
+       FMap = λ f → morph f ;
+       isFunctor = record {
+              ≈-cong   = λ x → x
+             ; identity = refl
+             ; distr    = refl
+       }
+   } 
+
+-- FObj 
+list  : (a : Set c) → ≡-Monoid
+list a = record {
+    Carrier    =  List a
+    ;  _∙_ = _++_
+    ; ε        = []
+    ; isMonoid = record {
+          identity = ( ( λ x → list-id-l {a}  ) , ( λ x → list-id-r {a} ) ) ;
+          isSemigroup = record {
+               assoc =  λ x → λ y → λ z → sym ( list-assoc {a} {x} {y} {z} )
+             ; isEquivalence = list-isEquivalence
+             ; ∙-cong = λ x → λ y →  list-o-resp-≈ y x
+          }
+      }
+    }
+
+Generator : Obj A → Obj B
+Generator s =  list s
+
+-- solution
+
+--   [a,b,c] → f(a) ∙ f(b) ∙ f(c)
+Φ :  {a : Obj A } {b : Obj B} ( f : Hom A a (FObj U b) ) →  List a → Carrier b
+Φ {a} {b} f [] = ε b
+Φ {a} {b} f ( x :: xs ) = b < ( f x ) ∙ (Φ {a} {b} f xs ) >
+
+solution : (a : Obj A ) (b : Obj B) ( f : Hom A a (FObj U b) ) →  Hom B (Generator a ) b 
+solution a b f = record {
+         morph = λ (l : List a) → Φ f l   ;
+         identity = refl;
+         homo = λ {x y} → homo1 x y 
+    } where
+        _*_ : Carrier b → Carrier b → Carrier b
+        _*_  f g = b <  f ∙ g >
+        homo1 : (x y : Carrier (Generator a)) → Φ f ( (Generator a) < x ∙  y > ) ≡ (Φ f x) * (Φ {a} {b} f y )
+        homo1 [] y = sym (proj₁ ( IsMonoid.identity ( isMonoid b) ) (Φ f y))
+        homo1 (x :: xs) y = let open ≡-Reasoning in 
+             sym ( begin
+                (Φ {a} {b} f (x :: xs)) * (Φ f y)
+             ≡⟨⟩
+                 ((f x) * (Φ f xs)) * (Φ f y)
+             ≡⟨ ( IsMonoid.assoc ( isMonoid b )) _ _ _ ⟩
+                (f x) * ( (Φ f xs)  * (Φ f y) )
+             ≡⟨ sym ( (IsMonoid.∙-cong (isMonoid b)) refl (homo1 xs y )) ⟩
+                (f x) * ( Φ f ( xs ++ y ) )
+             ≡⟨⟩
+                Φ {a} {b} f ( x :: ( xs ++ y ) )
+             ≡⟨⟩
+                Φ {a} {b} f ( (x ::  xs) ++ y ) 
+             ≡⟨⟩
+                Φ {a} {b} f ((Generator a) < ( x :: xs) ∙ y > ) 
+             ∎ )
+
+eta :  (a : Obj A) → Hom A a ( FObj U (Generator a) )
+eta  a = λ ( x : a ) →  x :: []
+
+FreeMonoidUniveralMapping : UniversalMapping A B U 
+FreeMonoidUniveralMapping = 
+    record {
+       F = Generator ;
+       η = eta ;
+       _* = λ {a b} → λ f → solution a b f ; 
+       isUniversalMapping = record {
+             universalMapping = λ {a b f} → universalMapping {a} {b} {f} ; 
+             uniquness = λ {a b f g} → uniquness {a} {b} {f} {g}
+       }
+    } where
+        universalMapping :  {a : Obj A } {b : Obj B} { f : Hom A a (FObj U b) } →  FMap U ( solution a b f  ) o eta a   ≡ f
+        universalMapping {a} {b} {f} = let open ≡-Reasoning in 
+                     begin
+                         FMap U ( solution a b f ) o eta a   
+                     ≡⟨⟩
+                         ( λ (x : a ) → Φ {a} {b} f (eta a x) )
+                     ≡⟨⟩
+                         ( λ (x : a ) → Φ {a} {b} f ( x :: [] ) )
+                     ≡⟨⟩
+                         ( λ (x : a ) →  b < ( f x ) ∙ (Φ {a} {b} f [] ) > )
+                     ≡⟨⟩
+                         ( λ (x : a ) →  b <    ( f x ) ∙ ( ε b ) > )
+                     ≡⟨ ≡-cong ( λ  g → ( ( λ (x : a ) →  g x ) )) (extensionality {a} lemma-ext1) ⟩
+                         ( λ (x : a ) →  f x  )
+                     ≡⟨⟩
+                          f
+                     ∎  where
+                        lemma-ext1 : ∀( x : a ) →  b <    ( f x ) ∙ ( ε b ) >  ≡ f x
+                        lemma-ext1 x = ( proj₂ ( IsMonoid.identity ( isMonoid b) ) ) (f x)
+        uniquness :  {a : Obj A } {b : Obj B} { f : Hom A a (FObj U b) } →
+             { g :  Hom B (Generator a) b } → (FMap U g) o (eta a )  ≡ f  → B [ solution a b f ≈ g ]
+        uniquness {a} {b} {f} {g} eq =  
+                     extensionality  lemma-ext2 where
+                        lemma-ext2 : ( ∀( x : List a ) → (morph ( solution a b f)) x  ≡ (morph g) x  )
+                        -- (morph ( solution a b f)) []  ≡ (morph g) []  )
+                        lemma-ext2 [] = let open ≡-Reasoning in
+                             begin
+                                (morph ( solution a b f)) []
+                             ≡⟨ identity ( solution a b f) ⟩
+                                ε b
+                             ≡⟨ sym ( identity g ) ⟩
+                                (morph g) []
+                             ∎  
+                        lemma-ext2 (x :: xs)  = let open ≡-Reasoning in
+                             begin
+                                (morph ( solution a b f)) ( x :: xs )
+                             ≡⟨ homo ( solution a b f) {x :: []} {xs} ⟩
+                                 b <   ((morph ( solution a b f)) ( x :: []) ) ∙ ((morph ( solution a b f)) xs ) >
+                             ≡⟨  ≡-cong ( λ  k → (b <   ((morph ( solution a b f)) ( x :: []) ) ∙ k > )) (lemma-ext2 xs )   ⟩
+                                 b <   ((morph ( solution a b f)) ( x :: []) )  ∙((morph g) ( xs )) >
+                             ≡⟨  ≡-cong ( λ k → ( b <   ( k x ) ∙ ((morph g) ( xs )) >  )) (
+                                 begin
+                                     ( λ x → (morph ( solution a b f)) ( x :: [] ) )
+                                 ≡⟨ extensionality {a} lemma-ext3 ⟩
+                                     ( λ x → (morph g) ( x :: [] ) )
+                                 ∎  
+                             ) ⟩
+                                 b <   ((morph g) ( x :: [] )) ∙((morph g) ( xs )) >
+                             ≡⟨ sym ( homo g ) ⟩
+                                (morph g) ( x :: xs )
+                             ∎   where
+                         lemma-ext3 :  ∀( x : a ) → (morph ( solution a b f)) (x :: [])  ≡ (morph g) ( x :: []  )
+                         lemma-ext3 x = let open ≡-Reasoning in
+                             begin
+                               (morph ( solution a b f)) (x :: [])
+                             ≡⟨  ( proj₂  ( IsMonoid.identity ( isMonoid b) )(f x) ) ⟩
+                                f x
+                             ≡⟨  sym ( ≡-cong (λ f → f x )  eq  ) ⟩
+                               (morph g) ( x :: []  )
+                             ∎   
+
+open NTrans
+--   fm-ε b = Φ
+
+fm-ε :  NTrans B B ( ( FunctorF A B FreeMonoidUniveralMapping) ○ U) identityFunctor
+fm-ε =  nat-ε A B FreeMonoidUniveralMapping 
+--   TMap = λ a  →  solution (FObj U a) a (λ x → x ) ;
+--   isNTrans = record {
+--        commute =  commute1 
+--     }
+--   } where
+--     commute1 :  {a b : Obj B} {f : Hom B a b} → let open ≈-Reasoning B  renaming (_o_ to _*_ ) in 
+--                ( FMap (identityFunctor {_} {_} {_} {B}) f * solution (FObj U a) a (λ x → x) ) ≈
+--                (  solution (FObj U b) b (λ x → x) * FMap (FunctorF A B FreeMonoidUniveralMapping ○ U) f )
+--     commute1 {a} {b} {f} = let open ≡-Reasoning in begin
+--              morph ((B ≈-Reasoning.o FMap identityFunctor f) (solution (FObj U a) a (λ x → x)))
+--         ≡⟨ {!!}  ⟩
+--             morph ((B ≈-Reasoning.o solution (FObj U b) b (λ x → x)) (FMap (FunctorF A B FreeMonoidUniveralMapping ○ U) f))
+--         ∎
+
+
+fm-η :  NTrans A A identityFunctor ( U ○ ( FunctorF A B FreeMonoidUniveralMapping) ) 
+fm-η =  record { 
+   TMap = λ a →  λ (x : a) → x :: [] ;
+   isNTrans =  record {
+       commute = commute1
+     }
+  } where
+     commute1 :  {a b : Obj A} {f : Hom A a b} → let open ≈-Reasoning A  renaming (_o_ to _*_ ) in 
+           (( FMap (U ○ FunctorF A B FreeMonoidUniveralMapping) f ) * (λ x → x :: []) ) ≈ ( (λ x → x :: []) * (λ z → FMap (identityFunctor {_} {_} {_} {A}) f z ) )
+     commute1 {a} {b} {f} =  refl   --    λ (x : a ) → f x :: []
+        
+
+-- A = Sets {c}
+-- B = Monoids  
+-- U   underline funcotr
+-- F   generator = x :: []
+-- Eta          x :: []
+-- Epsiron      morph = Φ
+
+adj = UMAdjunction A B U FreeMonoidUniveralMapping 
+
+ 
+
+