assert

Transkrypt

assert
PROLOG – INNE PRZYKŁADY
MACIEJ KELM
PREDYKAT RANDOM
Funkcja random zwraca losową liczbę całkowitą w przedziale od 1 do
X. Gdzie X jest parametrem funkcji random. Przed użyciem random
należy zainicjować tak zwany zalążek(seed). Jest on
wykorzystywany do tworzenia liczb pesudolosowych przez generator.
Przykład:
set_random(seed(1)).
A is random(100).
Wynik:
A = 45.
%ustawienie zalążka
%wygenerowanie liczby
PREDYKAT ASSERT
Komenda assert pozwala dodawać nowe wpisy do bazy wiedzy.
Przykład:
podpinamy się pod pustą bazę wiedzy
assert(zadowolony(Jan)).
assert(zadowolony(Wojtek)).
assert(zadowolony(Zosia)).
assert(zadowolony(Arek)).
assert(zadowolony(Jan)).
zadowolony(X).
Udało nam się dodać fakty do bazy wiedzy ale komenda assert pozwala
dodawać także nowe zasady.
PREDYKAT ASSERT
Udało nam się dodać fakty do bazy wiedzy ale komenda assert pozwala
dodawać także nowe zasady.
Przykład:
Załóżmy że chcemy dodać następującą zasadę:
„Każdy kto jest zadowolony jest naiwny”
Kod wyglądałby następująco:
assert( (naiwny(X):- zadowolony(X)) ).
PREDYKATY ASSERTA ORAZ ASSERTZ
Większe możliwości manipulacji na bazie wiedzy dają komendy asserta
oraz assertz które kolejno dodają elementy na początku i na końcu
bazy.
Przykład:
assert(temp(b)).
asserta(temp(a)).
assertz(temp(c)).
temp(X).
Wynik:
temp(X).
X=a;
X=b;
X = c.
PREDYKAT RETRACT
Funkcja retract pozwala na usuwanie wpisów z bazy wiedzy
Przykład:
retract(zadowolony(Jan)).
zadowolony(X).
Warto zauważyć że tylko pierwszy wpis w bazie został usunięty. Wynika
to z działania samego Prologa który przeszukuje bazę od góry do
znalezienia pierwszego wstąpienia faktu.
Do usunięcia wszystkich faktów możemy posłużyć się zmienną
Przykład:
retract(zadowolony(X)).
MANIPULACJE NA BAZIE WIEDZY
Manipulacje na bazie wiedzy są bardzo użyteczną techniką zwłaszcza
gdy chcemy przechowywać wyniki obliczeń. Pozwala to na
późniejsze ich użycie bez potrzeby wykonywania ponownie obliczeń.
Przykład: (plik: db_1.pl)
dynamic wyniki/3.
kwadratSumy(X,Y,Res):wyniki (X,Y,Res), !.
kwadratSumy(X,Y,Res):Res is (X+Y)*(X+Y),
assert(wyniki(X,Y,Res)).
MANIPULACJE NA BAZIE WIEDZY
Wyżej opisany program zwraca kwadrat sumy X oraz Y. Najważniejszą
rzeczą jest jednak to w jaki sposób tego dokonuje.
Na początek deklarujemy wyniki/3 jako dynamiczny predykat.
Musimy tego dokonać ponieważ definicja wyniki/3 zostanie
zmieniona w trakcie trwania programu.
Pierwsza klauzula sprawdza bazę danych w poszukiwaniu wyników.
Jeżeli je odnajdzie program kończy działanie.
Druga klauzula wykonuje potrzebne operacje matematyczne oraz
zapisuje wynik do bazy.
MANIPULACJE NA BAZIE WIEDZY
Przykład:
kwadratSumy(1, 2, X).
kwadratSumy(1, 3, X) .
wyniki(X, Y, Z).
Wynik:
X = 1,
Y = 2,
Z=9;
X = 1,
Y = 3,
Z = 16.
PREDYKAT GENSYM
Podczas pracy z Prologiem spotkamy się z problemem w którym, w
czasie trwania programu będziemy musieli wygenerować nowe
obiekty. Podczas generowania obiektu musimy się upewnić że nowy
atom nie koliduje z już istniejącymi.
Przykład:
Jeżeli operujemy na studentach oznaczenia atomów byłyby
następujące:
pierwszy student : student1
drugi student : student2
i tak dalej…
PREDYKAT GENSYM
Pomocny w takim przypadku może okazać się predykat gensym
gensym(student, X).
X = student1
gensym(student, X).
X = student2
i tak dalej…
Przy każdym następnym wywołaniu utworzony zostanie atom który
nie będzie kolidował z już istniejącymi.
PREDYKAT FINDALL
Predykat findall pozwala znaleźć wszystkie wyniki bez potrzeby
ciągłego wciskania klawisza „;”.
Przykład:
Załóżmy że chcemy znaleźć liczby parzyste z danego przedziału
Potrzebujemy do tego predykatów mod – dzielenie modulo oraz
numlist – zwraca liste kolejnych elementów z przedziału. Działają
one w następujący sposób:
?- A is mod(5,2).
A = 1.
?- A is mod(4,2).
A = 0.
?- numlist(1,8,X).
X = [1, 2, 3, 4, 5, 6, 7, 8].
PREDYKAT FINDALL
Predykat findall realizujący problem wyglądałby następująco:
findall(X, (numlist(1,8,NL),member(X,NL),0 =:= mod(X,2)) ,L).
Pierwszy argument X oznacza zmienna którą chcemy zapisywać w
trzecim argumencie L.
Powyższą definicję findall można przeczytać:
„Znajdź wszystkie X spełniające warunek(drugi argument) i zapisze
je do listy L”
Wynik:
?- findall(X, (numlist(1,8,NL),member(X,NL),0 =:= mod(X,2)) ,L).
L = [2, 4, 6, 8].
ZADANIA

Znajdź wszystkie liczby nieparzyste z przedziału 1 - 10 za pomocą
predykatu findall
Napisz program który wygeneruje za pomocą predykatu gensym
atom uczen, wygeneruje za pomocą predykatu random ocenę w skali
1-5 i zapisze fakt ocena(X,Y) do bazy wiedzy. Gdzie X oznacza atom
ucznia, Y atom oceny. Wyświetl wynik.


Za pomocą skryptu z poprzedniego zadania wygeneruj 5 ocen. Za
pomocą metody retract usuń drugi i trzeci fakt ocena(X, Y)

Za pomocą skryptu z poprzedniego zadania drugiego wygeneruj 5
ocen. Usuń wszystkie wpisy w bazie wiedzy.