Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:prolog_lab_1 [2008/10/08 09:07]
gjn linki wp
— (aktualna)
Linia 1: Linia 1:
-====== 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, [[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 
- 
- 
-==== 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 (atomy), 
-  * //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),​ 
-  * brak dualizmu dane/​program! 
- 
-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ć dostępny 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: 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 ====== 
-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. 
- 
-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.1223449676.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0