Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_1 [2008/02/21 15:01] ligeza |
— (aktualna) |
====== 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: | |
| |
* Jan Wielemaker, //SWI-Prolog//, http://www.swi-prolog.org | |
* LIACC/Universidade do Porto, OPPE Sistemas/UFRJ, //YAP//, http://www.ncc.up.pt/~vsc/Yap/ | |
* Daniel Diaz, //GNU-Prolog//, http://gnu-prolog.inria.fr | |
| |
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 | |
| |
* szeregu //klauzul// (ang. //clause//), wyróżniamy: | |
* fakty (klauzule proste, formuły atomowe/atomiczne), | |
* reguły (klauzule złożone), | |
* oraz //celu// (ang. //goal//). | |
| |
| |
| |
| |
==== 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) //[[http://packages.debian.org/stable/prolog-el|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 zamiast''swipl'' 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 (typu IF THEN ELSE, DO WHILE, GOTO), | |
* brak rozróżnienia we/wy w sensie klasycznego wywoływania funkcji, | |
* brak funkcji, (można jednak prowadzić proste obliczenia; funkcje mogą być zastępowane predykatami), | |
* brak instrukcji podstawienia/przypisania; inne rozumienie zmiennych, | |
* 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//). | |
| |
<code prolog> | |
rodzic(kasia,robert). | |
rodzic(tomek,robert). | |
rodzic(tomek,eliza). | |
| |
kobieta(kasia). | |
kobieta(eliza). | |
| |
mezczyzna(tomek). | |
mezczyzna(robert). | |
</code> | |
| |
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: | |
| |
<code prolog> | |
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). | |
</code> | |
| |
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: | |
| |
<code prolog> | |
famme(kasia). | |
homme(krzys). | |
parent(kasia,krzys). | |
</code> | |
| |
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. | |
| |
<code prolog> | |
matka(X,Y) :- | |
rodzic(X,Y), | |
kobieta(X). | |
| |
ojciec(X,Y) :- | |
rodzic(X,Y), | |
mezczyzna(X). | |
| |
</code> | |
| |
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: | |
| |
<code prolog> | |
przodek(X,Y) :- | |
rodzic(X,Y). | |
| |
przodek(X,Z) :- | |
rodzic(X,Y), | |
przodek(Y,Z). | |
</code> | |
| |
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. 8-) | |
| |
--- //[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2008/02/20 14:34// | |