Blog (55)
Komentarze (990)
Recenzje (1)

Prolog - nieco inne podejście do programowania

@kubutProlog - nieco inne podejście do programowania04.04.2013 01:53

Większość popularnych języków programowania nauczyło nas, że programowanie polega na opisywaniu komputerowi kolejnych kroków które ma wykonać. Wyobraźmy sobie jednak sposób tworzenia programów, w którym mówimy jedynie jak wygląda rozwiązanie, a od komputera wymagamy żeby sam do takiego wyniku doszedł. Tak właśnie działają języki deklaratywne (w dużym uproszczeniu, za które fanatycy mnie ukamienują). Najbardziej znanym przykładem takiego języka jest... SQL. Większość użytkowników tego języka nie jest nawet świadoma, że używa języka deklaratywnego, ale zastanówmy się przez chwilę. Nie mówimy przecież komputerowi jak ma wyszukać dane, rozkazujemy tylko:

Ziomuś, dawaj mi id usera o nicku kubut, ale znajdź je sobie jak chcesz

Nie da się ukryć, że jest to wygodne podejście do sprawy, ponieważ nie musimy martwić się implementacją przeszukiwania bazy danych ani żadnych innych operacji. Jako, że SQL jest dość popularny, dzisiaj chciałbym napisać parę słów na temat języka o nazwie Prolog. Podkreślam, że będzie to parę słów, nie kurs ;)

Trochę nudnych rzeczy o Prologu

Jak się zapewne domyślacie w Prologu także nie będziemy definiować w jaki sposób ma dojść do wyniku (choć w ograniczonym zakresie możemy to robić), będziemy natomiast żądać od niego, by sam rozwiązał nasz problem. Zalatuje sztuczną inteligencją? To dobrze, bo Prolog dobrze radzi sobie z wyzwaniami jakie stawia tworzenie sztucznego "mózgu". W Prologu nasze programy tworzymy na zasadach logiki pierwszego rzędu, czyli przygotujmy się na masę koniunkcji, alternatyw, czy implikacji. Ogólnie program prologowy składa się z definicji faktów i reguł. Pierwszym co należy powiedzieć o składni, to fakt, że linijkę (czy dokładniej - regułę/fakt) kończymy kropką, natomiast średnik traktowany jest jako alternatywa (or). Będziemy używać także przecinka jako koniunkcji (and) oraz :- jako czegoś w stylu

A jest spełnione :-(jeśli) B jest spełnione

Brzmi trochę strasznie, ale zaraz się rozjaśni. Zanim jednak będziemy mogli prologować potrzebujemy jakiegoś narzędzia które nam to umożliwi. Polecam SWI Prolog który pobrać można na stronie http://www.swi-prolog.org/. Progrm uruchamiamy, następnie wybieramy File->New by stworzyć nowy zestaw faktów. Następnie w konsoli prologa wczytamy nasz plik i będziemy mogli "rozmawiać" z maszyną prologową wypytując ją o różne ciekawe rzeczy.

Trochę przykładów

Zobaczmy może jak wygląda to w praktyce. Zacznijmy od faktów, które definiujemy w następujący sposób:

[code=Prolog] polaczenie(katowice,krakow). polaczenie(krakow,warszawa). polaczenie(warszawa,wroclaw).[/code]

Mówi to tyle, że istnieje połączenie z Katowic do Krakowa itp. Należy zaznaczyć przy tym ważną rzecz - w Prologu nazwy zaczynające się małą literą są stałą, natomiast wielką - zmienną. Dlatego też taki fakt:

[code=Prolog]polaczenie(Katowice,krakow).[/code]

będzie mówił, że z każdego miasta (bo nieważne co podstawimy pod zmienną Katowice) istnieje połączenie do Krakowa. Zapiszmy nasz plik pod nazwą test.pl (pl to rozszerzenie pików Prologa) oraz przejdźmy do konsoli. Pierwsze co musimy zrobić, to wczytać nasz plik z faktami, robimy to przez wpisanie do konsoli

[test].

Następnie spytajmy, czy z Warszawy dojedziemy do Wrocławia:

?- polaczenie(warszawa,wroclaw).

Oczywiście dostaniemy odpowiedź True. Co jednak gdy chcemy dojechać z Katowic do Warszawy? Nie istnieje połączenie bezpośrednie, więc Prolog odpowie False. Jeśli chcemy umożliwić przesiadki musimy zdefiniować regułę, która będzie mówiła kiedy można dojechać z A do C z przesiadką. Powiedzmy to najpierw po polsku:

z A można dojechać do C jeśli istnieje połączenie z A do B oraz z B do C lub z A można dojechać do C jeśli istnieje połączenie z A do C

Teraz możemy przepisać to do naszego pliku test.pl

[code=Prolog]przesiadka(A,C) :- polaczenie(A,B), polaczenie(B,C) ; polaczenie(A,C)[/code]

Teraz po ponownym wczytaniu tego pliku do maszyny prologowej po zapytaniu

?- przesiadka(katowice,warszawa).

Dostaniemy napis True.

Skomplikujmy bardziej!

Niby wszystko fajnie, ale co gdy chcemy wyszukać połączenie z dowolną liczbą przesiadek? Nie będziemy przecież pisać osobnej reguły dla każdej możliwej liczby przesiadek. Zastanówmy się chwilę, jak powiedzieć, że z A można dojechać do B z dowolną liczbą przesiadek? Wbrew pozorom nie jest to trudne, zacznijmy jednak od powiedzenia tego w sposób naturalny.

z miasta A można dojechać do miasta B jeśli istnieje bezpośrednie połączenie z A do B lub z miasta A można dojechać do miasta B jeśli istnieje bezpośrednie połączenie z A do Z, a z Z można dojechać (z przesiadkami) do B

Zawiłe? Może trochę, ale jak się w to wczytamy to nie jest to głupie. Zapiszmy to zatem zamiast naszej poprzedniej definicji reguły "przesiadka".

[code=Prolog]przesiadka(A,B) :- polaczenie(A,B); polaczenie(A,Z) , przesiadka(Z,B).[/code]

Mamy tutaj coś na styl rekurencji znanej z języków imperatywnych. Kod ten ma lekki defekt, mianowicie wpada w "pętle" gdy w zbiorze faktów będziemy mieli zamknięty cykl, jednak nie będę przedłużał wpisu omawiając jak to rozwiązać.

Słowo na koniec

Wyszło trochę dłużej i nudniej niż zamierzałem, jednak Prolog (jak wszystkie języki) to temat-rzeka i można pisać o nim w nieskończoność. Dokładnie poznają go wszyscy którzy pójdą na studia informatyczne na Uniwersytet Wrocławski. Być może porwę się na kontynuowanie tematu w kolejnym wpisie, jeśli będzie takie zapotrzebowanie (choć nie liczę na to) ;) Jako ciekawostkę na koniec powiem, że w bardzo prosty sposób możemy przygotować reguły, które rozwiążą nam "zagadkę Einsteina " i zajmie to o wiele mniej czasu niż rozwiązywanie jej na kartce ;)

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.