view em-category.agda @ 107:da14b7f03ff8

no yellow. ready to define category
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 31 Jul 2013 20:07:09 +0900
parents 4dec85377dbc
children e763efd30868
line wrap: on
line source

-- -- -- -- -- -- -- -- 
--  Monad to Eilenberg-Moore  Category
--  defines U^T and F^T as a resolution of Monad
--  checks Adjointness
-- 
--   Shinji KONO <kono@ie.u-ryukyu.ac.jp>
-- -- -- -- -- -- -- -- 

-- Monad
-- Category A
-- A = Category
-- Functor T : A → A
--T(a) = t(a)
--T(f) = tf(f)

open import Category -- https://github.com/konn/category-agda
open import Level
--open import Category.HomReasoning
open import HomReasoning
open import cat-utility
open import Category.Cat

module em-category { c₁ c₂ ℓ : Level} { A : Category c₁ c₂ ℓ }
                 { T : Functor A A }
                 { η : NTrans A A identityFunctor T }
                 { μ : NTrans A A (T ○ T) T }
                 { M : Monad A T η μ } where

--
--  Hom in Eilenberg-Moore Category
--
open Functor
open NTrans
record IsEMAlgebra (a : Obj A) (φ : Hom A (FObj T a) a ) : Set (c₁ ⊔ c₂ ⊔ ℓ) where
   field
       identity : A [ A [ φ  o TMap η a ] ≈ id1 A a ]
       eval     : A [ A [ φ  o TMap μ a ] ≈ A [ φ o FMap T φ ] ]
open IsEMAlgebra

record EMAlgebra (a : Obj A)  (φ : Hom A (FObj T a) a ) : Set (c₁ ⊔ c₂ ⊔ ℓ)  where
   obj : Obj A
   obj = a
   phi : Hom A (FObj T a) a
   phi = φ
   field
     isEMAlbgebra : IsEMAlgebra a φ 
open EMAlgebra
     
data EMObj {a : Obj A}  {φ : Hom A (FObj T a) a }  : Set ( c₁ ⊔ c₂  ⊔ ℓ) where
            emObj  : (EMAlgebra a φ) -> EMObj {a} {φ}

emobj : {a : Obj A} -> {φ : Hom A (FObj T a) a } -> EMObj {a} {φ} -> Obj A
emobj (emObj isAlgebra) = obj isAlgebra

emphi : {a : Obj A} -> {φ : Hom A (FObj T a) a } -> EMObj {a} {φ} -> Hom A (FObj T a) a
emphi (emObj isAlgebra) = phi isAlgebra 

record IsEMHom {x y : Obj A} {φ  : Hom A (FObj T x) x } {φ'  : Hom A (FObj T y) y }
              (a : EMObj {x} {φ}  ) 
              (b : EMObj {y} {φ'} ) 
              (α : Hom A x y) : Set ℓ where
   field
       homomorphism : A [ A [ φ'  o FMap T α ]  ≈ A [ α  o φ ] ]
open IsEMHom

record Eilenberg-Moore-Hom {x y : Obj A }
              {φ  : Hom A (FObj T x) x } 
              {φ' : Hom A (FObj T y) y } 
              (a : EMObj {x} {φ}) 
              (b : EMObj {y} {φ'}) 
              {α : Hom A x y} : Set (c₁ ⊔ c₂ ⊔ ℓ) where
   EMap    : Hom A x y
   EMap    = α
   field
       isEMHom : IsEMHom a b α
open Eilenberg-Moore-Hom

EMHom : {x y : Obj A} {φ : Hom A (FObj T x) x } {φ' : Hom A (FObj T y) y } {α : Hom A x y }
          (a : EMObj {x} {φ} ) (b : EMObj {y} {φ'} ) -> Set (c₁ ⊔ c₂ ⊔ ℓ)
EMHom {x} {y} {φ} {φ'} {α} a b = Eilenberg-Moore-Hom {x} {y} {φ} {φ'} a b {α}

Lemma-EM1 : {x : Obj A} {φ : Hom A (FObj T x) x} (a : EMObj {x} {φ})
               -> A [ A [ φ  o FMap T (id1 A x) ]  ≈ A [ (id1 A x) o φ ] ]
Lemma-EM1 {x} {φ} (emObj isAlgebra ) = let open ≈-Reasoning (A) in
   begin
       φ o FMap T (id1 A x)
   ≈⟨ cdr ( IsFunctor.identity (isFunctor T) ) ⟩
       φ o (id1 A (FObj T x))
   ≈⟨ idR ⟩
       φ 
   ≈⟨ sym idL ⟩
       (id1 A x)  o φ


EM-id : {x : Obj A} {φ : Hom A (FObj T x) x} {a : EMObj {x} {φ} } -> EMHom a a 
EM-id {x} {φ} {a = a} = record { 
     isEMHom = record { homomorphism = Lemma-EM1 {x} {φ} a } } 

open import Relation.Binary.Core

Lemma-EM2 : {x y z : Obj A}
            {φ   : Hom A  (FObj T x) x}
            {φ'  : Hom A  (FObj T y) y}
            {φ'' : Hom A  (FObj T z) z}
            {α  : Hom A x y}
            {α' : Hom A y z}
            (a : EMObj {x} {φ}   ) 
            (b : EMObj {y} {φ'}  ) 
            (c : EMObj {z} {φ''} ) 
            (g : EMHom {y} {z} {φ'} {φ''} {α'} b c )
            (f : EMHom {x} {y} {φ} {φ'} {α} a b)
                 -> A [ A [ φ''  o FMap T (A [ (EMap g)  o  (EMap f) ] ) ]  
                      ≈ A [ (A [ (EMap g)  o  (EMap f) ])  o φ ] ]
Lemma-EM2 {_} {_} {_} {φ} {φ'} {φ''} _ _ _ g f = let 
      open ≈-Reasoning (A) in
   begin
        φ''  o FMap T ((EMap g)  o  (EMap f))
   ≈⟨ cdr (distr T) ⟩
        φ''  o ( FMap T (EMap g)  o  FMap T (EMap f) )
   ≈⟨ assoc ⟩
        ( φ''  o FMap T (EMap g))  o  FMap T (EMap f) 
   ≈⟨ car (IsEMHom.homomorphism (isEMHom g)) ⟩
        ( EMap g o φ') o  FMap T (EMap f) 
   ≈⟨ sym assoc ⟩
        EMap g  o (φ' o  FMap T (EMap f) )
   ≈⟨ cdr (IsEMHom.homomorphism (isEMHom f)) ⟩
        EMap g  o (EMap f  o  φ)
   ≈⟨ assoc ⟩
        ( (EMap g)  o  (EMap f) )  o φ

_≗_ : { a : EMObj } { b : EMObj } (f g  : EMHom a b ) -> Set ℓ 
_≗_ f g = A [ EMap f ≈ EMap g ]

_∙_ : { a b c : EMObj } → 
                      ( EMHom b c) → (EMHom a b) → EMHom a c 
_∙_ {a} {b} {c} g f = record { isEMHom = record { homomorphism = Lemma-EM2 a b c g f } }

isEilenberg-MooreCategory : IsCategory EMObj EMHom _≗_ _∙_ EM-id 
isEilenberg-MooreCategory  = record  { isEquivalence =  isEquivalence 
                    ; identityL =   KidL
                    ; identityR =   KidR
                    ; o-resp-≈ =    Ko-resp
                    ; associative = Kassoc
                    }
     where
         open ≈-Reasoning (A) 
         isEquivalence :  { a b : EMObj } ->
               IsEquivalence {_} {_} {EMHom a b} _≗_
         isEquivalence {C} {D} =      -- this is the same function as A's equivalence but has different types
           record { refl  = refl-hom
             ; sym   = sym
             ; trans = trans-hom
             } 
         KidL : {C D : EMObj} -> {f : EMHom C D} → (EM-id ∙ f) ≗ f
         KidL {_} {_} {f} =  {!!} -- Lemma7 (EMap f) 
         KidR : {C D : EMObj} -> {f : EMHom C D} → (f ∙ EM-id) ≗ f
         KidR {_} {_} {f} =  {!!} -- Lemma8 (EMap f) 
         Ko-resp :  {a b c : EMObj} -> {f g : EMHom a b } → {h i : EMHom  b c } → 
                          f ≗ g → h ≗ i → (h ∙ f) ≗ (i ∙ g)
         Ko-resp {a} {b} {c} {f} {g} {h} {i} eq-fg eq-hi = {!!} -- Lemma10 {a} {b} {c} (EMap f) (EMap g) (EMap h) (EMap i) eq-fg eq-hi
         Kassoc :   {a b c d : EMObj} -> {f : EMHom c d } → {g : EMHom b c } → {h : EMHom a b } →
                          (f ∙ (g ∙ h)) ≗ ((f ∙ g) ∙ h)
         Kassoc {_} {_} {_} {_} {f} {g} {h} =  {!!} -- Lemma9 (EMap f) (EMap g) (EMap h) 

Eilenberg-MooreCategory : Category (c₁ ⊔ c₂ ⊔ ℓ) (c₁ ⊔ c₂ ⊔ ℓ) ℓ
Eilenberg-MooreCategory =
  record { Obj = EMObj
         ; Hom = EMHom
         ; _o_ = _∙_
         ; _≈_ = _≗_
         ; Id  = EM-id
         ; isCategory = isEilenberg-MooreCategory
         }

--
-- Resolution
--    T = U_T U_F
--      nat-ε
--      nat-η
--
-- 
-- 
-- U_T : Functor Eilenberg-MooreCategory A
-- U_T = record {
--         FObj = FObj T
--           ; FMap = ufmap
--         ; isFunctor = record
--         {      ≈-cong   = ≈-cong
--              ; identity = identity
--              ; distr    = distr1
--         }
--      } where
--         identity : {a : EMObj} →  A [ ufmap (EM-id {a}) ≈ id1 A (FObj T a) ]
--         identity {a} = let open ≈-Reasoning (A) in
--           begin
--               TMap μ (a)  o FMap T (TMap η a)
--           ≈⟨ IsMonad.unity2 (isMonad M) ⟩
--              id1 A (FObj T a)
--           ∎
--         ≈-cong : {a b : EMObj} {f g : EMHom a b} → A [ EMap f ≈ EMap g ] → A [ ufmap f ≈ ufmap g ]
--         ≈-cong {a} {b} {f} {g} f≈g = let open ≈-Reasoning (A) in
--           begin
--              TMap μ (b)  o FMap T (EMap f)
--           ≈⟨ cdr (fcong T f≈g) ⟩
--              TMap μ (b)  o FMap T (EMap g)
--           ∎
--         distr1 :  {a b c : EMObj} {f : EMHom a b} {g : EMHom b c} → A [ ufmap (g ∙ f) ≈ (A [ ufmap g o ufmap f ] )]
--         distr1 {a} {b} {c} {f} {g} = let open ≈-Reasoning (A) in
--           begin
--              ufmap (g ∙ f)
--           ≈⟨⟩
--              ufmap g o ufmap f
--           ∎
-- 
-- open MResolution
-- 
-- Resolution_T : MResolution A Eilenberg-MooreCategory T U_T F_T {nat-η} {nat-ε} {nat-μ} Adj_T 
-- Resolution_T = record {
--       T=UF   = Lemma11;
--       μ=UεF  = Lemma12 
--   }
-- 
-- -- end