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: 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:

?- [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. 8-)

Grzegorz J. Nalepa 2008/02/20 14:34

pl/prolog/prolog_lab/prolog_lab_2.1206121101.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
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