Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:programy [2009/02/25 09:29] holownia |
pl:prolog:prolog_lab:programy [2019/06/27 15:50] (aktualna) |
Predykaty //assert/a/z /1//, //retract/a/z /1// pozwalają na dodawanie, usuwanie faktów do/z bazy wiedzy, na/do jej początku/końca. | Predykaty //assert/a/z /1//, //retract/a/z /1// pozwalają na dodawanie, usuwanie faktów do/z bazy wiedzy, na/do jej początku/końca. |
| |
Predykat //abolish/1// pozwala usunąć predykat z bazy wiedzy. | Predykat //abolish/1// pozwala usunąć predykat z bazy wiedzy. (np. ''abolish(kobieta/1).'') |
| |
Predykat //retractall/1// pozwala usunąć klauzule danego predykatu z bazy wiedzy. | Predykat //retractall/1// pozwala usunąć klauzule danego predykatu z bazy wiedzy. (np. ''retractall(kobieta(K)).'') |
| |
Predykaty //see/n//, //tell/told// pozwalają na odczyt, zapis bazy wiedzy z/do pliku. | Predykaty //see/n//, //tell/told// pozwalają na odczyt, zapis bazy wiedzy z/do pliku. |
| |
W powyższym programie predykat ''addrule/0'' dodaje (''delrule/0'' usuwa) dynamicznie regułę: | W powyższym programie predykat ''addrule/0'' dodaje (''delrule/0'' usuwa) dynamicznie regułę: |
<code prolog> | <code> |
b(X,Y):-a(X),a(Y). | b(X,Y):-a(X),a(Y). |
</code> | </code> |
Uruchomienie programu ze wskazanego pliku (''plik.pl'') z poziomu systemu operacyjnego można zrealizować za pomocą: | Uruchomienie programu ze wskazanego pliku (''plik.pl'') z poziomu systemu operacyjnego można zrealizować za pomocą: |
| |
swipl -t halt -s plik.pl | swipl -s program.pl -g go -t halt |
| |
===== -. Śledzenie pracy programu ===== | ===== -. Śledzenie pracy programu ===== |
| |
Trace points: | Trace points: |
* trace/0 - ustawia trace point na wszystkich predykatach, | * trace/0 - ustawia trace point na wszystkich predykatach, w wersji swi-prolog używanej na laboratorium, ''trace/0'' śledzi **następny zadany cel**, np. |
| <code prolog> |
| ?- trace,kobieta(K),rodzic(K,_). |
| </code> |
* trace/1 - ustawia trace point na wskazanym predykacie, | * trace/1 - ustawia trace point na wskazanym predykacie, |
* trace/2 - np. trace(something,-all) - zdejmuje trace point ze wskazanego predykatu. | * trace/2 - modyfikuje dla wskazanego predykatu śledzone zdarzenia (call, redo, exit, fail), np.: |
| * trace(something/1,-all) - zdejmuje trace point ze wskazanego predykatu //something/1//, |
| * trace(something,+call) - ustawia trace point śledzący jedynie wywołania na wskazane predykaty //something// o dowolnej arności. |
| |
Predykat //debugging/0// wypisuje ustawione trace points. | Predykat //debugging/0// wypisuje ustawione trace points. |
* ''delta/4'' -- obliczający deltę, argumenty kolejno: a, b, c, wynik, | * ''delta/4'' -- obliczający deltę, argumenty kolejno: a, b, c, wynik, |
* ''kwadrat/4'' -- obliczający wynik równania kwadratowego, argumenty kolejno: a, b, c, wynik. | * ''kwadrat/4'' -- obliczający wynik równania kwadratowego, argumenty kolejno: a, b, c, wynik. |
Zwróć uwagę na niedeterminizm w predykacie ''kwadrat/4'', który znajduje zero, jedno, albo dwa rozwiązania; mogą się przydać [[http://gollem.science.uva.nl/SWI-Prolog/Manual/arith.html|funkcje matematyczne]]. | Zwróć uwagę na niedeterminizm w predykacie ''kwadrat/4'', który znajduje zero, jedno, albo dwa rozwiązania; mogą się przydać [[http://www.swi-prolog.org/pldoc/man?section=arith|funkcje matematyczne]], w szczególności do obliczenia pierwiastka używa się ''sqrt/1''. |
| |
===== -. Rekurencja w Prologu ===== | ===== -. Rekurencja w Prologu ===== |
| |
Wpisz, przetestuj i przemyśl działanie programu rekurencyjnie liczącego silnię. | Wpisz, przetestuj i przemyśl działanie programu rekurencyjnie liczącego silnię. |
| Uruchom program w trybie śledzenia wykonywania (trace). |
| |
| **Ćwiczenie** |
| |
| Opierając się na silni napisz program wypisujący [[http://pl.wikipedia.org/wiki/Ci%C4%85g_Fibonacciego|Ciąg Fibonacciego]]. |
| |
===== - Wybrane problemy rozwiązane w Prologu ===== | ===== - Wybrane problemy rozwiązane w Prologu ===== |
| |
| ==== Świat klocków ==== |
| Problem [[wp>Blocks_world]] |
| |
| Wczytaj {{:pl:prolog:prolog_lab:blocks.pl|}} |
| |
| Narysuj na kartce zamodelowany świat. |
| Jakie pytania można zadać? |
| <code prolog> |
| above(b1,b2). |
| above(b3,b5). |
| left(b1,b7). |
| left(b3,b3). |
| </code> |
| |
| |
| **Ćwiczenie** |
| |
| Opisz w programie taki świat: |
| <code> |
| a1 |
| a2 |
| a3 c1 c3 |
| a4 a5 c2 c4 |
| </code> |
| |
==== Wieże Hanoi ==== | ==== Wieże Hanoi ==== |
| |
Problem [[wp>Towers_of_hanoi]] | Problem [[wp>Towers_of_hanoi]] |
| |
Program {{:pl:prolog:prolog_lab:hanoi.pl|hanoi.pl}} | |
| |
| |
**Ćwiczenie** | **Ćwiczenie** |
| |
Pobrać program {{:pl:prolog:prolog_lab:hanoi.pl|hanoi.pl}} | Proszę pobrać program {{:pl:prolog:prolog_lab:hanoi.pl|hanoi.pl}}. |
Przetestować i przemyśleć. | Przetestować i przemyśleć. |
| |
| Predykat //move/4// działa następująco:\\ |
| np. //move(3,left,right,center)// przenosi 3 krążki ze stosu //left// na stos //right// przy pomocy stosu //center//. |
| |
Przykład: | Przykład: |
</code> | </code> |
| |
| Analizując kod programu proszę zauważyć, że algorytm rozwiązania problemu opiera się na dekompozycji na podproblemy. |
| |
==== Kolorowanie Mapy ==== | ==== Kolorowanie Mapy ==== |
Uwaga: w Prologu operator ''\='' to nieidentyczność, czy też niemożliwość uzgodnienia termów. | Uwaga: w Prologu operator ''\='' to nieidentyczność, czy też niemożliwość uzgodnienia termów. |
| |
| ==== Dla Zainteresowanych ==== |
| Więcej ciekawych problemów [[reprezentacja_wiedzy#ciekawe_problemy|na kolejnych zajęciach]] |
| oraz w [[prolog:pllib:start|bibliotece programów]]. |
| |
===== Obserwacje ===== | ===== Obserwacje ===== |