Programowanie w Prologu

27.10.2009 - Damian Rusak
TrudnośćTrudność

Prolog – ważne jest co, nie jak.

Jak sprawić, aby komputer wykonał to, czego chcemy? Często w tym celu pisze się programy. Każdy język programowania to inny sposób komunikacji z komputerem. Są jednak języki, które nie różnią się znacznie od pewnych innych, mają podobną budowę, składnię i są zgodne z jakimś ustalonym zbiorem zasad. Zasad, które z grubsza określają, w jaki sposób komputer ma wykonać nasze polecenia. Można jednak wskazać niektóre z nich, które są jak z innej planety. Taki właśnie jest Prolog, trochę egzotyczny dla tych, którzy go nie znają. Dlaczego? Poznajmy kilka faktów.

Większość rozpoczynających przygodę z programowaniem osób pisze w językach takich jak C, C++, Pascal czy Java. Te języki (jak i wiele innych) łączy to, że programista mówi jak komputer ma wykonać jego zamysł. Dokładnie opisuje, w jaki sposób ma być wykonane każde polecenie. Czasem nawet „ręcznie” manipuluje pamięcią. To języki imperatywne. Ich istotą jest wydawanie rozkazów i określanie, jak te rozkazy wykonać. Ale Prolog jest inny.

W pierwszym momencie to może zaskoczyć. Musimy zmienić punkt widzenia i przestać kontrolować każdy krok naszych programów. Po co przejmować się tym, co po kolei dzieje się w środku? Po co męczyć się z opisywaniem czynności, które powinien wykonać komputer? Niech nie interesuje nas to jak to działa. Nas interesuje co będzie wynikiem obliczeń. Oto jak działają języki deklaratywne. Ich istotą jest określenie przez programistę, co ma zostać obliczone. Reszta jest w rękach języka i komputera. Ale co to znaczy?

Świat w naszych rękach i parę słów o rodzinie

Prolog potrzebuje od nas pewnych informacji. Opisujemy mu, jak wygląda świat. Potem zostawiamy go z pewnym zadaniem i wiedzą, którą mu przekazaliśmy. Teraz musi on wykorzystać tę wiedzę, aby wykonać zadanie. Posiada swój sposób rozumowania i wyciągania wniosków. My czekamy cierpliwie, nie zastanawiając się, jak to się stanie.

Tak właśnie działa Prolog. Wystarczy, żebyśmy podali mu informacje na temat świata i możemy stawiać przed nim cele do osiągnięcia. Przyjrzyjmy się temu prostemu programowi poniżej (imiona muszą być pisane małymi literami, dowiemy się dlaczego niebawem) : To przykład prologowego programu.

Prawda, że krótki i nieskomplikowany? Podajemy Prologowi informacje – Adam oraz Ewa są rodzicami Ali, Piotra i Pawła. Nic prostszego:)

Te wyrażenia to fakty. Obrazują to, co Prolog wie o świecie.

Możemy też napisać:

Za chwilę wyjaśnimy, jak buduje się takie konstrukcje. Spróbujmy najpierw intuicji – osoba X i osoba Y są rodzeństwem, jeśli mają wspólnego rodzica, czyli pewna osoba Z jest rodzicem X, i ta sam osoba Z jest rodzicem Y. Możemy się spodziewać, że prawdą jest rodzenstwo(piotr, paweł) albo rodzenstwo(ala, piotr), za to jesteśmy pewni, że to nieprawda, że rodzenstwo(ewa, adam). Wybaczcie proszę brak polskich znaków, Prologa wymyślono na Zachodzie:)

Takie wyrażenie jak powyżej nazywa się regułą.

W odróżnieniu od faktu nie wskazuje konkretnie kto jest rodzeństwem kogo, ale uzależnia to od posiadanej przez program wiedzy. Możemy czytać tak: „X i Y są rodzeństwem, pod warunkiem, że znajdziemy takiego Z, że Z jest rodzicem X i Z jest rodzicem Y”. Prawda, że to logiczne? Dzięki temu nie musimy wypisywać wszystkich par rodzeństwa, jedynie jedną regułę. Prolog ma za zadanie skorzystać z wiedzy o tym, kiedy dwie osoby są rodzeństwem.

W celu wygodnej pracy z Prologiem zastosuj umieszczone przez nas okienka, służące do wykonania napisanego przez Ciebie fragmentu kodu w Prologu. Nie musisz się przejmować tym, by cały program był poprawnie napisany - wystarczy, abyś umieścił w okienku testowany fragment. Jeśli będzie Ci się wydawało, że wpisałeś poprawny fragment, a otrzymujesz złą odpowiedź, sprawdź dokładnie, co wpisałeś! Każde okienko służy do innego ćwiczenia!

Snippet icon

Poniżej możesz przetestować Prologa - jeśli wpiszesz tu jakieś wyrażenie, to Prolog odpowie, czy to prawda, czy nie. Spróbuj wpisać np. rodzic(adam, piotr), a potem rodzic(ewa, adam). Czy to drugie wyrażenie jest prawdziwe? Co odpowiedział Prolog?

Jak to działa?

Dobrze, powiedzmy, że chcemy sprawdzić, czy faktycznie Prolog jest taki sprytny – zapytajmy go o to, kto jest rodzeństwem Ali.

Szukamy takich osób (nazwijmy taką osobę Y), że prawdziwe jest stwierdzenie rodzenstwo(ala, Y). Wpiszmy to wyrażenie do okienka. Jeśli podajemy Prologowi takie wyrażenie, to nazywamy je celem. Prolog postara się ten cel spełnić. Teraz Prolog poda Ci wszystkie dobre odpowiedzi. Zwykle zadowala się znalezieniem chociaż jednej, o tym opowiemy trochę dalej.

Snippet icon

Jeśli wpisałeś cel poprawnie, powinienieś zobaczyć zielony napis "dobra odpowiedź", oraz poniżej listę odpowiedzi, które udało się znaleźć Prologowi

Zauważ, że odpowiedź wygląda tak: [ala, piotr, pawel, ala, piotr, pawel]. Dziwne, prawda? Od kiedy Ala jest swoim własnym rodzeństwem, i dlaczego każda odpowiedź pojawiła się dwukrotnie? Przypomnijmy sobie regułę rodzeństwo – nigdzie nie powiedzieliśmy Prologowi, że ktoś nie może być sam rodzeństwem dla siebie, przecież jeśli Y = ala, to dla Z = adam prawdą jest, że rodzic(adam,ala) i rodzic(adam,ala), więc rodzenstwo(ala, ala) to też prawda. Z kolei odpowiedzi są dwa razy, bo można wskazać dla każdej pary dwóch różnych rodziców – dla Ali i Piotra zarówno Adam spełni warunki reguły rodzeństwo, jak i Ewa. To wszystkie możliwe poprawne odpowiedzi. To niebawem pozwoli nam zrozumieć, jak działa Prolog.

Sprawdź, co odpowie w okienku powyżej Prolog, gdy zapytasz go o rodzenstwo(piotr, X), albo rodzenstwo(pawel, X).

 

Prolog po prostu sprawdza wszystkie możliwości. Gdy pytamy, dla jakiego Y prawdą jest rodzenstwo(ala, Y) będzie to wyglądało tak:

Ale, ale? - zapytasz. A gdzie podziała się Ewa, drugi z rodziców Ali? Skąd wzięły się powtórzone imiona na liście rodzeństwa Ali? Pierwsze trzy imiona, to właśnie dobre podstawienia imion ala, piotr i pawel pod Y, gdy wybraliśmy za rodzica adama. Ale Prolog chciał sprawdzać dalej, a żadne inne imię już nie pasowało. W tym momencie Prolog zrobił tak – skoro nie może znaleźć nic więcej dla Adama, to cofnie się, i wybierze innego rodzica. Wygląda to tak:

 

To nazywa się nawracaniem. Prolog wykonał nawrót, bo nie mógł znaleźć nic więcej dla pewnych wybranych wartości. Być może zmieniając pewien poprzedni wybór otrzyma coś satysfakcjonującego?

Zauważyłeś na pewno, że jest różnica pomiędzy Z i Y, a na przykład adam czy ala. Otóż X,Y,Z to zmienne – można do nich przypisać jakąś wartość. Mówimy, że zmienna ukonkretnia się, gdy przyjmuje konkretną wartość. Mieliśmy do czynienia na przykład z ukonkretnieniem się Z do wartości adam, albo Y do pawel. Stąd konieczność pisania tych imion małą literą – Prolog musi rozróżnić, czy mamy na myśli zmienną, czy coś konkretnego. Zmienne piszemy więc wielką literą (mogą mieć dłuższą nazwę, niż X czy Y, np. Liczba albo Napis). Wartości takie jak adam, ala czy ewa nazywamy atomami. To dlatego, że z nich tworzą się bardziej skomplikowane wyrażenia. Atomy mają nazwy pisane małą literą.

Snippet icon

Wyślij w poniższym okienku jakąś nazwę - jeżeli to atom, otrzymasz "poprawną odpowiedź".

Zmienne ukonkretniają się, gdy zaczynają wskazywać na jakiś obiekt. W powyższym przykładzie najpierw ukonretniliśmy X do ala, gdy podaliśmy w nawiasie reguły rodzenstwo atom, podczas gdy w definicji reguły znajduje się tam zmienna X. Później ukonkretniliśmy Z do adam i na końcu Y do ali. Potem Prolog szukał kolejnego rozwiązania, więc po nawrocie ukonkretnił Y do piotr, a potem do pawel. Jeżeli póki co nie jest to dla Ciebie jasne, nie przejmuj się - wszystko się wyjaśni w swoim czasie.

 

5
Twoja ocena: Brak Ocena: 5 (6 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com