• Nie Znaleziono Wyników

Na początku był Prolog

2.1 Elementy Prologu

2.1.6 Poszukiwania w drzewach, których nie ma

Dla dalszych rozważań pożyteczne będą pojęcia całkowitego stanu, przestrzeni stanu, dopuszczalnego stanu i częściowego stanu:

• Całkowity stan, w dalszym ciągu po prostu nazywany stanem, to dowolne uziemienie wszystkich zmiennych decyzyjnych.

• Przestrzeń stanu oznacza wszystkie możliwe uziemienia wszystkich zmien-nych decyzyjzmien-nych.

• Dopuszczalny stan to taki stan, który spełnia wszystkie ograniczenia pro-blemu.

• Częściowy stan to dowolne uziemienie części zmiennych decyzyjnych.

Wymienione pojęcia nie są zbyt popularne w środowiskach badaczy i twórców Prologu i CLP. Autor książki, ze względu na swe wykształcenie i długoletnią pracę w obszarze teorii i techniki sterowania, odczuwał od dawna brak owych pojęć w Prologu i CLP. Pisanie tej książki jest wspaniałą okazją by ten brak

uzupełnić.

Celem programu prologowego lub clp-owego jest spełnienie pewnego zapy-tania, tzn. uczynienie tego zapytania (którym jest zawsze wniosek jakiejś re-guły) prawdą na drodze wszystkich możliwych uziemień wszystkich zmiennych, od których zapytanie zależy. Dokonuje tego system wnioskujący będący częścią kompilator Prologu lub CLP. Istota jego działania polega na poszukiwaniu w przestrzeni stanu takiego stanu dopuszczalnego, który uczyni zapytanie prawdą.

W szczególności system wnioskujący działa na zasadzie:

• dynamicznego konstruowania drzewa poszukiwań odpowiadającego pro-gramowi prologowemu (lub clp-owemu), z równoczesnym przeszukiwaniem tego drzewa za pomocą algorytmu poszukiwań w głąb (zwanego również al-gorytmem poszukiwań w głąb z nawrotami lub czasem krótko alal-gorytmem nawrotów). Istotą poszukiwań jest uziemianie zmiennych na wartościach z ich dziedzin;

• propagacji ograniczeń, której istotą jest uwzględnienie wpływu dokonane-go uziemienia zmiennej na predykaty problemu. Jeżeli ostatnie uziemie-nie doprowadza do porażki jakiegokolwiek predykatu, następuje nawrót, polegający na tym, że odpowiednia zmienna odpowiedzialne za porażkę zostaje odziemiona (staje się ponownie zmienną wolną), a poszukiwania są kontynuowane powyżej tego punktu w drzewie poszukiwań, w którym dokonano uprzedniego uziemienia. Poszukiwania te mogą doprowadzić do ponownego uziemienia (reuziemienia) zmiennej. Jeżeli ostatnie uziemie-nie uziemie-nie skutkuje porażką, kontynuuje się poszukiwania uziemiając kolejną zmienną.

Ilustruje to następujący prosty program (2_1_poszukiwania.pl) w języku Pro-log:

/*1*/ a(X,Y)

:-/*2*/ b(X),

/*3*/ c(X,Y).

/*4*/ b(1).

/*5*/ b(&).

/*6*/ c(&,"A").

Program ten zawiera jedną regułę (linie 1, 2 i 3) oraz trzy fakty (linie 4, 5 i 6). Dziedziny zmiennych X i Y zostały w tym programie (jak we wszystkich programach prologowych) zadeklarowane implicite, w liniach 4, 5 i 6: dziedziną zmiennej X jest (1,&), dziedziną zmiennej Y jest "A". Zapytaniem niech będzie a(X,Y). A więc celem programu jest znalezienie takich wartości zmiennych X i Y, by a(X,Y) było prawdą. Reguła (linie 1, 2 i 3) stwierdza, że a(X,Y) będzie prawdą, jeżeli znajdzie się takie X, dla którego b(X) będzie prawdą, i takie Y któ-re łącznie z uziemioną już zmienną X sprawi, że c(X,Y) będzie prawdą. Zgodnie z liniami 2 i 3 nastąpi to, gdy uziemi się zmienne X i Y tak, by b(X) i c(X,Y) było prawdą. Idąc z góry programu w dół kompilator szuka najpierw takiej war-tości X, dla której b(X) jest prawdą. W linii 4 stwierdza się, że warwar-tością tą jest X = 1, tzn. zmienna X zostaje uziemiona na wartości 1. Uziemienie to zostaje propagowane dla wartości X z linii 3. Przechodząc do linii 3 i uwzględniając propagację dla X, szuka się z kolei takiej wartości Y, by c(1,Y) było prawdą.

Niestety, odpowiedniego faktu brak w programie; a więc poprzednie uziemienie dokonane dla X jest porażką. Dlatego X zostaje odziemione, wykonuje się na-wrót do linii 2 i szuka innej wartości X takiej, by b(X) było prawdą. W linii 5 stwierdza się, że wartością tą jest X = &, tzn. zmienna X zostaje reuziemiona na wartości &. Przechodząc ponownie do linii 3 i pamiętając ostatnie uziemienie dla X, szuka się z kolei takiej wartości Y, by c(@,Y) było prawdą. Z linii 6 wynika, że wartością tą jest "A". Zmienna Y zostaje więc reuziemiona jako Y = "A", czyli a(X,Y) jest prawdą dla X = & i Y = "A", co kończy program.

Można uważać, że opisane poszukiwania odbywają się one zgodnie z drzewem pokazanym na rysunku 2.2.

Ze względów oczywistych można więc rozważane poszukiwania nazywać po-szukiwaniami w głąb owego drzewa. Stosowany zaś sposób generowania nawro-tów nazywa się standardowym. Stąd pełna nazwa rozważanych poszukiwań: po-szukiwania w głąb ze standardowymi nawrotami.

Drzewo z rysunku 2.2 nosi nazwę drzewa poszukiwań. Jest ono definiowa-ne przez wszystkie punkty przestrzeni stanu programu w języku Prolog (lub w CLP ). Stanowi graficzny obraz przebiegu poszukiwań. Punkt (1) drzewa po-szukiwań jest przykładem punktu wyboru, gdyż w nim dokonuje się wyboru kolejnych możliwych wartości zmiennej X i do tego punktu dokonywany jest nawrót w przypadku porażki. Z przedstawionego przykładu wynika, że drzewo poszukiwań jest tworzone dynamicznie, gałąź po gałęzi, w miarę wykonywania kolejnych kroków programu.

Można również zauważyć, że nie ma potrzeby (a praktycznie bardzo często -możliwości) przechowywania całego tworzonego drzewa poszukiwań w pamięci

Rysunek 2.2: Drzewo poszukiwań w głąb ze standardowymi nawrotami dla pro-stego programu prologowego

operacyjnej komputera: należy przechowywać tylko analizowaną gałąź oraz te punkty wyboru, które odpowiadają wartościom zmiennych jeszcze nie testowa-nych. Właściwość ta leży u podstaw zalet Prologu i CLP : drzewa poszukiwań dla realistycznych problemów mają iście kosmiczne rozmiary i ewentualna potrzeba ich zapisywania ”w całości” przed rozpoczęciem poszukiwań byłaby trudnością nie do pokonania. To właśnie mamy na myśli pisząc o drzewach poszukiwań, których nie ma.

Przykład ilustruje również pewną ogólną prawidłowość, zgodnie z którą:

• uziemienie zmiennej jest elementem poszukiwań w głąb drzewa poszuki-wań i następuje w sytuacji dotarcia do predykatu, zawierającego nieuzie-mione zmienne;

• odziemienie zmiennej jest wynikiem porażki poniesionej dla propagacji na-stępującej po uziemieniu: ponieważ dla wzmiankowanego uziemienia nie

jest możliwa żadna propagacja (tzn. nie może być spełnione żadne ograni-czenie), to zmienna zostaje odziemiona i następuje nawrót (w górę drzewa poszukiwań), do tego najbliższego punktu wyboru, dla którego istnieją jeszcze nie testowane wartości odziemionej zmiennej.

Podkreśla się, że w Prologu i CLP zmienna może zmienić swą wartość jedynie w wyniku nawrotu do punktu wyboru (lub poza punkt wyboru), w którym została jej przyporządkowana ta wartość.

Powiązane dokumenty