Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_1 [2008/10/08 12:07] 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 ===== |
| |
| |
| |
Uwaga: nie należy za bardzo przejmować się hasłem o Prologu w Wikipedii -- jest //źle// napisane! | Uwaga: nie należy za bardzo przejmować się hasłem o Prologu w Wikipedii -- jest //źle// napisane! |
| |
| |
==== Rozwój: ==== | ==== Rozwój: ==== |
| |
* podstawy teoretyczne: logika, [[wp>J._Alan_Robinson]] (rezolucja), [[wp>]] (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: [[wp>Alain_Colmerauer]], (University of Aix-Marseille), 1972; [[wp>David_H._D._Warren]]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. |
| |
| |
| ==== Ć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ć dostępny przez polecenie ''pl''). |
| |
| Windows: uruchomić za pomoc ikony, menu, itp. |
| |
| UWAGA: każda //linia kodu// w Prologu musi się kończyć kropką, podobnie linia, polecenie w powłoce! |
| |
| Proszę sprawdzić działanie systemu pomocy, przez predykat ''help.'', a następnie przeczytać opis do predykatu ''consult/1''. |
| |
| Proszę wyjść z powłoki przez ''halt.'' |
| |
==== Temat: Programy w Prologu ==== | Proszę ponownie uruchomić powłokę SWI. Przy pomocy jakiej kombinacji klawiszy można wyjść z powłoki unixowej - analogiczenie w SWI? |
| |
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 z te zmiennymi w klasycznych językach programowania), | |
* //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 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! | |
| |
| |
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.''. | 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 ==== |
* strategii sterowania wnioskowaniem. | * strategii sterowania wnioskowaniem. |
| |
===== ĆWICZENIA ===== | ==== Temat: Pisanie programów ==== |
| |
| 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: |
| |
| * szeregu //klauzul// (ang. //clause//), wyróżniamy: |
| * //fakty// (klauzule proste, formuły atomowe/atomiczne), |
| * //reguły// (klauzule złożone), |
| * oraz //celu// (ang. //goal//). |
| |
==== 1.1 Ćwiczenie: Uruchamianie powłoki ==== | ==== Ćwiczenie: Pisanie programów ==== |
| |
| |
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''). | |
| |
Windows: uruchomi za pomoc ikony, menu, itp. | |
| |
UWAGA: każda //linia kodu// w Prologu musi się kończyć kropką, podobnie linia, polecenie w powłoce! | |
| |
Proszę sprawdzić działanie systemu pomocy, przez predykat ''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//). |
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//. |
| |
==== 1.3 Ćwiczenie: Uruchamianie programów ==== | |
| |
| ==== 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! |
| |
| |
| ==== Ć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 (;). |
| |
| ==== Ćwiczenie: Baza wiedzy ==== |
| |
==== 1.4 Ćwiczenie: Praca z programem ==== | 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). |
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: |
| |
| |
==== 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. |
| |
| |
==== 1.8 Ćwiczenie: Reguły rekurencyjne ==== | ==== Ćwiczenie: Reguły rekurencyjne ==== |
| |
Rekurencja jest jednym z podstawowych mechanizmów programowania w Prologu. Proszę się przyjrzeć regułom opisującej przodka: | Rekurencja jest jednym z podstawowych mechanizmów programowania w Prologu. Proszę się przyjrzeć regułom opisującym przodka: |
| |
<code prolog> | <code prolog> |
Jak zdefiniować potomka, krewnego? | 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: 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). | |
| |
| |
====== Obserwacje ====== | ====== Obserwacje ====== |