wybrane zagadnienia implementacji

advertisement
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.
Download