Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_1 [2008/02/20 14:14] gjn |
pl:prolog:prolog_lab:prolog_lab_1 [2009/02/22 14:06] holownia usunięto |
====== 1 LAB: Wprowadzenie do środowiska Prologu ====== | {{header>1}} |
| ====== - #1 LAB: Wprowadzenie do środowiska Prologu ====== |
| |
| |
===== WPROWADZENIE ===== | ===== - WPROWADZENIE ===== |
| |
| |
| |
Prolog to język programowania logicznego, lub dokładniej programowania w logice (//PROgrammation en LOGique, PROgramming in LOGic//). | Prolog to język programowania logicznego, lub dokładniej programowania w logice (//PROgrammation en LOGique, PROgramming in LOGic//). |
| |
| Uwaga: nie należy za bardzo przejmować się hasłem o Prologu w Wikipedii -- jest //źle// napisane! |
| |
| |
==== Rozwój: ==== | ==== Rozwój: ==== |
| |
* podstawy teoretyczne: logika, Robinson (rezolucja), Kowalski (University of Edinburgh) | * podstawy teoretyczne: logika ([[wp>George_Boole]],[[wp>Gottlob_Frege]],[[wp>Alfred_Tarski]], i inni), [[wp>J._Alan_Robinson]] (rezolucja), [[wp>]] (University of Edinburgh) |
* implementacje: Colmerauer, (University of Aix-Marseille), 1972; Warren (University of Edinburgh) 1977 | * implementacje: [[wp>Alain_Colmerauer]], (University of Aix-Marseille), 1972; [[wp>David_H._D._Warren]] (University of Edinburgh) 1977 |
| |
| |
* Daniel Diaz, //GNU-Prolog//, http://gnu-prolog.inria.fr | * Daniel Diaz, //GNU-Prolog//, http://gnu-prolog.inria.fr |
| |
W czasie zajęć będzie się pracować głównie w środowisku SWI. | W czasie zajęć będzie się pracować 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. | Podstawowym interfejsem w SWI jest powłoka. W powłoce pracuje się podobnie jak w powłoce unixowej, oczywiście z uwzględnieniem specyfiki Prologu. |
| |
| |
==== Temat: Programy w Prologu ==== | ==== Ćwiczenie: Uruchamianie powłoki ==== |
| |
Elementy składniowe programu: | Unix/GNU/Linux: Proszę otworzyć okno terminala, np. ''xterm'' i uruchomić w nim powłokę SWI przez polecenie ''swipl'' (może też być dostępny przez polecenie ''pl''). |
| |
* //atomy//: stałe znakowe, | Windows: uruchomić za pomoc ikony, menu, itp. |
* //niewiadome/szukane// (tzw. zmienne logiczne), | |
* //termy//: symbole funkcyjne przyjmujące argumenty | |
| |
Program składa się z | UWAGA: każda //linia kodu// w Prologu musi się kończyć kropką, podobnie linia, polecenie w powłoce! |
| |
* szeregu //klauzul// (ang. //clause//), wyróżniamy: | Proszę sprawdzić działanie systemu pomocy, przez predykat ''help.'', a następnie przeczytać opis do predykatu ''consult/1''. |
* fakty (klauzule proste) | |
* reguły (klauzule złożone) | |
* oraz //celu// (ang. //goal//) | |
| |
| 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? |
| |
==== 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 ==== |
| |
Temat: Środowisko pracy | |
SWI dostarcza przede wszystkim zaawansowanej powłoki, wyposażonej w bibliotekę //GNU ReadLine//. | 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/etch/prolog-el|prolog.el]]//. | 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//. | 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.''. |
| |
| ==== Ćwiczenie: Środowisko pracy ==== |
| |
| 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''). |
| |
| |
| ===== - Programowanie w Prologu ===== |
| |
==== Temat: Programowanie nieklasyczne ==== | ==== Temat: Programowanie nieklasyczne ==== |
| |
Nie ma w nim: | Nie ma w nim: |
| * słów kluczowych (typu IF THEN ELSE, DO WHILE, GOTO), |
* słów kluczowych, | * brak rozróżnienia we/wy w sensie klasycznego wywoływania funkcji, |
* 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 funkcji | * brak instrukcji podstawienia/przypisania; inne rozumienie zmiennych, |
* brak zmiennych (klasycznych) | * brak jawnej sekwencyjności, czy iteracyjności (z małymi wyjątkami), |
* brak jawnej sekwencyjności, czy iteracyjności (z małymi wyjątkami) | * brak dualizmu dane/program! |
| |
Prolog dostarcza: | 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. |
| |
* metody strukturalizowania informacji, termy | ==== Temat: Pisanie programów ==== |
* programowania deklaratywnego | |
* rekurencji, jak metody przetwarzania informacji | |
* unifikacji - mechanizmy dopasowywania wzorców | |
* rezolucji - metody wnioskowani logicznego | |
* strategii sterowania wnioskowaniem | |
| |
===== ĆWICZENIA ===== | Elementy składniowe programu: |
| |
| * //stałe//: stałe znakowe a także liczby (atomy), |
| * //niewiadome/szukane// (odpowiadają tzw. zmiennym logicznym, które __nie__ mają zbyt wiele wspólnego ze zmiennymi w klasycznych językach programowania), |
| * //termy//: symbole funkcyjne wraz z argumentami, obiekty strukturalnie złożone. |
| |
| Program składa się z: |
| |
==== 1.1 Ćwiczenie: Uruchamianie powłoki ==== | * szeregu //klauzul// (ang. //clause//), wyróżniamy: |
| * //fakty// (klauzule proste, formuły atomowe/atomiczne), |
| * //reguły// (klauzule złożone), |
| * oraz //celu// (ang. //goal//). |
| |
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). | ==== Ćwiczenie: Pisanie programów ==== |
| |
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//). | Proszę przyjrzeć się poniższemu, prostemu programowi (klasyczny przykład //Rodzina//). |
</code> | </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 | 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//. |
| |
| |
| |
| ==== Temat: Uruchamianie programu ==== |
| |
| Do uruchomienia programu należy w powłoce 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 bazy wiedzy! |
| |
==== 1.3 Ćwiczenie: Uruchamianie programów ==== | ==== Ćwiczenie: Uruchamianie programu ==== |
| |
W powłoce SWI należy wczytać powyższy program: | W powłoce SWI należy wczytać powyższy program: |
Po ukazaniu się 1. odpowiedzi należy wcisnąć klawisz średnika (;). | Po ukazaniu się 1. odpowiedzi należy wcisnąć klawisz średnika (;). |
| |
==== 1.4 Ćwiczenie: Praca z programem ==== | ==== Ćwiczenie: Baza wiedzy ==== |
| |
| 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). |
| |
| ==== Ćwiczenie: Praca z programem ==== |
| |
Systemowi można teraz zadawać pytania, cele do zrealizowania. | Systemowi można teraz zadawać pytania, cele do zrealizowania. |
| |
?- mezczyzna(tomek). | ?- mezczyzna(tomek). |
| |
| |
| |
Czy reksio jest mężczyzną? | Czy reksio jest mężczyzną? |
?- mezczyzna(reksio). | ?- mezczyzna(reksio). |
| |
Czy kasia jest rodzicem robert? | Czy kasia jest rodzicem roberta? |
| |
?- rodzic(kasia,robert). | ?- rodzic(kasia,robert). |
?- rodzic(Y,robert). | ?- rodzic(Y,robert). |
| |
Czy zamiast Y można wpisać inny symbol? | Czy zamiast ''Y'' można wpisać inny symbol? |
| |
==== 1.5 Ćwiczenie: Rozbudowa programu ==== | ==== Ćwiczenie: Rozbudowa programu ==== |
| |
Proszę rozbudować program do poniższej, analogicznej (co do liczby osób i zależności) formy: | Proszę rozbudować program do poniższej, analogicznej (co do liczby osób i zależności) formy: |
Czy kolejność wpisywania linii ma znaczenie? | Czy kolejność wpisywania linii ma znaczenie? |
| |
UWAGA: aby dopisane fakty były dostępne dla Prologu, należy go ponownie wczytać! | UWAGA: aby dopisane fakty były dostępne dla Prologu, należy ponownie załadować plik! |
| |
Jeżeli koniunkcję celów oznaczamy przecinkiem, to jak zapytać kto jest matką, a kto ojcem roberta? | 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 ==== | ==== Ćwiczenie: Przykład w innym języku ==== |
| |
Proszę spróbować dopisać do programu takie linijki: | Proszę spróbować dopisać do programu takie linijki: |
Jakie są ograniczenia na używane symbole? | Jakie są ograniczenia na używane symbole? |
| |
==== 1.7 Ćwiczenie: Reguły ==== | |
| |
| ==== Ćwiczenie: Reguły ==== |
| |
Proszę dopisać poniższe reguły i sprawdzić ich działanie. | 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ę 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:\= | Jaki pojawia się problem przy bracie/siostrze? Uwaga na operator: ''\='' |
| |
Proszę się zastanowić nad własnymi regułami opisującymi relacje w rodzinie. | 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: | ==== Ćwiczenie: Reguły rekurencyjne ==== |
| |
| Rekurencja jest jednym z podstawowych mechanizmów programowania w Prologu. Proszę się przyjrzeć regułom opisującym przodka: |
| |
<code prolog> | <code prolog> |
</code> | </code> |
| |
Te dwie klauzule, w tym przypadku reguły, opisują dokładnie jeden predykat: przodek/2. | Te dwie klauzule, w tym przypadku reguły, opisują dokładnie jeden predykat: //przodek/2//. |
| |
Jak zdefiniować potomka, krewnego? | Jak zdefiniować potomka, krewnego? |
| |
==== 1.9 Ćwiczenie: Środowisko pracy ==== | |
| |
Sprawdzić działanie systemu pomocy. | ====== Obserwacje ====== |
| |
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). | ===== Styl ===== |
| 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ę (relacyjną) użytą w Prologu. Czytelnik kodu programu nie musi znać //algorytmu// czy //modelu// (np. obiektowego), żeby zrozumieć program. To sam program JEST algorytmem, modelem. |
| |
==== 1.10 Ćwiczenie: Obserwacje ==== | ===== Alternatywa ===== |
| Tak, w Prologu jest operator alternatywy (ang. //OR//), ale //nie//, nie jest niezbędny, ani nie powinno się go używać. W praktyce ten sam efekt uzyskujemy pisząc kolejne klauzule, a zyskujemy na przejrzystości. |
| |
Sprawdzić działanie predykatu listing/0. | ===== Klasyczny program ===== |
| |
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: | Na zakończenie: |
| |
?- write('Hello world'), nl. | ?- 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// |