Mercurial > hg > Members > kono > Proof > category
changeset 457:0ba86e29f492
limit-to and discrete clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 02 Mar 2017 18:30:58 +0900 |
parents | 4d97955ea419 |
children | fd79b6d9f350 |
files | discrete.agda limit-to.agda |
diffstat | 2 files changed, 156 insertions(+), 741 deletions(-) [+] |
line wrap: on
line diff
--- a/discrete.agda Thu Mar 02 17:41:20 2017 +0900 +++ b/discrete.agda Thu Mar 02 18:30:58 2017 +0900 @@ -4,14 +4,6 @@ module discrete where open import Relation.Binary.Core -open import Relation.Nullary -open import Data.Empty -open import Data.Unit -open import Data.Maybe -open import cat-utility -open import HomReasoning - -open Functor data TwoObject {c₁ : Level} : Set c₁ where t0 : TwoObject @@ -25,6 +17,8 @@ --- 0 1 --- -----→ --- g +-- +-- missing arrows are constrainted by TwoHom data data TwoHom {c₁ c₂ : Level } : TwoObject {c₁} → TwoObject {c₁} → Set c₂ where id-t0 : TwoHom t0 t0 @@ -57,21 +51,19 @@ {g : (TwoHom {c₁} {c₂ } b c )} → {h : (TwoHom {c₁} {c₂ } a b )} → ( f × (g × h)) ≡ ((f × g) × h ) -assoc-× {c₁} {c₂} {a} {b} {c} {d} {f} {g} {h} with f | g | h -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} | id-t0 | id-t0 | id-t0 = refl -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} | arrow-f | id-t0 | id-t0 = refl -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} | arrow-g | id-t0 | id-t0 = refl -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} | id-t1 | arrow-f | id-t0 = refl -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} | id-t1 | arrow-g | id-t0 = refl -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} | id-t1 | id-t1 | arrow-f = refl -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} | id-t1 | id-t1 | arrow-g = refl -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} | id-t1 | id-t1 | id-t1 = refl +assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} { id-t0 }{ id-t0 }{ id-t0 } = refl +assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} { arrow-f }{ id-t0 }{ id-t0 } = refl +assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} { arrow-g }{ id-t0 }{ id-t0 } = refl +assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} { id-t1 }{ arrow-f }{ id-t0 } = refl +assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} { id-t1 }{ arrow-g }{ id-t0 } = refl +assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} { id-t1 }{ id-t1 }{ arrow-f } = refl +assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} { id-t1 }{ id-t1 }{ arrow-g } = refl +assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} { id-t1 }{ id-t1 }{ id-t1 } = refl TwoId : {c₁ c₂ : Level } (a : TwoObject {c₁} ) → (TwoHom {c₁} {c₂ } a a ) TwoId {_} {_} t0 = id-t0 TwoId {_} {_} t1 = id-t1 -open import Relation.Binary open import Relation.Binary.PropositionalEquality renaming ( cong to ≡-cong ) TwoCat : {c₁ c₂ : Level } → Category c₁ c₂ c₂ @@ -90,17 +82,15 @@ } } where identityL : {c₁ c₂ : Level } {A B : TwoObject {c₁}} {f : ( TwoHom {c₁} {c₂ } A B) } → ((TwoId B) × f) ≡ f - identityL {c₁} {c₂} {a} {b} {f} with f - identityL {c₁} {c₂} {t1} {t1} | id-t1 = refl - identityL {c₁} {c₂} {t0} {t0} | id-t0 = refl - identityL {c₁} {c₂} {t0} {t1} | arrow-f = refl - identityL {c₁} {c₂} {t0} {t1} | arrow-g = refl + identityL {c₁} {c₂} {t1} {t1} { id-t1 } = refl + identityL {c₁} {c₂} {t0} {t0} { id-t0 } = refl + identityL {c₁} {c₂} {t0} {t1} { arrow-f } = refl + identityL {c₁} {c₂} {t0} {t1} { arrow-g } = refl identityR : {c₁ c₂ : Level } {A B : TwoObject {c₁}} {f : ( TwoHom {c₁} {c₂ } A B) } → ( f × TwoId A ) ≡ f - identityR {c₁} {c₂} {_} {_} {f} with f - identityR {c₁} {c₂} {t1} {t1} | id-t1 = refl - identityR {c₁} {c₂} {t0} {t0} | id-t0 = refl - identityR {c₁} {c₂} {t0} {t1} | arrow-f = refl - identityR {c₁} {c₂} {t0} {t1} | arrow-g = refl + identityR {c₁} {c₂} {t1} {t1} { id-t1 } = refl + identityR {c₁} {c₂} {t0} {t0} { id-t0 } = refl + identityR {c₁} {c₂} {t0} {t1} { arrow-f } = refl + identityR {c₁} {c₂} {t0} {t1} { arrow-g } = refl o-resp-≈ : {c₁ c₂ : Level } {A B C : TwoObject {c₁} } {f g : ( TwoHom {c₁} {c₂ } A B)} {h i : ( TwoHom B C)} → f ≡ g → h ≡ i → ( h × f ) ≡ ( i × g ) o-resp-≈ {c₁} {c₂} {a} {b} {c} {f} {g} {h} {i} f==g h==i = @@ -116,190 +106,3 @@ ( i × g ) ∎ -indexFunctor : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) ( a b : Obj A) ( f g : Hom A a b ) → Functor (TwoCat {c₁} {c₂}) A -indexFunctor {c₁} {c₂} {ℓ} A a b f g = record { - FObj = λ a → fobj a - ; FMap = λ {a} {b} f → fmap {a} {b} f - ; isFunctor = record { - identity = λ{x} → identity x - ; distr = λ {a} {b} {c} {f} {g} → distr1 {a} {b} {c} {f} {g} - ; ≈-cong = λ {a} {b} {c} {f} → ≈-cong {a} {b} {c} {f} - } - } where - T = TwoCat {c₁} {c₂} - fobj : Obj T → Obj A - fobj t0 = a - fobj t1 = b - fmap : {x y : Obj T } → (Hom T x y ) → Hom A (fobj x) (fobj y) - fmap {t0} {t0} id-t0 = id1 A a - fmap {t1} {t1} id-t1 = id1 A b - fmap {t0} {t1} arrow-f = f - fmap {t0} {t1} arrow-g = g - ≈-cong : {a : Obj T} {b : Obj T} {f g : Hom T a b} → T [ f ≈ g ] → A [ fmap f ≈ fmap g ] - ≈-cong {a} {b} {f} {.f} refl = let open ≈-Reasoning A in refl-hom - identity : (x : Obj T ) -> A [ fmap (id1 T x) ≈ id1 A (fobj x) ] - identity t0 = let open ≈-Reasoning A in refl-hom - identity t1 = let open ≈-Reasoning A in refl-hom - distr1 : {a : Obj T} {b : Obj T} {c : Obj T} {f : Hom T a b} {g : Hom T b c} → - A [ fmap (T [ g o f ]) ≈ A [ fmap g o fmap f ] ] - distr1 {a} {b} {c} {f} {g} with f | g - distr1 {t0} {t0} {t0} {f} {g} | id-t0 | id-t0 = let open ≈-Reasoning A in sym-hom idL - distr1 {t1} {t1} {t1} {f} {g} | id-t1 | id-t1 = let open ≈-Reasoning A in begin - id1 A b - ≈↑⟨ idL ⟩ - id1 A b o id1 A b - ∎ - distr1 {t0} {t0} {t1} {f} {g} | id-t0 | arrow-f = let open ≈-Reasoning A in begin - fmap (comp arrow-f id-t0) - ≈⟨⟩ - fmap arrow-f - ≈↑⟨ idR ⟩ - fmap arrow-f o id1 A a - ∎ - distr1 {t0} {t0} {t1} {f} {g} | id-t0 | arrow-g = let open ≈-Reasoning A in begin - fmap (comp arrow-g id-t0) - ≈⟨⟩ - fmap arrow-g - ≈↑⟨ idR ⟩ - fmap arrow-g o id1 A a - ∎ - distr1 {t0} {t1} {t1} {f} {g} | arrow-f | id-t1 = let open ≈-Reasoning A in begin - fmap (comp id-t1 arrow-f) - ≈⟨⟩ - fmap arrow-f - ≈↑⟨ idL ⟩ - id1 A b o fmap arrow-f - ∎ - distr1 {t0} {t1} {t1} {f} {g} | arrow-g | id-t1 = let open ≈-Reasoning A in begin - fmap (comp id-t1 arrow-g) - ≈⟨⟩ - fmap arrow-g - ≈↑⟨ idL ⟩ - id1 A b o fmap arrow-g - ∎ - ---- Equalizer ---- f ---- e -----→ ---- c -----→ a b ---- ^ / -----→ ---- |k h g ---- | / ---- | / ^ ---- | / | ---- |/ | Γ ---- d _ | ---- |\ | ---- \ K af ---- \ -----→ ---- \ t0 t1 ---- -----→ ---- ag ---- ---- - -open Complete -open Limit -open NTrans - -equlimit : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) {a b : Obj A} -> (f g : Hom A a b) (comp : Complete A (TwoCat {c₁} {c₂} )) -> - Hom A ( limit-c comp (indexFunctor {c₁} {c₂} {ℓ} A a b f g)) a -equlimit {c₁} {c₂} {ℓ} A {a} {b} f g comp = ? -- TMap (limit-u comp (indexFunctor {c₁} {c₂} {ℓ} A a b f g)) t0 - -lim-to-equ : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) - (comp : Complete A (TwoCat {c₁} {c₂} ) ) - → {a b : Obj A} (f g : Hom A a b ) - → (fe=ge : A [ A [ f o (equlimit A f g comp ) ] ≈ A [ g o (equlimit A f g comp ) ] ] ) - → IsEqualizer A (equlimit A f g comp ) f g -lim-to-equ {c₁} {c₂} {ℓ} A comp {a} {b} f g fe=ge = record { - fe=ge = fe=ge - ; k = λ {d} h fh=gh → k {d} h fh=gh - ; ek=h = λ {d} {h} {fh=gh} → ek=h d h fh=gh - ; uniqueness = λ {d} {h} {fh=gh} {k'} → uniquness d h fh=gh k' - } where - I = TwoCat {c₁} {c₂} - Γ : Functor I A - Γ = indexFunctor {c₁} {c₂} {ℓ} A a b f g - c = limit-c comp Γ - k : {d : Obj A} (h : Hom A d a) → A [ A [ f o h ] ≈ A [ g o h ] ] → Hom A d c - nmap : (x : Obj I ) ( d : Obj (A) ) (h : Hom A d a ) → Hom A (FObj (K A I d) x) (FObj Γ x) - nmap x d h with x - ... | t0 = h - ... | t1 = A [ f o h ] - commute1 : {x y : Obj I} {f' : Hom I x y} (d : Obj A) (h : Hom A d a ) → A [ A [ f o h ] ≈ A [ g o h ] ] - → A [ A [ FMap Γ f' o nmap x d h ] ≈ A [ nmap y d h o FMap (K A I d) f' ] ] - commute1 {x} {y} {f'} d h fh=gh with f' - commute1 {t0} {t1} {f'} d h fh=gh | arrow-f = let open ≈-Reasoning A in begin - f o h - ≈↑⟨ idR ⟩ - (f o h ) o id1 A d - ∎ - commute1 {t0} {t1} {f'} d h fh=gh | arrow-g = let open ≈-Reasoning A in begin - g o h - ≈↑⟨ fh=gh ⟩ - f o h - ≈↑⟨ idR ⟩ - (f o h ) o id1 A d - ∎ - commute1 {t0} {t0} {f'} d h fh=gh | id-t0 = let open ≈-Reasoning A in begin - id1 A a o h - ≈⟨ idL ⟩ - h - ≈↑⟨ idR ⟩ - h o id1 A d - ∎ - commute1 {t1} {t1} {f'} d h fh=gh | id-t1 = let open ≈-Reasoning A in begin - id1 A b o ( f o h ) - ≈⟨ idL ⟩ - f o h - ≈↑⟨ idR ⟩ - ( f o h ) o id1 A d - ∎ - nat1 : (d : Obj A) → (h : Hom A d a ) → A [ A [ f o h ] ≈ A [ g o h ] ] → NTrans I A (K A I d) Γ - nat1 d h fh=gh = record { - TMap = λ x → nmap x d h ; - isNTrans = record { - commute = λ {x} {y} {f'} → commute1 {x} {y} {f'} d h fh=gh - } - } - e = equlimit A f g comp - eqlim = isLimit comp Γ (nat1 c e fe=ge ) - k {d} h fh=gh = limit eqlim d (nat1 d h fh=gh ) - ek=h : (d : Obj A ) (h : Hom A d a ) → ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ] ) → A [ A [ e o k h fh=gh ] ≈ h ] - ek=h d h fh=gh = let open ≈-Reasoning A in begin - e o k h fh=gh - ≈⟨ t0f=t eqlim {d} {nat1 d h fh=gh} {t0} ⟩ - h - ∎ - uniq-nat : {i : Obj I} → (d : Obj A ) (h : Hom A d a ) ( k' : Hom A d c ) - ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ]) → A [ A [ e o k' ] ≈ h ] → - A [ A [ TMap (nat1 c e fe=ge ) i o k' ] ≈ TMap (nat1 d h fh=gh) i ] - uniq-nat {t0} d h k' fh=gh ek'=h = let open ≈-Reasoning A in begin - (nmap t0 c e ) o k' - ≈⟨⟩ - e o k' - ≈⟨ ek'=h ⟩ - h - ≈⟨⟩ - nmap t0 d h - ∎ - uniq-nat {t1} d h k' fh=gh ek'=h = let open ≈-Reasoning A in begin - (nmap t1 c e ) o k' - ≈⟨⟩ - (f o e ) o k' - ≈↑⟨ assoc ⟩ - f o ( e o k' ) - ≈⟨ cdr ek'=h ⟩ - f o h - ≈⟨⟩ - TMap (nat1 d h fh=gh) t1 - ∎ - uniquness : (d : Obj A ) (h : Hom A d a ) → ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ] ) → - ( k' : Hom A d c ) - → A [ A [ e o k' ] ≈ h ] → A [ k h fh=gh ≈ k' ] - uniquness d h fh=gh k' ek'=h = let open ≈-Reasoning A in begin - k h fh=gh - ≈⟨ limit-uniqueness eqlim k' ( λ{i} → uniq-nat {i} d h k' fh=gh ek'=h ) ⟩ - k' - ∎ -
--- a/limit-to.agda Thu Mar 02 17:41:20 2017 +0900 +++ b/limit-to.agda Thu Mar 02 18:30:58 2017 +0900 @@ -6,423 +6,14 @@ open import cat-utility open import HomReasoning open import Relation.Binary.Core -open import Data.Maybe -open Functor - - - --- If we have limit then we have equalizer ---- two objects category ---- ---- f ---- -----→ ---- 0 1 ---- -----→ ---- g - - - -data TwoObject {c₁ : Level} : Set c₁ where - t0 : TwoObject - t1 : TwoObject - --- constrainted arrow --- we need inverse of f to complete cases -data Arrow {c₁ c₂ : Level } ( t00 t11 : TwoObject {c₁} ) : TwoObject {c₁} → TwoObject {c₁} → Set c₂ where - id-t0 : Arrow t00 t11 t00 t00 - id-t1 : Arrow t00 t11 t11 t11 - arrow-f : Arrow t00 t11 t00 t11 - arrow-g : Arrow t00 t11 t00 t11 - inv-f : Arrow t00 t11 t11 t00 - -record TwoHom {c₁ c₂ : Level} (a b : TwoObject {c₁} ) : Set c₂ where - field - hom : Maybe ( Arrow {c₁} {c₂} t0 t1 a b ) - -open TwoHom - --- arrow composition - - -comp : ∀ {c₁ c₂} → {a b c : TwoObject {c₁}} → Maybe ( Arrow {c₁} {c₂} t0 t1 b c ) → Maybe ( Arrow {c₁} {c₂} t0 t1 a b ) → Maybe ( Arrow {c₁} {c₂} t0 t1 a c ) -comp {_} {_} {_} {_} {_} nothing _ = nothing -comp {_} {_} {_} {_} {_} (just _ ) nothing = nothing -comp {_} {_} {t0} {t1} {t1} (just id-t1 ) ( just arrow-f ) = just arrow-f -comp {_} {_} {t0} {t1} {t1} (just id-t1 ) ( just arrow-g ) = just arrow-g -comp {_} {_} {t1} {t1} {t1} (just id-t1 ) ( just id-t1 ) = just id-t1 -comp {_} {_} {t1} {t1} {t0} (just inv-f ) ( just id-t1 ) = just inv-f -comp {_} {_} {t0} {t0} {t1} (just arrow-f ) ( just id-t0 ) = just arrow-f -comp {_} {_} {t0} {t0} {t1} (just arrow-g ) ( just id-t0 ) = just arrow-g -comp {_} {_} {t0} {t0} {t0} (just id-t0 ) ( just id-t0 ) = just id-t0 -comp {_} {_} {t1} {t0} {t0} (just id-t0 ) ( just inv-f ) = just inv-f -comp {_} {_} {_} {_} {_} (just _ ) ( just _ ) = nothing - - -_×_ : ∀ {c₁ c₂} → {a b c : TwoObject {c₁}} → ( TwoHom {c₁} {c₂} b c ) → ( TwoHom {c₁} {c₂} a b ) → ( TwoHom {c₁} {c₂} a c ) -_×_ {c₁} {c₂} {a} {b} {c} f g = record { hom = comp {c₁} {c₂} {a} {b} {c} (hom f) (hom g ) } - - -_==_ : ∀{ c₁ c₂ a b } → Rel (Maybe (Arrow {c₁} {c₂} t0 t1 a b )) (c₂) -_==_ = Eq _≡_ - -map2hom : ∀{ c₁ c₂ } → {a b : TwoObject {c₁}} → Maybe ( Arrow {c₁} {c₂} t0 t1 a b ) → TwoHom {c₁} {c₂ } a b -map2hom {_} {_} {t1} {t1} (just id-t1) = record { hom = just id-t1 } -map2hom {_} {_} {t0} {t1} (just arrow-f) = record { hom = just arrow-f } -map2hom {_} {_} {t0} {t1} (just arrow-g) = record { hom = just arrow-g } -map2hom {_} {_} {t0} {t0} (just id-t0) = record { hom = just id-t0 } -map2hom {_} {_} {_} {_} _ = record { hom = nothing } - -record TwoHom1 {c₁ c₂ : Level} (a : TwoObject {c₁} ) (b : TwoObject {c₁} ) : Set c₂ where - field - Map : TwoHom {c₁} {c₂ } a b - iso-Map : Map ≡ map2hom ( hom Map ) - -open TwoHom1 - -==refl : ∀{ c₁ c₂ a b } → ∀ {x : Maybe (Arrow {c₁} {c₂} t0 t1 a b )} → x == x -==refl {_} {_} {_} {_} {just x} = just refl -==refl {_} {_} {_} {_} {nothing} = nothing - -==sym : ∀{ c₁ c₂ a b } → ∀ {x y : Maybe (Arrow {c₁} {c₂} t0 t1 a b )} → x == y → y == x -==sym (just x≈y) = just (≡-sym x≈y) -==sym nothing = nothing - -==trans : ∀{ c₁ c₂ a b } → ∀ {x y z : Maybe (Arrow {c₁} {c₂} t0 t1 a b ) } → - x == y → y == z → x == z -==trans (just x≈y) (just y≈z) = just (≡-trans x≈y y≈z) -==trans nothing nothing = nothing - -==cong : ∀{ c₁ c₂ a b c d } → ∀ {x y : Maybe (Arrow {c₁} {c₂} t0 t1 a b )} → - (f : Maybe (Arrow {c₁} {c₂} t0 t1 a b ) → Maybe (Arrow {c₁} {c₂} t0 t1 c d ) ) → x == y → f x == f y -==cong { c₁} {c₂} {a} {b } {c} {d} {nothing} {nothing} f nothing = ==refl -==cong { c₁} {c₂} {a} {b } {c} {d} {just x} {just .x} f (just refl) = ==refl - - -module ==-Reasoning {c₁ c₂ : Level} where - - infixr 2 _∎ - infixr 2 _==⟨_⟩_ _==⟨⟩_ - infix 1 begin_ - - - data _IsRelatedTo_ {c₁ c₂ : Level} {a b : TwoObject {c₁} } (x y : (Maybe (Arrow {c₁} {c₂} t0 t1 a b ))) : - Set c₂ where - relTo : (x≈y : x == y ) → x IsRelatedTo y - - begin_ : { a b : TwoObject {c₁} } {x : Maybe (Arrow {c₁} {c₂} t0 t1 a b ) } {y : Maybe (Arrow {c₁} {c₂} t0 t1 a b )} → - x IsRelatedTo y → x == y - begin relTo x≈y = x≈y - - _==⟨_⟩_ : { a b : TwoObject {c₁} } (x : Maybe (Arrow {c₁} {c₂} t0 t1 a b )) {y z : Maybe (Arrow {c₁} {c₂} t0 t1 a b ) } → - x == y → y IsRelatedTo z → x IsRelatedTo z - _ ==⟨ x≈y ⟩ relTo y≈z = relTo (==trans x≈y y≈z) - - - _==⟨⟩_ : { a b : TwoObject {c₁} }(x : Maybe (Arrow {c₁} {c₂} t0 t1 a b )) {y : Maybe (Arrow {c₁} {c₂} t0 t1 a b )} - → x IsRelatedTo y → x IsRelatedTo y - _ ==⟨⟩ x≈y = x≈y - - _∎ : { a b : TwoObject {c₁} }(x : Maybe (Arrow {c₁} {c₂} t0 t1 a b )) → x IsRelatedTo x - _∎ _ = relTo ==refl - - --- TwoHom1Eq : {c₁ c₂ : Level } {a b : TwoObject {c₁} } {f g : ( TwoHom1 {c₁} {c₂ } a b)} → --- hom (Map f) == hom (Map g) → f == g --- TwoHom1Eq = ? - - --- f g h --- d <- c <- b <- a --- --- It can be proved without Arrow constraints - -assoc-× : {c₁ c₂ : Level } {a b c d : TwoObject {c₁} } - {f : (TwoHom {c₁} {c₂ } c d )} → - {g : (TwoHom {c₁} {c₂ } b c )} → - {h : (TwoHom {c₁} {c₂ } a b )} → - hom ( f × (g × h)) == hom ((f × g) × h ) -assoc-× {c₁} {c₂} {a} {b} {c} {d} {f} {g} {h} with hom f | hom g | hom h -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t0} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t0} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t0} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t0} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t0} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} {f} {g} {h} | nothing | _ | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t0} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t0} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t0} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t0} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t0} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} {f} {g} {h} | just _ | nothing | _ = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} {f} {g} {h} | just id-t0 | just id-t0 | just id-t0 = ==refl -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | just arrow-f | just id-t0 | just id-t0 = ==refl -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | just arrow-g | just id-t0 | just id-t0 = ==refl -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-f | just id-t0 = ==refl -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-g | just id-t0 = ==refl -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} {f} {g} {h} | just id-t1 | just id-t1 | just arrow-f = ==refl -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} {f} {g} {h} | just id-t1 | just id-t1 | just arrow-g = ==refl -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} {f} {g} {h} | just id-t1 | just id-t1 | just id-t1 = ==refl --- remaining all failure case (except inf-f case ) -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t0} {f} {g} {h} | just id-t0 | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t0} {f} {g} {h} | just id-t0 | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t1} {f} {g} {h} | just id-t1 | just id-t1 | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t1} {f} {g} {h} | just id-t1 | just id-t1 | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t0} {t0} {f} {g} {h} | just id-t0 | just inv-f | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t0} {t0} {f} {g} {h} | just id-t0 | just inv-f | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t1} {f} {g} {h} | just arrow-f | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t0} {t1} {f} {g} {h} | just arrow-g | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | just arrow-f | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t0} {t1} {f} {g} {h} | just arrow-g | just id-t0 | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-f | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-g | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-f | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t0} {t1} {t1} {f} {g} {h} | just id-t1 | just arrow-g | nothing = nothing -assoc-× {c₁} {c₂} {t0} {t1} {t1} {t0} {f} {g} {h} | just inv-f | just id-t1 | nothing = nothing -assoc-× {c₁} {c₂} {t1} {t1} {t1} {t0} {f} {g} {h} | just inv-f | just id-t1 | nothing = nothing -assoc-× {_} {_} {t0} {t0} {t1} {t0} {_} {_} {_} | (just _) | (just _) | nothing = nothing -assoc-× {_} {_} {t0} {t1} {t0} {t1} {_} {_} {_} | (just _) | (just _) | nothing = nothing -assoc-× {_} {_} {t1} {t0} {t1} {t0} {_} {_} {_} | (just _) | (just _) | nothing = nothing -assoc-× {_} {_} {t1} {t1} {t0} {t1} {_} {_} {_} | (just _) | (just _) | nothing = nothing -assoc-× {_} {_} {t0} {t0} {t1} {t0} {_} {_} {_} | (just _) | (just arrow-f) | (just id-t0) = nothing -assoc-× {_} {_} {t0} {t0} {t1} {t0} {_} {_} {_} | (just _) | (just arrow-g) | (just id-t0) = nothing -assoc-× {_} {_} {t0} {t1} {t0} {t0} {_} {_} {_} | (just id-t0) | (just inv-f) | (just _) = nothing -assoc-× {_} {_} {t0} {t1} {t0} {t1} {_} {_} {_} | (just _) | (just _) | (just _) = nothing -assoc-× {_} {_} {t0} {t1} {t1} {t0} {_} {_} {_} | (just inv-f) | (just id-t1) | (just arrow-f) = nothing -assoc-× {_} {_} {t0} {t1} {t1} {t0} {_} {_} {_} | (just inv-f) | (just id-t1) | (just arrow-g) = nothing -assoc-× {_} {_} {t1} {t0} {t0} {t0} {_} {_} {_} | (just id-t0) | (just id-t0) | (just inv-f) = ==refl -assoc-× {_} {_} {t1} {t0} {t0} {t1} {_} {_} {_} | (just arrow-f) | (just id-t0) | (just inv-f) = nothing -assoc-× {_} {_} {t1} {t0} {t0} {t1} {_} {_} {_} | (just arrow-g) | (just id-t0) | (just inv-f) = nothing -assoc-× {_} {_} {t1} {t0} {t1} {t0} {_} {_} {_} | (just _) | (just _) | (just _) = nothing -assoc-× {_} {_} {t1} {t0} {t1} {t1} {_} {_} {_} | (just id-t1) | (just arrow-f) | (just _) = nothing -assoc-× {_} {_} {t1} {t0} {t1} {t1} {_} {_} {_} | (just id-t1) | (just arrow-g) | (just _) = nothing -assoc-× {_} {_} {t1} {t1} {t0} {t0} {_} {_} {_} | (just id-t0) | (just inv-f) | (just id-t1) = ==refl -assoc-× {_} {_} {t1} {t1} {t0} {t1} {_} {_} {_} | (just arrow-f) | (just inv-f) | (just id-t1) = ==refl -assoc-× {_} {_} {t1} {t1} {t0} {t1} {_} {_} {_} | (just arrow-g) | (just inv-f) | (just id-t1) = ==refl -assoc-× {_} {_} {t1} {t1} {t1} {t0} {_} {_} {_} | (just inv-f) | (just id-t1) | (just id-t1) = ==refl - - - -TwoId : {c₁ c₂ : Level } (a : TwoObject {c₁} ) → (TwoHom {c₁} {c₂ } a a ) -TwoId {_} {_} t0 = record { hom = just id-t0 } -TwoId {_} {_} t1 = record { hom = just id-t1 } - -open import maybeCat - --- identityL {c₁} {c₂} {_} {b} {nothing} = let open ==-Reasoning {c₁} {c₂} in --- begin --- (TwoId b × nothing) --- ==⟨ {!!} ⟩ --- nothing --- ∎ - -open import Relation.Binary -TwoCat : {c₁ c₂ ℓ : Level } → Category c₁ c₂ c₂ -TwoCat {c₁} {c₂} {ℓ} = record { - Obj = TwoObject {c₁} ; - Hom = λ a b → ( TwoHom {c₁} {c₂ } a b ) ; - _o_ = λ{a} {b} {c} x y → _×_ {c₁ } { c₂} {a} {b} {c} x y ; - _≈_ = λ x y → hom x == hom y ; - Id = λ{a} → TwoId {c₁ } { c₂} a ; - isCategory = record { - isEquivalence = record {refl = ==refl ; trans = ==trans ; sym = ==sym } ; - identityL = λ{a b f} → identityL {c₁} {c₂ } {a} {b} {f} ; - identityR = λ{a b f} → identityR {c₁} {c₂ } {a} {b} {f} ; - o-resp-≈ = λ{a b c f g h i} → o-resp-≈ {c₁} {c₂ } {a} {b} {c} {f} {g} {h} {i} ; - associative = λ{a b c d f g h } → assoc-× {c₁} {c₂} {a} {b} {c} {d} {f} {g} {h} - } - } where - identityL : {c₁ c₂ : Level } {A B : TwoObject {c₁}} {f : ( TwoHom {c₁} {c₂ } A B) } → hom ((TwoId B) × f) == hom f - identityL {c₁} {c₂} {_} {_} {f} with hom f - identityL {c₁} {c₂} {t0} {t0} {_} | nothing = nothing - identityL {c₁} {c₂} {t0} {t1} {_} | nothing = nothing - identityL {c₁} {c₂} {t1} {t0} {_} | nothing = nothing - identityL {c₁} {c₂} {t1} {t1} {_} | nothing = nothing - identityL {c₁} {c₂} {t1} {t0} {_} | just inv-f = ==refl - identityL {c₁} {c₂} {t1} {t1} {_} | just id-t1 = ==refl - identityL {c₁} {c₂} {t0} {t0} {_} | just id-t0 = ==refl - identityL {c₁} {c₂} {t0} {t1} {_} | just arrow-f = ==refl - identityL {c₁} {c₂} {t0} {t1} {_} | just arrow-g = ==refl - identityR : {c₁ c₂ : Level } {A B : TwoObject {c₁}} {f : ( TwoHom {c₁} {c₂ } A B) } → hom ( f × TwoId A ) == hom f - identityR {c₁} {c₂} {_} {_} {f} with hom f - identityR {c₁} {c₂} {t0} {t0} {_} | nothing = nothing - identityR {c₁} {c₂} {t0} {t1} {_} | nothing = nothing - identityR {c₁} {c₂} {t1} {t0} {_} | nothing = nothing - identityR {c₁} {c₂} {t1} {t1} {_} | nothing = nothing - identityR {c₁} {c₂} {t1} {t0} {_} | just inv-f = ==refl - identityR {c₁} {c₂} {t1} {t1} {_} | just id-t1 = ==refl - identityR {c₁} {c₂} {t0} {t0} {_} | just id-t0 = ==refl - identityR {c₁} {c₂} {t0} {t1} {_} | just arrow-f = ==refl - identityR {c₁} {c₂} {t0} {t1} {_} | just arrow-g = ==refl - o-resp-≈ : {c₁ c₂ : Level } {A B C : TwoObject {c₁} } {f g : ( TwoHom {c₁} {c₂ } A B)} {h i : ( TwoHom B C)} → - hom f == hom g → hom h == hom i → hom ( h × f ) == hom ( i × g ) - o-resp-≈ {c₁} {c₂} {a} {b} {c} {f} {g} {h} {i} f==g h==i = - let open ==-Reasoning {c₁} {c₂ } in begin - hom ( h × f ) - ==⟨⟩ - comp (hom h) (hom f) - ==⟨ ==cong (λ x → comp ( hom h ) x ) f==g ⟩ - comp (hom h) (hom g) - ==⟨ ==cong (λ x → comp x ( hom g ) ) h==i ⟩ - comp (hom i) (hom g) - ==⟨⟩ - hom ( i × g ) - ∎ - -record Nil {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) : Set ( c₁ ⊔ c₂ ⊔ ℓ ) where - field - nil : {a b : Obj A } → Hom A a b - nil-id : {a : Obj A } → A [ nil {a} {a} ≈ id1 A a ] -- too strong but we need this - nil-idL : {a b c : Obj A } → { f : Hom A a b } → A [ A [ nil {b} {c} o f ] ≈ nil {a} {c} ] - nil-idR : {a b c : Obj A } → { f : Hom A b c } → A [ A [ f o nil {a} {b} ] ≈ nil {a} {c} ] - -open Nil - -justFunctor : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) → Nil A → Functor (MaybeCat A ) A -justFunctor{c₁} {c₂} {ℓ} A none = record { - FObj = λ a → fobj a - ; FMap = λ {a} {b} f → fmap {a} {b} f - ; isFunctor = record { - identity = λ{x} → identity {x} - ; distr = λ {a} {b} {c} {f} {g} → distr2 {a} {b} {c} {f} {g} - ; ≈-cong = λ {a} {b} {c} {f} → ≈-cong {a} {b} {c} {f} - } - } where - MA = MaybeCat A - fobj : Obj MA → Obj A - fobj = λ x → x - fmap : {x y : Obj MA } → Hom MA x y → Hom A x y - fmap {x} {y} f with MaybeHom.hom f - fmap {x} {y} _ | nothing = nil none - fmap {x} {y} _ | (just f) = f - identity : {x : Obj MA} → A [ fmap (id1 MA x) ≈ id1 A (fobj x) ] - identity = let open ≈-Reasoning (A) in refl-hom - distr2 : {a : Obj MA} {b : Obj MA} {c : Obj MA} {f : Hom MA a b} {g : Hom MA b c} → A [ fmap (MA [ g o f ]) ≈ A [ fmap g o fmap f ] ] - distr2 {a} {b} {c} {f} {g} with MaybeHom.hom f | MaybeHom.hom g - distr2 | nothing | nothing = let open ≈-Reasoning (A) in sym ( nil-idR none ) - distr2 | nothing | just ga = let open ≈-Reasoning (A) in sym ( nil-idR none ) - distr2 | just fa | nothing = let open ≈-Reasoning (A) in sym ( nil-idL none ) - distr2 | just f | just g = let open ≈-Reasoning (A) in refl-hom - ≈-cong : {a : Obj MA} {b : Obj MA} {f g : Hom MA a b} → MA [ f ≈ g ] → A [ fmap f ≈ fmap g ] - ≈-cong {a} {b} {f} {g} eq with MaybeHom.hom f | MaybeHom.hom g - ≈-cong {a} {b} {f} {g} nothing | nothing | nothing = let open ≈-Reasoning (A) in refl-hom - ≈-cong {a} {b} {f} {g} (just eq) | just _ | just _ = eq - --- indexFunctor' : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) (none : Nil A) ( a b : Obj A) ( f g : Hom A a b ) --- → ( obj→ : Obj A → TwoObject {c₁} ) --- → ( hom→ : { a b : Obj A } → Hom A a b → Arrow t0 t0 (obj→ a) (obj→ b) ) --- → ( { x y : Obj A } { h i : Hom A x y } → A [ h ≈ i ] → hom→ h ≡ hom→ i ) --- → Functor A A --- this one does not work on fmap ( g o f ) ≈ ( fmap g o fmap f ) --- because g o f can be arrow-f when g is arrow-g --- ideneity and ≈-cong are easy - - -indexFunctor : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) (none : Nil A) ( a b : Obj A) ( f g : Hom A a b ) → Functor (TwoCat {c₁} {c₂} {c₂} ) A -indexFunctor {c₁} {c₂} {ℓ} A none a b f g = record { - FObj = λ a → fobj a - ; FMap = λ {a} {b} f → fmap {a} {b} f - ; isFunctor = record { - identity = λ{x} → identity {x} - ; distr = λ {a} {b} {c} {f} {g} → distr1 {a} {b} {c} {f} {g} - ; ≈-cong = λ {a} {b} {c} {f} → ≈-cong {a} {b} {c} {f} - } - } where - I = TwoCat {c₁} {c₂} {ℓ} - fobj : Obj I → Obj A - fobj t0 = a - fobj t1 = b - fmap : {x y : Obj I } → (TwoHom {c₁} {c₂} x y ) → Hom A (fobj x) (fobj y) - fmap {x} {y} h with hom h - fmap {t0} {t0} h | just id-t0 = id1 A a - fmap {t1} {t1} h | just id-t1 = id1 A b - fmap {t0} {t1} h | just arrow-f = f - fmap {t0} {t1} h | just arrow-g = g - fmap {_} {_} h | _ = nil none - open ≈-Reasoning A - ≈-cong : {a : Obj I} {b : Obj I} {f g : Hom I a b} → I [ f ≈ g ] → A [ fmap f ≈ fmap g ] - ≈-cong {a} {b} {f1} {g1} f≈g with hom f1 | hom g1 - ≈-cong {t0} {t0} {f1} {g1} nothing | nothing | nothing = refl-hom - ≈-cong {t0} {t1} {f1} {g1} nothing | nothing | nothing = refl-hom - ≈-cong {t1} {t0} {f1} {g1} nothing | nothing | nothing = refl-hom - ≈-cong {t1} {t1} {f1} {g1} nothing | nothing | nothing = refl-hom - ≈-cong {t0} {t0} {f1} {g1} (just refl) | just id-t0 | just id-t0 = refl-hom - ≈-cong {t1} {t1} {f1} {g1} (just refl) | just id-t1 | just id-t1 = refl-hom - ≈-cong {t0} {t1} {f1} {g1} (just refl) | just arrow-f | just arrow-f = refl-hom - ≈-cong {t0} {t1} {f1} {g1} (just refl) | just arrow-g | just arrow-g = refl-hom - ≈-cong {t1} {t0} {f1} {g1} (just refl) | just inv-f | just inv-f = refl-hom - identity : {x : Obj I} → A [ fmap ( id1 I x ) ≈ id1 A (fobj x) ] - identity {t0} = refl-hom - identity {t1} = refl-hom - distr1 : {a₁ : Obj I} {b₁ : Obj I} {c : Obj I} {f₁ : Hom I a₁ b₁} {g₁ : Hom I b₁ c} → - A [ fmap (I [ g₁ o f₁ ]) ≈ A [ fmap g₁ o fmap f₁ ] ] - distr1 {a1} {b1} {c1} {f1} {g1} with hom g1 | hom f1 - distr1 {t0} {t0} {t0} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t0} {t0} {t1} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t0} {t1} {t0} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t0} {t1} {t1} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t1} {t0} {t0} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t1} {t0} {t1} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t1} {t1} {t0} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t1} {t1} {t1} {f1} {g1} | nothing | nothing = sym ( nil-idR none ) - distr1 {t0} {t0} {t0} {f1} {g1} | nothing | just id-t0 = sym ( nil-idL none ) - distr1 {t0} {t0} {t1} {f1} {g1} | nothing | just id-t0 = sym ( nil-idL none ) - distr1 {t1} {t1} {t0} {f1} {g1} | nothing | just id-t1 = sym ( nil-idL none ) - distr1 {t1} {t1} {t1} {f1} {g1} | nothing | just id-t1 = sym ( nil-idL none ) - distr1 {t0} {t1} {t1} {f1} {g1} | nothing | just arrow-f = sym ( nil-idL none ) - distr1 {t0} {t1} {t0} {f1} {g1} | nothing | just arrow-f = sym ( nil-idL none ) - distr1 {t0} {t1} {t1} {f1} {g1} | nothing | just arrow-g = sym ( nil-idL none ) - distr1 {t0} {t1} {t0} {f1} {g1} | nothing | just arrow-g = sym ( nil-idL none ) - distr1 {t1} {t0} {t0} {f1} {g1} | nothing | just inv-f = sym ( nil-idL none ) - distr1 {t1} {t0} {t1} {f1} {g1} | nothing | just inv-f = sym ( nil-idL none ) - distr1 {t0} {t0} {t0} {f1} {g1} | just id-t0 | nothing = sym ( nil-idR none ) - distr1 {t1} {t0} {t0} {f1} {g1} | just id-t0 | nothing = sym ( nil-idR none ) - distr1 {t0} {t1} {t1} {f1} {g1} | just id-t1 | nothing = sym ( nil-idR none ) - distr1 {t1} {t1} {t1} {f1} {g1} | just id-t1 | nothing = sym ( nil-idR none ) - distr1 {t0} {t0} {t1} {f1} {g1} | just arrow-f | nothing = sym ( nil-idR none ) - distr1 {t1} {t0} {t1} {f1} {g1} | just arrow-f | nothing = sym ( nil-idR none ) - distr1 {t0} {t0} {t1} {f1} {g1} | just arrow-g | nothing = sym ( nil-idR none ) - distr1 {t1} {t0} {t1} {f1} {g1} | just arrow-g | nothing = sym ( nil-idR none ) - distr1 {t0} {t1} {t0} {f1} {g1} | just inv-f | nothing = sym ( nil-idR none ) - distr1 {t1} {t1} {t0} {f1} {g1} | just inv-f | nothing = sym ( nil-idR none ) - distr1 {t0} {t0} {t0} {f1} {g1} | just id-t0 | just id-t0 = sym idL - distr1 {t1} {t0} {t0} {f1} {g1} | just id-t0 | just inv-f = sym idL - distr1 {t0} {t0} {t1} {f1} {g1} | just arrow-f | just id-t0 = sym idR - distr1 {t0} {t0} {t1} {f1} {g1} | just arrow-g | just id-t0 = sym idR - distr1 {t1} {t1} {t1} {f1} {g1} | just id-t1 | just id-t1 = sym idL - distr1 {t0} {t1} {t1} {f1} {g1} | just id-t1 | just arrow-f = sym idL - distr1 {t0} {t1} {t1} {f1} {g1} | just id-t1 | just arrow-g = sym idL - distr1 {t1} {t1} {t0} {f1} {g1} | just inv-f | just id-t1 = sym ( nil-idL none ) - distr1 {t0} {t1} {t0} {_} {_} | (just inv-f) | (just _) = sym ( nil-idL none ) - distr1 {t1} {t0} {t1} {_} {_} | (just arrow-f) | (just _) = sym ( nil-idR none ) - distr1 {t1} {t0} {t1} {_} {_} | (just arrow-g) | (just _) = sym ( nil-idR none ) - +open import discrete --- Equalizer --- f --- e -----→ ---- c -----→ a b +--- c -----→ a b A --- ^ / -----→ --- |k h g --- | / @@ -432,150 +23,173 @@ --- d _ | --- |\ | --- \ K af ---- \ -----→ ---- \ t0 t1 +--- \ -----→ +--- \ t0 t1 I --- -----→ --- ag --- --- +open Complete open Limit +open NTrans -I' : {c₁ c₂ ℓ : Level} → Category c₁ c₂ c₂ -I' {c₁} {c₂} {ℓ} = TwoCat {c₁} {c₂} {ℓ} +-- Functor : TwoCat -> A -lim-to-equ : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) ( none : Nil A ) - (lim : ( Γ : Functor (I' {c₁} {c₂} {ℓ}) A ) → {a0 : Obj A } - {u : NTrans I' A ( K A I' a0 ) Γ } → Limit A I' Γ a0 u ) -- completeness - → {a b c : Obj A} (f g : Hom A a b ) - → (e : Hom A c a ) → (fe=ge : A [ A [ f o e ] ≈ A [ g o e ] ] ) → IsEqualizer A e f g -lim-to-equ {c₁} {c₂} {ℓ } A none lim {a} {b} {c} f g e fe=ge = record { - fe=ge = fe=ge - ; k = λ {d} h fh=gh → k {d} h fh=gh - ; ek=h = λ {d} {h} {fh=gh} → ek=h d h fh=gh - ; uniqueness = λ {d} {h} {fh=gh} {k'} → uniquness d h fh=gh k' - } where - open ≈-Reasoning A - I : Category c₁ c₂ c₂ - I = I' {c₁} {c₂} {ℓ} +IndexFunctor : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) ( a b : Obj A) ( f g : Hom A a b ) → Functor (TwoCat {c₁} {c₂}) A +IndexFunctor {c₁} {c₂} {ℓ} A a b f g = record { + FObj = λ a → fobj a + ; FMap = λ {a} {b} f → fmap {a} {b} f + ; isFunctor = record { + identity = λ{x} → identity x + ; distr = λ {a} {b} {c} {f} {g} → distr1 {a} {b} {c} {f} {g} + ; ≈-cong = λ {a} {b} {c} {f} → ≈-cong {a} {b} {c} {f} + } + } where + T = TwoCat {c₁} {c₂} + fobj : Obj T → Obj A + fobj t0 = a + fobj t1 = b + fmap : {x y : Obj T } → (Hom T x y ) → Hom A (fobj x) (fobj y) + fmap {t0} {t0} id-t0 = id1 A a + fmap {t1} {t1} id-t1 = id1 A b + fmap {t0} {t1} arrow-f = f + fmap {t0} {t1} arrow-g = g + ≈-cong : {a : Obj T} {b : Obj T} {f g : Hom T a b} → T [ f ≈ g ] → A [ fmap f ≈ fmap g ] + ≈-cong {a} {b} {f} {.f} refl = let open ≈-Reasoning A in refl-hom + identity : (x : Obj T ) -> A [ fmap (id1 T x) ≈ id1 A (fobj x) ] + identity t0 = let open ≈-Reasoning A in refl-hom + identity t1 = let open ≈-Reasoning A in refl-hom + distr1 : {a : Obj T} {b : Obj T} {c : Obj T} {f : Hom T a b} {g : Hom T b c} → + A [ fmap (T [ g o f ]) ≈ A [ fmap g o fmap f ] ] + distr1 {t0} {t0} {t0} {id-t0 } { id-t0 } = let open ≈-Reasoning A in sym-hom idL + distr1 {t1} {t1} {t1} { id-t1 } { id-t1 } = let open ≈-Reasoning A in begin + id1 A b + ≈↑⟨ idL ⟩ + id1 A b o id1 A b + ∎ + distr1 {t0} {t0} {t1} { id-t0 } { arrow-f } = let open ≈-Reasoning A in begin + fmap (comp arrow-f id-t0) + ≈⟨⟩ + fmap arrow-f + ≈↑⟨ idR ⟩ + fmap arrow-f o id1 A a + ∎ + distr1 {t0} {t0} {t1} { id-t0 } { arrow-g } = let open ≈-Reasoning A in begin + fmap (comp arrow-g id-t0) + ≈⟨⟩ + fmap arrow-g + ≈↑⟨ idR ⟩ + fmap arrow-g o id1 A a + ∎ + distr1 {t0} {t1} {t1} { arrow-f } { id-t1 } = let open ≈-Reasoning A in begin + fmap (comp id-t1 arrow-f) + ≈⟨⟩ + fmap arrow-f + ≈↑⟨ idL ⟩ + id1 A b o fmap arrow-f + ∎ + distr1 {t0} {t1} {t1} { arrow-g } { id-t1 } = let open ≈-Reasoning A in begin + fmap (comp id-t1 arrow-g) + ≈⟨⟩ + fmap arrow-g + ≈↑⟨ idL ⟩ + id1 A b o fmap arrow-g + ∎ + +--- Nat for Limit +-- +-- Nat : K -> IndexFunctor +-- + +open Functor + +IndexNat : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) + (comp : Complete A (TwoCat {c₁} {c₂} ) ) + → {a b : Obj A} (f g : Hom A a b ) + (d : Obj A) → (h : Hom A d a ) → A [ A [ f o h ] ≈ A [ g o h ] ] → + NTrans (TwoCat {c₁} {c₂}) A (K A (TwoCat {c₁} {c₂}) d) (IndexFunctor {c₁} {c₂} {ℓ} A a b f g) +IndexNat {c₁} {c₂} {ℓ} A comp {a} {b} f g d h fh=gh = record { + TMap = λ x → nmap x d h ; + isNTrans = record { + commute = λ {x} {y} {f'} → commute1 {x} {y} {f'} d h fh=gh + } + } where + I = TwoCat {c₁} {c₂} Γ : Functor I A - Γ = indexFunctor {c₁} {c₂} {ℓ} A none a b f g + Γ = IndexFunctor {c₁} {c₂} {ℓ} A a b f g nmap : (x : Obj I ) ( d : Obj (A) ) (h : Hom A d a ) → Hom A (FObj (K A I d) x) (FObj Γ x) - nmap x d h with x - ... | t0 = h - ... | t1 = A [ f o h ] + nmap t0 d h = h + nmap t1 d h = A [ f o h ] commute1 : {x y : Obj I} {f' : Hom I x y} (d : Obj A) (h : Hom A d a ) → A [ A [ f o h ] ≈ A [ g o h ] ] → A [ A [ FMap Γ f' o nmap x d h ] ≈ A [ nmap y d h o FMap (K A I d) f' ] ] - commute1 {x} {y} {f'} d h fh=gh with hom f' - commute1 {t0} {t0} {f'} d h fh=gh | nothing = begin - nil none o h - ≈⟨ car ( nil-id none ) ⟩ + commute1 {t0} {t1} {arrow-f} d h fh=gh = let open ≈-Reasoning A in begin + f o h + ≈↑⟨ idR ⟩ + (f o h ) o id1 A d + ∎ + commute1 {t0} {t1} {arrow-g} d h fh=gh = let open ≈-Reasoning A in begin + g o h + ≈↑⟨ fh=gh ⟩ + f o h + ≈↑⟨ idR ⟩ + (f o h ) o id1 A d + ∎ + commute1 {t0} {t0} {id-t0} d h fh=gh = let open ≈-Reasoning A in begin id1 A a o h ≈⟨ idL ⟩ h ≈↑⟨ idR ⟩ h o id1 A d ∎ - commute1 {t0} {t1} {f'} d h fh=gh | nothing = begin - nil none o h - ≈↑⟨ car ( nil-idL none ) ⟩ - (nil none o f ) o h - ≈⟨ car ( car ( nil-id none ) ) ⟩ - (id1 A b o f ) o h - ≈⟨ car idL ⟩ - f o h - ≈↑⟨ idR ⟩ - (f o h ) o id1 A d - ∎ - commute1 {t1} {t0} {f'} d h fh=gh | nothing = begin - nil none o ( f o h ) - ≈⟨ assoc ⟩ - ( nil none o f ) o h - ≈⟨ car ( nil-idL none ) ⟩ - nil none o h - ≈⟨ car ( nil-id none ) ⟩ -- nil-id is need here - id1 A a o h - ≈⟨ idL ⟩ - h - ≈↑⟨ idR ⟩ - h o id1 A d - ∎ - commute1 {t1} {t1} {f'} d h fh=gh | nothing = begin - nil none o ( f o h ) - ≈⟨ car ( nil-id none ) ⟩ - id1 A b o ( f o h ) - ≈⟨ idL ⟩ - f o h - ≈↑⟨ idR ⟩ - ( f o h ) o id1 A d - ∎ - commute1 {t1} {t0} {f'} d h fh=gh | just inv-f = begin - nil none o ( f o h ) - ≈⟨ assoc ⟩ - ( nil none o f ) o h - ≈⟨ car ( nil-idL none ) ⟩ - nil none o h - ≈⟨ car ( nil-id none ) ⟩ - id1 A a o h - ≈⟨ idL ⟩ - h - ≈↑⟨ idR ⟩ - h o id1 A d - ∎ - commute1 {t0} {t1} {f'} d h fh=gh | just arrow-f = begin - f o h - ≈↑⟨ idR ⟩ - (f o h ) o id1 A d - ∎ - commute1 {t0} {t1} {f'} d h fh=gh | just arrow-g = begin - g o h - ≈↑⟨ fh=gh ⟩ - f o h - ≈↑⟨ idR ⟩ - (f o h ) o id1 A d - ∎ - commute1 {t0} {t0} {f'} d h fh=gh | just id-t0 = begin - id1 A a o h - ≈⟨ idL ⟩ - h - ≈↑⟨ idR ⟩ - h o id1 A d - ∎ - commute1 {t1} {t1} {f'} d h fh=gh | just id-t1 = begin + commute1 {t1} {t1} {id-t1} d h fh=gh = let open ≈-Reasoning A in begin id1 A b o ( f o h ) ≈⟨ idL ⟩ f o h ≈↑⟨ idR ⟩ ( f o h ) o id1 A d ∎ - nat1 : (d : Obj A) → (h : Hom A d a ) → A [ A [ f o h ] ≈ A [ g o h ] ] → NTrans I A (K A I d) Γ - nat1 d h fh=gh = record { - TMap = λ x → nmap x d h ; - isNTrans = record { - commute = λ {x} {y} {f'} → commute1 {x} {y} {f'} d h fh=gh - } - } - eqlim = lim Γ {c} {nat1 c e fe=ge } + + +lim-to-equ : {c₁ c₂ ℓ : Level} (A : Category c₁ c₂ ℓ) + (comp : Complete A (TwoCat {c₁} {c₂} ) ) + → {a b : Obj A} (f g : Hom A a b ) {e : Hom A (limit-c comp (IndexFunctor {c₁} {c₂} {ℓ} A a b f g)) a } + → (fe=ge : A [ A [ f o e ] ≈ A [ g o e ] ] ) + → IsEqualizer A e f g +lim-to-equ {c₁} {c₂} {ℓ} A comp {a} {b} f g {e} fe=ge = record { + fe=ge = fe=ge + ; k = λ {d} h fh=gh → k {d} h fh=gh + ; ek=h = λ {d} {h} {fh=gh} → ek=h d h fh=gh + ; uniqueness = λ {d} {h} {fh=gh} {k'} → uniquness d h fh=gh k' + } where + I = TwoCat {c₁} {c₂} + Γ : Functor I A + Γ = IndexFunctor {c₁} {c₂} {ℓ} A a b f g + c = limit-c comp Γ k : {d : Obj A} (h : Hom A d a) → A [ A [ f o h ] ≈ A [ g o h ] ] → Hom A d c - k {d} h fh=gh = limit eqlim d (nat1 d h fh=gh ) + nat0 = IndexNat A comp f g + eqlim = isLimit comp Γ (nat0 c e fe=ge ) + k {d} h fh=gh = limit eqlim d (nat0 d h fh=gh ) ek=h : (d : Obj A ) (h : Hom A d a ) → ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ] ) → A [ A [ e o k h fh=gh ] ≈ h ] - ek=h d h fh=gh = begin + ek=h d h fh=gh = let open ≈-Reasoning A in begin e o k h fh=gh - ≈⟨ t0f=t eqlim {d} {nat1 d h fh=gh} {t0} ⟩ + ≈⟨ t0f=t eqlim {d} {nat0 d h fh=gh} {t0} ⟩ h ∎ - uniq-nat : {i : Obj I} → (d : Obj A ) (h : Hom A d a ) ( k' : Hom A d c ) → A [ A [ e o k' ] ≈ h ] → A [ A [ nmap i c e o k' ] ≈ nmap i d h ] - uniq-nat {t0} d h k' ek'=h = begin - nmap t0 c e o k' + uniq-nat : {i : Obj I} → (d : Obj A ) (h : Hom A d a ) ( k' : Hom A d c ) + ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ]) → A [ A [ e o k' ] ≈ h ] → + A [ A [ TMap (nat0 c e fe=ge ) i o k' ] ≈ TMap (nat0 d h fh=gh) i ] + uniq-nat {t0} d h k' fh=gh ek'=h = let open ≈-Reasoning A in begin + TMap (nat0 c e fe=ge ) t0 o k' ≈⟨⟩ e o k' ≈⟨ ek'=h ⟩ h ≈⟨⟩ - nmap t0 d h + TMap (nat0 d h fh=gh) t0 ∎ - uniq-nat {t1} d h k' ek'=h = begin - nmap t1 c e o k' + uniq-nat {t1} d h k' fh=gh ek'=h = let open ≈-Reasoning A in begin + TMap (nat0 c e fe=ge ) t1 o k' ≈⟨⟩ (f o e ) o k' ≈↑⟨ assoc ⟩ @@ -583,16 +197,14 @@ ≈⟨ cdr ek'=h ⟩ f o h ≈⟨⟩ - nmap t1 d h + TMap (nat0 d h fh=gh) t1 ∎ uniquness : (d : Obj A ) (h : Hom A d a ) → ( fh=gh : A [ A [ f o h ] ≈ A [ g o h ] ] ) → ( k' : Hom A d c ) - → A [ A [ e o k' ] ≈ h ] → A [ k h fh=gh ≈ k' ] - uniquness d h fh=gh k' ek'=h = begin + → A [ A [ e o k' ] ≈ h ] → A [ k h fh=gh ≈ k' ] + uniquness d h fh=gh k' ek'=h = let open ≈-Reasoning A in begin k h fh=gh - ≈⟨ limit-uniqueness eqlim k' ( λ{i} → uniq-nat {i} d h k' ek'=h ) ⟩ + ≈⟨ limit-uniqueness eqlim k' ( λ{i} → uniq-nat {i} d h k' fh=gh ek'=h ) ⟩ k' ∎ - -