Języki sztucznej inteligencji a relacyjne bazy danych Opracowali: Marcin Kras Jacek Dołęga ZAGADNIENIA: • • • • Pakiet SPHINX System PS-Shell System CLIPS System JESS SPHINX SPHINX jest dobrze zintegrowanym pakietem oprogramowania narzędziowego z zakresu sztucznej inteligencji. W jego skład wchodzą następujące komponenty: • system PC-Shell – szkieletowy system ekspertowy, • system Neuronix – symulator sieci neuronowej, • system CAKE – system komputerowego wspomagania inżynierii wiedzy, • system HybRex – system do budowy inteligentnych aplikacji SWD i analizy danych, • system Predyktor – system prognostyczny, • system DeTreex – indukcyjny system pozyskiwania wiedzym, • system dialogEditor – system wspomagający tworzenie interfejsu użytkownika, • system demoViewer – system do prezentacji aplikacji pakietu SPHINX, • aplikacje demonstracyjne, • obszerna dokumentacja z dużą liczbą przykładów. Wykorzystywany jest w dydaktyce i badaniach naukowych na wielu polskich uczelniach. Znajduje również zastosowanie w przedsięwzięciach i instytucjach komercyjnych, zaczynając od techniki, a na finansach i bankowości kończąc. Pakiet posiada własny język reprezentacji wiedzy oraz programowania, co niezwykle zwiększa elastyczność tworzonych w jego środowisku aplikacji. http://www.aitech.com.pl/sphinx.htm PC-Shell PC-Shell jest pierwszym polskim - w pełni komercyjnym - szkieletowym systemem ekspertowym. PC-Shell powstał jako rezultat wcześniejszych doświadczeń uzyskanych podczas budowy systemu PC-Expert (1985-87) oraz Diagnosta MC 14007 (1988). PCShell otrzymał dwa wyróżnienia na Międzynarodowych Targach Oprogramowania SOFTARG w roku 1994 oraz 1996. W roku 1997 system otrzymał nagrodę II-go stopnia w konkursie na najlepszy program targów SOFTARG. System był wielokrotnie prezentowany na konferencjach i seminariach, zarówno w kraju jak i za granicą (Holandia, Singapur, Irlandia). Zastosowanie PC-Shell jest dziedzinowo-niezależnym narzędziem służącym do budowy systemów ekspertowych. Może być zastosowany w dowolnej dziedzinie: począwszy od bankowości i finansów a na zastosowaniach technicznych kończąc. Typowe obszary zastosowań systemu PC-Shell to: • systemy doradcze i wpomagania decyzji, • dydaktyka (wyższe uczelnie i szkoły średnie). System może być między innymi wykorzystywany w takich dziedzinach jak: • analizy finansowe (ekonomiczne), • analizy wniosków kredytowych w bankach, • doradztwo podatkowe, • dzięki otwartej architekturze może być łatwo zintegrowany z Systemami Informowania Kierownictwa, służąc np. do automatycznej analizy wskaźników ekonomicznych, • technika, np. do analizy danych pomiarowych. • System nadaje się do budowy zarówno małych, średnich jak i dużych aplikacji. Klasy problemów Dziedzinowa niezależność systemu PC-Shell oznacza, że nie dziedzina a raczej klasa problemów decyduje o powodzeniu zastosowania tego systemu. System PC-Shell jest szczególnie predysponowany do rozwiązywania następujących klas problemów : • analiza (interpretacja) danych • klasyfikacja, • diagnostyka, • finanse i bankowość, • inwestycje, • marketing, • technika, • dydaktyka, • komponent dla systemów SIK, analizatorów, arkuszy kalkulacyjnych, • komponent programów edukacyjnych. PC-Shell jest dziedzinowo niezależny, stąd zakres jego zastosowań jest bardzo szeroki. Bowiem nie dziedzina a klasa problemów decyduje o powodzeniu zastosowania systemu PC-Shell. Architektura Jak już wspomniano, system PC-Shell jest systemem o architekturze hybrydowej, tj. łączącej w sobie różne metody rozwiązywania problemów i reprezentacji wiedzy. Interesującą właściwością systemu PCShell jest między innymi wbudowany, w pełni zintegrowany, symulator sieci neuronowej. Inną istotną cechą systemu PC-Shell jest jego struktura tablicowa, co umożliwia podzielenie dużej bazy wiedzy na mniejsze moduły - zorientowane tematycznie, tzw. źródła wiedzy. Interfejs do baz danych Wraz z wersją 2.1 systemu PC-Shell został wprowadzony mechanizm dostępu do konwencjonalnych baz danych. Zastosowane w systemie rozwiązanie opiera się o mechanizm ODBC. Udostępnia on dostęp do dowolnego systemu zarządzania bazą danych (DBSM) pod warunkiem posiadania odpowiednich interfejsów (drivers) dostarczanych przez producentów systemów zarządzania bazami danych. W systemie PC-Shell dostęp do baz danych został zaimplementowany poprzez dodanie szeregu nowych instrukcji. Można obecnie realizować następujące operacje: inicjalizacja dostępu do baz danych przesłanie dowolnego zapytania SQL w tzw. trybie bezpośrednim wraz z możliwością pozyskania wyniku działania zapytania sterowanie transakcjami za pomocą odpowiednich instrukcji programowania Proces komunikacji z bazą musi być obramowany etapem inicjacji dostępu oraz na końcu etapem zakończenia dostępu. Do tego celu służą funkcje sqlInit i sqlDone. Instrukcją do przesyłania zapytań jest instrukcja sqlQuery, natomiast instrukcjami służącymi do pobrania danych po wykonaniu zapytania są instrukcje sqlInitBinding, sqlBind, sqlFetch. Ostatnią instrukcją związaną z dostępem do baz danych jest instrukcja sterowania transakcjami sqlTransact. ZASTOSOWANIE PRAKTYCZNE: System PC-Shell przeznaczony jest dla systemów Windows 9x/NT/2000 lub nowszy. Wymagania sprzętowe: Komputer 486 lub nowszy, pamięć RAM 8MB lub więcej. Sposób instalacji – standardowy Więcej informacji: http://www.aitech.com.pl/tech.htm CLIPS C Language Integrated Production System – w pełni zintegrowane środowisko służące do tworzenia systemów ekspertowych. Korzenie języka CLIPS sięgają roku 1984, gdy oddział Artificial Intelligence Section w NASA Johnson Space Center opracował jego prototyp. Oparta o język C wersja 1.0 była pomyślana jako narzędzie dla oprogramowania ówczesnych systemów ekspertowych (tj. programów przeznaczonych do modelowania ludzkiego doświadczenia i wiedzy). Początkowo język służył głównie do celów treningowych; jednak już po roku, gdy poprawiono przenośność programów, ich wydajność i funkcjonalność oraz uporządkowano dokumentację, udostępniono wersję 3.0 dla grup spoza NASA. Dalsze rozszerzenia i ulepszenia, w szczególności dodanie możliwości pisania programów proceduralnych i obiektowych, przekształciły CLIPS w wersjii 6.1 z narzędzia treningowego w pełnowartościowe narzędzie dla projektowania i oprogramowania systemów ekspertowych. Następujące cechy zdecydowały o sukcesie języka: • • • • Możliwość reprezentowania wiedzy. CLIPS stanowi spójne narzędzie dla przetwarzania wiedzy, wspierając trzy różne paradygmaty: regułowy, obiektowy i proceduralny. Programowanie oparte o reguły pozwala reprezentować wiedzę jako heurystyki lub ogólne zasady (reguły) oparte na doświadczeniu, które podają zbiór działań, jakie należy wykonać w danej sytuacji. Programowanie obiektowe pozwala modelować złożone systemy jako modularne komponenty (które można łatwo użyć ponownie do modelowania innych systemów lub do tworzenia nowych komponentów). Możliwości programowania proceduralnego są podobne, jak w językach C, Pascal, Ada i LISP. Przenośność. CLIPS, dla osiągnięcia przenośności i szybkości, jest napisany w C i został zainstalowany na wielu różnych komputerach bez zmian kodu (IBM PC, Macintosh, VAX11/780, Sun 3/260). Może być przenoszony na dowolny system posiadający kompilator języka ANSI C; przenośność zapewnia dostarczany z systemem CLIPS kod źródłowy, który może być modyfikowany stosownie do potrzeb użytkownika. Integracja/Rozszerzalność. Kod w języku CLIPS można wbudować wewnątrz kodu proceduralnego, wywoływanego jako podprogram, i zintegrowanego z takimi językami, jak C, C++, FORTRAN i ADA. Istnieją również ściśle zdefiniowane zasady tworzenia rozszerzeń jezyka. Interakcja z użytkownikiem. Standardowa wersja języka CLIPS zawiera interakcyjne środowisko opracowywania programu, obejmujące zintegrowany edytor, narzędzia dla uruchamiania oraz natychmiastową pomoc. Dla środowisk Macintosh, Windows 3.1 i X Window opracowano rozwijalne menu, zintegrowane edytory i system wielookienkowy. • Weryfikacja/Walidacja. CLIPS zawiera szereg cech dla wsparcia weryfikacji i walidacji systemów ekspertowych: modularne projektowanie i podział bazy wiedzy, statyczną i dynamiczną kontrolę atrybutów pól i argumentów funkcji oraz analizę semantyczną wzorcowych reguł dla ustalenia, czy niespójności mogłyby przeszkodzić w odpaleniu reguły lub wygenerować błąd. • Pełna dokumentacja. W pakiecie języka CLIPS znajdziemy obszerną dokumentację, w tym źródłowy podręcznik języka i przewodnik użytkownika. Program napisany w języku CLIPS składa się z reguł, faktów i obiektów. W terminologii języka słowem shell (powłoka) określa się tę jego część, która zawiera podstawowe elementy systemu ekspertowego: 1. Wykaz faktów (fact-list) i wykaz obiektów (instance-list) w pamięci roboczej. 2. Baza wiedzy (knowledge-base) w postaci zbioru reguł oraz agenda reguł. 3. Maszyna wnioskująca (inference-engine). Maszyna wnioskująca decyduje, które reguły powinny być wykonane i kiedy. Regułowy system ekspertowy zakodowany w języku CLIPS oparty jest o koncepcję wnioskowania wstępującego (forward chaining, data-driven inference). Oznacza to, że zadaje się pewne dane, które po dopasowaniu do przesłanek pozwalają na sformułowanie wniosków. Można zatem powiedzieć, że system ekspertowy napisany w języku CLIPS jest programem sterowanym danymi, ponieważ fakty i obiekty są tymi danymi, które stymulują wykonanie poprzez maszynę wnioskującą. Zauważmy, że w językach proceduralnych (np. C, BASIC, FORTRAN, Pascal) oraz hybrydowych (np. C++) wystarczy mieć sekwencję instrukcji, które mogą być wykonane bez dostarczenia im jakichkolwiek danych. Dokumentacja, kody źródłowe i binarne języka CLIPS dostępne są bez opłat na wielu serwerach sieci Internet. Podstawowe adresy URL, pod którymi można znaleźć odpowiednie pliki, są następujące: http://www.ghgcorp.com/clips/ oraz http://www.ghg.net/clips/CLIPS.html; publicznie dostępne repozytorium napisanych w języku CLIPS systemów ekspertowych znajduje się pod adresem http://www.cs.cmu.edu/afs/cs/project/ai-repository/. Okno dialogowe programu CLIPSE Dostęp do baz danych przy pomocy ODBC oraz wykorzystaniu CLIPS Win32 DLL http://eppe.tamu.edu/~xuxj/prog/download/dll/CLIPSDLL05.doc Fragment pliku napisanego w CLIPS ;;;************* ;;;* TEMPLATES * ;;;************* (deftemplate father-of (slot father) (slot child)) (deftemplate mother-of (slot mother) (slot child)) (deftemplate wife-of (slot wife) (slot husband)) (deftemplate male (slot person)) (deftemplate female (slot person)) (deftemplate Print-Phase (slot phase)) int main(int argc, char *argv[]) { CCLIPSWrap CLIPSEng(1); //Create an instance of CLIPS CString strCLIPSScript; // nazwa systemu stworzonego w języku clips CString strAssert, strODBCInfo; CString strQuery, strDeftemplateName, strOutFile = „plik_wynikowy.txt"; int iErrCode; //Initialize the CLIPS Engine -- DLL Loaded here! //If Initialization fails, display message to browser. if(!CLIPSEng.CLIPSInit()) { printf("CLIPS failed during initialization. Make sure the DLL is either in the current directory or somewhere in your PATH\n"); return(0); } //Load the CLIPS script(facts/rules etc.) //If Load fails, display message. iErrCode = CLIPSEng.CLIPSLoad(strCLIPSScript); if(iErrCode != CCLIPSWrap::READ_OK) { printf("CLIPS failed while loading the script %s\n", LPCSTR(strCLIPSScript)); switch (iErrCode) { case CCLIPSWrap::READ_FAIL : printf("Read Failure\n"); break; case CCLIPSWrap::PARSE_FAIL : printf("Parse Failure\n"); break; case CCLIPSWrap::BAD_LOAD_NAME : printf("Bad Load Name\n"); break; case CCLIPSWrap::READ_NOT_INIT : printf("Read Not Initialized\n"); } CLIPSEng.CLIPSExit(0); return(0); } //Issue CLIPS 'reset' Command CLIPSEng.CLIPSReset(); //Assert 'father-of' facts strDeftemplateName = "father-of"; strQuery = "SELECT father, child FROM FATHEROF"; CLIPSEng.CLIPSODBCQuery(strQuery, strODBCInfo, strDeftemplateName, TRUE); //Assert 'mother-of' facts strDeftemplateName = "mother-of"; strQuery = "SELECT mother, child FROM MOTHEROF"; CLIPSEng.CLIPSODBCQuery(strQuery, strODBCInfo, strDeftemplateName, TRUE); //Assert 'wife-of' facts strDeftemplateName = "wife-of"; strQuery = "SELECT wife, husband FROM WIFEOF"; CLIPSEng.CLIPSODBCQuery(strQuery, strODBCInfo, strDeftemplateName, TRUE); //Assert 'male' facts strDeftemplateName = "male"; strQuery = "SELECT person FROM male"; CLIPSEng.CLIPSODBCQuery(strQuery, strODBCInfo, strDeftemplateName, TRUE); //Assert 'female' facts strDeftemplateName = "female"; strQuery = "SELECT person FROM female"; CLIPSEng.CLIPSODBCQuery(strQuery, strODBCInfo, strDeftemplateName, TRUE); //Assert Print-Phase fact strAssert = "(Print-Phase (phase Print-Brother))"; if(!CLIPSEng.CLIPSAssert(strAssert)) { return(-255); } //Dribble the output to a file to be displayed later CLIPSEng.CLIPSDribble(strOutFile, TRUE); //Run the CLIPS Engine CLIPSEng.CLIPSRun(); //Close dribble output CLIPSEng.CLIPSDribble(strOutFile, FALSE); //Exit CLIPS and close any open files CLIPSEng.CLIPSExit(0); } JESS Jest to w pełni zintegrowane środowisko do tworzenia systemów ekspertowych. Zostało stworzone przez Sun w języku JAVA. Początkowo inspiracją do stworzenia tego środowiska był system ekspertowy CLIPS. Język którym posługuje się system JESS jest w pełni kompatybilny z językiem CLIPS, wiele skryptów napisanych w JESS jest poprawnych dla języka CLIPS i odwrotnie. Z poziomu języka JESS można korzystać z języka JAVA: tworzyć obiekty oraz wywoływać metody bez kompilowania kodu; tworzyć programy jak w JAVIE. System JESS jest więc środowiskiem bardzo podobnym do omówionego wcześniej systemu CLIPS. JESS jest kompatybilny z wszystkimi wersjami JAVY zaczynajac od JAVA 1.2. Innymi słowy mówiac JESS jest "biblioteka programisty". Język systemu JESS można również wykorzystać w kodzię JAVY. Umożliwia to pakiet jess. Poniżej przedstawiony jest przykład użycia pakietu jess. import jess.*; public class ExSquare { public static void main(String[] unused) { try { Rete r = new Rete(); //mechanizm wnioskujący z włąsną bazą wiedzy itp. r.executeCommand("(deffunction square (?n) (return (* ?n ?n)))"); Value v = r.executeCommand("(square 3)"); // Prints '9‘ System.out.println(v.intValue(r.getGlobalContext())); } catch (JessException ex) { System.err.println(ex); } } } C:\> java ExSquare 9 Strona systemu ekspertowego JESS: http://herzberg.ca.sandia.gov/jess/ Manual: http://www.cs.vu.nl/~ksprac/2002/doc/Jess60/table_of_contents.html Dostęp do baz danych Dostęp taki możemy uzyskać z poziomu programu wykorzystując pakiet jess oraz Sterowniki JDBC. Zarówno Java jak i JESS posiadają funkcje służące do transferu zmiennych pomiędzy środowiskami. JAVA: public Value store(String name, Value val); public Value store(String name, Object val); public Value fetch(String name); public void clearStorage(); JESS: store <name> <value>) (fetch <name>) (clear-storage) import jess.*; public class ExFetch { public static void main(String[] unused) throws JessException { Rete r = new Rete(); r.store("DIMENSION", new java.awt.Dimension(10, 10)); r.executeCommand("(defclass dimension java.awt.Dimension)"); r.executeCommand("(definstance dimension (fetch DIMENSION) static)"); r.executeCommand("(facts)"); } } public class EmployeeDAO { public static Employee [] getEmployeeList(){ try { String url = "jdbc:mySubprotocol:myDataSource"; Connection con = DriverManager.getConnection( url, "myLogin", "myPassword"); Statement s = con.createStatement() ; ResultSet rs = s.executeQuery("SELECT ENAME,EMPNO FROM SCOTT.EMP"); Employee tmp = new Employee(); tmp.empno=rs.getString("EMPNO"); tmp.ename=rs.getString("ENAME"); con.close(); return tmp; } catch (SQLException e) { return null; } }