To jest stara wersja strony!
1 LAB: Wprowadzenie do środowiska Prologu
WPROWADZENIE
Temat: Czym jest Prolog
Prolog to język programowania logicznego, lub dokładniej programowania w logice (PROgrammation en LOGique, PROgramming in LOGic).
Rozwój:
podstawy teoretyczne: logika, Robinson (rezolucja), Kowalski (University of Edinburgh)
implementacje: Colmerauer, (University of Aix-Marseille), 1972; Warren (University of Edinburgh) 1977
Temat: SWI Prolog
Współcześnie jest dostępnych szereg implementacji Prologu, w tym swobodnie dostępne kompilatory Prologu:
W czasie zajęć będzie się pracować głównie w środowisku SWI.
Podstawowym interfejsem jest w SWI powłoka. W powłoce pracuje się podobnie jak w powłoce unixowej, oczywiście z uwzględnieniem specyfiki Prologu.
Temat: Programy w Prologu
Elementy składniowe programu:
stałe: stałe znakowe a także liczby,
zmienne lub niewiadome/szukane,
termy: symbole funkcyjne wraz z argumentami, obiekty strukturalnie złożone.
Program składa się z
Temat: Uruchamianie programu
Do uruchomienia programu należy załadować plik z kodem w Prologu przy pomocy predykatu consult/1
(skrót [nazwa].
)
Operację tę należy powtarzać po każdej modyfikacji kodu.
Temat: Środowisko pracy
SWI dostarcza przede wszystkim zaawansowanej powłoki, wyposażonej w bibliotekę GNU ReadLine.
Cennym uzupełnieniem jest edytor GNU Emacs ze środowiskiem edycyjnym (trybem) prolog.el.
SWI w wersji rozszerzonej o środowisko XPCE dostarcza również narzędzi programistycznych, takich jak wbudowany edytor emacs. Aby z niego skorzystać należy zamiastswipl
wywołać xpce
a potem w powłoce Prologu emacs.
.
Temat: Programowanie nieklasyczne
Prolog NIE jest klasycznym językiem programowania.
Nie ma w nim:
słów kluczowych,
brak rozróżnienia we/wy w sensie klasycznego wywoływania funkcji
brak funkcji
brak zmiennych (klasycznych)
brak jawnej sekwencyjności, czy iteracyjności (z małymi wyjątkami)
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
1.1 Ćwiczenie: 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: uruchomi za pomoc ikony, menu, 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 - analogiczeniw SWI?
1.2 Ćwiczenie: Pisanie programów
Proszę przyjrzeć się poniższemu, prostemu programowi (klasyczny przykład Rodzina).
rodzic(kasia,robert).
rodzic(tomek,robert).
rodzic(tomek,eliza).
kobieta(kasia).
kobieta(eliza).
mezczyzna(tomek).
mezczyzna(robert).
Proszę uruchomić wybrany zewnętrzny edytor i wpisać w nim podobny program, dotyczący własnej (albo innej) rodziny. Mniej ambitni mogą po prostu przepisać… Program należy zapisać w pliku fam2.pl.
1.3 Ćwiczenie: Uruchamianie programów
W powłoce SWI należy wczytać powyższy program:
?- [fam2].
Program jest kompilowany, a zawarta w nim wiedza dodawana do bazy wiedzy dostępnej z powłoki SWI. Można to sprawdzić:
?- kobieta(X).
Po ukazaniu się 1. odpowiedzi należy wcisnąć klawisz średnika (;).
1.4 Ćwiczenie: Praca z programem
Systemowi można teraz zadawać pytania, cele do zrealizowania.
Kto jest mężczyzną?
?- mezczyzna(X).
Czy tomek jest mężczyzną?
?- mezczyzna(tomek).
Czy reksio jest mężczyzną?
?- mezczyzna(reksio).
Czy kasia jest rodzicem robert?
?- rodzic(kasia,robert).
Czyim rodzicem jest kasia?
?- rodzic(kasia,X).
Czy zamiast X można wpisać inny symbol? Jaki?
Kto jest rodzicem robert?
?- rodzic(Y,robert).
Czy zamiast Y można wpisać inny symbol?
1.5 Ćwiczenie: Rozbudowa programu
Proszę rozbudować program do poniższej, analogicznej (co do liczby osób i zależności) formy:
rodzic(kasia,robert).
rodzic(tomek,robert).
rodzic(tomek,eliza).
rodzic(robert,anna).
rodzic(robert,magda).
rodzic(magda,jan).
kobieta(kasia).
kobieta(eliza).
kobieta(magda).
kobieta(anna).
mezczyzna(tomek).
mezczyzna(robert).
mezczyzna(jan).
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 roberta?
1.6 Ćwiczenie: Przykład w innym języku
Proszę spróbować dopisać do programu takie linijki:
famme(kasia).
homme(krzys).
parent(kasia,krzys).
Czy nazwa użytych symboli wpływa na działanie programu?
Jakie są ograniczenia na używane symbole?
1.7 Ćwiczenie: Reguły
Proszę dopisać poniższe reguły i sprawdzić ich działanie.
matka(X,Y) :-
rodzic(X,Y),
kobieta(X).
ojciec(X,Y) :-
rodzic(X,Y),
mezczyzna(X).
Proszę zdefiniować reguły opisujące: brata, siostrę, dziadka i babcię. Proszę dokładnie sprawdzić ich działanie.
Jaki pojawia się problem przy bracie/siostrze? Uwaga na operator:\=
.
Proszę się zastanowić nad własnymi regułami opisującymi relacje w rodzinie.
1.8 Ćwiczenie: Reguły rekurencyjne
Rekurencja jest jednym z podstawowych mechanizmów programowania w Prologu. Proszę się przyjrzeć regułom opisującej 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?
1.9 Ćwiczenie: Środowisko pracy
Sprawdzić działanie systemu pomocy.
Sprawdzić działanie systemu pracy z linią poleceń (GNU Readline): historia, dopełnianie, skrótu klawiaturowe. Przeglądnąć tryb pracy w GNU Emacs i edytor PCE Emacs (uruchomić SWI Prolog przez xpce
).
1.10 Ćwiczenie: Obserwacje
Sprawdzić działanie predykatu listing/0.
Sprawdzić działanie predykatu listing/1:
?- listing(rodzic).
W sytuacjach kiedy nie interesują nas wartości pewnych szukanych w predykacie, możemy użyć tzw. szukanych anonimowych. Na przykład: ,,czy Robert ma rodziców?''
?- rodzic(_,robert).
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. Czytelnik kodu programu nie musi znać algorytmu czy modelu (np. obiektowego), żeby zrozumieć program. To sam program JEST algorytmem, modelem.
Na zakończenie:
?- write('Hello world'), nl.
Komentarze
Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab.
— Grzegorz J. Nalepa 2008/02/20 14:34