Skip to main content

Cuvântul "algebră" poate avea mai multe semnificații în matematică dar în contextul teoriei categoriilor când spunem "algebră" ne vom referii în general la F-algebre sau algebre pentru endofunctori dacă nu se specifică altfel. În acest context, o algebră încapsulează noțiunea de structură algebraică și este o noțiune foarte utilă pentru a definii structuri de date, mai ales structuri recursive.

Definiție: Algebră pentru un endofunctor

Fie F:CCF : \mathcal{C} \rightarrow \mathcal{C} un endofunctor. O algebră a lui FF este o pereche (a,α)(a, \alpha) unde aOb(C)a \in Ob(\mathcal{C}), numit și carrier, și α:FaaHom(C)\alpha : Fa \rightarrow a \in Hom(\mathcal{C}). Dacă din context morfismul α\alpha este cunoscut sau unic atunci carrier-ul este referit ca fiind algebra.

Un homomorfism între algebre (a,α)(a, \alpha) și (b,β)(b, \beta) este un morfism f:abf : a \rightarrow b pentru care βFf=fα\beta \circ Ff = f \circ \alpha, adică următoarea diagramă comută:

Din algebre și homomorfisme între acestea pentru endofunctorul FF putem forma o categorie iar dacă există obiectul inițial în acea categorie acesta este algebra inițială, adică avem câte un homomorfism unic de la acea algebră la oricare algebră a lui FF. Vom nota carrier-ul pentru algebra inițială a lui FF cu μF\mu F. Algebra inițială este un concept foarte important pentru că putem defini tipuri de date recursiv.

De asemenea, ne vom referi la FF ca fiind signatura algebrei.

Lema lui Lambek

Dacă pentru un endofunctor F:CCF : \mathcal{C} \rightarrow \mathcal{C} există algebra inițială (μF,α)(\mu F, \alpha) atunci μF\mu F este izomorf cu FμFF\mu F prin α\alpha.

Pentru că (FμF,Fα)(F\mu F, F\alpha) este tot o algebră și (μF,α)(\mu F, \alpha) este inițial atunci există un morfism unic i:μFFμFi : \mu F \rightarrow F\mu F pentru care iα=FαFii \circ \alpha = F\alpha \circ Fi, dar cum (μF,α)(\mu F, \alpha) este inițială și homomorfismul unic către ea însăși este dat de identitatea idμFid_{\mu F} rezultă că αi=idμF\alpha \circ i = id_{\mu F} și atunci iα=FαFi=idFμFi \circ \alpha = F\alpha \circ Fi = id_{F\mu F}. Putem vedea cum se leagă toate aceste lucruri în diagrama următoare:

Prin algebra inițială putem defini tipuri de date inductive în semantică categorială pentru că algebra inițială este cel mai mic punct fix (least fixed point) a lui FF.

Putem ilustra acest lucru prin următoarele exemple în Set\mathbf{Set}:

  • pentru functorul Fx=1+xFx = 1 + x, unde 11 este mulțimea singleton, algebra inițială este mulțimea numerelor naturale (μF=N,α)(\mu F = \mathbb{N}, \alpha). Numerele naturale ca tip de date pot fi definite recursiv ca fiind Nat=Zero  Succ NatNat = Zero~|~Succ~Nat, din definiția acestei algebre unde trebuie să existe α:1+μFμF\alpha : 1 + \mu F \rightarrow \mu F și faptul că avem o uniune disjunctă de mulțimi α\alpha poate fi împărțită în două funcții, un punct 1μF1 \rightarrow \mu F și o funcție de succesiune μFμF\mu F \rightarrow \mu F și de aici obținem cei doi constructori de tip. Unde intervine recursivitatea este în unicitatea funcției succesiune pentru că α\alpha este unic și inversabil iar inversa trebuie în mod necesar să fie incluziunea α1:μF1+μF\alpha^{-1} : \mu F \rightarrow 1 + \mu F.

  • pentru functorul Fx=1+a×xFx = 1 + a \times x algebra inițială este mulțimea listelor de tip aa, List a=Void  Cons(a,List a)List~a = Void~|~Cons(a, List~a).

  • pentru functorul Fx=1+a×x×xFx = 1 + a \times x \times x algebra inițială este mulțimea arborilor binari cu noduri cu valori de tip aa, BinTree a=Void  Node(BinTree a,BinTree a)BinTree~a= Void~|~Node(BinTree~a, BinTree~a).

Catamorfisme

Mofismul unic de la algebra inițială (μF,α)(\mu F, \alpha) pentru un endofunctor FF la o altă algebră (x,ϕ)(x, \phi) se numește catamorfism notat cataϕcata \phi.

Un catamorfism este conceptual o operație de tip fold, adică, transformăm valorile unui tip de date inductiv cum sunt listele într-o valoare de tip xx. Pentru catamorphism avem următoarea diagramă comutativă:

Conform definiției algebrei cataϕα=ϕF(cataϕ)cata \phi \circ \alpha = \phi \circ F (cata \phi), dar cum μF\mu F este algebra inițială α\alpha este invesabilă și atunci putem calcula recursiv cataϕ=ϕ(Fcataϕ)α1cata \phi = \phi \circ (F cata \phi) \circ \alpha^{-1}.

Să luăm cazul Fx=1+a×xFx = 1 + a \times x unde μF=List a\mu F = List~a, dacă luam un tip bb cu ϕ:1+a×bb\phi : 1 + a \times b \rightarrow b atunci cataϕ:List abcata \phi : List~a \rightarrow b. Deci catacata mapează ((1+a×b)b)(List ab)((1 + a \times b) \rightarrow b) \rightarrow (List~a \rightarrow b), iar funcția ϕ\phi poate fi spartă în init×opinit \times op, init:1bbinit: 1 \rightarrow b \cong b și op:a×bbop: a \times b \rightarrow b.

Astfel, putem rescrie catacata ca un fold la dreapta foldr:(b×(a×bb))List abb(a×bb)List abfoldr : (b \times (a \times b \rightarrow b)) \rightarrow List~a \rightarrow b \cong b \rightarrow (a \times b \rightarrow b) \rightarrow List~a \rightarrow b. Practic, dacă avem lift:(b×(a×bb))((1+a×b)b)lift : (b \times (a \times b \rightarrow b)) \rightarrow ((1 + a \times b) \rightarrow b) cu ϕ=lift(init×op)\phi = lift(init \times op) atunci foldr=cataliftfoldr = cata \circ lift. Este important de menționat că catacata corespunde cu fold-ul la dreapta, nu la stânga în acest caz.

Cu alte cuvinte, dacă avem o algebră, catacata transformă un morphism FbbFb \rightarrow b într-un morphism μFb\mu F \rightarrow b. Aici este un lucru foarte important de observat, cum FF este signatura algebrei aceasta servește ca un caz de bază pentru aplicarea catamorfismului, adică transformăm tratarea cazurilor de bază pentru a obține o valoare de tip bb într-o operație pe valorile algebrei inițiale (care este un tip inductiv) ca să obținem o valoare agregată de tip bb.

Definiție: Coalgebră pentru un endofunctor

Fie F:CCF : \mathcal{C} \rightarrow \mathcal{C} un endofunctor. O coalgebră a lui FF este o pereche (a,α)(a, \alpha) unde aOb(C)a \in Ob(\mathcal{C}), numit și carrier, și α:aFaHom(C)\alpha : a \rightarrow Fa \in Hom(\mathcal{C}). Dacă din context morfismul α\alpha este cunoscut sau unic atunci carrier-ul este referit ca fiind coalgebra.

Un homomorfism între coalgebre (a,α)(a, \alpha) și (b,β)(b, \beta) este un morfism f:abf : a \rightarrow b pentru care βf=Ffα\beta \circ f = Ff \circ \alpha, adică următoarea diagramă comută:

Din coalgebre și homomorfisme între acestea pentru endofunctorul FF putem forma o categorie iar dacă există obiectul final în acea categorie acesta este algebra finală, adică avem câte un homomorfism unic de la oricare coalgebră a lui FF la această coalgebră. Vom nota carrier-ul pentru coalgebra finală a lui FF cu νF\nu F. Coalgebra inițială este un concept foarte important pentru că putem defini tipuri de date corecursiv.

De asemenea, ne vom referi la FF ca fiind signatura coalgebrei.

Corolarul lemei lui Lambek pentru coalgebre

Dacă pentru un endofunctor F:CCF : \mathcal{C} \rightarrow \mathcal{C} există coalgebra finală (νF,α)(\nu F, \alpha) atunci νF\nu F este izomorf cu FνFF\nu F prin α\alpha.

Pentru că (FνF,Fα)(F\nu F, F\alpha) este tot o coalgebră și (νF,α)(\nu F, \alpha) este finală atunci există un morfism unic i:FνFνFi : F\nu F \rightarrow \nu F pentru care FiFα=αiFi \circ F\alpha = \alpha \circ i, dar cum (νF,α)(\nu F, \alpha) este finală și homomorfismul unic către ea însăși este dat de identitatea idνFid_{\nu F} rezultă că iα=idνFi \circ \alpha = id_{\nu F} și atunci αi=FiFα=idFνF\alpha \circ i = Fi \circ F\alpha = id_{F\nu F}. Putem vedea cum se leagă toate aceste lucruri în diagrama următoare:

Prin coalgebra finală putem defini tipuri de date coinductive în semantică categorială pentru că coalgebra finală este cel mai mare punct fix (greatest fixed point) a lui FF.

Anamorfisme

Mofismul unic către coalgebra finală (νF,α)(\nu F, \alpha) pentru un endofunctor FF de la o altă coalgebră (x,ϕ)(x, \phi) se numește anamorfism notat anaϕana \phi.

Un anamorfism este conceptual o operație de tip unfold, adică, transformăm o valoare a unui tip de date xx în valorile unui tip de date coinductiv cum sunt stream-urile. Pentru anaamorphism avem următoarea diagramă comutativă:

Conform definiției coalgebrei F(anaϕ)α=ϕanaϕF(ana \phi) \circ \alpha = \phi \circ ana \phi, dar cum νF\nu F este coalgebra finală α\alpha este invesabilă și atunci putem calcula corecursiv F(anaϕ)=ϕanaϕα1F(ana \phi) = \phi \circ ana \phi \circ \alpha^{-1}.

Să luăm cazul Fx=a×xFx = a \times x unde νF=Stream a\nu F = Stream~a, dacă luam un tip bb cu ϕ:ba×b\phi : b \rightarrow a \times b atunci anaϕ:bStream aana \phi : b \rightarrow Stream~a. Deci anaana mapează (ba×b)(bStream a)(b \rightarrow a \times b) \rightarrow (b \rightarrow Stream~a), iar funcția ϕ\phi poate fi spartă în init×opinit \times op, init:1bbinit: 1 \rightarrow b \cong b și op:a×bbop: a \times b \rightarrow b.

Astfel, anaana este chiar unfold la dreapta unfoldr:(ba×b)bStream aunfoldr : (b \rightarrow a \times b) \rightarrow b \rightarrow Stream~a.

Cu alte cuvinte, dacă avem o coalgebră, anaana transformă un morphism bFbb \rightarrow Fb într-un morphism bμFb \rightarrow \mu F. Aici este un lucru foarte important de observat, cum FF este signatura coalgebrei aceasta servește ca un generator pentru aplicarea anamorfismului, adică ne folosim de o valoare de tip bb ca să producem valorile coalgebrei finale (care este un tip coinductiv).