galeryjlka.jpg

    Zacznijmy od prostych faktów. Od prostego rozumowania. „Każdy człowiek jest śmiertelny. Sokrates jest człowiekiem. Więc Sokrates jest śmiertelny”. W sumie, zacznę od pierwszego zdania, i o nim tylko będzie mowa. Mamy zatem zdanie „Każdy człowiek jest śmiertelny”. W języku potocznym brzmi to literacko i złowrogo, oddamy zatem treść tego zdania w bardziej formalny, właściwie konwencjonalny, sposób: A = „Dla każdego {x} ze zbioru ludzi {L}, {x} jest śmiertelny”. jaka jest treść tego zdania? Zdanie odnosi się do obiektów {x}, które to obiekty należą do jakiegoś zbioru. Nie przesadzając jego zawartości oznaczmy go literą {X}. Zbiór ten zapewne jest całkiem spory, a jego elementy mogą mieć przeróżne własności. Zdanie A wymienia zbiór ludzi {L} uznamy zatem że jest on podzbiorem zbioru {X}. Dla dalszych celów należy dokonać dalszej przeróbki zdania A. Zwrot „{x} jest śmiertelny” używa słowa „jest” które w sumie nie wiadomo co znaczy. Zastąpimy je bardziej formalnym „należy do” tak, że zdanie A przyjmie formę: A = „Dla każdego {x} ze zbioru ludzi {L}, {x} należy do zbioru obiektów śmiertelnych {S}„. Jak widać wprowadziliśmy dodatkowe dwa zbiory! Są to: {S} – zbiór obiektów którym przysługuje własność śmiertelności ( a więc nie nalezą do niego na przykład Elrond i Gandalf ), który jest podzbiorem zbiory {Y} obiektów które będziemy rozważać, a których istoty nie musimy na razie wyjawiać wprost.

Skoro mamy dwa zbiory, {X} i {Y}, możemy zastanowić się nad własnościami funkcji pomiędzy nimi. Jak wiadomo funkcja {f\colon X \rightarrow Y} to relacja na zbiorze {X \times Y} taka, że każdy element {X} ma jakiś element z {Y} który jest z nim w relacji, oraz dodatkowo element ten jest wyznaczony jednoznacznie, to znaczy dla każdego elementu z {X} istnieje tylko jeden element w {Y} będący z nim w relacji funkcji.

Skoro zdanie A które analizujemy nie wymienia zbiorów {X} i {Y} jawnie, ale raczej mówi o ich podzbiorach, popatrzmy co ciekawego wynika z definicji funkcji w tym temacie. Definicja funkcji „faworyzuje” dziedzinę funkcji, jakikolwiek element dziedziny wybierzemy, znajdziemy zdefiniowaną dla niego „wartość” z przeciwdziedziny, zwanej także kodziedziną, w zbiorze {Y}. Jeśli jednak mówimy o podzbiorach dziedziny, sprawy stają się zabawnie symetryczne. Dla dowolnego podzbioru dziedziny {L} funkcja definiuje jego obraz {S}, jako zbiór elementów zbioru kodziedziny które pozostają w relacji funkcji z elementami podzbioru {L}. Obraz {S} jest oczywiście podzbiorem kodziedziny. Ha! Sytuacja odwrotna wygląda zupełnie podobnie: dla danego podzbioru kodziedziny {S} istnieje przeciwobraz {L}, będący podzbiorem dziedziny, którego elementy są w relacji funkcji z jego elementami. O ile w wypadku elementów wikłalibyśmy się w niejasne zależności ( bowiem z definicji funkcji wynika, ze nie każdy element kodziedziny musi być przyporządkowany jakiemuś elementowi dziedziny ) o tyle w wypadku podzbiorów sprawa staje się ładnie symetryczna. Mówmy zatem o podzbiorach.

Funkcja {f\colon X \rightarrow Y} definiuje pewne odwzorowanie zbioru podzbiorów zbioru {X} w zbiór podzbiorów zbioru {Y}. Dla prostoty nie będziemy oznaczać jej inną literą, choć formalnie rzecz biorąc jest to inny obiekt. Popatrzmy jednak dokładniej. Ta sama funkcja {f}, z powodu opisanej powyżej symetrii, definiuje inną funkcję, {f^{*} \colon Y \rightarrow X} ! Jakie znaczenie możemy przypisać funkcji {f^{*}}?

Rozważmy podzbiór zbioru {Y}, powiedzmy ten nazwany {S}. Jakie elementy do niego należą? Jak definiujemy podzbiory? Jeśli dysponujemy zbiorem {Y}, to nie musimy bać sie dobrze znanych paradoksów, i wolno nam zdefiniować pewien predykat {P(y)} – czyli „definicję przez wskazanie własności” – taki że do podzbioru {S} będą należały te elementy zbioru {Y}, dla których zdanie {P(y)} będzie spełnione. Zapiszmy to formalnie:

y \in S \Leftrightarrow P(y)

Wygląda bardzo ładnie, a że dysponujemy naszą funkcją {f} możemy napisać to samo za pomocą {x}-ów!!! Mianowicie dla elementów podzbioru {S} zachodzi związek {y=f(x)} czyli:

y \in S \Leftrightarrow P(f(x))

Oczywiście w równaniu powyższym cały kłopot w tym, by dla znanego {y} należącego do relacji {P} znaleźć stosowne {x} które da nam {f(x) = y}. Ale od szukania takich {x} mamy przecież odwzorowanie {f^{*}}! Odwzorowanie to ściśle rzecz biorąc zdefiniowane jest dla podzbiorów, a nie dla indywidualnych elementów ( ;-) ) ale to przecież nie problem!

Czegoś się nauczyliśmy? O tak! Zamiast wyrażać się o elementach przeciwdziedziny {Y} za pomocą predykatu {P}, możemy mówić coś o elementach {x} z dziedziny {X}. W istocie zdefiniowaliśmy ostatnim równaniem własność opisaną predykatem {P} dla tych elementów. Znaleźliśmy dosyć ogólny sposób by dokonać podstawienia elementów zbioru {X}, w miejsce elementów zbioru {Y}, co pozwala przenieść nam struktury ze zbioru {Y} do {X}. Na przykład kiedy zaczynaliśmy od relacji {P(y)} na zbiorze {Y}, udało nam sie zdefiniować relację {R(x) = P(f(x))} na zbiorze {X}. Ściśle rzecz biorąc powinniśmy jawnie napisać, że odwzorowania które tu analizujemy nie działają już na elementach, ale na podzbiorach ( być może jednoelementowych – czemu nie). Podstawienie to dosyć ważna logicznie operacja. W istocie elementy zbiorów {X} i {Y} nie miały w całym rozumowanie żadnego znaczenia. Warto zastanowić sie nad „operacją podstawienia” {f^{*}} samą w sobie. Co jest potrzebne aby można je było zbudować? Musimy dysponować dziedziną i kodziedziną. Potrzebne jest odwzorowanie między nimi. Wtedy przechodząc do podzbiorów, uzyskamy morfizm, nie bójmy się tego słowa, algebry zbiorów zbiorów {X} i {Y}. Co więcej – wiemy że algebry zbiorów sa algebrami Boola, co można by oznaczyć pisząc {B(X)} i {B(Y)}. Możemy wtedy zapomnieć o elementach zbiorów {X} i {Y} zaś jako podstawowe obiekty rozważać funktory pomiędzy algebrami Boola ich podzbiorów:

f \colon B(X) \rightarrow B(Y)

f^{*} \colon B(Y) \rightarrow B(X)

I w tym miejscu zaczyna sie robić bajecznie ciekawie. Algebry Boola, na przykład po jednej ze stron powyższych równań, można rozważać bez kontekstu algebry zbiorów. Uzyskujemy w ten sposób dostęp do całkiem sporego zestawu narzędzi algebraicznych. A w to wszystko zamieszana relacja podstawienia….

Do sedna. Rozważmy kolejny funktor, jaki sobie utworzymy za pomocą tego co zdefiniowaliśmy powyżej. Nazwijmy go E. Jego dziedziną, jak to u funktorów w zwyczaju, będzie algebra Boola {B(X)} podzbiorów zbioru {X}. Jego przeciwdziedziną będzie algebra {B(Y)}. Dla pewnej relacji ( podzbioru) {L \in B(X)} funktor ten da nam podzbiór {S \in B(Y)} o tej własności, że dla elementów {y \in S} istnieje jakiś {x} taki, że {y=f(x)}. Formalnie {E \colon B(X) \rightarrow B(Y)} taki że:

E_{f}(L) = \{ y \colon \exists x ( y=f(x) \land x \in L ) \}

Jeśli przynależność do zbioru {L}, czyli relacja {L(x)} miała dla nas jakieś znaczenie w odniesieniu do elementów zbioru {X}, to wówczas możemy traktować obraz {E_{f}(L) = S} w operacji {E} tej relacji, jako coś również obdarzonego znaczeniem, relację {S(y)} w odniesieniu do elementów zbioru {Y}. Sam morfizm {E} zamienia wykonuje działanie które możemy zapisać symbolicznie jako transformację { L(x) \rightarrow S(y) = E_{f} x P(x,y)} i interpretować ją jako kwantyfikator szczegółowy ( „istnieje” {x \in X } takie że {S(y)} gdzie {y=f(x)} )

Całkiem podobnie możemy postąpić definiując funktor {A_{f} \colon B(X) \rightarrow B(Y)} w taki sposób że spełniony jest związek:

A_{f}(L) = \{ y \colon \forall x (y=f(x) \Rightarrow x \in L ) \}

którego rola sprowadza sie do operacji { L(x) \rightarrow S(y) = A_{f} x P(x,y)} i zinterpretować go jako kwantyfikator ogólny ( „dla każdego” {x \in X } mamy {f(x)=y \in S(y) } )

Powyższa definicja funktorów {A_{f}} i {E_{f}} całkowicie ignoruje naturę zbiorów o jakich mowa. Czyni to tak konsekwentnie, że w istocie pojęcie zbioru nie jest nam tu do niczego potrzebne – możemy obyć się kategoriami, dla których jesteśmy w stanie zdefiniować stosowne operacje ( morfizmy). Jeśli jedna ze stron równania jest algebrą Boola, Heyntinga itp. możemy traktować zdefiniowane funktory jako kwantyfikatory ogólny i szczegółowy. Istotą powyższych definicji jest oderwanie tych pojęć od „elementów” domeny dyskursu. Sednem jest zbudowanie tych funktorów za pomocą morfizmów. Teoria kategorii ma bardzo rozbudowaną terminologię, choć im bardziej ją poznaję, tym prostsza sie wydaje. Trudności zaczynają się wraz z rozbudowaniem języka, a zwłaszcza wraz z odwoływaniem się do niezliczonych przykładów wymagających znajomości wielu, często dosyć egzotycznych pojęć. Z drugiej strony spotkałem sie ze stwierdzeniem, że w istocie chodzi tylko o malowanie strzałek, a cała teoria posiada tylko dwa interesujące twierdzenia… I nie była to złośliwość, a raczej forma zachęty by teorię poznać…

Na zakończenie uwagi terminologiczne, na podstawie skryptu dla informatyków. Załóżmy, że mamy kategorie {C} i {D}, oraz dwa funktory {f} i {g} miedzy nimi, takie, że {f \colon C \rightarrow D)} oraz, {g \colon D \rightarrow C} ( dodatkowo funktory muszą spełniać pewne naturalne założenia które pominę tu milczeniem – odsyłam do wykładu ). Z naszego, punktu widzenia, zaczynamy zabawę od kategorii {C}, i to ona definiuje nam „dziedzinę” zaś kategoria {D} jest kodziedziną. Mówimy wówczas, że {g} jest lewym sprzężeniem ( left adjoint ) dla funktora {f}. Odwrotnie funktor {f} jest prawym sprzężeniem ( right adjoint ) dla funktora {g}. Stosując ta terminologię, funktor kwantyfikatora ogólnego {A} jest prawym sprzężeniem , zaś kwantyfikator szczegółowy {S} jest lewym sprzężeniem dla funktora podstawienia {f^{*}}.

Ach! A co z Sokratesem? Aby móc wypowiedzieć zdanie A = „Dla każdego {x} ze zbioru ludzi {L}, {x} należy do zbioru obiektów śmiertelnych {S}” potrzebujemy znacznie szerszych zbiorów niż zbiór ludzi i zbiór obiektów śmiertelnych. Musimy rozważyć zbiór na którym bycie człowiekiem jest relacją, może być to zbiór istot ( żyjących, fikcyjnych, literackich, mitologicznych itp.). Z drugiej strony potrzebujemy kodomeny która posiada relację śmiertelności. Użyjemy w tym celu zbioru obiektów realnie istniejących. Każdemu obiektowi z tego zbioru ( który realnie istnieje!) przypiszemy „maksymalny czas życia” {T_{max}} w latach i powiemy że obiekt jest śmiertelny kiedy {T_{max} \leq U} gdzie {U = 1000} dla ustalenia uwagi. . Funktorem {f} pomiędzy kategoriami będzie przypisanie maksymalnego czasu życia dowolnej istocie z domeny. Kwantyfikatory są w tym momencie zdefiniowane. Moglibyśmy teraz zacząć badać ich własności, w szczególności całkiem interesujące wydaje się tu że śmiertelność związana jest z pewną stała ( {U=1000} lat), która można by zmieniać, rozważać jej inne wartości ( nieskończoność? zapewne lepiej oddawałaby intuicję śmiertelności ), zbadać jaki wpływ na powstałę modele śmiertelności maja różne inne morfizmy między kategoriami. Czy prowadzi to do czegoś nowego? Jakieś problemy znikają? W przypadku Sokratesa – chyba nie…

Artykuł powstał na podstawie pracy „Axiomatic Method and Category Theory” autorem której jest Andrei Rodin. Praca, co do zasady o silnym zabarwieniu filozoficznym,. zawiera bardzo interesujące uwagi na temat teorii kategorii, napisana jest zaś w kontekście historycznym. W zasadzie jest to książka, liczy sobie bowiem ponad 300 stron. Szalenie interesujący jest fragment ( nie przeczytałem całości, skupiam sie na wybranych zagadnieniach ) dotyczący relacji „obrazu logiki”, jaki powstaje przy zastosowaniu narzędzi z teorii kategorii, do klasycznego obrazu wynikającego ze stosowania metodologii aksjomatycznej ( systemów formalnych). Autor dostrzega istotne różnice w metodach teorii kategorii i w programie formalizacji na sposób hilbertowski. W szczególności w jednym z akapitów pada zdanie o zatarciu się relacji pomiędzy językiem i metajęzykiem, co wygląda bardzo ciekawie, ale przekracza moje zdolności rozumienia. Dotarłem do 150 strony – przede mną teoria toposów, jest więc nadzieja że coś się wyjaśni. Albo że zginę marnie…