2009-12-13

(Meta)fizyka kombinatoryczna

Potraktujmy poniższe jako niezobowiązującą zabawę w skojarzenia.

Nie wiem czy i do jakiego stopnia Epikura należałoby nazwać filozofem. Stworzył on coś w rodzaju świeckiej religii, której celem było wyzwolenie człowieka od starchu, egzystencjalnego przerażenia. Drogą ku owej wolności , oprócz stosownych reguł życia był - chciałoby się powiedzieć: wyznawany - materializm, który miał usunąć "lęk metafizyczny" i strach przed śmiercią. Jest chyba podobieństwo pomiędzy epikureizmem a psychoterapią (niekoniecznie freudowską, np. jakąś Gestalt czy coś w tym guście - nie znam się zbytnio na psychoterapii), którą w czasach współczesnych ludzie stosują w dokładnie tym samym celu. Ale ja nie o tym właściwie chciałem.

Epikur nie pozostawił pisanej spuścizny opierając się na nauczaniu ustnym i kształceniu uczniów - praktyków jego filozofii i podejścia do życia - krzewiących jego idee dalej. Ten model okazał się zaskakująco skuteczny skoro "wyznanie" epikurejczyków, przetrwało jakieś 500 lat w świecie starożytnym. Elementy filozofii epikurejskiej pokazujące metafizyczne koncepcje stojące za nią dotarły w dużej mierze dzięki twórczości "szeregowych" epikurejczyków utrwalających naukę w swojej twórczości. Najbardziej znany z nich to Lukrecjusz, którego poemat "O naturze wszechrzeczy" to chyba najważniejsze a na pewno najbardziej znane pismo epikurejskie dotrwałe do naszych czasów. Mimo braku programowych ksiąg kodyfikujących doktrynę metafizyczną epikureizmu, trochę o niej wiemy. Przede wszystkim koncepcje bytu i natury świata nie były tu spekulacją prowadzącą do wniosków o charakterze praktycznym, ale wręcz przeciwnie - mądrość życiowa, odrzucenie strachu, droga do szczęścia i wolności człowieka, słowem filozofia życia Epikura wyprzedzał metafizykę, która miała dać dla niej jedynie teoretyczne podstawy, zakorzenić ją w wizji samej natury świata. Jak wspomniałem epikureizm opierał się na materializmie - materia, to co dotykalne, jest jedynym bytem a rządzą materią ustalone racjonalne prawa. Fizyka tego świata to atomizm. Atomy to niepodzielne i podstawowe elementy materii, różnych co prawda ale w ustalonym wyborze rozmiarów i kształtów. Oczywiście epikurejczycy nie mieli pojęcia o grawitacji w rozumieniu dzisiejszym, mieli natomiast naiwne pojęcie o ciążeniu, jako o sile działającej wzdłuż kierunku (a właściwie konstytuującej kierunek) góra-dół. Naturalnym ruchem atomów był więc spadek, poruszanie się w dół. Jednak aby nie stały się jedynie lawiną równolegle spadających cząstek należało wprowadzić coś co tchnie w nią "życie". Zatem do naturalnego ruchu w dół atomom epikurejskim arbitralnie dodano losowy ruch na boki nazwany climena - odchylenie. To remedium na nudny, nieskończenie trywialny determinizm. To climena powoduje, że pojawiają się interakcje atomów, ich zderzenia, łączenie się. Za jego sprawą pojawiają się, jako losowy produkt owych interakcji światy. Dokładnie tak: światy a nie jeden świat. Wśród losowych konfiguracji atomów epikurejczycy za pewne przyjmują pojawienie się kiedyś każdej możliwej ich kombinacji a zatem i każdego możliwego świata. Są to światy chwilowe, nietrwałe, wynikłe z tymczasowej konfiguracji atomów. Ich pojawienie się jest jednak w jakichś sposób konieczne.

Ten aspekt metafizyki, czy też fizyki epikurejskiej jakoś mnie uwiódł. Postaram się wytłumaczyć dlaczego. W oczywisty sposób widzę w nim pewne wczesne ale i daleko idące intuicje probabilistyczne. Np. taką, że nawet niesłychanie mało prawdopodobne zdarzenia w odpowiednio długiej serii losowań (a każda zmiana oparta o climena jest niejako nowym aktem losowania, czy raczej krokiem losowego błądzenia) w końcu z wielką dozą pewności w niej się pojawią.
Ale to pierwsza myśl. Drugie skojarzenie dotyczące intuicji epikurejskich - tym razem na pograniczu probabilistyki i logiki - to teoria tzw. praw zero-jedynkowych. To niesłychanie ciekawe twierdzenia, których protoplastą było prawo zero-jedynkowe udowodnione w latach 60 przez matematyków radzieckich (a przepraszam: sowieckich). Brzmi ono tak:
Niech phi będzie dowolnym zdaniem w języku pierwszego rzędu o skończonej sygnaturze relacyjnej (tzn. języku zawierającym jedynie symbole relacyjne i to w skończonej ilości) wtedy, limn->∞ μn(φ) = 0 albo 1, gdzie przez μn(φ) rozumie się ilość nieizomorficznych modeli rozmiaru n zdania φ.

Co mówi prawo zero-jedynkowe w bardziej ludzkim języku? Ano mówi, że względnie proste zdania o prostym, losowym świecie (w odległy sposób przypominającym co do zasady epikurejską rzeczywisość atomów), są albo trywialnie prawdziwe albo trywialnie fałszywe. Tzn, jeżeli dopuścić naprawdę wielki losowy świat, albo lepiej, coraz większe losowe światy, to prawdopodobieństwo prawdziwości bądź fałszywości owych zdań w tych światach staje się coraz większe. Innymi jeszcze słowy, w coraz większym procencie - rosnącym wraz z rozmiarami - owych światów opisywane przez te zdania struktury istnieją, bądź nie istnieją. Pożytecznym zastosowaniem praw zero-jedynkowych jest możliwość dowodzenia twierdzeń o niewyrażalności pewnych własności w językach pierwszego rzędu. Taką własnością - co wynika z zacytowanego prawa prawa zero-jedynkowego niemal natychmiast - jest parzystość liczby elementów w strukturze relacyjnej. Nie jest to intuicyjne - przynajmniej dla mnie. Prawa zero-jedynkowe są więc ciekawe.
Mnie zawsze kusi, choć to oczywiście zabawa i żart i nie należy traktować tego poważnie, żeby ekstrapolować treść praw zero-jedynkowych na tzw. real w następujący sposób: wszystko co powiemy jasnym i prostym językiem jest albo trywialnie prawdziwe albo trywialnie nieprawdziwe. (Dla potrzeb żartu odrzucam tu wszystkie, ale to absolutnie wszystkie możliwe zastrzeżenia i upraszczam sprawę maksymalnie. Zastrzegam się tak, żeby nie gorszyć ew. czytających te słowa - jednych pozostawiając z fałszywymi przekonaniami co do praw zero-jedynkowych, drugich co do mojej osoby). Gdyby zbudować model formalny epikurejskiej fizyki i udowodnić o nim coś na kształt prawa zero jedynkowego, oznaczałoby to, że pewne konfiguracje, czy światy są w nim niemal konieczne, muszą się pojawić i pojawiają się często, inne zaś, mimo że logicznie możliwe pojawiają się rzadko, przygodnie - w praktycznym rozumieniu tego słowa: nigdy.

Prawa zero-jedynkowe funkcjonują w świecie absolutnie sprawiedliwie losowym. Co jednak ze światami które oszukują, w któych istnienie bądź nieistnienie relacji nie zależy od rzutu uczciwą monetą ale oszukaną. Tu ciekawe rzeczy mówi nam np. teoria grafów (i ogólnie hipergrafów) losowych. Tam pojawiają się interesujące zjawiska w postaci wartości krytycznych prawdopodobieństw zachodzenia relacji przy których dane zdanie stanie się niemal pewnym itp. To w ogóle droga do ciekawej i modnej ostatnio dziedziny badań na styku rachunku prawdopodobieństwa, kombinatoryki, teorii liczb. Wiele się tam ekscytujących rzeczy ostatnio dzieje.

2009-11-26

100

Tak wygląda setny wpis. Okrągła liczba więc powinienem coś podsumować. Szybko i bez nadmiernego zadęcia.
Nie mam zbyt wielu czytelników. Ogromna większość zagląda tu z powodu tytułu jednego z postów by znaleźć ściągę do wypracowania z polskiego. Staram się, żeby każdy post, jeśli już znajdę siłę by go pisać (coraz trudniej mi to robić) był jakimś oryginalnym wkładem w to co można znaleźć w Internecie. Czasem podsyłam rzeczy, które znalazłem gdzie indziej a które uważam za warte zerknięcia - uważam, że rekomendowanie rzeczy niezbyt popularnych a ciekawych jest w jakimś sensie również twórcze.
Będę pisał dalej, choć kiedy zakładałem tego bloga w nieco inny sposób wyobrażałem sobie jego przyszłość.
Największym zawodem jestem zdecydowanie ja sam. Chciałem przede wszystkim notować myśli, które uważam za oryginalne. Niestety, o ile wciąż wiele myśli, które (na własne ryzyko) uważam za warte zanotowania kłębi mi się w głowie, to wysiłek opisania ich wystarczająco precyzyjnie to zawsze jest męka na którą z rzadka się decyduję. Jestem po prostu leniuchem. Szczególnie, że od kiedy w pracy rozpocząłem zabawę z nowym projektem (co stało się niemal rok temu) czuję jak wyciąga ze mnie istotną część soków życiowych.

Nowości: Czasem - bo to znacznie mniej absorbujące i dające się robić przy okazji innych zajęć, trochę nieuczesanych myśli wrzucam na serwis mikroblogowy "Twitter" (hit ostatnich miesięcy). W dolnej części prawego marginesu jest gadżet wyświetlający ostatnich kilka tych wpisów.

Błędy: Czytając niektóre z moich wpisów, głównie matematyczne, widzę błędy i rzeczy do poprawy, ale uczciwie przyznam, że nie mam wielkiej motywacji by czyścić to teraz.

Przyszłość: Chciałbym pociągnąć kilka zaczętych już tematów - bo sam się pisząc o nich uczę się, albo jakoś krystalizuję swoje własne pojęcie o nich.

Zatem - jedyne co mogę obiecać, że mimo znacznego spadku gęstości, następne wpisy będą.

2009-10-29

Z życia Majów

Słońce stanęło w zenicie wpadając niemal pionowym promieniem przez otwór w suficie do wypełnionego dymem odurzających ziół pomieszczenia i oświetlając ołtarz na którym złożono tak wiele ofiar. Słychać było rytmiczny głos klaskania i przeciągłe mruczenie kapłanów. Quiptzlaxa słaniał się na nogach: trans trwał od samego poranka. Wizje przychodziły i odchodziły a każda kolejna ich fala oznaczała kolejną coraz silniejszą konwulsję.Czyżby bogowie chcieli aby przerwał już dzieło któremu za ich sprawą poświęcił całe życie? Czy któraś z mruczących, umazanych na twarzy niebieską farbą postaci otaczających go kołem poniesie ciężar kiedy on umrze przyjmując na siebie kolejne widzenie?

Była to krótka myśl, bowiem zmęczony umysł kapłana znowu wyczuł zbliżanie się obrazów. Opar otaczający go w pomieszczeniu na szczycie Najświętszej Piramidy wydał mu się najpierw gęstszy, wszystkich i wszystko co go otaczało okryła mgła, potem zniknęły dźwięki i zapachy. Dopiero po chwili z mlecznej otoczki zaczęła wyłaniać się wizja.

Dostrzegł, najpierw słabo, potem coraz wyraźniej jeden ze znanych mu już krajobrazów. Quiptzlax słuchał głosu bogów i oglądał to co chcieli przekazać jego ludowi od bardzo wielu faz świętej planety. Obrazy przyszłości rzadko już teraz zaskakiwały go czymś nowym. Nie musiał ich rozumieć, bogowie oczekiwali od niego jedynie wiernej relacji, opowieści która zostanie zapisana w kodeksach i wykuta w kamieniach stanowiąc Wielki Kalendarz - dzieło dla którego przyszedł na świat. Ten obraz jednak był dla niego zrozumiały. Widział wielki plac, kapłanów i uniesionych religijnym szałem uczestników. Odbywała się święta gra. Obrzęd w przyszłości był inny, piłki dotykano nogą a nie ręką i nie kończył się ofiarą dla Xolotlu, ale był zarazem podobny do tego jaki odprawiał i jego lud. Zdziwiony spostrzegł, że nie pierwszy już raz objawiają mu się ci sami wojownicy z emblematem przypominającym świętego jaguara lub raczej pumę i białym ptakiem na czerwonym polu, w strojach o kolorze mleka i krwi.

Mimo stanu w jakim się znajdował na twarz Quiptzlaxa wypełzł uśmiech na wspomnienie poprzednich wizji gry wojowników białego ptaka i pumy. Z trudem powstrzymał umysł przed napływem wesołości, która mogłaby zakłócić trans. Gdy powróciła ostrość widzenia przed oczyma kapłana zaczęło dziać się coś dziwnego i sercem Quiptzlaxa wstrząsnęła trwoga. Jeden z owych biało-czerwonych uczestników gry popchnął nogą piłkę która niczym wypuszczona strzała wpadła w siatkę okalającą brzeg placu którego bronili wojownicy przeciwnej drużyny. W tym momencie czarno odziany arcykapłan wydał z siebie przeciągły gwizd i wielki tłum wpadł w ekstazę.

Quiptzlax osłupiał z niedowierzaniem. Czuł, że wie dlaczego bogowie zsyłają na niego tą scenę: to kres jego pracy. To kres kalendarza. Więcej nie będzie już nic: żadnej następnej fazy księżyca, kolejnego wschodu ani zachodu słońca ani następnej fazy świętej planety, którą potomność nazywać będzie aż do tej objawionej mu chwili "Wenus".

Przerażenie zaczęło ustępować zmęczeniu, ponownie pojawiła się mgła ustępując powoli miejsca dymom kadzideł, wróciło mruczenie i zapach ziół. Stary kapłan stał skamieniały, ostatnie wspomnienie wizji końca świata to dziwne znaki niby ogniem rozjarzające się nad placem świętej gry:

"POLSKA MISTRZEM EUROPY W PIŁCE NOŻNEJ 2012".

2009-09-08

Geometria, sztuka, gołębie i gryzonie

Obrazek z niedzielnego spaceru ulicą Grodzką w Krakowie. Plac Marii Magdaleny - instalacja Ottmara Hörla "Dama z gronostajem" - oczywiście w nawiązaniu do naszego krakowskiego Leonarda.

2009-09-02

Witaj szkoło! (1?)

Moi bardzo młodzi acz niezbyt wierni czytelnicy zaglądający tu często w poszukiwaniu gotowców wypracowania (jak wynika z danych z google analytics) zaczynają właśnie szkołę. Mnie, bo zawsze mi to uświadamia jaki się stary powoli robię i ponieważ wbrew ogólnym tendencjom szkołę wspominam raczej dobrze, od razu łezka się w oku kręci. Szczęśliwe lata... Nie ma co!

Z dedykacją dla nich, dziś wpis przynależący do cyklu rekreacji matematyczno-informatycznych. Skoro szkoła, zatem i matematyka, skoro matematyka to algebra, skoro algebra to wielomiany, wzory skróconego mnożenia i inne tego typu przyjemności. Spróbujmy więc zobaczyć jak sobie poradzi z takimi zabawkami maszyna. Napiszemy ni mniej ni więcej tylko miniaturowy i prościutki system do obliczeń symbolicznych w języku Haskell.

Małe zastrzeżenia: nie będę używał tu całego potencjału języka, jak np. klas żeby jeszcze bardziej nie komplikować pojęciowo programu. Tematy jakie poruszę: algebra elementarna, wielomiany, typy danych, rekurencja, mapowanie list, składanie list, list comprehension (proponuję termin: ujawnianie postaci listy - nie wiem jak to przetłumaczyć dosłownie), odrobinę programowania generycznego.


Zaczynamy:

Ukłon w kierunku standardowej biblioteki, z której skorzystamy wkrótce:

import Char

Na poczatek, skoro algebra i wielomiany, to i zmienne, które będą dowolnymi łańcuchami znaków. Oczywiście to niebezpieczne założenie, bo może prowadzić do mylących nazw zmiennych, jak np taka: ", " ale nasz system będzie prościutki więc zaryzykujemy spychając konieczność pilnowania się na użytkownika. Zatem:

type Var = String

Zmienne w wielomianie występują w potęgach, a zapis potęgi danej zmiennej składa się z nazwy tej zmiennej i liczby całkowitej - potęgi w której występuje. W naszym systemie zareprezentujemy to jako parę (zmienna, liczba całkowita):

type Power = (Var, Integer)


Teraz jednomian (ale bez współczynnika jeszcze) czyli lista potęg zmiennych

type Monomial = [Power]

Jednomian ze współczynnikiem całkowitym (nazwany przeze mnie dla wygory PTerm-em) reprezentujemy przez parę:

type PTerm = (Integer, Monomial)

I w końcu wielomian, który jest listą PTermów:

type Polynomial = [PTerm]

Poćwiczmy rozumienie tych reprezentacji.

Przykład 1:

Wielomian x reprezentujemy jako jednoelementowa listę PTerm-ów, której jedynym elementem jest jednomian x^1 ze współczynnikiem 1. Zatem reprezentacja będzie wyglądać: [(1,[("x",1)])]


Przykład 2:

Wielomian x*y reprezentujemy jako jednoelementowa listę PTerm-ów, której
jedynyjm elementem jest jednomian x^1*y^1 ze współczynnikiem 1. Zatem
reprezentacja będzie wyglądać: [(1,[("x",1),("y",1)])]


Przykład 3:

Wielomian x^3*y+4*y^2*z+1 reprezentujemy jako trójelementową listę:

[ (reprezentacja PTermu x^3*y), (reprezentacja PTermu 4*y^2*z), (reprezentacja PTermu 1)] =

[(1, reprezentacja jednomianu x^3*y), (4,reprezentacja jednomianu y^2*z),
(1, reprezentacja jednomianu pustego)] =

[(1,[reprezentacja potęgi x^3, reprezentacja potęgi y^1]), (4, [reprezentacja ptęgi y^2, reprezentacja ptęgi z^1]), (1,[])] =

[(1,[("x",3),("y",1)]), (4,[("y",2),("z",1)]), (1,[])]


OK. Uznaję, że zrozumieliśmy jak reprezentujemy wielomian i przy okazji przy tych rachunkach na palcach trochę polizaliśmy metody "schodzenia w głąb struktury" którą będziemy konsekwetnie stosować.

Na moment porzućmy wielomian i przejdźmy do użytecznej funkcji, której użyję wkrótce. Do sortowania. Oto prosty kod generycznej implementacji algorytmu quicksort, którego użyjemy:


Deklaracja:

sort :: (x -> x -> Bool) -> [x] -> [x]


i implementacja:

sort _ [] = []
sort f (a:rs) = (sort f [x|x<-rs, f x a]) ++ [a] ++ (sort f [x|x<-rs, f a x])

Deklaracja mówi nam, że jako argumenty funkcja sort przyjmie:

- funkcję przyjmującą dwa argumenty pewnego nieokreślonego typu i zwracającą dla nich jedną z wartości typu Bool (True lub False)

- listę elementów owego typu

Jako wynik działania otrzymamy znowu listę elementów tego typu.


Po cichu zakładamy, że argumenty są dobre, tzn. owa funkcja będąca pierwszym argumentem dla sort jest operacją mniejszości (z wszystkimi konsekwencjami takimi jak antysymetria i przechodniość wyznaczonej przez nią relacji).
Implementacja sort intensywnie korzysta z rekurencyjnej natury quicksorta. Zasadą algorytmu quicksort, która pozwala zrozumieć go bez trudu, a którą ujawnia wprost niniejszy kod jest taka: Weźmy pierwszy element z listy, którą chcemy posortować, potem wrzućmy do pewnej listy wszystkie elementy mniejsze od niego i posortujmy (znowu quicksortem), do drugiej listy wrzućmy wszystkie elementy większe od niego i też posortujmy. Wyliczmy następnie listę wynikową przez sklejenie rezultatów sortowania listy pierwszej, elementu wziętego na początku i rezultatów sortowania listy drugiej. W ramach ćwiczenia można spróbować indukcyjnie udowodnić sobie poprawność tego algorytmu (tzn. że rzeczywiście sortuje).

Zapis (a:rs) jest wzorcem do którego intepreter dopasuje listę z argumentu. Po dopasowaniu w zmiennej a znajdzie sie element stanowiący jej głowę, w zmiennej rs lista (być może pusta) bedąca jej ogonem.

Operacja ++ jest operacją konkatenacji czyli złączenia list, natomiast konstrukcja [ x|x<-rs, f a x ] jest operacją "list comprehension", co ja nazywam operacją "ujawnienia postaci listy" 1.

Oznacza ona, w tym wariancie, stworzenie listy tych elementów x listy rs, które spełniają f a x, gdzie f jest stosowną funkcją a a jest ustalone w danym kroku rekurencji.


Wykonajmy:

Test 1:

Wgrywamy plik w dotychczasowej postaci

Hugs> :load "C:\\Users\\Artur\\Documents\\tar.hs"
i wywołujemy:

Main> sort (<) [1,2,4,3,2,6,9,0] [0,1,2,3,4,6,9]

Nasza funkcja sort rzeczywiście czasami działa. Oczywiście warto pobawić się i przekonać że działa rzeczywiście często :) i w różnych przypadkach.


Kolejną funkcją usługową, z której w różnych kontekstach skorzystamy, będzie funkcja simplify (uprość). Próbuję w niej zawrzeć pewien szczególny sposób upraszczania wyrażeń.
Deklaracja funkcji:

simplify :: (x -> x -> Bool) -> (x -> x -> x) -> [x] -> [x]

i implementacja:

simplify _ _ [] = []
simplify eq gr (h:t) = simplify_step h $ simplify eq gr t where
simplify_step f lst =
(foldl gr f [x | x <- lst, eq f x]) :
[x | x <- lst, not $ eq f x ]
Funkcja simplify bierze jako argument dwie funkcje dwuargumentowe działające na nieznanym apriori typie danych oraz listę elementów tego typu, zwraca zaś listę elementów tego typu.

Pierwsza z funkcji wziętych w argumencie przyjmuje dwa argumenty i zwraca wartość typu Bool (tzn. True lub False). Będzie pełniła rolę operatora porównania. Druga, dla dwu argumentów danego typu produkuje element tego typu i będzie pełniła rolę funkcji kumulacji.

simplify, działa tak, że przebiega listę wyszukuje wszystkie elementy listy równe ze względu na funkcję eq (pierwszy argument) i zastępuje je wszystkie elementem będacym ich kumulacją. Jak to działa w konkretnych przypadkach i dlaczego ma, jak wspomniałem, uchwycić pewną formę upraszczania zobaczymy za chwilę.


Z punktu widzenia języka, implementacja funkcji wprowadza sporo nowych konstrukcji poza znanym już dopasowaniem wzorca. Mamy więc operator $ oznaczajacy, że Haskell wyliczy wartość tego co po prawej stronie i użyje wyliczonej wartości w miejscu $.

Druga konstrukcja to wywołanie rekurencyjne nie zadeklarowanej ani nie zdefiniowanej wcześniej funkcji simplify_step. Funkcja ta jest zdefiniowana lokalnie po słowie where które oznacza własnie, że zdefiniowane zostaną lokalne funkcje. Typ funkcji simlify_step Haskell wydedukuje samodzielnie natomiast jej działanie jest następujące: funkcja bierze jako argument element typu takiego jaki użyty jest w argumentach wołającej ją funkcji simplify i listę elementów tego typu. Następnie wybiera te elementy listy lst którym argument f jest równy względem funkcji eq. Potem składa a właściwie kumuluje używając funkcji foldl wartości tej listy używając funkcji gr i wartości początkowej f. Ostatecznie dostaje pewien element typu takiego jak f. Następnie element ten użyty będzie jako głowa listy której ogonem bedzie lista tych elementów listy lst które nie będą równe f według relacji zadanej przez eq. Złożenie tej listy z głowy i ogona dokonuje się za pośrednictwem konstruktora listy : .

Nieco tajemnicza operacja foldl (której dokładną implementację warto podglądnąć w standardowym module Haskella Prelude) działa w taki sposób, że przyjmuje jako argumenty dwuargomentową funkcję typu (x ->x->x), czyli funkcję biorącą dwa argumenty pewnego typu x i zwracającą element typu x, wartość początkową typu x zgodnego z typem użytym w funkcji i listę elementów typu x . Następnie, jeżeli lista jest niepusta, oblicza wartość funkcji podanej jako argument na dwóch argumentach: zadanej wartości początkowej i głowie listy. Rezultat traktuje jako wartość początkową w rekurencyjnym wywołaniu samej siebie z tą samą funkcją jako argumentemi ogonem listy jako listą. Efektywnie, powoduje to zwijanie listy od lewej strony i kumulowanie wyniku.

Popatrzmy na przykład:

Przykład 4:
Jako funkcji w argumencie foldl użyjemy operatora + działąjącego na argumentach typu Int, jako wartości początkowej 1 a jako listy dwuelementowej listy zawierającej 2 i 3. Kto chce się sprawdzić niech spróbuje bazując na tym co napisane powyżej przewidzieć wynik. A oto rezultat Haskella

Hugs> foldl (+) 1 [2, 3]

Wracamy do wielomianów. Wysiłek jaki włożyliśmy w ogólność funkcji simplify zwróci się teraz przy upraszczaniu jednomianów. Ponieważ jednomian jest listą potęg i na liście tej potęgi tej samej zmiennej moga znaleźć się więcej niż raz, wprowadźmy funkcję upraszczającą eliminującą ową patologię. Oto jej deklaracja i definicja będąca specjalizacją zdefiniowanej powyżej funkcji simplify w której jako funkcja porównująca użyte będzie porównanie pierwszych elementów pary (a więc zmiennych), a jako funkcja kumulująca dodawanie wykładników (co odpowiada mnożeniu potęg):

simplify_mon :: Monomial -> Monomial

simplify_mon = simplify (\x y->fst x == fst y)
(\x y -> (fst x, snd x + snd y))


Mamy tu dwie nowe i ciekawe konstrukcje. Po pierwsze funkcje porównującą i kumulującą zdefiniowaliśmy jako funkcje anonimowe używając tzw lambda-abstrakcji. Przy takiej definicji po lewej stronie operatora -> deklarujemy argumenty funkcji poprzedzając je backslashem (będącym w tym kontekście daleko idącą stylizacją greckiej litery lambda), po prawej umieszczamy zaś stronie definicję działanie funkcji na argumentach.

Drugi interesujący element: nie wyspecyfikowaliśmy argumentu dla simplify_mon. Nie jest to jednak konieczne. Funkcja simplify jest trójargumentowa a w definicji simplify_mon ustalone zostały pierwsze dwa argumenty trzeci z nich pozostaje zmienny. Zatem ustalenie argumentów uczyniło z funkcji simplify funkcję jednoargumentową simplify_mon, przyjmującą jako argument argument ospowiadający trzeciemu argument funkcji simplify.


Kolejnym nowym elementem są dwie standardowe funkcje z modułu Prelude, mianowice fst i snd. Służą one do wybrania pierwszego (fst) i drugiego (snd) elementu pary.


Sprawdźmy teraz działanie simplify_mon. Musimy nasz jednomian zadać wprost

Test 4:

Hugs> :load "C:\\Users\\Artur\\Documents\\tar.hs"

Main> simplify_mon [("x",1), ("x",1)]
[("x",2)]


Uff. Coś działa.


Teraz jednomian sprowadzimy do postaci kanonicznej, co będzie oznaczało, że oprócz uproszczenia posortujemy jeszcze listę go reprezentującą względem porządku alfabetycznego zmiennych. Oto funkcja:


canonize_mon :: Monomial -> Monomial

canonize_mon mon = sort (<) $ simplify_mon mon


Inteligentny Haskell, dzięki modułowi Prelude wie jak porzenieść porządki zdefiniowane dla elementów pary leksykograficznie na porządek par. Funkcję sort już znamy. Zobaczmy canonize_mon w działaniu:


Test 5:


Main> canonize_mon [("x",1), ("x",1), ("a",5)]
[("a",5),("x",2)]


Zgodnie z oczekiwaniami.



Teraz sprowadźmy do postaci kanonicznej cały wielomian. Załatwimy sprawę jedną funkcją używając definicji lokalnych:


canonize_poly :: Polynomial -> Polynomial

canonize_poly p = sort (>) $
simplify (\x y -> snd x == snd y)
(\x y -> (fst x + fst y, snd x)) $
map (\x -> (fst x, canonize_mon $ snd x) ) p

Nowym elementem tu jest interesująca funkcja map zdefiniowana w standardowym module Haskella Prelude, która przenosi działanie fukcji którą dostaje w argumencie na działanie na listach. Innymi słowy podając fukcję pewnego typu (x->y) jako argument do fukcji map otrzymujemy fukcję typu [x]->[y], która działa na liście w ten sposób, że tworzy nową listę każdy element której jest obrazem elementu fukcji wejściowej przez fukcję podaną jako argument do map.


Przykład 5:

Prelude> map (4*) [1,2,3]
[4,8,12]
Prelude> map (\x -> [x]) ["a", "b", "c"]
[["a"],["b"]["c"]]



Sprawdźmy w działaniu funkcję canonize_poly (póki co wielomian zadawać będziemy explicite - jeszcze tylko króciótko się tak pomęczymy)


Test 6:


Main> canonize_poly [(3,[("x",1),("x",1)]), (2,[("x",2)]), (5,[("x",2),("a",4)])]

[(5,[("x",2)]),(5,[("a",4),("x",2)])]


Teraz zajmiemy się przedstawieniem naszych wielomianów w czytelnej dla nas formie, jako łancuchów znakowych. Zapisywać wielomiany będę oczywiście w sposób internetowy używając ASCII jedynie. Pedantycznie przepisywać bedę '*' w miejsce mnożenia i '^' przy potęgowaniu, jako ustępstwo na rzecz ładnego stylu dbając jedynie o unikanie gdzie nie potrzeba potęg pierwszych i mnożenia explicite przez 1. Przedstawię cały kod a potem omówię nowe elementy:

tostring_mon :: Monomial -> String

tostring_mon [] = ""
tostring_mon [(x,y)] | y == 1 = x
| otherwise = x++"^"++ (show y)
tostring_mon (a:rest) = (tostring_mon [a] ) ++ "*" ++ (tostring_mon rest)

tostring_pterm (c, []) = show c
tostring_pterm (1, m) = tostring_mon m
tostring_pterm (c, m) = (show c) ++ "*" ++ tostring_mon m

tostring_poly :: Polynomial -> String

tostring_poly [] = ""
tostring_poly [f] = tostring_pterm f
tostring_poly (f:tl) = foldl (++) (tostring_pterm f) $
map (("+"++).tostring_pterm) tl


W funkcji tostring_mon użyłem wariantowej definicji funkcji, przypominającej mocno zapis matematyczny w postaci tak zwanej klamry, z drugiej zaś trony konstrukcję if...elsif.....else albo bardziej zaawansowany (bo nie oparty o typ numeryczny switch() .. case znany z C, C++ i Javy. Po znaku '|' mamy kolejne warunki spełnieni których przez argumenty oznacza, że wartością funkcji będzie to co po znaku równości.

Kolejna nowość tam to funkcja show stosująca się do pewnych typów przynależnych do klasy Show. Zamienia ona elementy tych typów (w naszym przypadku Integer jest takim typem) na łańcuchy znaków (typ String).
Przy okazji wyszło szydło z worka - String jest po prostu listą znaków (typ Char) i można wobec niego stosować te same operacje co wobec innych list.


Teraz pierwsza radość - zamienimy na napisy pierwsze wielomiany. Zacznijmy od wielomianów z testu 6:


Test 7:

Main> tostring_poly [(3,[("x",1),("x",1)]), (2,[("x",2)]), (5,[("x",2),("a",4)])]

"3*x*x+2*x^2+5*x^2*a^4"

Main> tostring_poly $ canonize_poly [(3,[("x",1),("x",1)]),
(2,[("x",2)]), (5,[("x",2),("a",4)])]
"5*x^2+5*a^4*x^2"


Teraz mam nadzieję, że lepiej widać na czym polega kanonizacja.

Po mału doszliśmy do miejsca w którym możemy zdefiniować operacje na wielomianach. Zacznijmy od dodawania, które będziemy oznaczać fantazyjnym operatorem ~+, a które zdefiniujemy w zaskakująco prosty sposób.

infix 1 ~+

(~+) :: Polynomial -> Polynomial -> Polynomial
x ~+ y = canonize_poly $ x ++ y

Dodawanie jest więc jak widać konkatenacją list reprezentujących wielomiany. My, dla porządku jeszcze dodakowo od razu wynik konkatenacji skanonizujemy.

Ciekawy element to operator, który deklarujemy jako infix, czyli że argumenty dostawał będzie nie jak funkcja po swojej prawej stronie, ale jak porządny operator po obu swoich stronach. Dla potrzeb deklaracji jednak, musimy zaminieć go na chwilę na normalną funkcję (zdjąć z niego niejako "infiksowość") przez obłożenie go nawiasami.


Podobnie prosto zdefiniujemy mnożenie:


infix 2 ~*

(~*) :: Polynomial -> Polynomial -> Polynomial

p1 ~* p2 = canonize_poly [(c1*c2, m1++m2) | (c1, m1) <- p1 , (c2, m2) <- p2]

Tym razem korzystamy z faktu, że mnożenie wielomianów (będących sumą jednomianów) jest sumą wszystkich możliwych iloczynów par jednomianów, z których jeden pochodzi od pierwszego a drugi od drugiego wielomianu. Plus oczywiście kanonizacja dla porządku. Załatwiamy to jedną operacją ujawnienia postaci listy.


Czas na:


Test 8:

Spróbujemy pomnożyć x*(x+y+z*x^2):

Main> tostring_poly $ x ~* (x ~+ (y ~+ z ~* (x ~* x))) where (x,y,z) =
([(1,[("x",1)])],[(1,[("y",1)])],[(1,[("z",1)])])
"x^3*z+x^2+x*y"


Cały wielomian zrealizowany został jako wynik operacji na trywialnych wielomianach x, y, i z które zdefiniowane są po słówku where, wszystkie na raz w jedej krotce.

Wynik znowu zgodnie z oczekiwaniami.

Mając już takie narzędzia, zajmijmy się na chwilę klasyką, tj. tadam... dwumian Newtona. Policzmy go dla potęgi 5 dajmy na to:

Test 9:

Main> tostring_poly $ ((((a ~* a) ~* a) ~* a) ~*a) where a = [(1,[("x", 1)]),(1,[("y", 1)])]
"10*x^3*y^2+10*x^2*y^3+5*x^4*y+5*x*y^4+y^5+x^5"

Cóż, w nieco nieortodoksyjnym porządku, ale to czego należało się spodziewać.


Jak czytelnik pewnie zauważył zadawanie wielomianów w naszej surowej postaci nie jest wygodne, z tego względu pokusimy się o bardzo prosty parser, zamieniający reprezentację wielomianu jako zrozumiałego dla człowieka łańcucha znaków na reprezentację wewnętrzną. Ogólnie pisanie parsera wymaga sporo delikatności i uwagi, ale my napiszemy coś naprawdę bardzo prostego cedując na użytkownika staranność w zadawaniu wejścia dla parsera.

By zrealizować nasz parser, potrzebować będę tokenizera, tj funkcji zaminiającej łańcuch znaków na listę łańcuchów znaków będących rezultatem podzielenia listy oryginalnej na fragmenty rozdzielone z góry zadanym znakiem. Np napis "Ala ma kota" po "tokenizacji" względem znaku ' ' (spacja) stanie się listą ["Ala","ma","kota"]


Oto nasza funkcja tokenize, bioraca jako argument znak i łańcuch znaków a zwracającą stosowną listę łańcuchów:

tokenize :: Char -> String -> [String]

tokenize v "" = []
tokenize v x = tokenize_raw v x [] [] where
tokenize_raw v [] [] rv = rv
tokenize_raw v [] cs rv = (rv++[cs])
tokenize_raw v (f:r) cs rv | f == v = tokenize_raw v r [] (rv++[cs])
| otherwise = tokenize_raw v r (cs ++ [f]) rv


Sprawdźmy działanie naszego tokenizera:


Test 10:

Main> tokenize ' ' "Ala ma kota"
["Ala","ma","kota"]


Dokładnie jak się spodziewaliśmy.


Wykorzystamy teraz funkcję tokenize do parsowania wielomianów. Strategia jest następująca. Najpierw łańcuch podzielimy funkcją tokenize względem znaku '+', następnie każdy z tak otrzymanych kawałków podzielimy wgledem znaku '*' a potem każdy z nich względem znaku '^'. Stosownie do tego co otrzymamy w ostatniej fazie podziału spróbujemy odbudować wielomian odpowiednie interpretując otrzmane kawałki jako wielomiany i kombinując je w wielomian funkcją foldl, kumulując je już to funkcją ~* już to funkcją ~+ stosownie do tego reprezentację jakich fragmentów scalamy.

parse_poly :: String -> Polynomial

parse_poly = foldl (~+) [] $ map parse_coeff $ tokenize '+' s where
parse_coeff r = foldl (~*) [(1,[])] $ map parse_mono $ tokenize '*' r where
parse_mono x = parse_raw $ tokenize '^' x where
isNumber l = and $ map isDigit l
convertToInt l = toInteger $ foldl (\x y -> 10*x + y) 0 $ map digitToInt l
parse_raw [] = []
parse_raw [a,b] = [(1,[(a, convertToInt b)])]
parse_raw [a] | isNumber a = [(convertToInt a,[])]
| otherwise = [(1,[(a,1)])]


Z nowych elementów wystąpiły tu fukcje z załadowanego na początku modułu Char, tj. isDigit (mówiąca czy znak odpowiada cyfrze) i digitToInt (zamieniająca znak odpwiadający cyfrze na odpowiadającą tej cyfrze liczbę).



Przetestujmy:

Test 11:

Main> parse_poly "x+y"
[(1,[("y",1)]),(1,[("x",1)])]
Main> parse_poly "x+2*y*z^2+123"
[(123,[]),(2,[("y",1),("z",2)]),(1,[("x",1)])]
Main> tostring_poly $ parse_poly "x+2*y*z^2+123"
"123+2*y*z^2+x"


Jako ostatnią póki co zaimplementujmy jeszcze jedną operację - operację podstawiania. Pozwoli nam ona w prosty sposób zadawać nawet dość trudne wielomiany. Operacja podstawiania polega na tym, że za pewną zmienną w zadanym wielomianie podstawiamy inny wielomian, dokonujemy na tak otrzymanym wyrażeniu operacji algebraicznych by w efekcie otrzymać wielomian. Poniżej fukcja przyjmująca w argumencie zmienną za którą podstawiamy, wielomian do którego podstawiamy i wielomian podstawiany. Dotychczasowa wiedza powinna wystarczyć do samodzielnej jej analizy.

subst :: Var -> Polynomial -> Polynomial -> Polynomial

subst v bs with = foldl (~+) [] $
map (\(c, p)-> tms c $ subst_mono v p with) bs where
tms c = map (\(x,y)->(c*x, y))
subst_mono lv m w = foldl (~*) [(1,[])] $
map (\(x,n)-> if x==lv then foldl (~*) [(1,[])] $ [w|i<-[1..n]]
else [(1,[(x,n)])]) m


Sprawdżmy w działaniu.


Test 12:

Znowu dwumian Newtona - ale tym razem poszalejmy:

Main> tostring_poly $ subst "a" (parse_poly "a^15") (parse_poly "x+y")
"6435*x^8*y^7+6435*x^7*y^8+5005*x^9*y^6+5005*x^6*y^9+3003*x^10*y^5+3003*x^5*y^10+1365*x^11*y^4+1365*x^4*y^11+455*x^12*y^3+455*x^3*y^12+105*x^13*y^2+10
5*x^2*y^13+15*x^14*y+15*x*y^14+y^15+x^15"

Hmmm... Ręcznie sprawdzić będzie ciężko.

Jak widać Haskell mógłby sobie jakoś poradzić z prostą szkolną algebrą

Na dziś kończymy zabawę. Wkrótce postaram się ulepszyć i rozbudować (nieco) tę zabawkę i poigrać trochę z takimi tematami jak wielomiany symetryczne, wyróżnik, a może i dalej : eliminacja kwantyfikatorów i twierdzenie Tarskiego.


Na razie: wszystkim uczniom i nauczycielom (szczególnie matematyki) życzę powodzenia i cierpliwości w zaczynającym się roku szkolnym.




1
Operacja ujawnienia postaci listy jest z natury podobna do matematycznego zapisu zbiory (bądź klasy) w postaci { : }, gdzie po lewej stronie znaku ':' pojawia się funkcja (być może identyczność) dla argumentów spełniajacych warunek po stronie prawej logiczny warunek opisujący wybrane elementy. Pamiętajmy jednak - listy to nie zbiory!

2009-08-25

Film!

Google video uraczyło mnie dziś głośnym swego czasu i nagradzanym filmem animowanym, "Outside in". Film sygnowany jest m.in. przez jedną z największych gwiazd powojennej matematyki, laureata Medalu Fieldsa (którego wręczono mu nb. na Międzynarodowym Kongresie Matematycznym w Warszawie), Williama Thurstona. Pierwszy raz chyba zobaczyłem to dzieło w całości (wcześniej widziałme jedynie urywki) i uważam, że jest rewelacyjne. Kto ma dziś migrenę, kaca, dolegliwości żołądkowe czy innye podobne przypadłości lepiej niech odłoży oglądanie na inny dzień, w każdym razie ja nie biorę odpowiedzialności za ew. sensacje.
Zatem, usiądźcie wygodnie na stabilnym siedzisku, wyostrzcie zmysły, oczyśćcie umysł i wysilcie wyobraźnię (przede wszystkim przestrzenną) - film tylko pomaga zobaczyć!


2009-08-12

Tałtologia/Tajtologia 2009

Tym razem nadaję z krainy kleszczy, komarów, wody, chmur, lasów, polnych kwiatów, krzyżackich zamków i hitlerowskich bunkrów - słowem z Prus Wschodnich. Urlopujemy się. Trochę panikując a propos kryzysu, przestraszeni kursami walut postanowiliśmy w tym roku nadrobić nasze lokalne zaległości krajoznawcze. Warto. Jest cicho, przyzwoicie cenowo, czysto. I jest do tego niezła pogoda. Nie smażymy i nie pławimy się w jeziorach jedynie. Penetrujemy lokalne zabytki, spacerujemy. Małe odkrycia: warte polecenia kajakowanie na Krutyni. Kto kiedykolwiek zazdrościł np Chorwatom Plitvic powinien koniecznie przepłynąć się odcinkiem z Ukty do Nowego Mostu, wyruszając koniecznie rano kiedy na szlaku nie ma jeszcze zbyt wielu turystów. Cisza, przezroczysta woda i podwodne łąki.
Mazury, to świat od niedawna dopiero "nasz". Pełen jest śladów wielowiecznych tu gospodarzy: Niemców. Zabytkiem ich kultury materialnej są m.in. niezwykłe hydrobudowle - kanały i śluzy, ruchome mosty, które można podziwiać z lądu, ale lepiej z wody. Miasta i wioski mają młodziutkie nazwy i tylko dwujęzyczne mapy zdradzają ich do niedawna jescze odwieczne miano. Stąd pewnie i sporo niemieckich turystów. Dziwne wrażenie. Nasza i nienasza ziemia. Żywy jeszcze ślad czasów gdy z hukiem przeobrażała się europejska siatka granic. Memento: jak wielka cenę, prócz krwi i nieszczęść, płaci się za głupotę i fanatyzm.
Inne rozrywki: zmęczyłem w końcu III tom Reale i niezbyt jeszcze głęboko zabrnąłem w tom IV. Plażując kontynuuję też (leniwie i nie bardzo widząc dokąd mnie zaprowadzą) rozważania matematyczne z poprzedniego postu. Podzielę się, kiedy już na dobre powrócę. Pracuję też niespiesznie nad zabawnym dowodem całkiem poważnego i znanego twierdzenia z nazwiskiem. Jak coś mi z tego wyjdzie - też nie omieszkam napisać.
Kilka zdjęć z wakacji:

2009-07-28

O zwartości burzowym latem

gdy umysł i ciało wołają urlopu...
Dziś trochę matematyki, jaką ostatnio się podbawiałem.



1. Twierdzenie z topologii o uniwersalności kostki Cantora dla przestrzeni zwartych



W topologii ogólnej dowodzi się następującego twierdzenia:



Twierdzenie 1:

Każdej przestrzeń zwarta X o ciężarze m jest ciągłym obrazem kostki Cantora Cm =  {0,1}m (gdzie na Cm mamy topologię Tichonowa).

Gwoli wyjaśnienia, ciężarem przestrzeni topologicznej nazywamy minimalną liczność bazy tej przestrzeni.



2. Specjalny przypadek zwartych przestrzeni metyrycznych: dowód

Nas interesować będzie szczególna wersja tego twierdzenia, mianowicie
taka, gdy X jest przestrzenią zwartą metryczną. Ponieważ zwarta
przestrzeń metryczna ma ciężar nie przekraczający ω, twierdzenie,
którym przez moment się zajmiemy będzie miało postać:

Twierdzenie 2:

Każdej przestrzeń metryczna zwarta X jest ciągłym obrazem kostki
Cantora Cω  =  {0,1}N

(gdzie na Cω mamy metrykę
zadaną wzorem: dC(x,y)=0, dla x=y i d(x,y) = (1/2)-n, gdzie n = min {i| x(i)≠y(i)} w przeciwnym wypadku).

Oczywiście pracujemy tu w ogóle w kategorii porzestrzeni metrycznych z odwzorowaniami ciągłymi jako morfizmami, bowiem {0,1}N jest metryzowalna (i co więcej da się tak zmetryzować, że będzie izometryczna ze zbiorem Cantora mieszkającym jak wiadomo na odcinku). Dla potrzeb poniższych rozważań, żeby nie gryźć się w język co chwilę, pojęcia kostki Cantora używał będeż zawsze w rozumieniu kostki Cantora o ciężarze ω. Podobnie - z uwagi na to co powiedziałem powyżej, mogę też użyć terminu "zbiór Cantora" jako synonimu dla "kostki Cantora".

Przedstawię dowód twierdzenia 2 jaki sobie na własny użytek przeprowadziłem:


Zacznijmy od definicji. ε-sieć  to zbiór S punktów w przestrzeni metrycznej (X,d), t.że X = {K(x, ε) | x ∊ S}.

Dla przestrzeni metrycznych zwartych, dla kazdego epsilon istnieje (na ogół nie jedna) skończona ε-sieć.




W celu konstrukcji naszego odwzorowania, weźmy ciąg εn = (1/2)n . Dla n, niech Sn oznacza pewną wybraną εn-sieć.


Niech φ(0) = #S0


φ(n) = max {#Sn ⋂ K(x, εn-1)| x ∊ Sn-1}


Niech Φ(n) := [log2(φ(n))]+1


niech

ψ(0): {0,1}Φ(0) -> S0


ψ(n): {0,1}Φ(n) × Sn-1 -> Sn taka, że:


ψ(0) jest surjekcją


ψ(n)(_,x): {0,1}Φ(n) -> K(x,εn-1)) ⋂ Sn jest surjekcją


Φ(n) jak można zauważyć jest wystarczająco duże, tak że ψ(n)(_,x) da się dobrze określić dla każedego x ∊ Sn-1. Zbiory postaci {0,1}Φ(n) × {x} dla x ∊ Sn-1 są rozłączne i łącznie pokrywają całą dziedzinę funkcji ψ(n), zatem ψ(n) da się określić dla każdego n.


Teraz zdefiniujemy dwie funkcje:


Rtp : {0,1}N -> {0,1}Φ(0) × {0,1}Φ(1) × ...

i

Sq: {0,1}Φ(0) × {0,1}Φ(1) × ... -> XN


Rtp jest zdefiniowana naturalnie:


(c0, c1, ..., cΦ(0)-1, cΦ(0) ..., cΦ(0)+Φ(1)-1, cΦ(0)+Φ(1), ...) -> ((c0, c1, ..., cΦ(0)-1), (cΦ(0) ..., cΦ(0)+Φ(1)-1), (cΦ(0)+Φ(1), ...),...)


Przyporządkowanie Sq zaś, określone jest następująco:

((c0, c1, ..., cΦ(0)-1), (cΦ(0) ..., cΦ(0)+Φ(1)-1), (cΦ(0)+Φ(1), ...),...) -> (x0, x1, ...)

gdzie:

x0 = ψ(0)(c0, c1, ..., cΦ(0)-1)

xn = ψ(n)((cΦ(0)+...+Φ(n-1), cΦ(0)+...+Φ(n-1)+1, ..., cΦ(0)+...+Φ(n)-1), xn-1)


Zauważmy, że dowolny ciąg należący do obrazu funkcji Sq jest zbieżny.
Wynika to z określenia ciągu (xn) i doboru funkcji ψ(n).
Mamy bowiem:
d(xn, xn-1) <= εn-1
więc
d(xl, xk) < Σi=min(l,k) (1/2)i  = (1/2)min(l,k)-1


Zatem(xn) jest ciągiem Cauchy'ego - a więc zbieżnym w przestrzeni zwartej.

Możemy teraz zdefiniować funkcję:

Cant : {0,1}N -> X

Cant(s) = limn->∞(Sq(Rpt(s)))(n)

Do zakończenia dowodu należy jeszcze pokazać, że:

1. Cant, jest funkcją ciągłą
2. Cant jest suriekcją

Punktu 1 dowodzi się podobnie jak istnienia granicy:

Zauważmy, że d(Sq(Rpt(s))(j), Cant(s)) < (1/2)(j-1) (*)

Teraz, jeżeli Cant(s) = x i weźmiemy dowolne ε > 0, możemy wybrać δ > 0, tak małe, że:

z dC(s,t) < δ wynika, że s(i) = t(i) dla i = 0,...,N, gdzie N > Φ(0)+....+Φ(k) i gdzie (1/2)k < ε/2

Wtedy Sq(Rpt(s))(i) = Sq(Rpt(t))(i) dla i = 0,...,k

i

d(Cant(s), Cant(t))<d(Sq(Rpt(s))(k), Cant(s))+d(Sq(Rpt(s))(k), Cant(t)) = d(Sq(Rpt(s))(k), Cant(s))+d(Sq(Rpt(t))(k), Cant(t)) < ε

co dowodzi ciągłości.

Zatem Cant(Cω) jest domknięty (zwarty) w X. Pokażę teraz, że jest również gęsty w X, co da nam suriektywność i skończy tym samym dowód. Wybierzmy pewne dowolne ε i punkt x ∊ X. Pokażę, że w otoczeniu K(x, ε) punktu x istnieje punkt z obrazu funkcji Cant. Zauważmy, że dla każdego j Sq(Rpt(_))(j) : Cω -> Sj jest surjekcją (**). Wybierzmy więc j tak duże, że Sj jest ε/2-siecią i (1/2)(j-1) < ε/2. Z nierówności (*) i faktu (**) wynika, że istnieje s takie, że d(Cant(s), x)<ε .



3. Ale po co

Samo twierdzenie wydawało mi się zawsze ciekawe. Jakoś ostatnio nachodziło mnie (i wtedy też je sobie udowodniłem) w kontekście nieco filozoficznych rozważań o naturze obiektów matematycznych. Jest bowiem tak, że w twierdzeniu jest ukryty pewien sposób konstruowania przestrzeni zwartych w kombinatoryczny (może finitystyczny) sposób. Funkcje pomocnicze, które były wykorzystywane na potrzeby konstrukcji funkcji Cant zależą od dość dowolnych wyborów stosownych ε-sieci i odpowiednich suriekcji (słowem: Cant powinna mieć przeliczalną liczbę indeksów opisujących jakąż parametry od których zależy) . Ciekawe może być pytanie o warunki jakie należy narzucić na ciąg zbiorów skończonych (Zn) i funkcji Fn: Zn->P(Zn+1) (P(X) to zbiór poszbiorów zbioru X) i malejący ciąg liczb (εn) aby istniała przestrzeń metryczna dla której Zn będą εn-sieciami? Jak odpowiedź zależy od tego, że założymy że będę to εn-sieci minimalne (tzn. żaden właściwy podzbiór Zn nie będzie już en siecią)?  Przy założeniach minimalności są chyba jakieś ciekawe związki między ciągiem #Zn z wymiarem Hausdorffa przestrzeni X? Dołożyć do systemu wymaganie obliczalności systemu funkcji Fn - co dostaniemy? Czy jakąś obliczalną teorię przestrzeni zwartych, w której da się ściśle i dokładnie powiedzieć co to znaczy np. że okrąg lub odcinek jest "prostym" zbiorem natomiast taki płatek Kocha bardziej złożonym (a może wręcz przeciwnie prostszym)? Może ma to jakieś praktyczne znaczenie - np dla kompresji "kształtów" a więc i np. obrazów?

Czy jest jakiś związek (właśnie się uczę tej teorii zaintrygowany ninejszym pytaniem) między twierdzeniem tu dowodzonym a możliwością przedstawiania przestrzeni zwartych jako algebr definiowalnych równościowo?

Bedę wracał do tych tematów mam nadzieję, bo żywo mnie ostatnio zajmują.

2009-07-08

Interludium w milczeniu

Znowu długa i nie planowana przerwa w blogowaniu. Dużo pracy, po prostu. Nie bardzo mam siłę zabierać się za pisanie. Dookoła dziwne lato. Chaos w pogodzie i chaos w umysłach ludzi. Bardzo podziwiam moich znajomych, którzy wychodzą z pracy i oddają się jeszcze jakiemuś absorbującemu hobby. Ja ostatnio nawet lektury pcham do przodu z największym trudem. Fakt, że nie poszedłem z nimi na łatwiznę - zbliżam się właśnie do końca drugiego tomu "Historii filozofii starożytnej" Giovanniego Reale. Świetna rzecz - polecam gorąco. W tle i przed zaśnięciem doprowadziłem też za Flawiuszem Arrianem Aleksandra Wielkiego do Indii i pożegnałem go w Babilonie.
Sam nie wiem jak się to stało, że od jakiegoś czasu strasznie mnie wciąga starożytność. Może to kolejna po matematyce forma bezpiecznego dla zdrowia eskapizmu (uprawiam również formy niezdrowe...)? Może fakt, że po kilku przejażdżkach w śródziemnomorskie okolice, zobaczeniu kilku miejsc przestała być dla mnie ta historia bezduszna - nabrała barw, smaków, kolorów. Ma swoją scenografię. Z drugiej strony, nie jest to jednak oderwanie się zupełne od współczesności. W zmienionych dekoracjach widzę tam przecież ten sam spektakl, charaktery i postawy które spotykam na ulicach, w pracy czy włączając telewizor. Czytając książkę Reale znajduję początek, w wielu przejawach imponujący jakby miał być apogeum, sporów i przygód myśli ludzkiej które trwają do dzisiaj. Pytań na które, stawiając je być może w innym języku - wciąż nie znaleziono odpowiedzi mimo ataków i prób.
Z drugiej strony jestem nieodrodnym dzieckiem swoich czasów. Doceniając pragnienie odpowiedzi na wielkie pytania, metafizyczne starożytności, podziwiając śmiałość w ich stawianiu, rodzącą się głębię i precyzję myśli w czasach kiedy po raz pierwszy próbowano na nie udzielać odpowiedzi, więzi mnie sceptycyzm co do możliwości udzielenia tejże w ogóle. Zgniłe podejrzenia, że są to w rzeczywistości problemy sztuczne, pułapki języka. Wątpliwości co do sensu ich stawiania. Węszę ślady złudnych odpowiedzi i "nibyrozwiązań" w myślach i słowach tych, którzy czują się powołani narzucać -arbitralnie, z pyszną pewnością swoich racji - swoją wolę innym. Historia myśli jest historią złudzeń. Teraźniejszość myśli jest teraźniejszością złudzeń.

2009-05-23

Kolaż


collage, originally uploaded by minthem.

Impresje, ulotność chwili. Kolory, zapachy dźwięki - wrażenia. Filozofowie od czasów najdawniejszych próbują jakoś pogodzić, że realny świat dociera do nas przez strumień wrażeń jedynie. Od kwestionowania prawdziwości tego co i jak nam się jawi w relacji do bytu prawdziwego jak u eleatów, rozpaczliwe starcie o PEWNOSĆ u Kratezjusza i niepokojącą nieomal bluźnierczą myśl biskupa Berkeleya: długa droga nie tak dziwna wcale jak mogłoby się wydawać. Wystarczy pomyśleć jak niewielki wycinek spektrum elektromagentycznego odbieramy wzrokiem, jak wąski zakres częstotliwości słuchem, jak niewiele zapachów i smaków odróżniamy. A nawet gdybyśmy byli nieskończenie bardziej czuli jako aparaty pomiarowe: to z czym styka się nasz umysł to impulsy biegnące w nerwach. Można, stymulując je sztucznie, wywołać owe wrażenia. Podobnie jak stymulując chemicznie mózg możemy oszukać go i sprawić że zachowuje się tak jakby owe impulsy do niego docierały.
Zdecydowanie: rzeczywistość nam się wymyka ale wrażenia, to jedyne co mamy. Cenimy je sobie. Chcemy je zachować, przechować, odszukiwać je, wracać. To zatrudnienie dla pamięci. Nauczyliśmy się pomagać pamięci zachowująć wycinek, aspekt rzeczywistości jak nam się ona jawi. To m.in. fotografia. Dziś, montując we wszędobylskie już telefony komórkowe aparaty fotograficzne ich producenci dali nam szansę czynić o bez większego trudu. Ja w każdym razie łapię te wrażenia. Celowo niedokładnie i nieprecyzyjnie. Nie tylko z powodu niedoskonałości technicznej zabawkowego aparatu, ale właśnie by zamrozić ów moment przelotnego wrażenia. Z całą jego niedokładnością i niedbalstwem. Rynek Krakowski w dziwnym świetle, pożółkłe liście na chodniku w Cieszynie, nidopałek na ulicy Dolnych Młynów itd. itp. - migawki ze świata, jak jawi się mnie.
Ten kolaż to fragment tego impresjonistycznego minipamiętnika.

2009-05-20

Hard Day's Night

ale w sumie sam tego chciałem. Porzuciwszy jakiś czas temu biurową wygodę zapuściłem się w świat frontowego programowania. Potrafi dać w kość, szczególnie jeśli się jak ja zardzewiało dość mocno. Tak oto staję przed wami zmorzony tropieniem pułapek wielokrotnego dziedziczenia w C++ (dzięki Bogu nie w moim kodzie takie bezeceństwa), braku synchronizacji na obiekcie w którym STL-owe kontenery zmieniają się aż miło (to też nie mój błąd ale znalezienie go kosztowało mnie właśnie zdrowie), czy w końcu niuchanie niezwalnianych zasobów - też pokutowałem za nieswoje grzechy. To wszystko zanim wejrzę w otchłań własnych błędów...
Pan Bóg wypędzając Adam z Raju, o ile pamiętam, przyobiecał mu, że nie będzie lekko. Na język dzisiejszej programującej klasy robotniczej przekłada się to właśnie na takie oto atrakcje, jakie opisałem. Swoją drogą, idąc tym tropem piszącym w C++ bliżej do Raju niż tym piszącym w Javie, która nie jest aż taką pokutą. Z drugiej strony w C++ (szczególnie w nowinkach STL-owych) znaleźć można pewne perwersyjne przyjemności. Więc może wszyscy równo w tym czyśćcu...
Co by nie mówić, wychodząc dzisiaj z roboty (tak! z roboty a nie z pracy!), w poczuciu, niewykluczone że dobrze, spełnionego obowiązku poczułem grawitację silniej niż zwykle. Rytuał oczyszczenia z nalotu pracy i powrotu do problemów które zajmują mnie naprawdę, zwykle ograniczający się do lektury w autobusie dziś nie poskutkował. Siedzę, a w głowie kotłują mi się wskaźniki, mutexy, semafory itp. Gdyby to był jeszcze mój kod - jego struktura, sposób działania dojrzewałby wraz ze mną, wmyśliłbym się w niego dawniej już, inaczej by wyglądał, czułbym jaki być powinien, byłby taki. Miałby okrągły design, którego chętnie bym bronił. A tak, muszę się na w zawiłych linijkach ścierać z jakimś innym umysłem inaczej podchodzącym do problemów, gwałcić swój by nie ulec pokusie nadmiernego przepisywania i ograniczyć się do rozsądnych uderzeń młotkiem we właściwe miejsca - tak nakazuje ekonomia.
Cóż, musi wyjść dobrze. Wyjdzie. W końcu jestem zawodowcem. Prywatne odczucia powierzę blogowi - tj. wam czytelnicy.

2009-04-19

Botanica. Wiosna, po prostu wiosna.

Mały fotoreportaż z wiosennej przechadzki. Ogród botaniczny w Krakowie.
Rozleniwiłem się (jeśli to możliwe jeszcze bardziej) więc wielu słów nie będzie.

2009-04-16

Debiut Tricki

Parę godzin temu pojawił się anons, że strona o której już tu jakiś czas temu pisałem jest aktywna i dostępna dla użytkowników. Chodzi o projekt "Tricki" - czegoś rodzaju wiki tyle, że z opisem sposobów, sztuczek, wytrychów, metod itd. które można zastosować w pracy matematyka. To wyjątkowy pomysł - nie monografia, nie encyklopedia, nie wykład. To nauka warsztatu. Bezcenna sprawa. Pomysł sygnują i kontrybuują do projektu wybitni matematycy współcześni, w tym laureaci medalu Fieldsa: Timothy Gowers i Terence Tao.
Polecam - sam już oblizuję się na myśl czego się można już i czego się można będzie w przyszłości z materiałów tam zamieszczonych nauczyć.
Szczególnie polecam tej, bliskiej mi mentalnie grupie ludzi (której istnienie i liczność przekraczającą jeden na nikłych przesłankach antycypuję), którzy zdobyli formalne wykształcenie matematyczne (lub pokrewne) i matematyką się interesują "twórczo", tzn. lubią popracować nad jakimś problemem, a z różnych przyczyn znaleźli się poza szeroko rozumianym środowiskiem akademickim. Internet, a szczególnie takie inicjatywy to wielka szansa dla nas, aby nie stracić kontaktu z prawdziwą nauką. Szkoda tylko, że w polskojęzycznym Internecie tak mało się w owym światku dzieje.

2009-04-09

Zrzuty ze stanu umysłu

Tak więc:
1. Co mnie ubawiło
Ubawiło mnie, że oszołomstwo jest zjawiskiem permanentnym, wykazują je ludzie niezależnie od epok. Idee i myśli mają tendencję by się wyradzać i zamieniać w swoją groteskową formę. Ubawił mnie w szczególności w tym kontekście filozof grecki Kratylos, który zradykalizował myśl Heraklita i doszedł do takich kwiatów (jak podaje Arystoteles w "Metafizyce"):
"w końcu doszedł do wniosku, że nie należy nic mówić, lecz tylko poruszać palcem i krytykował również Heraklita za to, że twierdził, iż nie można wejść dwa razy do tej samej rzeki, bo jego zdaniem nie można nawet raz wejść do tej samej rzeki".
Zaiste, strach coś mądrego powiedzieć (nie żebym sam miał coś mądrego do powiedzenia, ale tak ogólnie stwierdzam).
2. Czego się dowiedziałem
Dowiedziałem się (a potem sam sobie udowodniłem), że suma odwrotności kolejnych liczb naturalnych od 1 do p-1, gdzie p to liczba pierwsza, przedstawiona jako ulamek nieskracalny ma licznik podzielny przez p^2. Polecam amatorom. Nietrudne i fajne.
Poza tym ciekawa praca z 1959 roku (rzecz jest już solidnie klasyczna, więc pewnie dawno powinienem to wiedzieć i zapewne jest również w podręcznikach, ale nie chce mi się sprawdzać czy i w których - przyznaję, że moja ignorancja jest potworna) z Pacific Journal of Mathematics: E.D.Cashwell, C.J.Everett "The Ring of number-theoretic functions" (jest on-line - Google pomoże)
3. Co mnie nakręciło.
Nakręcił mnie klip z YouTube. Znowu trochę o Afryce. Cesaria Evora i jej afrykańscy przyjaciele (z moją prywatnę dedykacją dla B16):

2009-03-28

Dwóch

Jeden znaleziony w rzece Zbrucz pochodzi z IX wieku, drugi sfotografowany został zeszłorocznej jesieni na rynku w Lanckoronie. Oba na swój sposób ładne.

Pół biedy jeśli obserwator rozszerza źrenicę gdy dzieje się coś złego znudzonym wzrokiem ledwie tylko łypiąc przy ukradkowych pocałunkach wstydliwych parek czy szybkim łyku wódki nie tam gdzie wolno. Gorzej jeśli patrzy z wypiekami ocierając spocone z podniecenia czoło. Jeszcze gorzej gdy patrzy i nie ma skrupułów.
Czy na pewno wiemy kto będzie na nas patrzył kiedy pozwalamy by się nam przyglądać?

Informacje o prawach autorskich: Zdjęcie Światowida ze Zbrucza zostało zrobione i udostępnione w zasobach Wikipedii w ramach licencji GFDL i Creative Commons Attribution ShareAlike 2.5 przez pana Jana Mehlicha.

2009-03-27

Sprowokowany zabawnym artykułem...

Ponieważ zapronumerowałem wieści o świeżo pojawiających się w niektórych działach serwisu arXiv artykułach, trzymam rękę na pulsie. Przedwczoraj właśnie serwis zaanonsował mi, jak się okazało zabawny i ciekawy, artykulik niejakiego Dorona Zeilbergera. Tytuł jest nieco krzykliwy: "Teaching the Computer how to Discover(!) and then Prove(!!) (all by Itself(!!!)) Analogs of Collatz's Notorious 3x+1 Conjecture".
Zanim po krótce objaśnię o czym ten artykuł, podywaguję (co lubię najbardziej). Zeilberger jest m.in. współautorem (z Petkovsekem i Wilfem) głośnej swego czasu książki "A=B" . W książce tej o ile dobrze pamiętam ćwiczy się intensywnie (choć nie jedynie) automatyczne odkrywanie i dowodzenie identyczności różnych sum z symbolem Newtona w roli głównej. Jest to pewna forma uprawiania wspomaganej komputerowo matematyki w której nie walczy się o ogólność podejścia komputerowego (np. żeby maszyna potrafiła twórczo podejść do udowodnienia bądź nawet odkrycia dowolnego twierdzenia jakiejś teorii), ale raczej eksploatuje się pewne szczególne podejście które daje dużo dobrych twierdzeń jakiejś szczególnej postaci - np. tożsamości - powielając bądź lekko wariując jedną metodę.
W ogóle, to jest historia, która mnie trochę bawi z tymi algorytmami z książki "A=B". Rosyjski matematyk Jurij Matiasiewicz, sławny dzięki zadaniu coup de grace słynnemu X problemowi Hilberta, w pracach z końca lat 90-tych (choćby tu ) pokazał metody tłumaczenia twierdzeń z teorii liczb na tożsamości z użyciem symbolu Newtona, w typie zbliżonym do tych, o których mowa u Zelbergera, Wilfa i Petkoveska. W niektórych pracach wprost nawiązuje on do książki "A=B" wyrażając nadzieję, że uda się kiedyś dzięki jego translacjom, przez (automatyczne) udowodnienie takich tożsamości dowodzić twierdzeń o innej bardziej interesującej matematycznie treści. W szczególności, w pracy Matjasiewicza, którą tu linkuję zajmuje się on translacją do tożsamości dwumiennych starej hipotezy zwanej "problemem Collatza", czasem "problemem Ulama", względnie "problem 3x+1". Zagadnienie jest dobrze znane i szeroko opisywane nie będę go więc tu przedstawiał w szczegółach.
Zeilberger, że zatoczę w moich dygresjach koło, we wspomnianym na początku artykule zajmuje się rodziną problemów formalnie podobnych do problemu Collatza, analizując strukturę dowodów (podanych przez ludzi) dla pewnych przypadków szczególnych. Następnie, pokazuje w jaki sposób można przymusić komputer do postępowania według podobnego schematu: generowania konkretnych przypadków zagadnienia za pomocą metod "rachunkowych" , znajdowania wzorca spełanianego przez przypadki satysfakcjonujące, tworzenia na tej bazie hipotezy (pewnej z góry znanej twórcy programu postaci, ale zależnej od wielu parametrów ustalonych przez komputer w krokach poprzednich), generowania (jeśli się uda) dowodu, który też jest konstruowany według pewnego szczególnego, znanego apriori schematu. Konkretna realizacja tego schematu jest jednak wyszukiwana przez komputer. W efekcie, maszyna wypluwa szereg twierdzeń i dowodów o całkiem interesującej matematycznie treści, wysycając potencjał tkwiący w zaszytych w algorytmie schematach.
Poruszam się tu na dużym poziomie ogólności więc po szczegóły odsyłam bezpośrednio do wzmiankowanej pracy. Nie jest to ani typowa praca matematyczna, ani lektura trudna pojęciowo a i napisana jest leciutko. Sądzę, że jest, bez wielkiego trudu, do przejścia dla tzw. zdolnego licealisty. Niezbyt zawiłe ćwiczenie z nierówności trójkąta, indukcji matematycznej i zrozumienia sposobu działania algorytmów.
Kilka myśli, a może i jakiś morał.
Po pierwsze, w typowym myśleniu o automatycznym dowodzeniu twierdzeń rozważa, się mniej więcej coś takiego:
Przestrzenią w której się poruszamy jest skierowany graf (drzewo właściwie) możliwych wywodów, węzłami którego są wywody, tj. zbiory (być może puste) stwierdzeń.
Wywody w węzłach mają tę własność, że wywód w węźle na końcu strzałki jest powtórzeniem wywodu z początku strzałki z dopisanym aksjomatem lub stwierdzeniem będącym logiczną konsekwencją stwierdzeń wchodzących w skład wywodu z początku strzałki.
Abstrakcyjnie pojęty algorytm automatycznego dowodzenia przeszukuje według pewnej strategii owe drzewo starając się znaleźć nasze twierdzenie jako jeden z elementów wywodu w którymś węźle1. Pułapka leży w tym, że przestrzeń poszukiwań (ów graf) jest ogromny i startegie prostackie, nie mają szans. Strategie wyrafinowane mają wbudowaną w siebie jakąś podpowiedź (heurystykę). To co proponuje Zeilberger to, w tych terminach, bardzo silna heurystyka, która ryzykując chybienie celu przeszukuje bardzo mały ale obiecujący obszar przestrzeni. Ta strategia może nieźle działać: jesteśmy w stanie zidentyfikować pewne "metody" czy "schematy" dowodzenia które aplikują się w wielu sytuacjach. Jesteśmy w stanie podać sposoby generowania skomplikowanych ale schematycznych prób dowodzenia czegoś. Np. (ograniczając sie jedynie do hasła "indukcja matematyczna"), przez piętrowe dowody indukcyjne albo przez stopniowe wzmacnianie hipotez indukcyjnych jak w pracy Zeilbergera. W takich sytuacjach mechanizacja jest możliwa i może być bardzo efektywna. Oczywiście czytelność takich dowodów jest problematyczna: człowiek może nie być w stanie ogarnąć, dajmy na to, kilkunastopiętrowej indukcji. Może być tak oczywiście, że jakieś teorie wyższego poziomu pozwolą zrezygnować z niezrozumiałych dowodów na rzecz prostszych, z wyższego punktu widzenia niejako przeprowadzonych (ale wtedy same te teorie ukryją w sobie prawdopodobnie całą złożoność). Ale raczej sądzę, że zagadnienia typu np. hipotezy Robbinsa staną się jednak domeną komputerów. Pozostaje wierzyć w maszyny i cieszyć się wynikami. Nie można apriori wykluczyć, ze są twierdzenia, które po prostu dadzą się tylko tak udowodnić - jeśli chcemy więc znać prawdę być może będziemy skazani, również w matematyce, na zaufanie do maszyn.
Ciekawym aspektem pracy Zeilbergera jest też mechanizacja procesu stawiania hipotez. Tu do indukcji matematycznej dochodzi indukcja empiryczna, ale to zupełnie inny temat, zresztą lekko tylko tam poruszony. To zagadnienie - moim zdaniem centralne dla rozwoju tzw. Sztucznej Inteligencji - zasługuje na osobne potraktowanie, na co, w tym sprowokowanym lekturą pracy Zeilerbergera poście, nie znajduję miejsca (ale w przyszłości, kto wie...).
Dołączam się w końcu do apelu autora artykułu: może któryś z nadpobudliwych intelektualnie młodych kolegów, zamiast myśleć o hackowaniu kolejnej strony czy ściąganiu zabezpieczeń z kolejnego programu, zająłby się uczciwszym, a stawiającym wyższe poprzeczki jego umiejętnościom, zajęciem i podjął się dalszych eksperymentów w duchu tych o których mowa w dyskutowanej pracy? Autor tego bloga pewnie chciałby, ale jeśli zdoła to uczynić to chyba dopiero na emeryturze (jeśli dożyje i nie będzie musiał żebrać).


1Często konstruuje się ten graf inaczej: wychodzi się od zaprzeczenia twierdzenia wyjściowego, aksjomatów i zachowując regułę wynikania z poprzedzajacych wywodów szuka się sprzecznosci.

2009-03-25

Wszelkie pogłoski

o śmierci tego bloga (rozpuszczane anonimowo!!!) wydają się być nieco przesadzone. Przyznaję, przyznaję, tegoroczny marzec obfitując w wydarzenia, nawarstwiające się komplikacje, nawał prac rozmaitych, wydaje się być dla blogowania stracony, ale po wynikach jednej bitwy nie rozstrzygajmy o losach wojny.
Wracam więc na łamy z garścią nie do końca powiązanych myśli. Po pierwsze, przeoczyłem niemal poprzedni (marcowy, bo marcowy pojawia się już w lutym, a w marcu konsekwentnie pojawia się kwietniowy) numer "Notices of AMS", gdzie znaleźć można ciekawy artykuł Time-frequency Analysis of Musical Rhythm. Polecam miłośnikom muzyki, przetwarzania sygnałów i nowej nauki (a może odmiany filozofii), którą właśnie obmyślam ;) i którą roboczo i uroczo nazywam ordobabilistyką (zresztą nieważne, o tym kiedy indziej).
Apropos muzyki, o czym pewnie tu jeszcze nie wspominałem, jestem miłośnikiem, choć nie takim jak drzewiej bywało, muzyki - głównie klasycznej ale i dobrych dźwięków nieco lżejszej natury (w tym staroci i zapomnianych ramotek). Idąc za najbardziej ogólną klasyfikacją: preferuję muzykę smutną... Renesans moich zainteresowań muzycznych, dla których znajdowałem w ostatnich latach mało bardzo czasu, wiąże się ściśle z gwiazdkowym prezentem od Mojej Małżonki jakim był odtwarzacz ZEN firmy Creative, a który stał się jednym z moich Najlepszych Przyjaciół. Słucham więc na całego co przy okazji i w miejscach w których nigdy przedtem muzyki nie słuchałem, co jest przy okazji łagodną formą eskapizmu. Najnowszymi czasy, wyrwawszy się z kartezjańskiej pułapki czasu i częstotliwości, w której, na zasadzie obsesji, zamknęły mnie "Wariacje goldbergowskie" Bacha w wykonaniu fortepianowym Bronisławy Kawalli, wpadłem w drugą pułapkę zastawioną przez niezwykłą portugalską śpiewczkę: Marizę. O istnieniu pani Marizy dowiedziałem się, będzie ze dwa lata temu, z telewizji Mezzo, gdzie, przystając w szaleńczej galopadzie po kanałach telewizyjnych, natknąłem się na jej koncert z Londynu. Zrobił na mnie wielkie wrażenie ale jakoś w pierwszym odruchu nie zakupiłem żadnej płyty a potem wspomnienie stopniowo mi się zacierało. Ostatnio wszak nabyłem ich aż trzy i rozrywam sobie serce niezwykłą muzyką fado w wykonaniu niezwykłej Portugalki. Nie jest to przesadnie wyrafinowana muzyka. Fado - to raczej dźwięki i melodie, które z łatwością wzruszają i zapadają w pamięć. Jej prostota jednakże jest szlachetna i nie ma nic wspólnego z prostactwem. Zresztą nie sama forma i melodia są tu zdaje się najważniejsze. Najważniejszy jest głos i emocja. I choć fado jako takie jest wytworem XIX wiecznej miejskiej kultury Lizbony, w tym kraju marynarzy nie mogło nie nasiąknąć elementami kultur obcych. Słuchanie fado jest więc prawdziwą podróżą do podstaw, do "miejsca" w którym z prostych wzruszeń rodzi się sztuka zwana muzyką. Słowem: polecam Marizę. Próbka z YouTube (kiedyś cała ta żerująca radośnie jutubowa szarańcza co się nie boi Boga i praw autorskich pójdzie siedzieć a wiatr będzie hulał po wyludnionych miastach) :

Cóż, wspomnę jeszcze w tym reanimacyjnym wpisie o tym, że niestety częśc moich lektur późnozimowych stała się lekturami wczesnowiosennymi, bo jakoś nie mogę uzyskać tego poziomu koncentracji by je po prostu skończyć. O jednej szczególnej będę musiał napisać osobno, bo zanosi się na moją osobistą porażkę. Odsyłam do wpisów przyszłości gwoli poznania szczegółów, powiem teraz tylko tyle, ża (jak już kiedyś pisałem) matematyka nie jest łatwa niestety...

2009-02-22

Rozsądek

W zasadzie cenię sobie zdrowy rozsądek. Schlebiam sobie, że w pewnym zakresie go posiadam. Oczekuję go od innych w wielu sprawach. Pamiętam jednak o aforyzmie Einsteina: zdrowy rozsądek to suma przesądów zdobytych w dzieciństwie.
W zasadzie cenię sobie intuicję. Schlebiam sobie, że w pewnych sprawach ją posiadam. Oczekuję jej w wielu kwestiach od innych. Co to jednak jest intuicja, czy nie jest aby przeceniana ? Czy nie jest to suma przesądów zdobytych niekoniecznie już w dzieciństwie, tyle, że nie do końca uświadomiona? Pozawerbalna materializacja doświadczenia ?
Zdrowy rozsądek, ubrany w słowa robi piorunujące wrażenie. Przekonuje. W opakowaniu retorycznego, czy zgoła erystycznego argumentu jest najlepszą łapówką za przyznanie zwycięstwa jaką dyskutant może dać słuchaczom dysputy. Schlebia powierzchownemu oglądowi rzeczy, schlebia lenistwu umysłu. Nie trzeba wnikać głęboko - głaskanie naskórka umysłu wystarczy.
Zdrowy rozsądek jest pożytecznym przystosowaniem. W obrębie ludzkiego mezokosmosu, dla czynności i potrzeb przetrwania, złowienia czy wyhodowania pokarmu, zwabienia partnera seksualnego i utrzymania potomstwa do momentu kiedy osiągnie samodzielność, w statystycznej większości sytuacji nie zawodzi. Jego owoce są szybkie a podążanie za jego nakazami czyni sprawnym. W obszarach, które są produktem ubocznym inteligencji, przystosowania jakim ewolucja obdarzyła gatunek ludzki, tam gdzie zaczyna on dociekać istoty rzeczy, poszukuje prawdziwych mechanizmów rządzących światem i wszechświatem nie poprzestając na teoriach jedynie użytecznych, przewodnik to zwodniczy. Kultura - ów twór ewoluujący niejako samodzielnie w środowisku, którym jest społeczeństwo ludzkie, również i dawno już oparła się o próg poza którym od istot ludzkich wymagane jest coś znacznie więcej niż powierzchowny ogląd rzeczy.
Zdrowy rozsądek ewoluuje wraz z kulturą - to fakt. Wczorajsze przełomy, kiedy nasze rozumienie rzeczy przebiło się przez okowy ówczesnego zdrowego rozsądku, stają się dziś podstawą przesądów jakie nabywamy w dzieciństwie, by stać się pancerzem, przez który będzie musiało przebić się rozumienie rzeczy w pokoleniach następnych. Czy to, że tak jest, że nasza skrzętnie notowana i hołubiona historia odnotowuje ten powtarzający się w kółko proces, nauczyło nas czegoś ? Częściowo tak. Może zaczęliśmy doceniać wielką rolę jaką dla tego czym jesteśmy, dla naszych osiągnięć jako ludzkości stanowi sceptycyzm. Może...
Uważam, żeby nie przedobrzyć ze zdrowym rozsądkiem. Szczypię się boleśnie kiedy zdroworozsądkowy argument - polityczny, naukowy czy jakikolwiek inny zaczyna do mnie przemawiać zbyt wyraźnie. Węszę pułapkę. Bo choć w większości przypadków można polegać na tym przewodniku, to co naprawdę ciekawe łatwo można przeoczyć polegając na nim absolutnie.

2009-02-20

Jeśli chcesz w przyszłości zostać guru...

Co jakiś czas wertując różne nowości i ciekawostki ze świata nauki natrafia się na coś, co pachnie technologią przyszłości. Nie takiej za 50 czy sto lat. Takiej za 5 albo 10. Ostatnio mój kandydat numer jeden to technika tzw. compressed sensing rozwijana przez różne grupy zajmujace się przetwarzaniem sygnałów, głównie w USA, wsparte matematycznie przez taką sławę jak Terence Tao.

Zastosowania compressed sensing, które autorzy najczęściej podają, wiążą sie głównie z akwizycją i kompresowaniem obrazów, choć zastosowania potencjalne idą znacznie dalej. Postaram się w trzech słowach objaśnić co na razie z tego rozumiem.

Compreessed sensing jak wszystko co ma w nazwie "compressed" opiera sie na pewnej redundancji, czyli nadmiarowości w sygnale jakim w naszym przykładzie jest obraz. W klasycznym kodowaniu stratnym proces z grubsza wygląda tak:

(1) najpierw zbieramy dość dokładną informację o sygnale. Dokładność przekłada się zwykle na częstość próbkowania - na przykład w przypadku obrazu w aparacie cyfrowym na ilość elementów czułych w matrycy. Dostajemy pewien wektor w bazie, której każdy element przedstawia jeden piksel. Taka baza to zbiór wektorów postaci:

em,n(t,k) = 1 gdy t = m, k = n i 0 w innym wypadku.

W tej bazie obraz ma M na N pikseli ma przedstawienie:

OBRAZ = a1,1 * e1,1+...+aM,N*eM,N

gdzie am,n oznacza poziom jasności piksela. W tej bazie zwykle większość ai,j jest sporych i nie możnaby łatwo ograniczyć się do części z nich by reprezentować obraz.

(2) Potem dokonujemy transformaty, czyli wyliczamy przedstawienie tego wektora w bazie transformaty.

W przypadku dyskretnej transformaty Fouriera będzie to baza postaci

Fm,n(t, k) = exp(2*pi*i*(t*m/M + n*k/N)).

W tej bazie, nasz wektor będzie miał przedstawienie:

OBRAZ = b1,1 * F1,1+...bM,N*FM,N.

Tu, zwykle okazuje się, że jest lepiej i pewna niewielka część współczynników dominuje 1. Oczywiście możemy używać innych baz: np falek (wavelet) itp.

(3) Dokonujemy pewnych uproszczeń na sygnale korzystając z tej jego miłej cechy po przedstawieniu w bazie transformaty o której wspomniałem powyżej i dostajemy


OBRAZ' = b1,1' * F1,1+ ...bM,N' *FM,N



gdzie współczynniki primowane są bliskie nieprimowanych ale wiele z nich jest po prostu zerem. Wektor OBRAZ' jest bliski wektorowi OBRAZ.


(4) Na drugą stronę linii trzeba więc przekazać (względnie schować do pliku) indeksy i ich wartości tych niezerowych współczynników primowanych



(5) Odtwarzający (odpakowujący) odtwarza z tego co zapisane w punkcie (4) OBRAZ'.


Na ile dobrze to działa (modulo szczegóły techniczne, konkretne transformaty itp. bo zasada jest ta sama) możemy oglądać codziennie przeglądając obrazki na stronach WWW czy oglądając film na DVD.

A teraz wyobraźmy sobie, że nie musimy martwić się przekazywaniem informacji o tym podzbiorze ani o wartościach współczynników. Że zamiast mierzyć wszystkie piksele w kroku 1 mierzymy jedynie ich niewielką ale znaną część, że w ogóle pomijamy krok 2 i krok 3, i przesyłamy tylko wyniki tego pomiaru. Najpierw zalety: postępując w ten sposób mamy:

- mierzenie z kroku 1 staje się tańsze (bo mniej mamy punktów pomiarowych - np. w aparacie zamiast 5 mpx mamy tylko 1 mpx).

- pomijamy niezbyt może kosztowny w epoce FFT, ale mimo wszystko niedarmowy krok 2

- przesyłamy tylko wyniki pomiarów a nie dbmy o przesyłanie indeksów

- wciąż mamy sygnał skompresowany, bo choć przesyłamy wymniki pierwotnego pomiaru, to jest ich istotnie mniej niż w oryginalnym problemie

No dobrze: ale tym sposobem przesłaliśmy znacznie mniej informacji. Mniej jej wydobyliśmy z sygnału (mniej próbek) i nie dokonaliśmy żadnej analizy by wydobyć najcenniejszą jej część. Co zatem zyskaliśmy powyżej tracimy w postaci istotnego zaniku informacji. Nie ma darmowych obiadów... A jednak...

Przy pewnych założeniach, które wkrótce ostrożnie wypowiem (pamiętajcie, piszę co na razie sam z tego rozumiem) taka magia może mieć miejsce. Otóż:

Pomysł compressed sensing polega na tym, że jeżeli wiemy coś o sygnale ponad to co przesyła nam nadawca to coś może nam dać ową brakującą informację, której nikt nam nie przesłał i pozwolić na lepszą rekonstrukcję sygnału2 Co to za magiczna wiedza ? Pisałem trochę wyżej, że kompresja się uda jeżeli sygnał będzie kombinacją liniową niewielu wektorów bazy transformaty. Zatem, jeżeli mamy dobrze dobraną do klasy sygnałów bazę i wiemy że sygnały z klasy którą rozważamy mają w niej przedstawienia rzadkie, możemy po stronie odbiorcy zapytać: jaki sygnał będący kombinacją liniową niewielu wektorów bazy transformaty da nam w bazie pomiarowej nasz wynik?

Okazuje się, że odpowiadając na to pytanie w wielu przypadkach jesteśmy w stanie zrekonstruować rzeczywisty sygnał, który tak niechlujnie pomierzyliśmy. W jeszcze większej ilości przypadków jesteśmy w stanie odtworzyć sygnał bliski temu wyjściowemu. Problem: jak to zrobić?

Sposób jest taki: sprowadzić zagadnienie do problemu optymalizacji. Więzy, czyli ograniczenia na sygnał zadane są przez początkowy pomiar. Jeżeli wektory pomiarowe oznaczymy przez e1,...,eK a wyniki naszego pomiaru (a więc współczynniki w rozkładzie rzutu wektora OBRAZ na podprzestrzeń generowaną zbiór pomiarowy) przez a1,...,aK ograniczenia na poszukiwany sygnał X dają się zapisać jako:

<e1|X>=a1, <e2|X>=a2,...<eK|X>=aK.

Teraz drugi warunek na X, który pozwoli nam wybrać jeden wektor z tej podprzestrzeni. Złym, choć naturalnie narzucającym się sposobem jest poszukiwać wprost wektora którego przedstawienie będzie najrzadsze w bazie transformaty. Złym bo prowadzącym do olbrzymiej, niewykonalnej w praktyce - ilości obliczeń. Pomysł wieć jest taki, żeby zminimalizować pewną normę na przstrzeni sygnału. Okazuje się jednak, że minimalizując (znowu narzucającą się) normę euklidesową | |2 na ogół dochodzimy do wektora, który nie ma przedstawienia rzadkiego w bazie transformaty. Rozsądnym kompromisem pomiędzy obydwoma podejściami jest minimalizacja normy | |1 powiązanej z bazą tranformaty

F1,1, ..., FM,N

tzn normy takiej, że:


|b1,1 * F1,1+ ...bM,N *FM,N|1 = |b1,1|+...+|bM,N|


Taki problem jest zagadnieniem klasycznej optymalizacji wypukłej i sposoby jego rozwiązywania są dobrze znane.

Są dwa wybory, których trzeba tu dokonać. Pierwszy to - i jak mawiają Niemcy: hier liegt der hund begraben - wybór bazy transformaty. To ona musi być dobrana do klasy sygnału.
Drugi to wybór zbioru pomiarowego. Okazuje się, że rozmieszczenie wektorów którymi mierzymy sygnał "większość" jest dobra, tzn. można owe wektory wybrać praktycznie losowo. Natomiast ich ilość - aby dostać dobrą rekonstrukcję sygnału musi być rzędu A*log(B) gdzie A to rzadkość sygnału (a więć ilość elementów o niezerowych współczynnikach w przedstawieniu sygnału w bazie) a B to rozmiar tej bazy.

Podobno przykłady pokazują, że teoretyczne ograniczenia w poprzednim paragrafie w praktyce można jeszcze proprawić. Czyli jeśli empiria pokazuje, że jeśli mamy dobrą bazę, to sygnały spotykane w codziennym życiu nawet przy mniejszej ilości pomiarów dają się nieźle zrekonstruować.

Wydaje się, że wielki jest potencjał tych metod. Zarówno do przesyłania i transmisji sygnałów, jak i do rekonstrukcji - np. w obrazowaniu medycznym (choćby tomografia), itd. Zasosowanie do innych sygnałów niż obrazy - np mowy też może być ciekawe. Znowu przesyłanie jest ok, ale jeszcze ciekawsza może być rekonstrukcja z bardzo słabego albo silnie zniekształconego sygnału. Wydaje się, że od specyficznych zastosowań, np. obrazy twarzy itd. itd. można dobrać doskonale pasujące bazy i ich zastosowanie może dać ogromne, nieosiągalne dziś poziomy kompresji. Wydaje się też, że metoda może dać niezwykle tanie i energooszczędne a dokładnie obrazujące czujniki, kamery itp.

Słowem - matematyka w służbie ludzkości. Tak, stanowczo - jeśli chcecie zostać guru telekomunikacji, przetwarzania sygnałów itd. za lat 5-10 uczcie się o compressed sensing już dziś.




1OK. W rzeczywistości wystarczy nam że sprowadzimy do takiego przedstawienia w bazie, które dobrze się pakuje kompresją bezstratną. "Rzadkość" przedstawienia (a więc duża ilość współczynników zerowych w przedstawieniu w bazie) daje możliwość dobrego upakowania. Dla dyskusji compressed sensing pozostanę przy tej cesze.



2Zupełnie jak paleontolog który z fragmentów kości dinozaura jest w
stanie zrekonstruować zwierzę, ponieważ wie, że rekonstruuje dinozaura.


2009-02-18

Eklektyczno - chaotycznie: lektury późnozimowe

Coś nieskładnie mi idzie ostatnio pisanie. Dużo się dzieje - dla normalnego blogera byłaby to właśnie okazja do pisania, a mnie natłok wydarzeń jakoś zniechęca. A kto wie czy nie zaczyna nudzić.
Zamiast przejmować się więc rosnącym z dnia na dzień kredytem we frankach, teutońskim butem na zadku Jana Marii i podniecać czy lis (wiadomo jaki) nie jest przypadkiem farbowany (choć farbowano go na oczach wszystkich), przemyśliwuję jak ma się grzecznie zamknąć i pozwalniać zasoby program który właśnie piszę w pracy, czytam kolejny tom Jasienicy, "Podróż na Beagle" Darwina i nabytki z Amazona (z nieodległych ale już starych dobrych czasów, gdy ceny w dolarach nie odstraszały).

Czytam Jasienicę i tak sobie myślę: Czemu nikt w Polsce nie weźmie się za zrobienie filmu historycznego o dymitriadach ? Rosjanie zrobili "1612" (którego jeszcze nie ma w wypożyczalni z której korzystam, obiecują na koniec lutego), ale znacznie ciekawsza jest historia trochę wcześniejsza, której rok 1612 jest finałem. Osadzenie fałszywego cara, druga próba dokazania tej sztuczki i niesamowita historia Heleny Mniszchówny, uczestniczki tego dramatu, z rożnych powodów, jak sądzę głównie politycznych, nie trafiły do literatury popularnej (a może tylko popularyzowanej). A temat i historie lepsze niż u Sienkiewicza - choć niewątpliwie jego pióro najlepiej by się do tego nadało. Nie widzę powodu, dlaczego teraz nie zrobić na ten temat porządnego filmu historycznego w starym dobrym stylu dla w miarę dorosłego widza. I bankierzy, zamiast zajmować się kombinacjami na poziomie cinkciarza żeby wyłudzić ciężko zarobione pieniądze od ludzi, zrobiliby coś do czego zdaje się są powołani - zainwestowaliby w jakieś uczciwe przedsięwzięcie które przyniosłoby i pożytek i pieniądze, które sam ochoczo zaniósłbym do kina.

Z zupełnie innej beczki. Mignęła mi rocznica urodzin Darwina. Rozmaite blogi się rozpisały, google zamieścił baner. A ja - daję słowo, zupełnie przypadkowo - kupiłem jakoś w grudniu "Podróż na okręcie Beagle" i jakoś tak w styczniu powolutku zacząłem się wieczorową porą przegryzać. Bardzo ciekawa i sympatyczna lektura. Nie przygodowa może, ale par excellance podróżnicza w starym dobrym XIX wiecznym stylu (co ja dziś z tym "starym dobrym" ?). U nas - era Paskiewicza, ciężki but przycisnął kraj po świeżym jeszcze w pamięci Powstaniu Listopadowym, a z Anglii młodziutki 21-letni Karol Darwin świeżo upieczony absolwent Cambridge po wydębieniu zgody rodziny skorzystal z niezwykłej propozycji która zmieniła jego życie. Na okręcie Beagle dowodzonym orzez niewiele starszego od niego, 26-letniego kapitana FitzRoya, dzierżąc stanowisko stanowisko przyrodnika wyprawy, wyruszył z Devenport tuż po Bożym Narodzeniu roku 1831. Wyruszył w czteroletnią podróż dookoła świata (ze szczególnym uwzględnieniem Ameryki Południowej). Gdy wrócił z niej po wielu latach, nigdy już więcej nie poważył się na ułamek nawet podobnej przygody, jeżeli przygodę wiązać z fizycznym niebezpieczeństwem i wielką ilością wydarzeń, resztę życia, gnębiony prawdziwymi i urojonymni chorobami, pędząc spokojnie na angielskiej prowincji. Jeżeli jednak przygodę pojąć szerzej, to ta prawdziwa i naprawdę wielka, zgłębienie sposobu w jaki zmienia się świat przyrody, w jaki powstają i giną gatunki, dopiero tu przed nim. Na razie widzę więc tylko młodego Karola, jak galopuje przez pampasy, wspina się na skały, pokonuje rwące rzeki, nocuje na południowoamerykańskich pustkowiach w towarzystwie gauchów, zbiera pieczołowicie okazy przyrodnicze, obserwuje i zastanawia się nad obyczajami i rozmieszczeniem zwierząt, nad geologią i geografią stron które odwiedza. Wielkie pytania na które zainicjuje wielkie odpowiedzi gdzieś tu się już błąkają - prowokują do nich kości kopalnych zwierząt, rożnorodność odmian wśród takich samych gatunków, identyczność cech u niespokrewnionych, zaduma nad eonami czasu w jakich dokonywała się- już chciałoby się użyć słowa "ewolucja" - zmiana a których spetryfikowane przekroje obnażają przed nim strome brzegi rzek czy terasy równin Patagoni. Warto zwrócić uwagę na pewną rzecz, o którym kiedyś na tym blogu wspominałem, a która zdumiewa i Darwina. Otóż niewyobrażalna dla naszego ludzkiego doświadczenia jest ilość czasu, w którym widzialne skutki kumulują się z bardzo małych przyczyn i wolnych procesów. Mam wrażenie, że w istocie ta obca naszemu doświadczeniu skala czasowa jest w sensie psychologicznym podobną barierą do przeskoczenia dla zdroworozsądkowego podejścia jak te dziwne rzeczy z czasem i przestrzenią które opisuje teoria względności i paradoksalne zjawiska opisywane przez mechanikę kwantową. W "Podróży" zdaje mi się dostrzegam jak Darwin mierzy się z tą myślą. Dzisiejsi ideologiczni wrogowie teorii ewolucji wysuwający przeciw niej sofistyczne argumenty odwołujące się do zdrowego rozsądku - ani się na taką rzecz nie zdobędą ani chcieć będą próbować.
Słowem: "Podróż na okręcie Beagle" to dobra i nic się nie starzejąca lektura. Dobra sama dla siebie a jeszcze lepsza czytana z perspektywy historycznej.

Skoro już się rozpisałem o tym com ostatnio czytał bądź przeczytał, wspomnę jeszcze o małej ale uroczej książeczce Ernesta Nagela i Jamesa R. Newmana "Gödel's proof". To popularyzatorskie dziełko, choć dość stare (jakiś początek lat 50-tych) trzyma się dzielnie i jest jedną z najprzyjemniejszych znanych mi wprowadzeń do twierdzenia Gödla. Mam wrażenie, że ogólna wiedza jednak na temat tego twierdzenia i jego implikacji, że ta wielka droga jaką odbyto do źródeł prawdy i pewności przekonań pozostała dla szerszej publiczności zapoznana, mimo, że w literaturze filozoficznej wiele powiedziano o jego znaczeniu, o niemal wstrząsie jaki spowodowało w rozumieniu podstaw matematyki, a własciwie ogólnie: w epistemologii.
Stanowczo za mało było takich prac jak ta Nagela i Newmana, a w naszej literaturze to już w ogóle mizeria. W szczególności ominęła nas przyjemność czytania w języku polskim książki Douglasa Hofstedtera (który jest autorem porzedmowy i redaktorem mojego wydania "Gödel's proof") "Gödel, Escher, Bach: An eternal golden braid", beststelera na zachodzie w latach 80-tych. Nb. egzemplarz tej ostatniej, zakupiony w jakimś antykwariacie przywiozłem sobie z mojej pierwszej wizyty w USA i niestety zaginął mi na amen. Wydaje mi się, choć nie napiszę dlaczego, że w naszym akurat kraju poprawa rozumienia tej i pokrewnej tematyki na poziomie nawet popularnym byłaby ze wszech miar pożadana. Słowa takie jak "Prawda" (zawsze z dużej litery) są jednym z najczęstszych fetyszów politycznych na Wisłą, że nie wspomnę o ich znaczeniu w słowniku i retoryce religijnej. Warto byłoby się coś więc o jej istocie dowiedzieć - nie żebym mieszał potoczne rozumienie ze ściśle specjalistycznym, ale dla mnie przynajmniej jakoś się to przenika i medytacje nad "technicznym" pojęciem prawdy są przyczynkiem do refleksji ogólniejszej natury. Przy okazji, interesujące rozważania - choć kusi mnie by trochę sprostować/podyskutować jak znajde więcej czasu - na pokrewne tematy pojawiły się na rekomendowanym na prawym marginesie blogu Fiksacje .

Kończę ten wyjątkowo eklektyczny, choć spięty przecież klamrą jedności miejsca i czasu - jak w starej dobrej (znów !!!) tragedii greckiej - lektur ktore go zainspirowały, post.