1. Większość – relacja przechodnia i przepełnienie stosu

To zadanie obejmuje wiedzę z zakresu tworzenia prostych faktów, uruchamiania programu, zadawania zapytań. Poruszyliśmy w nim też kwestie reguł – przedstawimy tutaj relacja przechodnią. W matematyce jeżeli para (x,y) jest w relacji R oraz para (y,z) jest w relacji R to dla pary (x,z) też zachodzi relacja R.

W języku programowa Prolog obiekt opisuje się w sposób „jaki on jest”, a nie „z czego się składa”. Dodatkowo umieszcza się go w relacji z innym obiektem.

Regułę dzieli się na prawą i lewą stronę – po lewej znajduję się zbiór warunków, które muszą zostać spełnione, by prawej stronie można było przypisać logiczną prawdę.

Do przedstawienia zagadnienia wykorzystaliśmy różnicę w wielkości domowych zwierząt, takich jak chomik, świnka morska, kot i pies.

Na początku napiszemy krótki program zawierający same fakty.

Aby nauczyć się tworzyć fakty skorzystamy z gotowego wzoru:

nazwa_relacji(obiekt1,obiekt2) – w naszym przypadku nazwa_relacji to większy, obiekt1 to zwierze większe, a obiekt2 to zwierze mniejsze, czyli obiekt1 jest nazwa_relacji od obiekt2.

wiekszy(pies, kot). – pies jest większy od kota.

większy(kot, swinka). – kot jest większy od świnki morskiej.

wiekszy(swinka, chomik). – świnka jest większa od chomika.

POBIERZ PROGRAM

W tym momencie opisaliśmy obiekty w postaci zwierząt i stworzyliśmy między nimi relację większości.

Zapisujemy nasz program i zadajemy pytania.

Na początek zadamy proste zapytania elementarne. Zapytania elementarne tworzymy w sposób analogiczny do tworzenia faktów:

nazwa_relacji(ten_obiekt,od_tego_obiektu) – czy ten_obiekt jest nazwa_relacji od_tego_obiektu.

Przykład zapytania 1.

Spróbuj zadać zapytanie:

a) czy świnka jest w większa od chomika;

wiekszy(swinka,chomik). – czy świnka morska jest większa od chomika.

b)czy pies jest większy od kota;

wiekszy(pies,kot). – czy pies jest większy od chomika.

Przykład zapytania 2.

Teraz sprawdzimy:

a) czy pies jest większy od świnki morskiej;

wiekszy(pies,swinka). – czy pies jest większy od świnki

b) czy kot jest większy od chomika;

wiekszy(kot,chomik). – czy kot jest większy od chomika

Prolog zaprzecza w obu przypadkach, a dobrze wiadomo, że pies jest większy od świnki, a kot od chomika. Aby program w prologu mógł sam wywnioskować, że pies jest większy od świnki morskiej, musimy utworzyć reguły. Bez reguł, na podstawie samych znanych faktów, które opisaliśmy, prolog zaprzeczy, co widać na powyższych przykładach.

Pies jest większy od świnki morskiej jeżeli pies jest większy od kota i kot jest większy od świnki morskiej.

Nazwy zwierząt zastąpimy zmiennymi X,Y, Z.

wiekszy(X,Y):-wiekszy(X,Z), wiekszy(Z,Y).

:- oznacza jeżeli – jeżeli zachodzi prawa strona to zachodzi lewa strona.

, oznacza operator logiczny AND.

Dopisaną regułę zapisujemy w naszym programie i uruchamiamy go ponownie.

POBIERZ PROGRAM

Zadajemy te same pytania i w tym momencie nasz program działa prawidłowo.

Od naszego programu możemy dowiedzieć się więcej – które zwierze jest większe od psa, kota? Przy konstruowaniu takiego pytania musimy podstawić zmienną w miejsce obiekt2, aby program w trakcie wnioskowania z naszej reguły mógł zmiennej przypisać odpowiednie zwierzęta.

Przykład zapytania 3.

Spróbujmy dowiedzieć się:

a) od jakich zwierząt większy jest pies;

wiekszy(pies,X). – od jakich zwierząt jest większy pies

b) od jakich zwierząt większy jest kot;

wiekszy(kot,X). – od jakich zwierząt jest większy kot

W tym przypadku po zadaniu pytania i naciśnięciu ENTER należy użyć średnika „;”, który odpowiada logicznemu OR (lub) – dzięki temu wyświetlimy wszystkie możliwości. Gdybyśmy nacisnęli po pierwszym wyświetlonym zwierzęciu ENTER, wtedy program zakończyłby poszukiwania kolejnych możliwości.

Przykład zapytania 4.

Tym razem spytamy o to, od jakich zwierząt większy jest chomik.

wiekszy(chomik,X).

Pamiętamy, że nasze fakty nie zawierają informacji o jakimkolwiek zwierzęciu, które by odpowiadało na to zapytanie. Przewidujemy, że program poinformuje nas o braku wiedzy na temat zwierzęcia większego od chomika.

Wyświetla nam się ERROR: Out of local stack, czyli błąd przepełnienia stosu.

Przykład zapytania 5.

Nie dostając przewidywanej odpowiedzi, spróbujemy dowiedzieć się tym razem jakie zwierzęta są większe od chomika, czyli zmienną podstawiamy pod obiekt1.

wiekszy(X,chomik).

Tym razem również nie dostajemy poprawnej odpowiedzi – dobrze wiemy, że zgodnie ze skonstruowanymi przez nas faktami w odpowiedziach powinien się znaleźć jeszcze kot. I po raz kolejny pojawia się informacja o przepełnieniu stosu.

Przykład zapytania 6.

Spróbujemy zadać jeszcze jeden rodzaj zapytania – wyświetlającą wszystkie pary zwierząt, które spełniają regułę większości. Aby móc to zrobić, musimy obiekt1 i obiekt2 zastąpić zmiennymi.

wiekszy(X,Y).

Niestety, i w tym przypadku, po przeanalizowaniu naszych faktów, można zauważyć, że Prolog pominął jedną parę – kot, chomik. I znów ERROR: Out of local stack – informacja o przepełnieniu stosu. Pojawia się wtedy, kiedy reguła wywołuje samą siebie i przerywa dalsze poszukiwania.

Aby nie dopuścić do takiej sytuacji, należy zmodyfikować wcześniej stworzoną regułę, pozwoli to uniknąć momentu przerwania poszukiwań, przez co poszukiwania będą bardziej trafne i program nie pominie żadnych informacji.

Należy zapamiętać ten sposób tworzenia reguł – by głowa reguły miała inną nazwę niż predykat łącząca fakty, dzięki temu unikniemy sytuacji, w której reguła będzie wywoływać samą siebie i przepełniać stos.

POBIERZ PROGRAM

Jak widać, przestał pojawiać się ERROR:Out of local stack. Nasze zapytanie kończy false.

Tym razem program nie wyświetla błędu o przepełnieniu stosu, informuje nas o tym, że nie posiada faktów, które dadzą mu odpowiedź na nasze zapytanie, poprzez wyświetlenie false.

Pytając o wszystkie pary zwierząt, które łączy reguła większości otrzymujemy prawidłową liczbę par, które spełniają regułę.

Komentowanie jest wyłączone.