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.