[[
✎ pl:prolog:prolog_lab:prolog_lab_1
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== 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 * 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: * atomy: stałe znakowe, * niewiadome/szukane (tzw. zmienne logiczne), * termy: symbole funkcyjne przyjmujące argumenty Program składa się z * szeregu klauzul (ang. clause), wyróżniamy: * fakty (klauzule proste) * 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) prolog.el. SWI w wersji rozszerzonej o środowisko XPCE dostarcza również narzędzi programistycznych, takich jak wbudowany edytor emacs. ==== Temat: Programowanie nieklasyczne ==== Prolog NIE jest klasycznym językiem programowania. Nie ma w nim: * słów kluczowych, * 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 ===== ==== 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: 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. <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.
pl/prolog/prolog_lab/prolog_lab_1.1195684711.txt.gz
· ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry