To jest stara wersja strony!


LAB: Pisanie programów w Prologu

1. Interakcja z programem

Temat: Wypisywanie na wyjściu

Predykat write/1 wypisuje term na wyjście; nl/0 przechodzi do nowej linii.

Ćwiczenie: Wypisywanie na wyjściu

Przetestować działanie:

write('Ala ma '),write('kota'),nl,write('w ciapki!').

Temat: Programy interaktywne

Predykat read/1 pozwala na pobieranie danych od użytkownika.

Ćwiczenie: Programy interaktywne

Proszę oglądnąć zastosowanie read/1 na przykładzie programu interac.pl

Po załadowaniu proszę wpisać:

?- go.

2. Wymuszanie nawrotów

Temat: Predykat fail

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.

Ćwiczenie: Predykat 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.

3. Dynamiczna bazy wiedzy

Temat: Modyfikacja 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.

Ćwiczenie: 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.

Temat: Modyfikacja reguł

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

4. Uruchamianie i debuggowanie programów

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.

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

5. Arytmetyka w Prologu

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.

Ćwiczenie: Obliczenia arytmetyczne 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.

6. Rekurencja w Prologu

Temat: Rekurencyjne liczenie silni

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.

Ćwiczenie: Rekurencyjne liczenie silni

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

7 Wybrane problemy rozwiązane w Prologu

Temat: Wieże Hanoi

Ćwiczenie: Wieże Hanoi

Pobrać program hanoi.pl Przetestować i przemyśleć.

Przykład:

?- move(3,left,right,center).
Move top disk from left to right
Move top disk from left to center
Move top disk from right to center
Move top disk from left to right
Move top disk from center to left
Move top disk from center to right
Move top disk from left to right

Temat: Kolorowanie Mapy

Problem: mamy mapę taką jak poniżej

                 |Bialorus
                 |------------
     Polska      |
  ---------------|
       |         | Ukraina
 Czechy| Slowacja|-----------
-----------------

Należy ja pokolorować 3 kolorami, tak aby żadne sąsiadujące państwa nie miały takiego samego koloru: Four_color_theorem

Ćwiczenie: Kolorowanie Mapy

Definiujemy 3 kolory:

kolor(czerwony).
kolor(zielony).
kolor(niebieski).

Należy zdefiniować predykat koloruj/5, tak aby zadając pytanie:

?- koloruj(Polska,Bialorus,Ukraina,Slowacja,Czechy).

dostać wszystkie możliwości pokolorowania tej konkretnej mapy.

Uwaga: predykat koloruj/5 definiuje zależności geograficzne.

Uwaga: w Prologu operator \= to nieidentyczność, czy też niemożliwość uzgodnienia termów.

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/programy.1235339420.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