[[
✎ 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 * 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: * //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) //[[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, * 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//). <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//
pl/prolog/prolog_lab/prolog_lab_1.1203514545.txt.gz
· ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry