Wprowadzenie do środowiska programowania w Prologu
Co to jest Prolog?
Prolog to język programowania w logice (PROgrammation en LOGique, PROgramming in LOGic).
http://pl.wikipedia.org/wiki/Prolog_%28j%C4%99zyk_programowania%29
SWI Prolog
Współcześnie jest dostępnych szereg implementacji Prologu, w tym swobodnie dostępne kompilatory Prologu:
np:.
- SWI-Prolog, Jan Wielemaker, http://www.swi-prolog.org
- GNU-Prolog, Daniel Diaz, http://gnu-prolog.inria.fr
- dostępne przez www: http://ktiml.mff.cuni.cz/~bartak/prolog/testing.html
W czasie zajęć będziemy pracować w środowisku SWI-Prolog.
Proszę pobrać plik tego programu z: http://gollem.science.uva.nl/cgi-bin/nph-download/SWI-Prolog/w32pl5643.exe http://gollem.science.uva.nl/cgi-bin/nph-download/SWI-Prolog/w32pl5648.exe
Podstawowym interfejsem w SWI-Prologu jest powłoka.
Jest ona bardzo podobna do powłoki, spotykanej w systemach unixowych, oczywiście z uwzględnieniem specyfiki programowania w Prologu.
Pisanie programu w Prologu
Elementy składniowe programu:
- atomy: stałe znakowe,
- niewiadome/szukane (tzw. zmienne logiczne),
- termy: symbole funkcyjne przyjmujące argumenty
Przykład programu zapisanego w Prologu:
lubi(jan, tatry).
lubi(jan, beskidy).
lubi(jerzy, beskidy).
lubi(jerzy, bieszczady).
lubi(józef, sudety).
lubi(justyna, gświętokrzyskie).
bratniadusza(X, Y) :- lubi(X, S), lubi(Y, S), X \= Y.
Program składa się z
- szeregu klauzul (ang. clause), wyróżniamy:
- fakty (klauzule proste)
- reguły (klauzule złożone)
- oraz celu (ang. goal)
Proszę zapoznać się z wizualizacją działania powyższego programu: http://wazniak.mimuw.edu.pl
Uruchamianie programu
W celu uruchomienia programu należy załadować plik z kodem (rozszerzenie *.pl) w języku Prolog.
Możemy w tym celu wykorzystać polecenie:
- menu File->Consult… u góry ekranu (a następnie wybieramy plik z katalogu)
- ręcznie w konsoli wpisujemy predykat consult/1 (skrót [nazwa].)
Operację tę należy powtarzać po każdej modyfikacji kodu.
Programowanie nieklasyczne
Prolog NIE jest klasycznym językiem programowania.
Nie ma w nim:
- słów kluczowych, (if, for…)
- brak rozróżnienia we/wy
- brak funkcji
- brak zmiennych (klasycznych)
- brak jawnej sekwencyjności, czy iteracyjności
Prolog dostarcza:
- metody strukturalizowania informacji, termy
- programowania deklaratywnego
- rekurencji, jak metody przetwarzania informacji
- unifikacji - mechanizmy dopasowywania wzorców
- rezolucji - metody wnioskowani logicznego
- strategii sterowania wnioskowaniem
ĆWICZENIA
Ćwiczenie 1: Uruchamianie powłoki
- Unix/GNU/Linux: Proszę otworzyć okno terminala, np. xterm i uruchomić w nim powłokę SWI przez polecenie swipl (może też być dostepny przez polecenie pl).
- Windows: Proszę uruchomić za pomoc ikony, menu Start, itp.
- UWAGA: każda „linia kodu” w Prologu musi się kończyć kropką!
- Proszę sprawdzić działanie systemu pomocy, przez predykaty help., a następnie przeczytać opis do predykatu consult/1.
- Proszę wyjść z powłoki przez halt.
- Proszę ponownie uruchomić powłokę SWI. Przy pomocy jakiej kombinacji klawiszy można wyjść z powłoki unixowej - analogiczenie w SWI?
Ćwiczenie 2: Pisanie prostych programów
- Proszę przyjrzeć się poniższemu, prostemu programowi (klasyczny przykład „Rodzina”).
rodzic(ola,max).
rodzic(tomek,max).
rodzic(tomek,lila).
kobieta(ola).
kobieta(lila).
mezczyzna(tomek).
mezczyzna(max).
Proszę uruchomić wybrany zewnętrzny edytor tekstu (np. Notatnik) i wpisać w nim analogiczny program (dotyczący własnej rodziny). Program należy zapisać w pliku przyklad1.pl
Ćwiczenie 3: Uruchamianie programów
- W powłoce SWI należy wczytać napisany uprzednio program:
?- [przyklad1].
- Program jest kompilowany, a zawarta w nim wiedza dodawana do bazy wiedzy dostępnej z powłoki SWI. Można to sprawdzić przy pomocy polecenia:
?- kobieta(X).
- Po ukazaniu się pierwszej odpowiedzi należy wcisnąć klawisz średnika
;
by wyszukać kolejne dopasowania.
Ćwiczenie 4: Praca z programem
- Systemowi można teraz zadawać pytania, cele do zrealizowania. Proszę zapoznać się z propozycjami poniższych pytań i zapisać je w Prologu. (przykładowe pytania dotyczą przykładu z ćwiczenia 2):
- Kto jest mężczyzną?
- Czy Tomek jest mężczyzną?
- Czy Smerfus jest mężczyzną?
- Czy Ola jest rodzicem Max-a?
- Czyim rodzicem jest Ola?
- Czy zamiast X można wpisać inny symbol? Jaki?
- Kto jest rodzicem Max-a?
Ćwiczenie 5: Rozbudowa programu
Proszę rozbudować program do poniższej, analogicznej (co do liczby osób i zależności) formy:
rodzic(ola,max).
rodzic(tomek,max).
rodzic(tomek,lila).
rodzic(max,ania).
rodzic(max,kasia).
rodzic(kasia,radek).
kobieta(ola).
kobieta(lila).
kobieta(kasia).
kobieta(ania).
mezczyzna(tomek).
mezczyzna(max).
mezczyzna(radek).
Czy kolejność wpisywania linii ma znaczenie?
UWAGA: aby dopisane fakty były dostępne dla Prologu, należy go ponownie wczytać!
Jeżeli koniunkcję celów oznaczamy przecinkiem
,
to jak zapytać:
- kto jest matką
- a kto ojcem Max-a?
Napisz odpowiednie zapytania i sprawdź ich działanie.
Ćwiczenie 6: Reguły
Proszę dopisać poniższe reguły i sprawdzić ich działanie.
- Proszę zdefiniować reguły opisujące: brata, siostrę, dziadka i babcię. Proszę dokładnie sprawdzić ich działanie.
Proszę się zastanowić nad własnymi regułami opisującymi relacje w rodzinie.
Ćwiczenie 7: Reguły rekurencyjne
Rekurencja jest jednym z podstawowych mechanizmów programowania w Prologu. Proszę się przyjrzeć regułom opisującym przodka:
przodek(X,Y) :-
rodzic(X,Y).
przodek(X,Z) :-
rodzic(X,Y),
przodek(Y,Z).
Te dwie klauzule, w tym przypadku reguły, opisują dokładnie jeden predykat: przodek/2.
Jak zdefiniować potomka, krewnego?
Ćwiczenie 8: Obserwacje
Sprawdzić działanie predykatu listing/0.
Sprawdzić działanie predykatu listing/1:
?- listing(parent).
W sytuacjach kiedy nie interesują nas wartości pewnych szukanych w predykacie, możemy użyć tzw. szukanych anonimowych. Na przykład: „Czy Max ma rodziców?”
?- rodzic(_,max).
Poprawny styl kodowania bardzo wpływa na przejrzystość programów w Prologu. Program w Prologu jest pewną reprezentacją wiedzy, powinien być zrozumiały dla osoby znającej jedynie notację (realcyjną) użytą w Prologu.
Na zakończenie:
?- write('Hello world'), nl.