Uch, znowu zaczynam wracać do niechlubnej praktyki pisania notek raz na dwa tygodnie. Niestety, nie przewidziałem, iż w drugim semestrze czeka mnie tyle pracy – ostatnie dni spędziłem na przykład nad doprowadzeniem algorytmów sortowania do porządku i przygotowania ich do testów w laboratorium, gdzie okazało się, że większość ma źle napisanego quicksorta i nie ma szans na dobre oceny. Właściwie, to nawet o tym chciałem pisać, ale zrobię to przy innej okazji.
Jednakże, w tym samym okresie moich studiów, mam do czynienia z przedmiotem o intrygującej nazwie Programowanie Deklaratywne. Większość pewnie wie, o co chodzi, gdyż albo sami gdzieś to widzieli podczas przeszukiwania mroków internetu (tak, będę teraz pisał “internet” z małej litery, gdyż to już dawno przestało być neologizmem czy nazwą własną), mieli to już na studiach lub (co bardziej prawdopodobne) zajmowali się obsługą baz danych za pomocą SQL, które również jest takowym językiem. Otóż, główny podział paradygmatów programowania wygląda mniej więcej tak (a przynajmniej tak to widzę):
- języki imperatywne
- języki obiektowe
- języki deklaratywne
Języki imperatywne i obiektowe są, według mnie, bardzo blisko siebie, choć może wydaje mi się tak w kontekście C oraz C++. Krótko mówiąc, jest to wypisywanie ciągu rozkazów i instrukcji mówiących “jak” ma program cokolwiek zrobić (zaparzyć kawę, napisać raport, wyszukać Battle Green Tea Axe +3/+4/+8/+12/+luck/+nie-wiadomo-co-jeszcze), a różnica polega na tym, że w takim na przykład C robimy to strukturalnie, a w C# czy Javie – obiektowo. Być może lepszym przykładem, gdzie zachodzi takie rozszerzenie obiektowe na języku strukturalnym to Pascal i Delphi, które również większości są nieobce. Natomiast języki deklaratywne to zupełnie inna bajka. Charakteryzują się tym, iż nie są używane do określenia sposobu dojścia do celu, a jedynie do zdefiniowania jego samego. Uszczegóławiając (bo sam też tego z początku nie rozumiałem) – w kodzie zamieszczamy definicje faktów, reguł i klauzul (Bardzo Ważne Słowo), natomiast po skompilowaniu tegoż, za pomocą interpretera wydajemy zapytania (kolejne Bardzo Ważne Słowo), które mogą dać trzy efekty – “tak” (prawda), “nie” (fałsz) oraz “patrz, wywalam się” (o kurde). Dlatego między innymi SQL jest wykorzystywany przy bazach danych do wyszukiwania informacji – dzięki maszynie zaimplementowanej w interpreter ten proces staje się bardziej przyjazny.
Ale my na razie nie mamy SQL-a, za to jesteśmy na ścieżce dalszego poznawania logiki obliczeniowej i jej praktycznego wykorzystywania (co będzie miało apogeum w bodajże trzecim semestrze przy Sztucznej Inteligencji). A co za tym idzie – obowiązuje nas język Prolog. Jest to mechanizm do programowania logiki, oparty o rachunek predykatów pierwszego rzędu (który jest nierozstrzygalny). Szczerze mówiąc, orłem z tej dziedziny nie jestem, zatem pozwolicie, że nie będę się wymądrzał na temat zagadnień logiki obliczeniowej, bo jeszcze komuś namieszam. W każdym razie, charakterystyką tego języka (i chyba większości deklaratywnych) jest to, że składnia ogranicza się do może kilkunastu lub nawet kilku znaków – nie ma tutaj tak skrótowych mechanizmów jak w C, gdzie instrukcję warunkową możemy zapisać na kilka sposobów. Przykładowy program w prologu może wyglądać tak:
%relacja okreslajaca pokrewienstworodzic(adam,iza).
rodzic(marta,iza).
rodzic(iza,tomek).
rodzic(krzysztof,tomek).
Zapytanie w interpreterze:
?- rodzic(X,iza).
I odpowiedzi, które uzyskamy:
X = adam ;
X = marta ;
false
(Przepraszam za złe sformatowanie, coś Windows Live Writer nie lubi mojego sposobu pisania w Code Snippecie.)
Jest kilka ważnych spraw:
- stałe rozpoczynamy z małej litery (np. tomek)
- zmienne rozpoczynamy z wielkiej litery (np. X)
- każdą regułę, fakt, zapytanie, polecenie i inne kończymy kropką
- Po wydaniu powyższego zapytania zostanie wyświetlone tylko X = adam. Dopiero średnik umożliwia “dostanie” się do następnych wiązań zmiennych
A co sam program robi? Niewiele – w kodzie programu umieszczamy reguły informujące, kto jest czyim rodzicem. Następnie wydajemy (już w interpreterze) zapytanie ze zmienną X. Można je odczytać mniej więcej jako “wypisz rodziców Izy”. Pod zmienną X zostaną natomiast podstawione wyniki, które maszynka prologowa zdołała wywnioskować z przedstawionych wcześniej faktów. Należy też wspomnieć, iż w Prologu jest zaimplementowany całkiem niezły debugger, który pozwala nam prześledzić wnioskowanie krok po kroku. Strasznie żmudne zajęcie…
Programem do programowania w Prologu (ale to brzmi…) polecanym na mojej uczelni jest SWI-Prolog i fakt – jest całkiem znośny. Jedyne, co powinno się zmienić, to rodzaj rozszerzenia, z którym kojarzone będą pliki z programem z .pl na .pro. Jest to spowodowane tym, że Perl również korzysta z rozszerzenia .pl i mogłyby nastąpić małe zawirowania.
Cóż, z gamedevem na pewno ta notka nie ma wiele wspólnego. O samym Prologu też za wiele się nie rozpisałem. Być może ktoś jednak poczuje się zainteresowany czymś takim jak Prolog i zechce spróbować swoich sił. Nie jest to na pewno szczyt moich marzeń (tzn. sam język, a nie motywacje czytających), ale nie ukrywam, iż spodziewałem się większej katorgii.
Mam nadzieję, że następnym razem uda mi się w końcu coś napisać o “normalnych” projektach. O ile znajdę na to czas…
Pozdrawiam i dziękuję – SceNtriC.
1 komentarze:
http://www.amzi.com/AdventureInProlog/advfrtop.htm
Polecam ten tutorial do tworzenia tekstowych gier przygodowych w prologu ;-) Sam na zaliczenie pisałem w prologu grę w okręty (ze sztuczną "inteligencją") i dość miło to wspominam. Prolog wymaga specyficznego podejścia, ale po przełamaniu pierwszych lodów okazuje się językiem bez wątpienia interesującym. Jeśli do tego dodać integrację z Javą (choćby JPL) to otrzymujemy całkiem potężne narzędzie, które pewne operacje pozwala opisać w sposób znacznie prostszy niż "normalne" języki. Bez wątpienia dla studentów fajna zabawka :-)
Prześlij komentarz