{-# OPTIONS --without-K --safe #-}
open import Categories.Category
open import Categories.Functor using (Functor; Endofunctor)
module Coalgebra.Recursive {o β e} (π : Category o β e) (F : Endofunctor π) where
private
module π = Category π
module F = Functor F
open import Level
open import Categories.Functor.Coalgebra
open import Categories.Functor.Algebra hiding (iterate)
open import Categories.Category using (Category)
open import Categories.Category.Construction.F-Algebras
open import Categories.Diagram.Cocone.Properties
open import Categories.Category.Construction.F-Coalgebras
open import Categories.Morphism using (IsIso; Iso; module β
; Retract)
import Categories.Morphism
open import Categories.Object.Initial using (IsInitial)
open import Categories.Morphism.Reasoning
open import F-Coalgebra-Colimit
open import Colimit-Lemmas
record C2A-morphism {o β e} {π : Category o β e} {F : Endofunctor π}
(X : F-Coalgebra F)
(Y : F-Algebra F) : Set (β β e) where
open Category π
module X = F-Coalgebra X
module Y = F-Algebra Y
open Functor F
field
f : X.A β Y.A
commutes : f β Y.Ξ± β Fβ f β X.Ξ±
C2A-precompose : {B D : F-Coalgebra F} β {A : F-Algebra F} β
C2A-morphism D A β F-Coalgebra-Morphism B D β C2A-morphism B A
C2A-precompose {B} {D} {A} eval mor =
let
open Category π
module eval = C2A-morphism eval
module mor = F-Coalgebra-Morphism mor
module B = F-Coalgebra B
module D = F-Coalgebra D
module A = F-Algebra A
open HomReasoning
open Functor F
in
record
{ f = eval.f β mor.f ;
commutes = begin
eval.f β mor.f ββ¨ eval.commutes β©ββ¨refl β©
(A.Ξ± β Fβ eval.f β D.Ξ±) β mor.f ββ¨ assoc β©
A.Ξ± β (Fβ eval.f β D.Ξ±) β mor.f ββ¨ reflβ©ββ¨ assoc β©
A.Ξ± β Fβ eval.f β D.Ξ± β mor.f ββ¨ reflβ©ββ¨ reflβ©ββ¨ mor.commutes β©
A.Ξ± β Fβ eval.f β Fβ mor.f β B.Ξ± ββ¨ reflβ©ββ¨ sym-assoc β©
A.Ξ± β (Fβ eval.f β Fβ mor.f) β B.Ξ± βΛβ¨ reflβ©ββ¨ homomorphism β©ββ¨refl β©
A.Ξ± β Fβ (eval.f β mor.f) β B.Ξ±
β
}
record IsRecursive (X : F-Coalgebra F) : Set (o β β β e) where
morph = C2A-morphism.f
field
recur : (B : F-Algebra F) β C2A-morphism X B
unique : (B : F-Algebra F) β (g h : C2A-morphism X B) β
π [ morph g β morph h ]
iso-recursiveβinitial :
(R : F-Coalgebra F)
β IsRecursive R
β (r-iso : IsIso π (F-Coalgebra.Ξ± R))
β IsInitial (F-Algebras F) (to-Algebra (IsIso.inv r-iso))
iso-recursiveβinitial R is-rec r-iso =
let
open Category π
open HomReasoning
rβ»ΒΉ = IsIso.inv r-iso
r = F-Coalgebra.Ξ± R
in
record
{ ! = Ξ» {A : F-Algebra F} β
let
coalg2alg = IsRecursive.recur is-rec A
a = F-Algebra.Ξ± A
h : (F-Coalgebra.A R) β (F-Algebra.A A)
h = C2A-morphism.f coalg2alg
Fh = Functor.Fβ F h
in
record
{ f = h
; commutes = begin
h β rβ»ΒΉ
ββ¨ C2A-morphism.commutes coalg2alg β©ββ¨refl β©
(a β Fh β r) β rβ»ΒΉ ββ¨ assoc β©
a β ((Fh β r) β rβ»ΒΉ) ββ¨ reflβ©ββ¨ assoc β©
a β Fh β (r β rβ»ΒΉ)
βΛβ¨ assoc β©
(a β Fh) β (r β rβ»ΒΉ)
ββ¨ reflβ©ββ¨ Iso.isoΚ³ (IsIso.iso r-iso) β©
(a β Fh) β id
ββ¨ identityΚ³ β©
a β Fh
β
}
; !-unique = Ξ» {A} g-hom β
let
g = (F-Algebra-Morphism.f g-hom)
Fg = Functor.Fβ F g
a = F-Algebra.Ξ± A
g-coalg2alg : C2A-morphism R A
g-coalg2alg = record {
f = g ;
commutes =
begin
g βΛβ¨ identityΚ³ β©
g β id βΛβ¨ reflβ©ββ¨ Iso.isoΛ‘ (IsIso.iso r-iso) β©
g β (rβ»ΒΉ β r) βΛβ¨ assoc β©
(g β rβ»ΒΉ) β r ββ¨ F-Algebra-Morphism.commutes g-hom β©ββ¨refl β©
(a β Fg) β r ββ¨ assoc β©
a β Fg β r
β
}
h = IsRecursive.recur is-rec A
in
IsRecursive.unique is-rec A h g-coalg2alg
}
sandwich-recursive :
β (R B : F-Coalgebra F)
β IsRecursive R
β (h : F-Coalgebra-Morphism R B)
β (g : F-Coalgebra-Morphism B (iterate R))
β π [ F-Coalgebra.Ξ± B β F.β (F-Coalgebra-Morphism.f h) π.β (F-Coalgebra-Morphism.f g) ]
β IsRecursive B
sandwich-recursive R B R-is-rec h g equation =
let
module R = F-Coalgebra R
module B = F-Coalgebra B
module h = F-Coalgebra-Morphism h
module g = F-Coalgebra-Morphism g
open IsRecursive R-is-rec
open Category π
in
record {
recur = Ξ» D β
let
module D = F-Algebra D
R2D = recur D
module R2D = C2A-morphism R2D
sol = D.Ξ± β F.β R2D.f β g.f
open HomReasoning
in
record {
f = sol;
commutes =
begin
sol β‘β¨β©
D.Ξ± β F.β R2D.f β g.f ββ¨ reflβ©ββ¨ F.F-resp-β R2D.commutes β©ββ¨refl β©
D.Ξ± β F.β (D.Ξ± β F.β R2D.f β R.Ξ±) β g.f βΛβ¨ reflβ©ββ¨ F.F-resp-β assoc β©ββ¨refl β©
D.Ξ± β F.β ((D.Ξ± β F.β R2D.f) β R.Ξ±) β g.f ββ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
D.Ξ± β (F.β (D.Ξ± β F.β R2D.f) β F.β R.Ξ±) β g.f ββ¨ reflβ©ββ¨ assoc β©
D.Ξ± β F.β (D.Ξ± β F.β R2D.f) β F.β R.Ξ± β g.f ββ¨ reflβ©ββ¨ reflβ©ββ¨ g.commutes β©
D.Ξ± β F.β (D.Ξ± β F.β R2D.f) β F.β g.f β B.Ξ± βΛβ¨ reflβ©ββ¨ assoc β©
D.Ξ± β (F.β (D.Ξ± β F.β R2D.f) β F.β g.f) β B.Ξ± βΛβ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
D.Ξ± β F.β ((D.Ξ± β F.β R2D.f) β g.f) β B.Ξ± ββ¨ reflβ©ββ¨ F.F-resp-β assoc β©ββ¨refl β©
D.Ξ± β F.β (D.Ξ± β F.β R2D.f β g.f) β B.Ξ± β‘β¨β©
D.Ξ± β F.β sol β B.Ξ±
β
} ;
unique = Ξ» D sol1 sol2 β
let
module D = F-Algebra D
module sol1 = C2A-morphism sol1
module sol2 = C2A-morphism sol2
open HomReasoning
sol1-h-is-sol2-h : sol1.f β h.f β sol2.f β h.f
sol1-h-is-sol2-h =
IsRecursive.unique R-is-rec D
(C2A-precompose sol1 h)
(C2A-precompose sol2 h)
sol-transformation sol =
let
module sol = C2A-morphism sol
in
begin
sol.f ββ¨ sol.commutes β©
D.Ξ± β F.β sol.f β B.Ξ± ββ¨ reflβ©ββ¨ reflβ©ββ¨ equation β©
D.Ξ± β F.β sol.f β F.β h.f β g.f ββ¨ reflβ©ββ¨ sym-assoc β©
D.Ξ± β (F.β sol.f β F.β h.f) β g.f βΛβ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
D.Ξ± β F.β (sol.f β h.f) β g.f
β
in
begin
sol1.f ββ¨ sol-transformation sol1 β©
D.Ξ± β F.β (sol1.f β h.f) β g.f ββ¨ reflβ©ββ¨ F.F-resp-β sol1-h-is-sol2-h β©ββ¨refl β©
D.Ξ± β F.β (sol2.f β h.f) β g.f βΛβ¨ sol-transformation sol2 β©
sol2.f
β
}
iterate-recursive : (R : F-Coalgebra F)
β IsRecursive R
β IsRecursive (iterate R)
iterate-recursive R is-rec =
sandwich-recursive R (iterate R) is-rec r (Category.id (F-Coalgebras F)) equation
where
module R = F-Coalgebra R
module FR = F-Coalgebra (iterate R)
r : F-Coalgebra-Morphism R (iterate R)
r = record { f = R.Ξ± ; commutes = π.Equiv.refl }
equation : π [ FR.Ξ± β F.β R.Ξ± π.β π.id ]
equation = π.Equiv.sym π.identityΚ³
iterate-F-Coalgebra-Morphism : {A B : F-Coalgebra F}
β (h : F-Coalgebra-Morphism A B)
β F-Coalgebra-Morphism (iterate A) (iterate B)
iterate-F-Coalgebra-Morphism {A} {B} h =
record {
f = F.β h.f ; commutes = begin
F.β Ξ² β F.β h.f βΛβ¨ F.homomorphism β©
F.β (Ξ² β h.f) ββ¨ F.F-resp-β h.commutes β©
F.β (F.β h.f β Ξ±) ββ¨ F.homomorphism β©
F.β (F.β h.f) β F.β Ξ±
β}
where
module h = F-Coalgebra-Morphism h
open F-Coalgebra A
open F-Coalgebra B renaming (A to B; Ξ± to Ξ²)
open Category π
open HomReasoning
record R-Coalgebra : Set (o β β β e) where
field
coalg : F-Coalgebra F
ump : IsRecursive coalg
open F-Coalgebra coalg public
open IsRecursive ump public
R-Coalgebras : Category (β β o β e) (e β β) e
R-Coalgebras = FullSubCategory (F-Coalgebras F) R-Coalgebra.coalg
where
open import Categories.Category.SubCategory using (FullSubCategory)
module _ where
open import Categories.Functor.Construction.SubCategory
forget-rec : Functor (R-Coalgebras) (F-Coalgebras F)
forget-rec = FullSub (F-Coalgebras F)
open import Categories.Diagram.Colimit using (Colimit)
open import Categories.Diagram.Cocone
open import Categories.Functor using (_βF_)
module _ {o' β' e' : Level} {π : Category o' β' e'} (J : Functor π (F-Coalgebras F)) where
private
module π = Category π
module J = Functor J
Limitting-Cocone-IsRecursive :
(β (i : π.Obj) β IsRecursive (J.β i))
β (cocone : Cocone J)
β IsLimitting (F-map-CoconeΛ‘ forget-Coalgebra cocone)
β IsRecursive (Cocone.N cocone)
Limitting-Cocone-IsRecursive all-recursive cocone limitting =
record { recur = Ξ» B β coconeβ-to-sol B (limitting.! {alg2cocone B})
; unique = Ξ» B g h β limitting.!-uniqueβ (sol-to-coconeβ B g) (sol-to-coconeβ B h)
}
where
open Category π
open HomReasoning
module cocone = Cocone cocone
module limitting = IsInitial limitting
obj-cocone = (F-map-CoconeΛ‘ forget-Coalgebra cocone)
module obj-cocone = Cocone obj-cocone
alg2cocone : F-Algebra F β Cocone (forget-Coalgebra βF J)
alg2cocone B =
let module B = F-Algebra B in
record { coapex = record {
Ο = Ξ» i β C2A-morphism.f (IsRecursive.recur (all-recursive i) B) ;
commute = Ξ» {i} {i'} h β
let
sol1 = IsRecursive.recur (all-recursive i) B
sol2 = C2A-precompose (IsRecursive.recur (all-recursive i') B) (J.β h)
in
IsRecursive.unique (all-recursive i) B sol2 sol1 } }
coconeβ-to-sol : (B : F-Algebra F)
β Coconeβ (forget-Coalgebra βF J) obj-cocone (alg2cocone B)
β C2A-morphism cocone.N B
coconeβ-to-sol B mor = let
module B = F-Algebra B
module mor = Coconeβ mor
in
record { f = mor.arr ; commutes = limitting-cocone-is-jointly-epic obj-cocone limitting (Ξ» i β
let
sol = IsRecursive.recur (all-recursive i) B
module sol = C2A-morphism sol
in
begin
mor.arr β obj-cocone.Ο i ββ¨ mor.commute {i} β©
sol.f ββ¨ sol.commutes β©
B.Ξ± β F.Fβ sol.f β F-Coalgebra.Ξ± (J.β i) βΛβ¨ reflβ©ββ¨ F.F-resp-β mor.commute β©ββ¨refl β©
B.Ξ± β F.Fβ (mor.arr β obj-cocone.Ο i) β F-Coalgebra.Ξ± (J.β i) ββ¨ reflβ©ββ¨ pushΛ‘ π F.homomorphism β©
B.Ξ± β F.Fβ mor.arr β F.β (obj-cocone.Ο i) β F-Coalgebra.Ξ± (J.β i) βΛβ¨ reflβ©ββ¨ reflβ©ββ¨ F-Coalgebra-Morphism.commutes (cocone.Ο i) β©
B.Ξ± β F.Fβ mor.arr β F-Coalgebra.Ξ± cocone.N β obj-cocone.Ο i βΛβ¨ (assoc β (reflβ©ββ¨ assoc)) β©
(B.Ξ± β F.Fβ mor.arr β F-Coalgebra.Ξ± cocone.N) β obj-cocone.Ο i
β) }
sol-to-coconeβ : (B : F-Algebra F) β C2A-morphism cocone.N B
β Coconeβ (forget-Coalgebra βF J) obj-cocone (alg2cocone B)
sol-to-coconeβ B sol = let
module B = F-Algebra B
module sol = C2A-morphism sol
in record
{ arr = sol.f
; commute = Ξ» {i} β
IsRecursive.unique (all-recursive i) B
(C2A-precompose sol (cocone.Ο i))
(IsRecursive.recur (all-recursive i) B)
}
R-Coalgebras-Colimit : {o' β' e' : Level} β {D : Category o' β' e'} β (J : Functor D R-Coalgebras)
β Colimit (forget-Coalgebra βF forget-rec βF J) β Colimit J
R-Coalgebras-Colimit J π-colim =
FullSub-Colimit R-Coalgebra.coalg J Coalg-colim R (β
.refl (F-Coalgebras F))
where
module J = Functor J
module π-colim = Colimit π-colim
Coalg-colim : Colimit (forget-rec βF J)
Coalg-colim = F-Coalgebras-Colimit _ π-colim
module Coalg-colim = Colimit Coalg-colim
alg2cocone : F-Algebra F β Cocone (forget-Coalgebra βF forget-rec βF J)
alg2cocone B =
let
module B = F-Algebra B
in
record {
N = B.A ;
coapex = record {
Ο = Ξ» R β
let
module R = R-Coalgebra (J.Fβ R)
in
C2A-morphism.f (R.recur B) ;
commute = Ξ» {R} {R'} h β
let
module R = R-Coalgebra (J.Fβ R)
module R' = R-Coalgebra (J.Fβ R')
open Category π
open HomReasoning
open Equiv
module h = F-Coalgebra-Morphism (J.Fβ h)
module U = Functor (forget-Coalgebra βF forget-rec βF J)
module U' = Functor (forget-rec βF J)
sol : C2A-morphism R.coalg B
sol =
let
module r' = C2A-morphism (R'.recur B)
in
record {
f = r'.f β U.Fβ h;
commutes =
begin
r'.f β U.Fβ h ββ¨ r'.commutes β©ββ¨refl β©
(B.Ξ± β (F.Fβ r'.f β R'.Ξ±)) β U.Fβ h ββ¨ assoc β©
B.Ξ± β ((F.Fβ r'.f β R'.Ξ±) β U.Fβ h) ββ¨ reflβ©ββ¨ assoc β©
B.Ξ± β (F.Fβ r'.f β (R'.Ξ± β U.Fβ h)) ββ¨ reflβ©ββ¨ reflβ©ββ¨ h.commutes β©
B.Ξ± β (F.Fβ r'.f β (F.Fβ (U.Fβ h) β R.Ξ±)) ββ¨ reflβ©ββ¨ sym-assoc β©
B.Ξ± β ((F.Fβ r'.f β F.Fβ (U.Fβ h)) β R.Ξ±) βΛβ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
B.Ξ± β F.Fβ (r'.f β U.Fβ h) β R.Ξ±
β
}
in
R.unique B sol (R.recur B)
} }
alg2solution : (B : F-Algebra F) β C2A-morphism Coalg-colim.coapex B
alg2solution B =
let
module B = F-Algebra B
open Category π
open HomReasoning
sol : π [ F-Coalgebra.A Coalg-colim.coapex , B.A ]
sol = π-colim.rep (alg2cocone B)
in
record { f = sol ;
commutes = colimit-is-jointly-epic π-colim Ξ» R β
let
module R = R-Coalgebra (J.Fβ R)
module R-sol = C2A-morphism (R.recur B)
in
begin
sol β π-colim.proj R
ββ¨ π-colim.commute β©
R-sol.f
ββ¨ R-sol.commutes β©
B.Ξ± β F.Fβ R-sol.f β R.Ξ±
βΛβ¨ reflβ©ββ¨ F.F-resp-β π-colim.commute β©ββ¨refl β©
B.Ξ± β F.Fβ (sol β π-colim.proj R) β R.Ξ±
ββ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
B.Ξ± β (F.Fβ sol β F.Fβ (π-colim.proj R)) β R.Ξ±
ββ¨ reflβ©ββ¨ assoc β©
B.Ξ± β F.Fβ sol β (F.Fβ (π-colim.proj R) β R.Ξ±)
βΛβ¨ reflβ©ββ¨ reflβ©ββ¨ F-Coalgebra-Morphism.commutes (Coalg-colim.proj R) β©
B.Ξ± β F.Fβ sol β F-Coalgebra.Ξ± Coalg-colim.coapex β π-colim.proj R
βΛβ¨ reflβ©ββ¨ assoc β©
B.Ξ± β (F.Fβ sol β F-Coalgebra.Ξ± Coalg-colim.coapex) β π-colim.proj R
βΛβ¨ assoc β©
(B.Ξ± β F.Fβ sol β F-Coalgebra.Ξ± Coalg-colim.coapex) β π-colim.proj R
β
}
R : R-Coalgebra
R = record {
coalg = Coalg-colim.coapex ;
ump = record {
recur = alg2solution;
unique = Ξ» B g h β
colimit-is-jointly-epic π-colim Ξ» R β
let
open Category π
open HomReasoning
module B = F-Algebra B
module R = R-Coalgebra (J.Fβ R)
proj-sol : C2A-morphism Coalg-colim.coapex B β C2A-morphism R.coalg B
proj-sol s =
let module s = C2A-morphism s in
record {
f = s.f β π-colim.proj R ;
commutes =
begin
s.f β π-colim.proj R
ββ¨ s.commutes β©ββ¨refl β©
(B.Ξ± β F.Fβ s.f β F-Coalgebra.Ξ± Coalg-colim.coapex) β π-colim.proj R
ββ¨ assoc β©
B.Ξ± β ((F.Fβ s.f β F-Coalgebra.Ξ± Coalg-colim.coapex) β π-colim.proj R)
ββ¨ reflβ©ββ¨ assoc β©
B.Ξ± β F.Fβ s.f β F-Coalgebra.Ξ± Coalg-colim.coapex β π-colim.proj R
ββ¨ reflβ©ββ¨ reflβ©ββ¨ F-Coalgebra-Morphism.commutes (Coalg-colim.proj R) β©
B.Ξ± β F.Fβ s.f β F.Fβ (π-colim.proj R) β R.Ξ±
βΛβ¨ reflβ©ββ¨ assoc β©
B.Ξ± β (F.Fβ s.f β F.Fβ (π-colim.proj R)) β R.Ξ±
βΛβ¨ reflβ©ββ¨ F.homomorphism β©ββ¨refl β©
B.Ξ± β F.Fβ (s.f β π-colim.proj R) β R.Ξ±
β
}
in
R.unique B (proj-sol g) (proj-sol h)
} }
retract-coalgebra : (X : F-Coalgebra F) {Y : π.Obj}
β Retract π (F-Coalgebra.A X) Y
β F-Coalgebra F
retract-coalgebra X {Y} r = record { A = Y ; Ξ± = Fβ r.section β X.Ξ± β r.retract }
where
open Functor F
open Category π
module r = Retract r
module X = F-Coalgebra X
retract-coalgebra-hom : (X : F-Coalgebra F) {Y : π.Obj}
β (r : Retract π (F-Coalgebra.A X) Y)
β F-Coalgebras F [ X , retract-coalgebra X r ]
retract-coalgebra-hom X {Y} r =
record { f = r.section ; commutes = begin
(Fβ r.section β X.Ξ± β r.retract) β r.section ββ¨ assocΒ²' π β©
Fβ r.section β X.Ξ± β r.retract β r.section ββ¨ reflβ©ββ¨ elimΚ³ π r.is-retract β©
Fβ r.section β X.Ξ±
β}
where
open Functor F
open Category π
open HomReasoning
module r = Retract r
module X = F-Coalgebra X
retract-coalgebra-homβ»ΒΉ : (X : F-Coalgebra F) {Y : π.Obj}
β (r : Retract π (F-Coalgebra.A X) Y)
β F-Coalgebras F [ retract-coalgebra X r , X ]
retract-coalgebra-homβ»ΒΉ X {Y} r =
record { f = r.retract ; commutes = begin
X.Ξ± β r.retract βΛβ¨ pullΛ‘ π (elimΛ‘ π (F-resp-β r.is-retract β identity)) β©
Fβ (r.retract β r.section) β X.Ξ± β r.retract ββ¨ pushΛ‘ π homomorphism β©
Fβ r.retract β Fβ r.section β X.Ξ± β r.retract
β}
where
open Functor F
open Category π
open HomReasoning
module r = Retract r
module X = F-Coalgebra X
retract-coalgebra-hom-to-iterate : (X : F-Coalgebra F) {Y : π.Obj}
β (r : Retract π (F-Coalgebra.A X) Y)
β F-Coalgebras F [ retract-coalgebra X r , (iterate X) ]
retract-coalgebra-hom-to-iterate X {Y} r =
record { f = X.Ξ± β r.retract ; commutes =
begin
Fβ X.Ξ± β X.Ξ± β r.retract
βΛβ¨ reflβ©ββ¨ elimΛ‘ π identity β©
Fβ X.Ξ± β Fβ id β X.Ξ± β r.retract
βΛβ¨ reflβ©ββ¨ F-resp-β r.is-retract β©ββ¨refl β©
Fβ X.Ξ± β Fβ (r.retract β r.section) β X.Ξ± β r.retract
ββ¨ reflβ©ββ¨ pushΛ‘ π homomorphism β©
Fβ X.Ξ± β Fβ r.retract β Fβ r.section β X.Ξ± β r.retract
βΛβ¨ pushΛ‘ π homomorphism β©
Fβ (X.Ξ± β r.retract) β Fβ r.section β X.Ξ± β r.retract
β
}
where
open Functor F
open Category π
open HomReasoning
module r = Retract r
module X = F-Coalgebra X
retract-coalgebra-recursive : (X : F-Coalgebra F) {Y : π.Obj}
β (r : Retract π (F-Coalgebra.A X) Y)
β IsRecursive X
β IsRecursive (retract-coalgebra X r)
retract-coalgebra-recursive X {Y} r X-rec =
sandwich-recursive X (retract-coalgebra X r) X-rec
(retract-coalgebra-hom X r)
(retract-coalgebra-hom-to-iterate X r) π.Equiv.refl
where
open Functor F
open Category π
open HomReasoning
module r = Retract r
module X = F-Coalgebra X