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/02/20 14:14]
gjn
pl:prolog:prolog_lab:prolog_lab_1 [2009/02/22 14:06]
holownia usunięto
Linia 1: Linia 1:
-====== 1 LAB: Wprowadzenie do środowiska Prologu ======+{{header>​1}} 
 +====== ​- #1 LAB: Wprowadzenie do środowiska Prologu ======
  
  
-===== WPROWADZENIE ===== +===== WPROWADZENIE =====
  
  
Linia 9: Linia 9:
  
 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
  
  
Linia 24: Linia 27:
   * 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.
  
  
-==== TematProgramy w Prologu ​====+==== ĆwiczenieUruchamianie powłoki ​====
  
-Elementy składniowe programu:+Unix/​GNU/​LinuxProszę 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, +Windowsuruchomić za pomoc ikonymenu, itp.
-  * //​niewiadome/​szukane//​ (tzwzmienne 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 ====
Linia 65: Linia 68:
  
 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 ĆwiczenieUruchamianie 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//​).
Linia 116: Linia 114:
 </​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:
Linia 130: Linia 137:
 Po ukazaniu się 1. odpowiedzi należy wcisnąć klawisz średnika (;). Po ukazaniu się 1. odpowiedzi należy wcisnąć klawisz średnika (;).
  
-==== 1.Ć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.
Linia 141: Linia 160:
  
   ?- mezczyzna(tomek).   ?- mezczyzna(tomek).
 +
 +
  
 Czy reksio jest mężczyzną?​ Czy reksio jest mężczyzną?​
Linia 146: Linia 167:
   ?- mezczyzna(reksio).   ?- mezczyzna(reksio).
  
-Czy kasia jest rodzicem ​robert?+Czy kasia jest rodzicem ​roberta?
  
   ?- rodzic(kasia,​robert).   ?- rodzic(kasia,​robert).
Linia 160: Linia 181:
   ?- 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:
Linia 186: Linia 207:
 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:
Linia 205: Linia 225:
 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.
Linia 222: Linia 244:
 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>
Linia 239: Linia 262:
 </​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): historiadopełnianie, skrótu klawiaturowe. Przeglądnąć tryb pracy 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ą wiedzypowinien 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//
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