systemy ekspertowe, regułowe bazy wiedzy, struktura bazy wiedzy, wnioskowanie. Agnieszka NOWAK Roman SIMIŃSKI * ** WYBRANE ZAGADNIENIA IMPLEMENTACJI WIELOPLATFORMOWEGO MODUŁU WNIOSKOWANIA WSTECZ INFER V 2.0 DLA SYSTEMU Z REGUŁOWĄ REPREZENTACJĄ WIEDZY – SCHEMAT BAZY WIEDZY I BUDOWA STRUKTUR DANYCH Treść niniejszego opracowania obejmuje zagadnienie projektu regułowej bazy wiedzy dla systemu Infer v2.0 – wieloplatformowego modułu wnioskowania wstecz.[5] Obok przedstawienia struktury i formatu bazy wiedzy omawianego systemu praca prezentuje równieŜ schemat najwaŜniejszych struktur danych niezbędnych do stworzenia tego systemu. 1. WSTĘP Celem niniejszej pracy jest prezentacja wybranych aspektów praktycznej realizacji wieloplatformowego modułu wnioskowania wstecz [4][5]. Moduł ten – zwany Infer v 2.0 –wykorzystuje regułową reprezentację wiedzy. Reguły przyjmują postać klauzul Horna, natomiast do zapisu literałów wykorzystuje się dwójki atrybut-wartość. Podstawowym celem realizowanych prac było opracowanie takiej wersji modułu, która moŜe działać niezaleŜnie od platformy sprzętowo-systemowej, z uwzględnieniem moŜliwości osadzenia aplikacji w środowisku WWW. Moduł ten stanowi kontynuację modułu Infer v 1.0 zaimplementowanego w języku C++[3]. Do realizacji wersji drugiej wybrano język Java umoŜliwiający osiągnięcie zakładanych celów projektowych. W trakcie tworzenia modułu rozwiązywano szereg praktycznych * Uniwersytet Śląski, Instytut Informatyki, 41-200 Sosnowiec, ul. Będzińska 39, [email protected] Uniwersytet Śląski, Instytut Informatyki, 41-200 Sosnowiec, ul. Będzińska 39, [email protected] ** problemów implementacyjnych, w tej pracy zaprezentowano pewien wybrany aspekt dotyczący zagadnień wyboru dogodnych struktur danych opisywanego modułu. 2. STRUKTURA I FORMAT BAZY WIEDZY W systemie Infer v2.0 baza wiedzy jest plikiem tekstowym (*.txt). Dla potrzeb programu przyjęto pewne załoŜenia co do sposobu zapisu danych w bazie wiedzy, a mianowicie: • baza wiedzy podzielona jest na 2 bloki: blok atrybutów i wartości oraz blok reguł, • blok atrybutów i wartości jest zawarty między dwoma etykietami: AttrDefBegin a AttrDefEnd, • blok reguł jest zawarty między dwoma etykietami: RuleDefBegin a RuleDefEnd, • kaŜda pojedyncza reguła ma postać: • konkluzja if przesłanka_1;przesłanka_2;przesłanka_3..., • kaŜdy pojedynczy element takiej reguły (tj. konkluzja lub przesłanka) ma postać dwójki: <atrybut = wartość>, • na podstawie bazy wiedzy uzupełniane są dla potrzeb programu następujące struktury: lista atrybutów, lista wartości atrybutów, lista reguł oraz lista faktów. Elementami kaŜdej reguły są: konkluzja, licznik warunków danej reguły oraz lista tych warunków. Lista faktów powstaje w trakcie wnioskowania i zawiera dwójki <atrybut = wartość> udowodnione, na podstawie reguł, odpowiedzi uŜytkownika. Rysunek nr 1 przedstawia schemat bazy wiedzy i schemat jej przetwarzania.[3][4] Rys. 1 . Schemat bazy wiedzy Fig. 1. The structure of knowledge base 3. BAZA WIEDZY W MODULE INFER v 2.0 UŜytkownik po uruchomieniu modułu i wyborze jednej z proponowanych baz wiedzy ma moŜliwość przeglądu jej struktury w wielu postaciach: (i)podgląd całego pliku z bazą wiedzy, (ii)podgląd samych reguł, (iii)podgląd samych atrybutów i ich wartości, (iv)podgląd bazy wiedzy przedstawionej w postaci drzewa, gdzie wybierając dany atrybut w dodatkowym okienku dialogowym wyświetlane są informacje o liczbie jego wartości i o tym, czy atrybut ten jest konkluzją jakieś reguły i jeśli tak to ilu reguł. Z kolei wybierając wartość któregoś z atrybutów uzyskujemy informacje o tym, jakiego atrybutu ta wartość dotyczy i czy jest konkluzją jakiejś reguły i jeŜeli tak to ilu. Drzewo stworzone zostało takŜe dla reguł, gdzie dokładnie widać poziom zagnieŜdŜenia reguł w bazie wiedzy.[4] 4. STRUKTURY DANYCH WaŜnym etapem w czasie implementacji modułu Infer v2.0 było odpowiednie zaprojektowanie struktur danych, które wypełnione byłyby danymi z wiedzą zapisaną w pliku bazy wiedzy. Okazuje się bowiem, Ŝe do stworzenia efektywnego modułu wnioskowania niezbędne jest stworzenie wielu struktur danych: tablic, list, zmiennych globalnych. NaleŜy tak przetworzyć plik tekstowy, aby wypełnione zostały: lista atrybutów, wartości atrybutów oraz lista reguł, a w trakcie pracy modułu wypełniane będą pozostałe struktury: lista faktów, lista historii wnioskowania oraz pozostałe niezbędne dane. Wybrany język implementacji – Java – udostępnia potrzebne elementy i środki realizacyjne. Zawiera bibliotekę klas kontenerowych wspomagających bardziej wyszukane sposoby przechowywania obiektów. Jednym z podstawowych typów wspomnianej biblioteki klas kontenerowych jest klasa List. W omawianym module została wykorzystana klasa pochodna – LinkedList -- zapewniająca optymalny dostęp sekwencyjny wraz z efektywnym usuwaniem i wstawianiem w środek listy. Dzięki metodom addFirst(), addLast(), getFirst(), getLast(), removeFirst() oraz removeLast(), moŜna jej uŜyć jako stosu, kolejki lub kolejki dwukierunkowej. Rysunek nr 2 prezentuje zastosowane w module Infer struktury danych bazujące właśnie na klasie kontenerowej LinkedList. [1][2] 5. REALIZACJA PODSTAWOWYCH FUNKCJI W MODULE INFER v 2.0 Moduł Infer v 2.0 realizuje wiele funkcji – operacji na bazie wiedzy, zarówno przed procesem wnioskowania, w trakcie dowodzenia poprawności celu wnioskowania jak i po przeprowadzonym wnioskowaniu. Przed rozpoczęciem wnioskowania, operacje te dotyczą odczytu wiedzy z pliku tekstowego i wypełnienia odpowiednich struktur danych. SłuŜy do tego funkcja ReadFromFile(nazwa_pliku). Rys. 2 . Reprezentacja struktur danych w systemie Fig. 2. Representation of the system data structures PoniŜszy fragment tekstu ReadFromFile(nazwa_pliku). zawiera poglądowy pseudokod while ((b1=in.readLine()) != null) { if (b1.indexOf(k_a)<0) // k_a <> [ATTR_DEF_END] { if (b1.indexOf("-") < 0) //atrybut { .... attrTable.add(atrybut); .... } else if (b1.indexOf("-") > -1)//wartosc { .... valTable.add(wartosc); .... } } funkcja else // k_a = [ATTR_DEF_END] { while (((b1=in.readLine())!= null)&&(b1.indexOf(k_r)<0 )) { //ZAPIS KAZDEJ LINII - REGUŁY DO TABLICY ATOMY[W] ... String atomy[] = b1.split("=| if |;"); ... // ZAPIS KAZDEJ REGUŁY DO LISTY REGUŁ – korzystając z funkcji add() kontenera LinkedList() rules.add(reguła); } Korzystając z metody split() – biblioteki wyraŜeń regularnych RegExp uzyskujemy tablicę rozdzielonych elementów wczytanych z kaŜdej linijki z pliku. Parametry wskazane w metodzie split() za pomocą separatorów „|” słuŜą do rozdzielenia analizowanego tekstu na elementy zamieszczone pomiędzy tymi właśnie elementami [=,if, ;]. PoniŜszy schemat nr 3 przedstawia sposób konwersji pliku tekstowego na reguły pamiętane w listach kontenerowych. Rys. 3 . Sposób konwersji pliku tekstowego Fig. 3. The method of knowledge base file conversion Teraz proste jest zapisanie tak podzielonych elementów reguły do listy reguł w strukturze kontenerowej. Do zapamiętania wszystkich ustawień wnioskowania dotyczących wybranego trybu pracy systemu, wybranej strategii doboru reguł oraz decyzji w kwestii realizacji nawrotów czy opcji zakładających moŜliwość pamiętania w systemie tylko jednej wartości danego atrybutu – słuŜą róŜnego typu zmienne globalne, których wartością steruje uŜytkownik systemu za pośrednictwem odpowiednich elementów interfejsu.. WaŜną cechą modułu Infer v 2.0 jest funkcja PlanWnioskowania(), która sprawdza czy wskazana hipoteza główna jest faktem w bazie wiedzy lub konkluzją którejś z reguł, i jeśli tak to w zaleŜności od wybranej strategii doboru reguł pokazuje nawet kolejność odpalania reguł przez maszynę wnioskującą. Dzieje się to jeszcze przed rozpoczęciem procesu dowodzenia poprawności celu działając na tych samych zasadach co maszyna wnioskującą i interpreter reguł. W module Infer v2.0 zaimplementowo wiele funkcji operujących na pliku z bazą wiedzy, wśród których najwaŜniejsze to: 1. runInference(atrybut, wartość) – funkcja przeprowadza proces dowodzenia poprawności celu wnioskowania hipotezy podanej jako parametry funkcji. 2. facts.get(f) – metoda klasy kontenerowej LinkedList(), którą jest m.in. lista faktów. Metoda get() pobiera kolejny element listy. 3. MatchToGoal(f) – funkcja próbująca dopasować analizowany fakt do celu wnioskowania. Zwraca wartość true w sytuacji gdy porównywane wartości są identyczne. W przeciwnym przypadku zwraca wartość false. 4. SearchConclusionOfRules(r) – funkcja sprawdza czy konkluzja analizowanej reguły daje się zunifikować z celem wnioskowania. Zwraca wartość true w przypadku sukcesu, false w przypadku poraŜki. 5. FireingRule(r) – funkcja odpala daną regułę, czyli dla kaŜdego z jej warunków uruchamiany jest proces wnioskowania. Funkcja zwraca wartość true gdy dowodzenie poprawności dla kaŜdej przesłanki zakończyło się sukcesem. Wartość false zwracana jest jako rezultat funkcji wówczas, gdy co najmniej jedna przesłanka nie będzie prawdziwa. 6. AskForAttrValue(atrybut, wartość) – funkcja pyta uŜytkownika o wartość analizowanego atrybutu, będącego warunkiem uaktywnionej reguły. Odpowiedź uŜytkownika dodawana jest jako nowy fakt do listy faktów. 7. showWhyExplanations() – funkcja objaśnia uŜytkownikowi powód zapytania go o wartość danego atrybutu i jak podana przez niego odpowiedź wpłynie na drogę rozumowania prowadzonego przez maszynę wnioskującą. 8. showInferenceResults() – funkcja ma na celu przedstawić dokładną drogę wnioskowania prowadzoną przez maszynę wnioskującą. Po wybraniu celu wnioskowania uruchamiany jest proces dowodzenia jego poprawności metodą wnioskowania wstecz. Realizuje to rekurencyjna funkcja RunInference(atrybut, wartość), której fragment przedstawiony został na poniŜszym schemacie. runInference(atrybut, wartość) { // najpierw przeszukiwana jest lista faktów for (int f=0 ; f < facts.size(); f++) { facts.get(f); boolean fact = MatchToGoal(f); if (fact == true) f = facts.size()-1; } if (fact == false) // celu nie ma w faktach { // przeszukiwane są konkluzje reguł for ( int r=0 ; r < rules.size(); r++) { boolean rules = SearchConclusionOfRules(r); if (rules == true) { boolean fire_result = FireingRule(r); } } if ((fact == false) && (rules==false)) { boolean ask = AskForAttrValue(atrybut, wartość); } if ((fact==true)||(fire_result==true)||(ask==true)) { return true; } else { return false; } } boolean MatchToGoal(int f) { if ((fakt.attr == a)&&(fakt.valNo == w)) { return true; } } boolean FireingRule(int r) { boolean iloczyn = 1; for (int w = 0 ; w <= liczba_war ; w++) { ... iloczyn = iloczyn * runInference(war_atr, war_val); ... } if (iloczyn == 1) return true; else return false; } Rezultat funkcji jest pewną maską logiczną pozwalającą na poprawne wyjście z rekurencji. Funkcja RunInference() zwraca wartość całkowitą, czyli gdy rezultat = 1 to znaczy ze wszystkie przesłanki były prawdziwe a jeŜeli 0 tzn., Ŝe co najmniej jedna przesłanka nie została potwierdzona. [3][4][5] 6. PODSUMOWANIE Praca prezentuje schemat wykorzystania klas kontenerowych Javy do organizacji struktur danych przeznaczonych do przechowywania zawartości bazy wiedzy. Przedstawiona została struktura wewnętrzna modułu, schemat organizacji struktur danych oraz szkic metody ich przetwarzania. W rozwaŜaniach uwzględniono m.in. te właściwości Javy (oraz jej bibliotek), które pozwalają unikać wielu niedogodności typowych dla języka C/ C++, który był językiem implementacji poprzedniej wersji modułu Infer. LITERATURA [1] BOONE B., Java TM dla programistów C I C++., Warszawa, WNT, 1998 [2] ECKELL B., Thinking in Java, Helion, Gliwice, 2000 [3] NOWAK A., Realizacja modułu wnioskowania wstecz dla regułowej reprezentacji wiedzy, Praca licencjacka, Uniwersytet Śląski, Sosnowiec, 2000 [4] NOWAK A., Wieloplatoformowy moduł wnioskowania dla inteligentnych aplikacji internetowych, Praca magisterska, Uniwersytet Śląski, Sosnowiec, 2002 [5] http://www.inference.engine.prv.pl/ IMPLEMENTED OF THE MULTIPLATFORMED INFERENCE ENGINE MODULE INFER v 2.0 – STRUCTURE OF THE KNOWLEDGE BASE AND MODEL OF DATA STRUCTURE This paper describes the project of the knowledge rule base of system Infer v 2.0 – multiplatformed inference engine module. It is also contains structure of the knowledge base and describes the main data structures used in this system. The second part presents how to use container classes in Java language which were used in this module to keep the knowledge base data.