Różnice

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

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:prolog_lab_1 [2007/11/21 23:38]
root Document moved from pl:prolog:lab:prolog_lab_1
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 =====
  
  
 ==== Temat: Czym jest Prolog ==== ==== Temat: Czym jest Prolog ====
  
-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 
  
 ==== Temat: SWI Prolog ==== ==== Temat: SWI Prolog ====
Linia 18: Linia 23:
 Współcześnie jest dostępnych szereg implementacji Prologu, w tym swobodnie dostępne kompilatory Prologu: 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 +  * Jan Wielemaker, ​//SWI-Prolog//, http://​www.swi-prolog.org 
-  * Daniel Diaz, GNU-Prolog, http://​gnu-prolog.inria.fr+  * 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.+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.
  
-==== Temat: Programy w Prologu ==== 
  
-Elementy składniowe programu:+==== ĆwiczenieUruchamianie powłoki ====
  
-  * atomystałe znakowe, +Unix/​GNU/​LinuxProszę otworzyć okno terminalanp''​xterm''​ i uruchomić w nim powłokę SWI przez polecenie ''​swipl''​ (może też być dostępny przez polecenie ''​pl''​).
-  * niewiadome/​szukane (tzwzmienne logiczne)+
-  * termy: symbole funkcyjne przyjmujące argumenty+
  
-Program składa się z+Windows: uruchomić za pomoc ikony, menu, itp.
  
-  * szeregu klauzul (ang. clause)wyróżniamy:​ +UWAGA: każda //linia kodu// w Prologu musi się kończyć kropkąpodobnie linia, polecenie w powłoce!
-    * fakty (klauzule proste) +
-    * reguły (klauzule złożone) +
-  * oraz celu (ang. goal)+
  
-==== Temat: Uruchamianie programu ====+Proszę sprawdzić działanie systemu pomocy, przez predykat ''​help.'',​ a następnie przeczytać opis do predykatu ''​consult/​1''​.
  
-Do uruchomienia programu należy załadować plik kodem w Prologu przy pomocy predykatu consult/1 (skrót [nazwa].)+Proszę wyjść z powłoki przez ''​halt.''​
  
-Operację tę należy powtarzać po każdej modyfikacji kodu.+Proszę ponownie uruchomić powłokę SWI. Przy pomocy jakiej kombinacji klawiszy można wyjść z powłoki unixowej - analogiczenie w SWI?
  
-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: Środowisko ​pracy ====
  
-==== Temat: Programowanie nieklasyczne ====+SWI dostarcza przede wszystkim zaawansowanej powłoki, wyposażonej w bibliotekę //GNU ReadLine//.
  
-Prolog NIE jest klasycznym językiem programowania.+Cennym uzupełnieniem ​jest edytor GNU Emacs ze środowiskiem edycyjnym (trybem) //​[[http://​packages.debian.org/​stable/​prolog-el|prolog.el]]//​.
  
-Nie ma nim:+SWI 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.''​.
  
-  * słów kluczowych,​ +==== Ćwiczenie: Środowisko pracy ====
-  * brak rozróżnienia we/wy +
-  * brak funkcji +
-  * brak zmiennych (klasycznych) +
-  * brak jawnej sekwencyjności,​ czy iteracyjności+
  
-Prolog dostarcza:+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''​).
  
-  * metody strukturalizowania informacji, termy 
-  * programowania deklaratywnego 
-  * rekurencji, jak metody przetwarzania informacji 
-  * unifikacji - mechanizmy dopasowywania wzorców 
-  * rezolucji - metody wnioskowani logicznego 
-  * strategii sterowania wnioskowaniem 
  
-===== ĆWICZENIA ​=====+===== - Programowanie w Prologu ​=====
  
 +==== Temat: Programowanie nieklasyczne ====
  
-==== 1.1 Ćwiczenie: Uruchamianie powłoki ====+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!
  
-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).+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.
  
-Windowsuruchomi za pomoc ikony, menu, itp.+==== TematPisanie programów ====
  
-UWAGAkażda //linia kodu// w Prologu musi się kończyć kropką!+Elementy składniowe programu:
  
-Proszę sprawdzić działanie systemu pomocyprzez predykaty help., a następnie przeczytać opis do predykatu consult/1.+  * //stałe//: stałe znakowe a także liczby (atomy), 
 +  * //​niewiadome/​szukane//​ (odpowiadają tzwzmiennym logicznymktó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.
  
-Proszę wyjść ​powłoki przez halt.+Program składa się z:
  
-Proszę ponownie uruchomić powłokę SWIPrzy pomocy jakiej kombinacji klawiszy można wyjść ​powłoki unixowej - analogiczeniw SWI?+  * szeregu //klauzul// (ang//​clause//​),​ wyróżniamy: 
 +    * //fakty// (klauzule proste, formuły atomowe/​atomiczne),​ 
 +    * //reguły// (klauzule ​ożone), 
 +  * oraz //celu// (ang. //goal//).
  
-==== 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 108: 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//.
  
-==== 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 122: 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 133: Linia 160:
  
   ?- mezczyzna(tomek).   ?- mezczyzna(tomek).
 +
 +
  
 Czy reksio jest mężczyzną?​ Czy reksio jest mężczyzną?​
Linia 138: Linia 167:
   ?- mezczyzna(reksio).   ?- mezczyzna(reksio).
  
-Czy kasia jest rodzicem ​robert?+Czy kasia jest rodzicem ​roberta?
  
   ?- rodzic(kasia,​robert).   ?- rodzic(kasia,​robert).
Linia 152: 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 178: 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:
  
 +<code prolog>
   famme(kasia).   famme(kasia).
- 
   homme(krzys).   homme(krzys).
- 
   parent(kasia,​krzys).   parent(kasia,​krzys).
 +</​code>​
  
 Czy nazwa użytych symboli wpływa na działanie programu? Czy nazwa użytych symboli wpływa na działanie programu?
Linia 197: 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 214: 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 231: 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