Teoria kategorii dla informatyków/Wykład 4: Zaawansowane konstrukcje uniwersalne

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Eksponent

Mając dane dwa zbiory A i B, możemy stworzyć- zgodnie z aksjomatyką teorii mnogości - zbiór wszystkich funkcji typu AB oznaczany BA. W języku kategoryjnym powiedzielibyśmy, że dla danych dwóch obiektów A,B𝐒𝐞𝐭0, istnieje zawsze inny obiekt BA, który nazwiemy tu eksponentem. Jeszcze krócej tę samą myśl wypowiemy tak: 𝐒𝐞𝐭 ma eksponenty. Spróbujmy zbadać, jaką własnością uniwersalną charakteryzują się eksponenty w 𝐒𝐞𝐭. Oto nieformalny tok rozumowania: skoro BA, który łatwo będzie nam też zapisywać w miarę potrzeby jako [A,B], jest pewnym specjalnym obiektem 𝐒𝐞𝐭, to muszą z nim być związane strzałki, które go dekonstruują, czyli rozkładają na czynniki A, B, z których powstał. (Tak było na przykład w przypadku produktu A×B, gdzie destruktorami są projekcje.) Teoria mnogości wspomaga nas tutaj twierdzeniem, że istnieje izmorfizm

𝐒𝐞𝐭(Z×A,B)𝐒𝐞𝐭(Z,BA)      (4.1)

Rzeczywiście, dowolnej funkcji f:Z×AB przyporządkowujemy funkcję curry(f):ZBA jako: curry(f)(z):=f(z,). Operacja curry, nazywana kuryfikacją, jest szukaną bijekcją. Sens tej bijekcji możemy odczytać w następujący sposób - mając dane: funkcję f:Z×AB i dwa elementy zZ, aA, wartość f(z,a) powstaje albo przez bezpośrednią aplikację funkcji f do pary argumentów (z,a), albo poprzez aplikację funkcji curry(f) do argumentu z i potem ewaluację tak powstałej funkcji na argumencie a. Innymi słowy, poniższy diagram komutuje:

gdzie ev:BA×AB jest ewaluacją definiowaną jako ev(f,a):=f(a). Rzeczywiście:

(ev(curry(f)×1A))(z,a)=ev(curry(f)(z),a)=ev(f(z,),a)=f(z,a)

albo w końcu:

ev(curry(f)×1A)=f

Powyższe rozważania mają sens nie tylko w 𝐒𝐞𝐭, ale i w każdej kategorii z produktami. Otrzymujemy więc następującą definicję:


Definicja 4.1 [eksponent]

Niech 𝐂 będzie kategorią z produktami. Eksponentem obiektów A i B w 𝐂 jest obiekt [A,B]𝐂0 wraz ze strzałką ev:[A,B]×AB, nazywaną ewaluacją, taką że dla dowolnego obiektu Z𝐂0 i strzałki f:Z×AB istnieje dokładnie jedna strzałka curry(f):Z[A,B] spełniająca równanie:

ev(curry(f)×1A)=f

wyrażone na diagramie jako:

Uwaga techniczna: często w dowodach pojawiają się naraz ewaluacje różnych typów; wygodnie wtedy ev:[A,B]×AB oznaczyć jako evA,B.

Zauważmy, że dla dowolnej strzałki g:Z[A,B] możemy zdefiniować jej odwrotność jako

uncurry(g):=ev(g×1A):Z×AB

Wtedy własność uniwersalna z powyższej definicji daje nam:

curry(uncurry(g))=g

oraz dla dowolnej f:Z×AB komutowanie powyższego diagramu natychmiast implikuje, że:

uncurry(curry(f))=f

Pokazaliśmy więc izomorfizm:

Hom𝐂(Z×A,B)Hom𝐂(Z,[A,B]),      (4.2)

który uogólnia izomorfizm (4.1) dla 𝐒𝐞𝐭.

Kategorie kartezjańsko zamknięte

Kategorie, w których istnieją eksponenty zasługują na wyróżnienie:


Definicja 4.2

Kategoria 𝐂 jest kartezjańsko zamknięta, jeśli posiada obiekt końcowy, produkty binarne i eksponenty.


Oto przykłady:

  • 𝐒𝐞𝐭 jest kartezjańsko zamknięta. Podobnie 𝐒𝐞𝐭fin, gdyż konstrukcje są takie same, jak dla 𝐒𝐞𝐭, a eksponent [A,B] dla zbiorów skończonych jest zbiorem skończonym.
  • Kategoria 𝐏𝐨𝐬 jest kartezjańsko zamknięta. Produkt dwóch posetów (P,)×(Q,) definiuje się jako produkt zbiorów P×Q wraz z relacją częściowego porządku po współrzędnych: (p1,q1)(p2,q2) wtedy i tylko wtedy, gdy (p1p2)(q1q2) wraz z naturalnymi projekcjami πP(p,q):=p i πQ(p,q):=q. Jako eksponent [P,Q] bierzemy zbiór wszystkich funkcji monotonicznych typu PQ wraz z porządkiem po współrzędnych: fgzP (f(z)g(z)) Ewaluacja i kuryfikacja są definiowane tak jak w 𝐒𝐞𝐭, wystarczy więc sprawdzić, że są monotoniczne. Jeśli (f,p)(q,r) w [P,Q]×P, to ev(f,p)=f(p)g(p)g(r)=ev(g,r) a zatem ewaluacja jest monotoniczna. Natomiast dla f:Z×PQ, zz, pP mamy curry(f)(z)(p)=f(z,p)f(z,p)=curry(f)(z)(p) co świadczy o tym, że curry(f)(z)curry(f)(z), czyli że kuryfikacja jest monotoniczna dla każdej funkcji f.
  • Dwie ważne dla semantyki języków programowania kategorie kartezjańsko zamknięte: kategorię posetów zupełnych 𝐃𝐜𝐩𝐨 i kategorię bc-dziedzin 𝐁𝐂 omawiamy oddzielnie w Wykładzie 13.
  • Poset (P,) z elementem najmniejszym 0 jako kategoria jest kartezjańsko zamknięty wtedy i tylko wtedy, gdy jest algebrą Heytinga, zobacz podrozdział nt. algebr Heytinga.
  • 𝐂𝐚𝐭 - kategoria wszystkich małych kategorii - jest kartezjańsko zamknięta.
  • Dla dowolnej małej kategorii 𝐂 kategoria funktorów [𝐂op,𝐒𝐞𝐭] jest kartezjańsko zamknięta. Do tego przykładu wrócimy w Wykładach 7 i 8.
  • Kartezjańsko zamknięte nie są: 𝐕𝐞𝐜𝐭, 𝐀𝐛, 𝐓𝐨𝐩, 𝐌𝐞𝐭, ... z różnych przyczyn.

Algebry Heytinga

Przypomnijmy najpierw - w telegraficznym skrócie -pojęcia kraty dystrybutywnej i algebry Boole'a: Niech (L,) będzie kratą z elementem najmniejszym 𝟎 i elementem największym 𝟏. Łatwo się przekonać, że kratę można również zdefiniować jako algebrę, bez relacji , jedynie za pomocą równości i prymitywnych operacji ,,𝟎,𝟏.

Stwierdzenie 4.3

Niech L będzie zbiorem z operacjami:
:L×LL
:L×LL
𝟎:1L
𝟏:1L

gdzie i są łączne i przemienne oraz spełniają następujące aksjomaty:

xx=x
xx=x
𝟏x=x
𝟎x=x
x(yx)=x=(xy)x

dla dowolnych x,y,zL. Wówczas (L,) jest kratą, gdzie definiujemy jako

xyx=xy

lub równoważnie:

xyy=xy

Oczywiście twierdzenie odwrotne też zachodzi.

Niektóre spośród krat posiadają ciekawą własność:

Definicja 4.4

Kratę (L,) nazywamy dystrybutywną, jeśli dla dowolnych x,y,zL zachodzi
x(yz)=(xy)(xz)

Fakt 4.5

Powyższa równość w definicji implikuje równość dualną:
x(yz)=(xy)(xz)


Definicja 4.6

Elementem przeciwnym do x w kracie L nazywamy element aL taki, że xa=𝟎 i xa=𝟏.


Fakt 4.7

W kracie dystrybutywnej element przeciwny do x jest jedyny. Oznaczamy go wówczas jako ¬x.


Najbardziej znanymi kratami dystrybutywnymi są niewątpliwie algebry Boole'a.


Definicja 4.8 [algebra Boole'a]

Algebrą Boole'a nazywamy kratę dystrybutywną, w której każdy element x ma element przeciwny.


Fakt 4.9

W dowolnej algebrze Boole'a L zachodzą równości:

¬(xy)=¬x¬y
¬(xy)=¬x¬y
¬¬x=x

Pierwszą i drugą równość nazywamy prawami de Morgana.


Algebry Boole'a są szczególnymi przypadkami innych krat dystrybutywnych, tzw. algebr Heytinga, które omawiamy poniżej:


Definicja 4.10 [algebra Heytinga]

Algebrą Heytinga nazywamy kratę (L,) z elementem najmniejszym 𝟎, elementem największym 𝟏 i operacją :L×LL definiowaną dla każdej pary elementów x,yL jako:
xy:={zLzxy}

Taka definicja może na pierwszy rzut oka wydawać się przypadkowa. Punkt widzenia teorii kategorii rozjaśnia wątpliwości natychmiast: Jeśli potraktujemy kratę (L,,𝟎,𝟏) jako kategorię, będzie to kategoria, w której pomiędzy dwoma dowolnymi obiektami istnieje co najwyżej jedna strzałka, z elementem początkowym 𝟎, końcowym 𝟏, produktami (infima binarne: ) i koproduktami (suprema: ). Krata taka jest algebrą Heytinga wtedy i tylko wtedy, gdy istnieje operacja taka, że

xy={zLzxy}

dla każdego x,yL. Ta definicja da się przepisać następująco:

zxy  zxy

co w terminach kategoryjnych oznacza, ze istnieje bijekcja pomiędzy strzałkami HomL(z,xy) i strzałkami Hom(zx,y). A ten warunek jest dokładnie warunkiem uniwersalnym dla elementu xy traktowanego jako eksponent!

A zatem: algebra Heytinga to poset z elementem najmniejszym, który jako kategoria jest kartezjańsko zamknięty. Warto zapamiętać tę charakteryzację.

Ponieważ:


Fakt 4.11

W dowolnej algebrze Boole'a mamy:
z(¬xy)zxy


więc każda algebra Boole'a jest algebrą Heytinga. Można też pokazać, że:


Fakt 4.12

W dowolnej algebrze Heytinga L, jeśli dla xL istnieje ¬x, to musi być ¬x=x𝟎.


Kartezjańska zamkniętość algebr Heytinga daje nam natychmiast następujące równości (które w innych kategoriach są izomorfizmami) i nierówności (czyli istnienie odpowiednich strzałek) - porównaj Zadanie 4.3:


Fakt 4.13

W dowolnej algebrze Heytinga zachodzą zależności:
x(y(xy))
y(yx)x
(x𝟏)=𝟏
(𝟏x)=x
(yz)x=(z(yx))
(x(yz))=(xy)(xz)
𝟏xx
𝟏(x(yx))
𝟏(x(yz))((xy)(xz))


Powyższe własności doprowadzają nas do najważniejszego wniosku w tym podrozdziale: algebry Heytinga są algebraicznym odpowiednikiem rachunku intuicjonistycznej logiki zdaniowej. Naszkicujmy tę odpowiedniość w obie strony: dla danej algebry Heytinga (L,,𝟎,𝟏,,,) traktujemy elementy xL jako zmienne, jako syntaktyczną relację dedukcji , 𝟎, 𝟏 jako stałe fałsz i prawda, zaś operacje ,, jako spójniki zdaniowe. Wówczas taki system jest rachunkiem zdaniowym logiki intuicjonistycznej.

Odwrotnie, załóżmy, że mamy dany język zdaniowy, intuicjonistyczny, , składający się ze zmiennych zdaniowych x,y,z,.., z których za pomocą spójników ,, i stałych 𝟎,𝟏 tworzymy w znany sposób zdania p,q,r,.. oraz z syntaktycznej relacji dedukcji podlegającej aksjomatom:

  • jest zwrotna i przechodnia,
  • p𝟏,
  • 𝟎p,
  • pq i pr wtedy i tylko wtedy, gdy pqr,
  • pr i qr wtedy i tylko wtedy, gdy pqr,
  • pqr wtedy i tylko wtedy, gdy pqr.

Wówczas z tworzymy algebrę H(), tzw. algebrę Lindenbauma - Tarskiego składającą się z klas abstrakcji [p] relacji równoważności = danej przez

[p]=[q]  pq

Algebra H() jest częściowym porządkiem:

[p][q] : pq

z elementem największym [𝟏] i najmniejszym [𝟎]. Operacje algebry są zadane jako: [p][q]:=[pq], i tak samo dla oraz . Tak utworzona algebra H() jest algebrą Heytinga, która - co więcej - ma tę własność, że zdanie p można udowodnić w wtedy i tylko wtedy, gdy [p]=𝟏 w H().

Kategorie kartezjańsko zamknięte a lambda rachunek

Oczywiście można i trzeba sobie zadać pytanie: skoro algebry Heytinga są algebraicznym równoważnikiem zdaniowego rachunku logiki intuicjonistycznej, to czy ten fenomen przenosi się na ogólne kategorie kartezjańsko zamknięte? Pytamy zatem: jaki język odpowiada dowolnej kategorii kartezjańsko zamkniętej 𝐂? Nie dość, że pytanie jest dobrze postawione, co się okaże za chwilę, to jeszcze ma bardzo satysfakcjonującą odpowiedź: tym językiem jest rachunek lambda! W rzeczywistości struktury: kategorii kartezjańsko zamkniętej i lambda rachunku, są dwoma odbiciami tego samego zjawiska, czy też - jeśli ktoś woli inną poetykę - kategorie k.z. i λ-rachunek są dwiema manifestacjami tej samej struktury matematycznej. Poniżej spróbujemy wykazać tą tezę w kilku krokach:

  • Po pierwsze, pokażmy, że dla λ-rachunku kategoria 𝐂(λ), zdefiniowana w Zadaniu 1.11, wzbogacona o obiekt końcowy (który zawsze łatwo dodać), jest kartezjańsko zamknięta. Widzieliśmy już w podrozdziale nt. produktów, że ta kategoria posiada produkty. Pokażemy zatem, że posiada eksponenty. Oczywiście [A,B]:=AB dla typów A,B, zaś ewaluacja i odwrotność kuryfikacji są zdefiniowane, jak następuje:
ev:=λz.π1(z)π2(z):[A,B]×AB
uncurry(f):=λz.λx.f(z,x):Z[A,B]

gdzie z:Z,x:A. Wtedy - pamiętając, że

g×h=λw.gπ1(w),hπ2(w)

mamy:

ev(curry(f)×1A)=λv.(λz.π1(z)π2(z))(λw.(λy.λx.f(y,x))π1(w),(λu.u)π2(w))v=λv.(λz.π1(z)π2(z))(λx.f(π1(v),x),π2(v))=λv.(λx.f(π1(v),x))π2(v)=λv.f(π1(v),π2(v))=λv.fv=f

Naszkicowaliśmy zatem dowód, że 𝐂(λ) jest kategorią kartezjańsko zamkniętą.

  • Odwrotnie, mając daną kategorię kartezjańsko zamkniętą 𝐂, definiujemy język (𝐂) jak następuje: typy to obiekty 𝐂; termy typu AB to strzałki typu AB; termy proste typu A to strzałki typu 𝟏A; równania języka (𝐂) to znane równania w 𝐂, m.in. te wynikające z kartezjańskiej zamkniętości, np.:
λx.π1(x)=p1
λx.π2(x)=p2
λy.f(x,y)=curry(f)(x)

i tak dalej.

  • Dwie opisane powyżej konstrukcje są w ścisłym sensie odwrotne do siebie, ponieważ możemy udowodnić, że 𝐂((𝐂))𝐂, tzn. kategorie 𝐂(λ(𝐂)) i 𝐂 są izmorficzne oraz że języki λ i (𝐂(λ)) są sobie równoważne w sensie, który jest dokładnie przedyskutowany w książce J.Lambeka i O. Scotta pt. Introduction to Higher-Order Categorical Logic, Cambridge University Press, 1986.