Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_2 [2008/03/21 18:38] wojnicki zadawanie celu w programie, uruchamianie programu z poziomu OS |
— (aktualna) |
====== 2 LAB: Pisanie programów w Prologu ====== | |
| |
===== WPROWADZENIE ===== | |
| |
==== Temat: Wypisywanie odpowiedzi ==== | |
| |
Predykat //write/1// wypisuje term na wyjście; //nl/0// przechodzi do nowej linii. | |
| |
==== Temat: Wymuszanie nawrotów ==== | |
| |
| |
Predykat //fail/0// pozwala na wymuszanie nawrotów w procesie poszukiwania rozwiązania, co pozwala w szczególności na znalezienie wszystkich rozwiązań problemu. | |
| |
Przypomnienie: Prolog używa strategii przeszukiwania wgłąb drzewa rozwiązań problemu i zatrzymuje sie po napotkaniu 1. poprawnego rozwiązania. | |
| |
==== Temat: Programy interaktywne ==== | |
| |
| |
Predykat read/1 pozwala na pobieranie danych od użytkownika. | |
| |
==== Temat: Modyfikacje bazy wiedzy ==== | |
| |
| |
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 //retractall/1// pozwala usunąć klauzule danego predykatu z bazy wiedzy. | |
| |
Predykaty //see/n//, //tell/told// pozwalają na odczyt, zapis bazy wiedzy z/do pliku. | |
| |
==== Temat: Zadanie celu, uruchamianie programów ==== | |
| |
Konstrukcja: | |
| |
:- cos. | |
| |
pozwala na podanie celu w programie, np.: | |
| |
:- dynamic(capital_of/2). | |
:- go. | |
:- start. | |
| |
Prolog przystąpi do zrealizowania celu po załadowaniu kodu. | |
| |
Uruchomienie programu ze wskazanego pliku (''plik.pl'') z poziomu systemu operacyjnego można zrealizować za pomocą: | |
| |
swipl -t halt -s plik.pl | |
| |
| |
==== Temat: Śledzenie pracy programu ==== | |
| |
Interpretery Prologu pozwalają na śledzenie pracy programu. W tym celu należy włączyć śledzenie analizowania konkretnego predykatu przez //spy/1//, a następnie włączyć tryb śledzenia pracy programu przez //trace/0//. | |
| |
Debugger wyłącza się przez //nodebug/0//. | |
| |
==== Temat: Obliczenia arytmetyczne i operatory porównania ==== | |
| |
| |
W Prologu nie można w sposób //bezpośredni// wykonywać obliczeń arytmetycznych. Służy do tego predykat //is//. | |
| |
==== Temat: Prosty system ekspertowy ==== | |
| |
| |
W Prologu niezwykle prosto tworzy się systemy ekspertowe. | |
| |
Przykład takiego systemu znajduje sie w pliku {{car.pl}} | |
| |
Dodatkowo korzysta on z pliku {{getyesno.pl}} | |
| |
Jest to system bazujący na wbudowanym w Prolog mechanizmie wnioskowania, tj. wnioskowaniu wstecz, czyli abdukcji. | |
| |
===== ĆWICZENIA ===== | |
| |
| |
==== 2.1 Ćwiczenie: Wyświetlanie wyników pracy programu ==== | |
| |
| |
Przetestować działanie: | |
| |
write('Ala ma '),write('kota'),nl,write('w ciapki!'). | |
| |
| |
==== 2.2 Ćwiczenie: Użycie fail ==== | |
| |
| |
Pobrać i wczytać program {{fam2.pl}} | |
| |
Wyświetlić go przez listing. | |
| |
Sprawdzić działanie: | |
| |
?- kobieta(K),write(K),write(' to kobieta.'),nl. | |
| |
Jak wymusić odnajdywanie kolejnych kobiet. | |
| |
Sprawdzić działanie: | |
| |
?- kobieta(K),write(K),write(' to kobieta.'),nl,fail. | |
| |
Sprawdzić działanie: | |
| |
?- kobieta(K),fail. | |
| |
Dlaczego nic się nie pojawia? | |
| |
Pobrać i wczytać program {{capitals.pl}} | |
| |
Sprawdzić działanie: | |
| |
?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl. | |
?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl, fail. | |
| |
==== 2.3 Ćwiczenie: Praca interaktywna ==== | |
| |
| |
Proszę oglądnąć zastosowanie //read/1// na przykładzie programu {{interac.pl}} | |
| |
Po załadowaniu proszę wpisać: | |
| |
?- go. | |
| |
| |
| |
| |
| |
| |
==== 2.4 Ćwiczenie: Dynamiczna modyfikacja bazy wiedzy ==== | |
| |
Proszę napisać: | |
| |
?- assert(kobieta(kopernik)). | |
| |
jak zmieniła sie wiedza na temat kobiet? | |
| |
?- listing(kobieta). | |
| |
Proszę sprawdzić: | |
| |
kobieta(K),write(K),write(' to kobieta.'),nl,fail. | |
| |
Uwaga: niektóre kompilatory Prologu (np. SWI) wymagają wcześniejszego zadeklarowania predykatu jako takiego, który może być dynamicznie modyfikowany. Robi się to przez predykat //dynamic/2//, np. dla predykatu //kobieta/1// deklaracja w pliku //fam2.pl// ma postać '':- dynamic(kobieta/1).''. | |
| |
Proszę oglądnąć zastosowanie //assert/retract// na przykładzie programu {{learner.pl}} | |
| |
Początkowa baza wiedzy jest w pliku {{learner_kb.pl}} | |
| |
Należy uruchomić program przez ''start.'' | |
| |
Jakie 3 przypadki odpowiedzi są brane pod uwagę? Co dzieje się przy wyjściu z programu i jak to wpływa na jego kolejne uruchamianie? | |
| |
Uwaga: operator ''\+'' oznacza //negację//. | |
| |
Predykat //dynamic/2// jest potrzebny w niektórych implementacjach Prologu (np. SWI) do umożliwienia wykonywania dynamicznych modyfikacji, t.j. //assert// i //retract//. | |
| |
==== 2.5 Ćwiczenie: Śledzenie pracy programu ==== | |
| |
| |
Sprawdzić działanie: | |
| |
<code prolog> | |
?- [capitals]. | |
?- spy(capital_of). | |
[debug] ?- trace. | |
[trace] ?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl. | |
[trace] ?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl, fail. | |
</code> | |
| |
W SWI Prologu można też skorzystać z dodatkowego pakietu XPCE, w którym jest też wizualny debugger. | |
| |
Należy wyjść z bieżacej sesji SWI. Uruchomić interpreter z powłoki unixa przez przez polecenie ''xpce''. Następnie wykonać: | |
| |
<code prolog> | |
?- [capitals]. | |
?- spy(capital_of). | |
[debug] ?- guitracer. | |
[debug] ?- trace. | |
[trace] ?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl, fail. | |
</code> | |
| |
| |
==== 2.6 Ćwiczenie: Obliczenia i operatory porównania ==== | |
| |
| |
Sprawdzić działanie: | |
| |
<code prolog> | |
?- X is 2 + 2. | |
?- Y is 2.5 + ( 4 / 2). | |
?- Z is 2 + 0.001. | |
</code> | |
| |
Uwaga: | |
| |
<code prolog> | |
?- A is 3. | |
?- B is A + 4. | |
?- A is 3, B is A + 4. | |
</code> | |
| |
Operacje arytmetyczne: | |
| |
<code prolog> | |
?- X is 2 + 2. | |
?- X is 2 * 3. | |
?- X is 4 / 2. | |
?- X is 4 / 3. | |
?- X is 4 // 3. | |
</code> | |
Uwaga na //podstawianie//: | |
| |
<code prolog> | |
?- X is 2 + 5. | |
?- X = 2 + 5. | |
?- 2 + 5 =:= 1 + 4. | |
?- 2 + 5 =:= 3 + 4. | |
?- 2 + 5 =:= 4 + 4. | |
</code> | |
| |
Przećwiczyć użycie operatorów: | |
| |
<code prolog> | |
?- 2 < 3. | |
?- 2 > 3. | |
?- 3 > 3. | |
?- 3 >= 3. | |
?- 3 =< 3. | |
</code> | |
| |
==== 2.7 Ćwiczenie: Prosty system ekspertowy ==== | |
| |
| |
Przetestować działanie systemu. System diagnozuje przyczyną awarii samochodu. | |
| |
Kod systemu znajduje sie w pliku {{car.pl}} | |
| |
Dodatkowo korzysta on z pliku {{getyesno.pl}} | |
| |
W systemie ekspertowym można wyróżnić następujące elementy: | |
| |
* baza wiedzy, czasami dzielona na: właściwą bazę wiedzy (czyli tą którą system dysponuje stale, od początku/uruchomienia) i bazę faktów, które system odkrywa, dostaje, wypracowuje, | |
* mechanizm wnioskujący, który przeprowadza właściwy proces wnioskowania, tj. odnajduje rozwiązanie/odpowiedź | |
* mechanizm wyjaśniający, dlaczego jest to odpowiedź poprawna/dopuszczalna, | |
* interfejs użytkownika, pozwalający na komunikację z systemem. | |
| |
Rysunek 1: Struktura Systemu Ekspertowego. | |
| |
{{expert-systems-arch.png}} | |
| |
W przypadku tego systemu te elementy są odwzorowane przez: | |
| |
* predykat //defect_may_be/1// | |
* predykat //try_all_possibilities/0//, oraz mechanizm wnioskujący Prologu | |
* predykat //explain/1// | |
* predykaty //ask_question/1// i //user_says/2//. | |
| |
====== Obserwacje ====== | |
| |
W Prologu negacja opiera się o //Closed World Assumption//! | |
| |
W Prologu nie ma dualizmu "dane/kod" -> w Prologu jest jedna //baza wiedzy//, zawierająca fakty i reguły, którą można dynamicznie modyfikować. | |
| |
====== 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// | |