Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_2 [2007/11/29 14:04] wojnicki syntah high |
— (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: Ś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 prograu 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. | |
| |
Proszę oglądnąć zastosowanie asser/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ę. | |
| |
Uwaga: w programie konstrukcja: | |
| |
:- cos. | |
| |
pozwala na podanie celu, np.: | |
| |
:- dynamic(capital_of/2). | |
:- go. | |
:- start. | |
| |
Prolog przystąpi do zrealizowania celu po załadowaniu kodu. | |
| |
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 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. | |
| |
| |