To jest stara wersja strony!
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 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: niekó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/1, np. dla predykatu kobieta/1 deklaracja w pliku fam.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ę.
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:
?- [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.
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ć:
?- [capitals].
?- spy(capital_of).
[debug] ?- guitracer.
[debug] ?- trace.
[trace] ?- capital_of(A,B), write(B), write(' to stolica '), write(A), nl, fail.
2.6 Ćwiczenie: Obliczenia i operatory porównania
Sprawdzić działanie:
?- X is 2 + 2.
?- Y is 2.5 + ( 4 / 2).
?- Z is 2 + 0.001.
Uwaga:
?- A is 3.
?- B is A + 4.
?- A is 3, B is A + 4.
Operacje arytmetyczne:
?- X is 2 + 2.
?- X is 2 * 3.
?- X is 4 / 2.
?- X is 4 / 3.
?- X is 4 // 3.
Uwaga na podstawianie:
?- X is 2 + 5.
?- X = 2 + 5.
?- 2 + 5 =:= 1 + 4.
?- 2 + 5 =:= 3 + 4.
?- 2 + 5 =:= 4 + 4.
Przećwiczyć użycie operatorów:
?- 2 < 3.
?- 2 > 3.
?- 3 > 3.
?- 3 >= 3.
?- 3 =< 3.
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.
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.
— Grzegorz J. Nalepa 2008/02/20 14:34