Mercurial > hg > Members > kono > Proof > category
changeset 355:8fd085379380
add DataCategory Universal mapping
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 11 May 2015 11:16:24 +0900 |
parents | 2a83718f50a0 |
children | 500c813af3c9 |
files | code-data.agda limit-to.agda |
diffstat | 2 files changed, 240 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code-data.agda Mon May 11 11:16:24 2015 +0900 @@ -0,0 +1,228 @@ +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 code-data { c₁ c₂ ℓ : Level} { A : Category c₁ c₂ ℓ } where + +record DataObj : Set (c₁ ⊔ c₂ ⊔ ℓ) where + field + dom : Obj A + codom : Obj A + code : Hom A dom codom + rev-code : Hom A codom dom + id-left : A [ A [ code o rev-code ] ≈ id1 A codom ] + +open DataObj + +record isDataHom (a : DataObj ) (b : DataObj ) : Set (c₁ ⊔ c₂ ⊔ ℓ) where + field + history : Hom A (codom a) (dom b) + data-dom = a + data-codom = b + +open isDataHom + +DataHom : (a : DataObj ) (b : DataObj ) → Set (c₁ ⊔ c₂ ⊔ ℓ) +DataHom = λ a b → isDataHom a b + +DataId : { a : DataObj } → DataHom a a +DataId {a} = record { + history = rev-code a + } + +_∙_ : {a b c : DataObj } → DataHom b c → DataHom a b → DataHom a c +_∙_ {a} {b} {c} g f = record { history = A [ history g o A [ code b o history f ] ] } + +_≗_ : {a : DataObj } {b : DataObj } (f g : DataHom a b ) → Set ℓ +_≗_ {a} {b} f g = A [ A [ code b o history f ] ≈ A [ code b o history g ] ] + +open import Relation.Binary.Core + +iDataCategory : IsCategory DataObj DataHom _≗_ _∙_ DataId +iDataCategory = record { isEquivalence = isEquivalence + ; identityL = \{a} {b} {f} -> identityL a b f + ; identityR = \{a} {b} {f} -> identityR a b f + ; o-resp-≈ = \{a} {b} {c} {f} {g} {h} {i} -> o-resp {a} {b} {c} {f} {g} {h} {i} + ; associative = \{a} {b} {c} {d} {f} {g} {h} -> associative a b c d f g h + } + where + open ≈-Reasoning (A) + o-resp : {A B C : DataObj} {f g : DataHom A B} {h i : DataHom B C} → f ≗ g → h ≗ i → (h ∙ f) ≗ (i ∙ g) + o-resp {a} {b} {c} {f} {g} {h} {i} f≗g h≗i = begin + code c o history (h ∙ f) + ≈⟨⟩ + code c o history h o code b o history f + ≈⟨ cdr ( cdr ( f≗g ) ) ⟩ + code c o history h o code b o history g + ≈⟨ assoc ⟩ + (code c o history h ) o code b o history g + ≈⟨ car h≗i ⟩ + (code c o history i ) o code b o history g + ≈⟨ sym assoc ⟩ + code c o history i o code b o history g + ≈⟨⟩ + code c o history (i ∙ g) + ∎ + associative : (a b c d : DataObj) (f : DataHom c d) (g : DataHom b c) (h : DataHom a b) → (f ∙ (g ∙ h)) ≗ ((f ∙ g) ∙ h) + associative a b c d f g h = begin + code d o history (f ∙ (g ∙ h)) + ≈⟨⟩ + code d o history f o code c o history g o code b o history h + ≈⟨ cdr (cdr assoc ) ⟩ + code d o history f o (code c o history g) o code b o history h + ≈⟨ cdr assoc ⟩ + code d o (history f o code c o history g) o code b o history h + ≈⟨⟩ + code d o history ((f ∙ g) ∙ h) + ∎ + identityL : (a : DataObj) (b : DataObj) (f : DataHom a b) → (DataId ∙ f) ≗ f + identityL a b f = begin + code b o history (DataId ∙ f) + ≈⟨⟩ + code b o ( rev-code b o (code b o history f )) + ≈⟨ assoc ⟩ + (code b o rev-code b ) o ( code b o history f ) + ≈⟨ car (id-left b ) ⟩ + id1 A (codom b) o ( code b o history f ) + ≈⟨ idL ⟩ + code b o history f + ∎ + identityR : (a : DataObj) (b : DataObj) (f : DataHom a b) → (f ∙ DataId ) ≗ f + identityR a b f = begin + code b o history (f ∙ DataId) + ≈⟨⟩ + code b o ( history f o ( code a o rev-code a ) ) + ≈⟨ cdr (cdr (id-left a)) ⟩ + code b o ( history f o id1 A (codom a) ) + ≈⟨ cdr idR ⟩ + code b o history f + ∎ + isEquivalence : {a : DataObj } {b : DataObj } → + IsEquivalence {_} {_} {DataHom 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 + } +DataCategory : Category (c₁ ⊔ c₂ ⊔ ℓ) (c₁ ⊔ c₂ ⊔ ℓ) ℓ +DataCategory = + record { Obj = DataObj + ; Hom = DataHom + ; _o_ = _∙_ + ; _≈_ = _≗_ + ; Id = DataId + ; isCategory = iDataCategory + } + + + +open Functor +open NTrans + +F : Obj A -> Obj DataCategory +F d = record { + dom = d + ; codom = d + ; code = id1 A d + ; rev-code = id1 A d + ; id-left = idL + } where open ≈-Reasoning (A) + +U : Functor DataCategory A +U = record { + FObj = \d -> codom d + ; FMap = \f -> A [ code ( data-codom f ) o history f ] + ; isFunctor = record { + ≈-cong = \{a} {b} {f} {g} -> ≈-cong-1 {a} {b} {f} {g} + ; identity = \{a} -> identity-1 {a} + ; distr = \{a b c f g} -> distr-1 {a} {b} {c} {f} {g} + } + } where + open ≈-Reasoning (A) + ≈-cong-1 : {a : Obj DataCategory} {b : Obj DataCategory} {f g : Hom DataCategory a b} → DataCategory [ f ≈ g ] → + A [ A [ code (data-codom f) o history f ] ≈ A [ code (data-codom g) o history g ] ] + ≈-cong-1 {a} {b} {f} {g} f≈g = begin + code (data-codom f) o history f + ≈⟨⟩ + code b o history f + ≈⟨ f≈g ⟩ + code b o history g + ≈⟨⟩ + code (data-codom g) o history g + ∎ + identity-1 : {a : Obj DataCategory} → A [ A [ code (data-codom (DataId {a})) o history (DataId {a}) ] ≈ id1 A (codom a) ] + identity-1 {a} = begin + code (data-codom (DataId {a} )) o history (DataId {a} ) + ≈⟨⟩ + code a o rev-code a + ≈⟨ id-left a ⟩ + id1 A (codom a) + ∎ + distr-1 : {a b c : Obj DataCategory} {f : Hom DataCategory a b} {g : Hom DataCategory b c} → + A [ A [ code (data-codom ( g ∙ f )) o history ( g ∙ f ) ] ≈ + A [ A [ code (data-codom g) o history g ] o A [ code (data-codom f) o history f ] ] ] + distr-1 {a} {b} {c} {f} {g} = begin + code (data-codom (g ∙ f )) o history ( g ∙ f ) + ≈⟨⟩ + code c o history g o code b o history f + ≈⟨ assoc ⟩ + (code c o history g ) o code b o history f + ≈⟨⟩ + ( code (data-codom g) o history g ) o ( code (data-codom f) o history f ) + ∎ + +eta-map : (a : Obj A) → Hom A a ( FObj U (F a) ) +eta-map a = id1 A a + + +Lemma1 : UniversalMapping A DataCategory U F eta-map +Lemma1 = record { + _* = solution ; + isUniversalMapping = record { + universalMapping = \{a} {b} {f} -> universalMapping {a} {b} {f} ; + uniquness = \{a} {b} {f} {g} -> uniqueness {a} {b} {f} {g} + } + } where + open ≈-Reasoning (A) + solution : {a : Obj A} {b : Obj DataCategory} → Hom A a (FObj U b) → Hom DataCategory (F a) b + solution {a} {b} f = record { history = A [ rev-code b o f ] } + universalMapping : {a : Obj A} {b : Obj DataCategory} {f : Hom A a (FObj U b)} → A [ A [ FMap U (solution {a} {b} f) o eta-map a ] ≈ f ] + universalMapping {a} {b} {f} = begin + FMap U (solution {a} {b} f) o eta-map a + ≈⟨⟩ + (code b o ( rev-code b o f)) o id1 A a + ≈⟨ idR ⟩ + code b o ( rev-code b o f) + ≈⟨ assoc ⟩ + (code b o rev-code b ) o f + ≈⟨ car (id-left b) ⟩ + id1 A (codom b) o f + ≈⟨ idL ⟩ + f + ∎ + uniqueness : {a : Obj A} {b : Obj DataCategory} {f : Hom A a (FObj U b)} + {g : Hom DataCategory (F a) b} → + A [ A [ FMap U g o eta-map a ] ≈ f ] → + DataCategory [ solution f ≈ g ] + uniqueness {a} {b} {f} {g} Uη≈f = begin + code b o history (solution {a} {b} f) + ≈⟨⟩ + code b o ( rev-code b o f) + ≈⟨ sym ( cdr ( cdr Uη≈f )) ⟩ + code b o rev-code b o ( code b o history g ) o id1 A (codom (F a)) + ≈⟨ assoc ⟩ + (code b o rev-code b ) o ( code b o history g ) o id1 A (codom (F a)) + ≈⟨ car ( id-left b) ⟩ + id1 A (codom b ) o ( code b o history g ) o id1 A (codom (F a)) + ≈⟨ idL ⟩ + ( code b o history g ) o id1 A (codom (F a)) + ≈⟨ idR ⟩ + code b o history g + ∎ + + + +
--- a/limit-to.agda Thu Apr 02 22:49:13 2015 +0900 +++ b/limit-to.agda Mon May 11 11:16:24 2015 +0900 @@ -20,14 +20,25 @@ --- ------> --- g +postulate φ id-0 id-1 f g : Set c₂ + infixr 40 _::_ data List {a} (A : Set a) : Set a where [] : List A _::_ : A -> List A -> List A +data Maybe {a} (A : Set a) : Set a where + nothing : Maybe A + just : A -> Maybe A -postulate id-0 id-1 f g : Set c₂ +memberp1 : {a : Level } -> {A : Set a} → A → List A → {!!} -> Maybe A +memberp1 = {!!} + +memberp : {a : Level } -> {A : Set a} → A → List A → Maybe A +memberp _ [] = nothing +memberp x ( H :: T ) = memberp1 x T ( x ≡ H ) + data Two {c₁} : Set c₁ where