Zadanie 2: Regułowa baza wiedzy
Transkrypt
Zadanie 2: Regułowa baza wiedzy
Informatyka, studia dzienne, inż. I st. semestr VI Sztuczna inteligencja i systemy ekspertowe 2010/2011 Prowadzący: mgr inż. Jacek Pintera piątek, 11:15 Data oddania: Ocena: Sebastian Drabiński Paweł Tarasiuk 150856 151021 Zadanie 2: Regułowa baza wiedzy∗ 1. Cel Celem ćwiczenia laboratoryjnego było stworzenie prostego systemu ekspertowego, który w oparciu o regułową bazę wiedzy rozwiązuje praktyczny problem, prowadząc przy tym interakcję z użytkownikiem. Zagadnieniem pośrednim było opanowanie składni narzędzia CLIPS, w której przygotowywane były listy faktów początkowych oraz reguły wnioskowania. Aby po prostu korzystać ze stworzonej bazy, jednocześnie czyniąc pracę nieco bardzo zaawansowaną, stworzyliśmy „od zera” w języku Python własne narzędzie emulujące składnię CLIPSa i dokonujące wnioskowań. Narzędzie jest ograniczone do potrzebnego nam podzbioru składni CLIPSa, ale nie jest to wcale podzbiór skrajnie ubogi (zawarte jest w nim na przykład definiowanie własnych funkcji). 2. Wprowadzenie Przygotowana baza wiedzy zawiera informacje o kilku wybranych, najpopularniejszych programach pełniących określone funkcje potrzebne użytkownikom komputerów domowych / laptopów działających pod kontrolą systemów klasy GNU/Linux. Problemem, który jest rozwiązywany przez system ekspertowy jest wybór zestawu potrzebnych programów w zależności od preferencji użytkownika. Użytkownik wskazuje, jakie rodzaje programów są mu ∗ SVN: clips@2180 https://serce.ics.p.lodz.pl/svn/labs/sise/jp_pt1115/SebPab/ 1 potrzebne, a następnie jest odpytywany o znaczenie jakie mają dla niego poszczególne cechy rozważanych programów. Brane pod uwagę są te cechy, które w jakiś sposób wyróżniają któryś z programów branych pod rozwagę. Istotą tego pomysłu jest to, że jedna cecha może być w różnym stopniu spełniana przez różne programy, w szczególności - programy z różnych kategorii. Najistotniejsza część wnioskowania, opisana przez kilkanaście reguł tworzących, następuje po uzyskaniu odpowiedzi na pytania. Wówczas brane są pod uwagę elementy rozumowania takie jak promocja programów korzystających z tych samych technologii i najlepsze dopasowanie programów do preferencji użytkownika wywnioskowanych z dialogu z nim. Stworzona baza wiedzy stanowi formalizację własnych doświadczeń (obaj autorzy korzystają na co dzień z systemów GNU/Linuksowych na komputerach domowych oraz laptopach), oraz recenzji i porównań z serwisów tematycznych. Istotne dla nas było uwzględnienie tych programów, które są popularne, rozwijają się już co najmniej od dwóch lat i są stosowane jako domyślne w pewnych dystrybucjach Linuksa. Aby wyeliminować subiektywizm z naszej bazy wiedzy, w przypadkach w których tylko to było możliwe, potwierdzaliśmy zawarte w bazie wiedzy cechy programów w oparciu o informacje ze stron głównych opisywanych projektów. Część własności programów zmienia się z wersji na wersję - staraliśmy się opisać wersje dostępne w chwili tworzenia bazy wiedzy w repozytoriach dystrybucji Arch Linux - ze względu na model tworzenia tej dystrybucji, są to wersje najnowsze bądź bardzo bliskie najnowszym. 3. Opis implementacji Stworzona przez nas baza wiedzy zapisana jest w składni języka CLIPS. Naszym celem było stworzenie zupełnie niezależnego narzędzia obsługującego tę składnię. Narzędzie zostało napisane w języku Python. Najistotniejszym elementem, który zmieniliśmy w stosunku do CLIPSa (bo nie zgadzamy się ze sposobem, na jaki został on zaimplementowany w oryginalnym CLIPSie) jest sposób przekazywania list jako argumentów do samodzielnie zdefiniowanych funkcji. W CLIPSie tylko jeden, ostatni argument własnej funkcji może być listą i elementy tej listy przekazywane są w dokładnie taki sam sposób, co argumenty będące poprzednikami listy. Tworząc własny interpretator języka reguł wnioskujących, uznaliśmy za stosowne obudowywanie przykazywanych list nawiasami - umożliwia to na przykład zdefiniowanie własnej funkcji przyjmującej pośród argumentów kilka list. Drugą i ostatnią różnicą między składnią naszego narzędzia a składnią CLIPSa jest zwracanie wartości przez zdefiniowane samodzielnie funkcje - tutaj także uznaliśmy za intuicyjne i zgodne z resztą składni języka wymaganie umieszczenia zwracanego wyrażenia w nawisach. Pomimo drobnych różnic w składni, nadal korzystamy z wygody jaką daje nam zgodność naszego narzędzia z CLIPSem. Różnice te wymagają zmian 2 w zaledwie trzech liniach naszego pliku z bazą wiedzy i regułami, który ma w sumie ponad 580 linii. Stworzone przez nas narzędzie także stanowi powłokę, która przyjmuje polecenia wpisywane przez użytkownika. Obsługujemy polecenie load tak samo jak oryginalny CLIPS - zatem przebieg uruchomienia systemu wnioskującego jest u nas taki sam jak w CLIPSie - load, reset, run. Dodaliśmy własne polecenie reexec, które pozwala uruchomić nasze narzędzie zupełnie od nowa - było to dla nas bardzo wygodne, gdy stopniowo tworzyliśmy kod naszego narzędzia - nasze polecenie od razu uruchamiało nową wersję skryptu w Pythonie. Wybór języka Python jest nieprzypadkowy - bardzo istotną dla nas cechą języka są dostępne w tym języku od ręki operacje na łańcuchach znaków, oraz listy pozwalające na przechowywanie elementów różnych typów (np. list obok łańcuchów znaków). Pozwala to w bardzo naturalny sposób dokonać przekształcenia napisu z kodem w składni CLIPSa do postaci w której łatwo jest przeglądać elementy poszczególnych nawiasów - robimy to za pomocą zaimplementowanego przez siebie automatu skończonego. Nasze narzędzie zajmuje mniej niż 1000 linii, co jest pewnym osiągnięciem. Należy jednak zauważyć, że nie implementujemy całej składni CLIPSa, ani nawet nie próbujemy tego robić - po prostu obsługujemy część składni która pozwala nam uruchomić nasze rozwiązanie zagadki o kocie wabiącym się „Tuńczyk” oraz głównej bazy wiedzy. Często jednak rozszerzanie podzbioru obsługiwanej składni było dla nas łatwiejsze, niż upraszczanie zapisu CLIPSowych reguł. Obsługujemy kilkadziesiąt różnych poleceń, obejmujących proste wnioskowanie, elementy arytmetyki, obsługę szablonów wraz z multislotami, oraz definiowanie własnych funkcji. Sama baza wiedzy zawiera opisy zastosowań rozważanych programów, technologii i bibliotek w jakich są one wykonane, oraz nazwanych semantycznie cech jakie posiadają te programy, wraz ze stopniami w jaki cechy te są spełniane (jeżeli np. kryterium wiele-formatow-dokumentow jest szczególnie słabą cechą danego programu, notowana jest dla niego wartość ujemna stopnia spełniania tej cechy). Poza oceną, w jakim stopniu dany program spełnia kryteria wskazane przez użytkownika jako ważne, oceniane są związki między programami. Jeżeli jakaś technologia inna niż natywna (przez „technologię natywną” rozumiane jest tutaj to, że program w zdecydowanej większości oparty jest o skompilowane, binarne pliki uruchamialne oraz biblioteki - technologia nienatywną może być np. maszyna wirtualna / interpretator skryptów) jest używana przez więcej niż jeden program, punkty karne za korzystanie z niej maleją. Ponadto, jeżeli dwa programy korzystają z tych samych bibliotek (im więcej bibliotek się zgadza, tym lepiej), rośnie szansa że zostaną one wybrane razem, gdyż prawdopodobnie dobrze będą się ze sobą integrować 3 lub po prostu będą estetycznie wyglądać używane razem. Wydajność naszego narzędzia jest istotnie słabsza od wydajności oryginalnego CLIPSa. Wynika to częściowo z różnic zastosowanej technologii, ale przede wszystkim z lat pracy twórców CLIPSa poświęconych jego optymalizacji. Założeniem naszego projektu od początku nie było bicie rekordów czasu, a raczej po prostu prowadzenie prawidłowych wnioskowań w czasie na tyle krótkim, aby przeprowadzenie odpowiedniej liczby testów było możliwe. Wnioskowanie prowadzone za pomocą naszego narzędzia trwa na naszych komputerach do kilkudziesięciu sekund, w zależności od udzielanych odpowiedzi. Główny narzut wynika z tego, że wiele danych przechowujemy w pamięci po prostu jako napisy - dotyczy to także reguł i własnych funkcji, które są interpretowane ponownie przy każdej potrzebie. Zastosowanie specyficznych struktur danych oraz czegoś w rodzaju kodu pośredniego dla reguł i funkcji mogłoby znacznie zredukować czas działania naszego narzędzia. Innym polem do optymalizacji mogłoby być ulepszenie podejścia do wyszukiwania faktów - o ile brak jest ogólnych reguł pozwalających zoptymalizować wszystkie przypadki przeszukiwania faktów, to w części przypadków sortowanie faktów i wybór pasujących faktów według prefiksu (przy wykorzystaniu wyszukiwania binarnego) mógłby pomóc. 4. Materiały i metody Wielokrotnie uruchamialiśmy dialog z użytkownikiem służący wnioskowaniu, zarówno w oryginalnym CLIPSie jak i w naszym narzędziu. Testy przeprowadzane poprzez wpisywanie naszych prawdziwych preferencji, różnorodnych zmyślonych wartości, oraz preferencji naszych znajomych pozwoliły wyeliminować błędy w działaniu systemu, potwierdzić zgodność między naszym narzędziem a CLIPSem, oraz porównać otrzymane wyniki wnioskowań z naszą intuicją. Stan do jakiego doprowadziliśmy nasz projekt jest dla nas satysfakcjonujący we wszystkich tych kwestiach. 5. Wnioski Wnioskowanie w przód pozwala na przeprowadzanie nietrywialnych dla człowieka, dowolnie głębokich „rozumowań”, w stopniu na jaki pozwala zapisany zbiór reguł. Za pomocą odpowiednich warunków da się wymusić kolejność rozumowania (możliwe jest nawet naśladowanie postępowań imperatywnych), jednak sam zapis reguł wnioskujących jest bardzo intuicyjny. Dzięki temu błędy przy formułowaniu reguł wnioskujących są rzadsze niż na przykład przy programowaniu imperatywnym. O ile sformułowanie odpowiednich reguł wymaga przeprowadzenia w głowie pewnych symulacji, ogarnięcie dużej bazy wiedzy jest dla człowieka problematyczne (przeważnie wymaga po prostu poświęcenia danej tematyce dużej ilości czasu). Systemy ekspertowe oparte o zbiór reguł wnioskujących pozwalają na wielokrotne wyciąganie wniosków z raz zdefiniowanej bazy wiedzy, 4 która może być nawet bardzo duża. Jeżeli zbiór faktów potraktujemy jako zbiór napisów w określonej, bardzo deterministycznej składni (przez determinizm rozumiemy tutaj to, że znaczenie faktu powinno jednoznacznie określać, jak będzie wyglądał reprezentujący go napis), implementacja systemu ze składnią reguł wnioskujących podobną do CLIPSa okazuje się zadaniem wykonalnym w ramach ćwiczenia laboratoryjnego. Jakkolwiek wydajność nie jest najmocniejszą stroną stworzonej przez nas implementacji, dokonuje ona prawidłowego wnioskowania w przód i obsługuje ciekawy podzbiór składni języka CLIPS (zawiera się w tym definiowanie własnych funkcji). Literatura — http://en.wikipedia.org/wiki/Forward_chaining — http://clipsrules.sourceforge.net/OnlineDocs.html — http://iweb.tntech.edu/bhuguenard/ds6530/ClipsTutorial/tableOfContents. htm — http://docs.python.org/release/3.0.1/ — http://en.wikipedia.org/wiki/Comparison_of_web_browsers — http://www.technozeast.com/top-10-browsers.html — http://en.wikipedia.org/wiki/Comparison_of_audio_player_software — http://en.wikipedia.org/wiki/Comparison_of_video_player_software — http://www.dedoimedo.com/computers/media-players.html — http://9oe.me/blog/?p=745 — http://en.wikipedia.org/wiki/Office_suites — http://www.linuxcommunity.pl/strona/2566/pakiety-biurowe.html 5