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: Dynamiczna baza wiedzy: reguły

assert/retract pozwala również dodawać/usuwać reguły:

:-dynamic(a/1), dynamic(b/2).
 
a(1). a(2).
 
addrule:- assert((b(X,Y):-a(X),a(Y))).
 
delrule:- retract((b(_,_):-_)).
 
start:-addrule, b(X,Y), write(X), write('  '), write(Y),nl,fail.
start.

W powyższym programie predykat addrule/0 dodaje (delrule/0 usuwa) dynamicznie regułę:

b(X,Y):-a(X),a(Y).

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: Wstęp do rekurencji

Typowym przykładem wykorzystania mechanizmu rekurencji jest obliczanie wartości funkcji silnia. Poniżej znajduje się kod realizujący tą funkcjonalność.

 factorial(0,1).
 factorial(Number,Result) :-
        Number > 0,
        NewNumber is  Number-1,
        factorial(NewNumber,NewResult),
        Result  is  Number*NewResult.

Ć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/1, 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/1 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

1. 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. Napisz program obliczający wynik równania kwadratowego (Quadratic Equation) ax^2 + bx + c = 0 w dziedzinie liczb rzeczywistych. Zaimplementuj predykaty:

  • 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.

Zwróć uwagę na niedeterminizm w predykacie kwadrat/4, który znajduje zero, jedno, albo dwa rozwiązania; mogą się przydać funkcje matematyczne.

2.7 Ćwiczenie: Wstęp do rekurencji

Wpisz, przetestuj i przemyśl działanie programu rekurencyjnie liczącego silnię.

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.1225879912.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