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:35]
gjn komentarze
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 ====
Linia 59: Linia 54:
 Cennym uzupełnieniem jest edytor GNU Emacs ze środowiskiem edycyjnym (trybem) //​[[http://​packages.debian.org/​stable/​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//. 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 ====
Linia 67: 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 prosteformuły atomowe/​atomiczne),​ 
- +    * //​reguły// ​(klauzule złożone), 
-Unix/GNU/Linux: Proszę otworzyć okno terminalanp. xterm i uruchomić w nim powłokę SWI przez polecenie ''​swipl'' ​(może też być dostepny przez polecenie pl)+  * oraz //celu// (ang. //goal//).
- +
-Windows: uruchomi za pomoc ikonymenu, 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 ====+==== Ć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 121: Linia 116:
 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.Ć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:
Linia 133: 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 144: Linia 160:
  
   ?- mezczyzna(tomek).   ?- mezczyzna(tomek).
 +
 +
  
 Czy reksio jest mężczyzną?​ Czy reksio jest mężczyzną?​
Linia 149: Linia 167:
   ?- mezczyzna(reksio).   ?- mezczyzna(reksio).
  
-Czy kasia jest rodzicem ​robert?+Czy kasia jest rodzicem ​roberta?
  
   ?- rodzic(kasia,​robert).   ?- rodzic(kasia,​robert).
Linia 163: 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 189: 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 209: Linia 226:
  
  
-==== 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 226: 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 243: 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 ====+====== Obserwacje ======
  
-Sprawdzić działanie systemu pomocy.+===== Styl ===== 
 +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.
  
-Sprawdzić działanie systemu pracy z linią poleceń ​(GNU Readline): historiadopełnianieskrótu klawiaturowePrzeglądnąć tryb pracy w GNU Emacs i edytor PCE Emacs (uruchomić SWI Prolog przez ''​xpce''​).+===== 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.
  
-==== 1.10 Ćwiczenie: Obserwacje ​==== +===== Klasyczny program =====
- +
-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:​ Na zakończenie:​
  
   ?- write('​Hello world'​),​ nl.   ?- write('​Hello world'​),​ nl.
- +
 ====== Komentarze ====== ====== Komentarze ======
 Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-) 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//  --- //​[[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