Programowanie i Systemy ekspertowe
Pojęcie programu komputerowego. Klasyfikacja języków programowania.
Program komputerowy to ciąg instrukcji, które wykonywane są na komputerze.
Klasyfikacja języków programowania:
j. Wewnętrzny
j. Symboliczne (assemblery)
j. Wysokiego poziomu (Pascal, C, C++)
automatyczne programowanie (RAD - Delphi, C++ Builder, Visual C++)
j. ogólnego przeznaczenia: Algol, Fortran, Modula, Ada, Java.
j. specjalne: Prolog, Smaltalk, Lisp
j. bazowodanowe: SQL, dBase, Snobol, Cobol.
Cechy programowania strukturalnego.
- Wykorzystanie bloków funkcyjnych z zainstalowanych bibliotek.
- Tworzenie funkcji użytkownika i bloków funkcyjnych. Powtórne wykorzystanie
programowania jest niezależne od urządzeń i adresów
- rekordy ( we wcześniejszych wersjach programowania nie było ich )
Dane alokowane statycznie a dynamicznie.
Dane alokowane statycznie dołączane są do programów. Oznacza to że w czasie wykonywania programu kopia wszystkich danych wykorzystanych w programie przebywa w pamięci komputera.
Dane alokowane dynamicznie mogą być tworzone i usuwane z pamięci komputera.
Pojęcie i cechy typu oraz zmiennej.
Przez zmienną rozumie się obszar pamięci wraz z zapisaną w niej informacją. Informacji można nadawać różne znaczenia, nazywane wartością zmiennej. Funkcję przyporządkowującą wartość konkretnemu obszarowi pamięci (informacji) czyli sposób zinterpretowania ciągu bitów nazywamy typem zmiennej. Każda zmienna ma w każdej chwili dokładnie jeden typ, ustalany podczas procesu obliczeniowego.
Metody przekazywania parametrów do podprogramów.
przez wartość
przez zmienna (referencje)
np. -przez wartość
void test1(double xx, double yy, int ii)
{
xx=xx+1.5;
yy=2.5*yy;
}
np. -przez referencję (dokładniej o co chodzi z referencją)
void main()
{ int actualint = 123;
int &otherint = actualint;
cout<< actualint; //123
cout<< otherint; //123
otherint++;
cout<< actualint; //124;
cout<< otherint; //124
actualint++;
cout<<actualint; //125
cout<< otherint; //125
}
Czasami w kontekście języka C mówi się o przekazywaniu parametrów przez referencje, mając na myśli wskaźniki. Jest to nieścisłe nazewnictwo. Przesyłanie przez referencję stosuje się w przypadku, gdy argumentami funkcji są duże obiekty, do przesyłania których przez wartość konieczne było rezerwowanie na stosie setek bajtów.
Metody translacji programów.
Języki wysokiego poziomu dzielą się one w zależności od metody translacji (tłumaczenia kodu) na kompilatory (możliwość przedstawienia programu w postaci skompilowanej czyli przetłumaczonej dla maszyny) i interpretery (tłumaczenia "w locie", znacznie wolniejsze i wymagające każdorazowej translacji po uruchomieniu programu). Do tych pierwszych zalicza się popularny Pascal, do tych drugich Logo.
TRANSLACJA to tłumaczenie programu na język wewnętrzny komputera, wykonywane za pomocą wyspecjalizowanego programu, tzw. translatora. Wyróżniamy dwa typy translacji: kompilację i interpretację.
Po napisaniu ciągu instrukcji w wybranym języku programowania należy zapisać program w pliku na nośniku pamięci zewnętrznej, np. dysku twardym, oraz wykonać jego kompilację, czyli uruchomić proces tłumaczący instrukcje na język zrozumiały dla procesora. Po poprawnym przeprowadzeniu kompilacji można program uruchomić.
W zależności od języka programowania i wersji programu służącego do pisania programów plik utworzony w takim programie może mieć różne rozszerzenia, np. programy pisane w Turbo Pascalu mają rozszerzenie pas.
Pisanie programów w języku programowania RAM umożliwia program edukacyjny EI - moduł COMPUTER systemu DISC-MATH. Korzystając z niego można nie tylko napisać program, ale także przeprowadzić jego kompilację, a następnie uruchomić. W dokumentacji do programu opisano zasady korzystania z całego modułu komputer.
KOMPILACJA - przetłumaczenie napisanego przez nas programu w całości, tak by mógł on być wykonany przez komputer przy każdorazowym uruchomieniu. Raz skompilowany program nie wymaga już powtórnej operacji tłumaczenia. Do wykonania kompilacji służą programy narzędziowe - kompilatory.
INTERPRETACJA - tłumaczenie programu tworzonego w jednym z języków programowania instrukcja po instrukcji, tak by każda wywołana instrukcja była wykonana przez komputer. Tłumaczenie następuje każdorazowo przy uruchomieniu programu.
Pojęcie tablicy w językach programowania. Tablice o zmiennej liczbie elementów.
Tablica składa się z ustalonej liczby elementów tego samego typu, zwanego typem składowym, który może być zarówno typem prostym lub łańcuchowym, jak i typem strukturalnym. Za pomocą tablic reprezentowane są regularne układy danych, np. wektory i macierze. Dostęp do tablic uzyskuje się za pomocą indeksowania. Indeksem może być dowolne wyrażenie, którego wartość jest zgodna w sensie przypisania z typem indeksowym.
index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
wartość |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Pascal: Tablica: array[0..9] of integer; tablica statyczna
Tablica: ^typ_elementow_tablicy; tablica dynamiczna
lub
type wskaznik_tablicy = ^char;
var tablica: wskaznik_tablicy;
Funkcje i procedury modułu system wykorzystywane przy dynamicznej obsłudze pamięci:
Getmem Procedura ta tworzy zmienną dynamiczną o nazwie zmienna wskaźnikowa i rozmiarze rozmiar podanym w bajtach, rozmiar to wyrażenie typu Word.
Freemem Procedura ta zwalnia pamięć uprzednio przydzieloną zmiennej zmienna wskaźnikowa procedurą GetMem.
Move Procedura ta kopiuje kolejne bajty począwszy od pierwszego a skończywszy na osiągnięciu wartości podanej w licznik ze zmiennej źródłowej do zmiennej docelowej.
MaxAvail Funkcja ta podaje w bajtach rozmiar największego wolnego bloku w segmencie przeznaczonym na zmienne dynamiczne.
MemAvail Funkcja ta podaje w bajtach sumę rozmiarów wszystkich wolnych bloków w segmencie przeznaczonym na zmienne dynamiczne.
SizeOf Funkcja ta zwraca w bajtach rozmiar identyfikatora.
FillChar Procedura ta wypełnia pamięć zajmowaną (wskazywaną) przez zmienną zmienna elementami znak wypełnienia.
C++: int Tablica[9]; tablica statyczna
wsk = new typ[wymiar]; tablica dynamiczna
np.
w= new char [10];
delete [ ] w;
Moduły dołączane statycznie a biblioteki DLL.
Moduły dołączane statycznie: oznacza to że w czasie kompilacji kopia kodu wszystkich modułów wykorzystywanych prze program umieszczana jest w pliku programu z rozszerzeniem EXE. Zatem każdy program który korzysta z danego modułu posiada oddzielną jego kopię w pliku EXE.
Dwa powody aby nie używać modułów statycznie dołączanych:
Jeśli moduły są duże i kilka programów go wykorzystuje zakończymy z zaskakująco dużą ilością kopii kodu w swych programach.
Elastyczność: tzn. aby uaktualnić program należy go skompilować bądź w najgorszym wypadku napisać od nowa.
Moduły dołączane dynamicznie: Zamiast dołączać kopię kodu modułu głównego do głównego pliku EXE aplikacji, DLL umożliwia umieszczenie wielokrotne wykorzystywanego kodu w oddzielnym pliku bibliotecznym, który ładowany jest w razie potrzeby w fazie wykonania. Jeśli z funkcji znajdujących się w bibliotece DLL musi skorzystać 5 różnych programów, na dysku jest wciąż jedna kopia programu a co najważniejsze, tylko jedna kopia w pamięci. I to jest właśnie elastyczność.
Pojęcie i struktura bloku w językach Pascal i C.
Pascal |
C++ |
Blok DD (deklaracyjno definicyjny) Definicje stałych, typów, zmiennych, podprogramów (funkcji, procedur) |
|
|
|
Begin Instrukcje; End; |
{ Instrukcje; } |
Funkcje przeciążone w wybranych językach programowania. Zastosowanie.
Przeciążanie funkcji (ang. overloading), to tworzenie w programie kilku funkcji o tych samych nazwach. Każda z funkcji musi mieć inną liczbę lub typy przyjmowanych argumentów. Kompilator rozpoznaje właściwą funkcję na podstawie typów i ilości argumentów w miejscu wywołania.
Przeciążanie funkcji jest stosowane tam, gdzie przeprowadzane są takie same obliczenia na różnych typach danych.
Np.
Pascal |
C++ |
function Podziel(x, y: Real): Real; overload; begin Result := x / y; end;
function Podziel(x, y: Integer): Integer; overload; begin Result := x div y; end; |
Int polePowierzchni(int bokX,int bokY); Double polePowierzchni(double bokX,double bokY);
int main() { int a=5,b=4; double c=5.8,d=3.2; cout<<" arg. całkowitymi " << polePowierzchni(a,b) <<'\n'; cout<<"arg. rzeczywistymi " <<polePowierzchni(c,d)<<endl; return 0; } //definicja funkcji
int polePowierzchni(int bokX,int bokY) { return bokX*bokY; }
double polePowierzchni(double bokX,double bokY) { return bokX*bokY; } |
Rodzaje plików w wybranych językach programowania.
Rodzaje plików:
Pliki tekstowe
Jest to zbiór składający się ze znaków ASCII. Poszczególne informacje zwykle znajdują się w kolejnych wierszach. Każdy wiersz zakończony jest dwoma znakami (CR/LF).
Pliki binarne
Nie są zwykle przeznaczone do bezpośredniego oglądania, zawierają binarne informacje, które zrozumiałe są jedynie dla określonych programów.
Pliki zdefiniowane
Określamy tutaj strukturę elementów, z których składać się będzie informacja zawarta w pliku. Struktura ta jest zwykle rekordem zawierającym pola różnego typu.
Pliki niezdefiniowane
Pliki niezdefiniowane pozwalają na bardziej elastyczną pracę. Możemy skoczyć w dowolne miejsce takiego pliku, zmienić lub odczytać pojedynczy bajt czy cały blok. Nie mamy obowiązku tworzenia na sztywno jakiejś konkretnej struktury związanej z plikiem. Musimy jednak wiedzieć dokładnie jaki element nas interesuje i w którym miejscu się on znajduje.
Podział instrukcji w wybranych językach programowania.
Pascal:
C++:
Instrukcje warunkowe.
Pascal |
|
C++ |
if (i=15) then coś tam else coś tam innego; |
= |
if (i==15) { coś tam } else { coś tam innego} |
Case i of 1: coś tam; 2: coś tam innego; end; |
= |
Switch{ Case 1: co stam; break; Case 2: co stam innego; break; Default: co stam innego; break;} |
For i=0 to 9 do coś tam; |
= |
for(i=0;i<10;i++) { } |
while (i <= 10) coś tam; |
= |
while (i <= 10) { coś tam } lub do { coś tam } while (i <= 10); |
Repeat coś tam Until i <>10;
|
= |
|
Programowanie proceduralne a obiektowe.
Programowanie proceduralne polega na stosowaniu procedur operujących danymi. Dane mogą być reprezentowane przez ciąg znaków, tablice, liczby lub dowolne inne struktury.
W programowaniu obiektowym dane i kod są połączone. Razem tworzą obiekt. Tak zorganizowane programowanie jest dla nas bardziej naturalne.
Programowanie proceduralne |
Programowanie obiektowe |
Zmienna Wartość zmiennej Typ Funkcja/Procedura Wywołanie funkcji/procedury Hierarchia typów |
Obiekt Stan Klasa Metoda Komunikat Hierarchia klas |
|
Procedury a funkcje w językach programowania.
Ogólna składnia procedury jest następująca:
procedure Nazwa_procedury (Parametry); dyrektywa;
blok_danych; {opcjonalnie}
blok_kodu;
Nazwa_procedury jest identyfikatorem, za pomocą którego będziemy się do niej zwracać. Jako parametry możemy podawać różne wartości przyjmowane przez procedurę. Jeśli w danej procedurze zostaje wywołana ta sama procedura, to nazywamy to rekurencją. Podczas wywoływania procedury rekurencyjnie na stosie zapamiętywany jest aktualny adres oraz wartości wszystkich zmiennych lokalnych, dzięki temu po zakończeniu wykonywania się procedury, następuje powrót do miejsca, z którego wywołanie nastąpiło oraz wszystkie zmienne przywracają swoje pierwotne wartości.
Ogólna składnia funkcji jest następująca:
function Nazwa_funkcji (Parametry) : Typ_rezultatu; dyrektywa;
blok;
Każda funkcja zwraca jakąś wartość. W bloku funkcji musimy więc zamieścić zapis: Nazwa_funkcji:=wartość;
Instrukcje iteracyjne w wybranych językach programowania.
Odp. Pyt 13 (część)
Cechy programowania obiektowego.
Hermetyzacja
Dziedziczenie
Polimorfizm
Kolejki a stosy.
Stos jest strukturą danych składającą się z liniowo uporządkowanych zbiorów składników (elementów), z których tylko „największy” jest w danej chwili dostępny. Miejsce dostępu nazywa się wierzchołkiem stosu. Jest to jedyne miejsce, do którego można dołączyć lub z którego można usuwać elementy. Schemat organizacji stosu jest przedstawiony poniżej. Każdy składnik stosu posiada wyróżniony element (wskaźnik), który wskazuje składnik następujący po nim (dokładniej: adres tego składnika). Wskaźnik ostatniego składnika stosu wskazuje na adres pusty - nil.
Dane |
Wskaźnik |
Składnik 1 |
Dane |
Wskaźnik |
Składnik 3 |
Dane |
Wskaźnik |
Składnik 2 |
Dane |
Wskaźnik |
Składnik n |
Wejście
Wyjście
Kolejka jest strukturą liniowo uporządkowanych danych w której dołączać nowe dane można jedynie na koniec kolejki a usuwać z początku. Procedura usunięcia danych z końca kolejki jest taka sama, jak w przypadku stosu, z tą różnicą, że usuwamy dane od początku a nie od końca. Pierwszy element (a dokładniej wskaźnik do jego miejsca w pamięci) musi zostać zapamiętany, by możliwe było usuwanie pierwszego elementu w czasie stałym O(1). Gdybyśmy tego nie zrobili, aby dotrzeć do pierwszego elementu należałoby przejść wszystkie od elementu aktualnego (czyli ostatniego), co wymaga czasu O(n). Działanie na kolejce jest intuicyjnie jasne, gdy skojarzymy ją z kolejką ludzi np. w sklepie. Każdy nowy klient staje na jej końcu, obsługa odbywa się jedynie na początku.
Dane |
Wskaźnik |
Składnik 1 |
Dane |
Wskaźnik |
Składnik 2 |
Dane |
Wskaźnik |
Składnik 3 |
Dane |
Wskaźnik |
Składnik n |
Wyjście
Podział typów danych w wybranych językach programowania.
Pascal:
C++:
Czym różni się system ekspertowy od typowego systemu informacyjnego.
Systemy ekspertowe poprzez pewne techniki naśladujące ludzkie rozumowanie, wykorzystują zgromadzoną wiedzę do rozwiązania konkretnego problemu. Każdy system ekspertowy posiada następujące cechy:
stanowi kodyfikację wiedzy ekspertów,
posiada zdolność do rozwiązywania problemów specjalistycznych, gdzie główną rolę pełni doświadczenie, a wiedza eksperta jest wartością wyjątkowo rzadko spotykaną oraz kosztowną,
zwiększa się dostępność ekspertyzy,
poziom ekspertyzy jest stabilny (jej jakość nie zależy już od warunków zewnętrznych i czasu pracy systemu),
wiedza reprezentowana jest w postaci zrozumiałej dla użytkownika końcowego,
zdolność do objaśniania potwierdzonych hipotez,
modularna budowa pozwala na rozbudowę systemu,
możliwe jest wnioskowanie z niepełnej wiedzy [1].
Metody reprezentacji wiedzy w bazach wiedzy systemów ekspertowych.
Wiedza
Wiedza oraz wnioskowanie to kluczowe elementy każdego systemu ekspertowego. Pod pojęciem wiedzy kryje się zbiór wiadomości z określonej dziedziny - konkretny wynik procesu uczenia się oraz bagaż doświadczeń. Wiedza z danej dziedziny przenoszona jest w określony język reprezentacji, a także zapisywana w bazach wiedzy .
Metody reprezentacji wiedzy
Za pomocą metod reprezentacji wiedzy można generować świat rzeczywisty i panujące w nim zależności, oddziaływania. Odbywa się to naturalnie z wykorzystaniem komputerów. Oto najpopularniejsze metody reprezentowania wiedzy (zwane też technikami organizowania baz wiedzy):
metody bazujące na bezpośrednim zastosowaniu logiki: rachunek zdań, rachunek predykatów,
metody wykorzystujące zapis stwierdzeń,
metody wykorzystujące systemy regułowe (wektory wiedzy),
metody z wykorzystaniem sieci semantycznych,
metody oparte na ramach,
metody używające modeli obliczeniowych [6].
Powyżej zostały zaprezentowane metody reprezentacji wiedzy, które są najbardziej rozpowszechnione. Istnieje także inna gałąź w tej dziedzinie, zwana reprezentacjami niesymbolicznymi. Do tego grona należą między innymi sieci neuronowe, które symulują działanie komórek nerwowych oraz algorytmy genetyczne, wykorzystujące tak zwane geny, jako podstawowe źródło informacji.
Regułowa reprezentacja wiedzy
Jedną z najważniejszych metod reprezentacji wiedzy są metody oparte o regułach. By określić dane środowisko, należy zdefiniować panujące w nim reguły. Zapis samych stwierdzeń jest stanowczo niewystarczający. Reguły zapisujemy w następujący sposób:
IF przesłanka THEN konkluzja
oraz
IF przesłanka THEN działanie (produkcja)
W zapisie formalnym, regułowa reprezentacja wiedzy obejmuje:
zapisy reguł za pomocą tablic decyzyjnych,
zapisy za pomocą perceptów,
zapisy za pomocą rachunku zdań i predykatów,
zapisy reguł produkcji.
Wszystkie te sposoby zaliczają się do reprezentacji regułowej. Ich końcowa forma stanowi zazwyczaj deklarację reguły, choć różnie zapisanej w zależności od sposobu zapisu.
Regułowa baza wiedzy składa się zawsze z dwóch części:
faktów,
reguł.
W ten sposób można wygenerować pewną rzeczywistość opartą o wymienione struktury zdaniowe. "Zdecydowana większość powstałych do tej pory systemów ekspertowych jest oparta na regułach. Podejście to umożliwia uzyskanie dużej modularności bazy wiedzy".
Rodzaje reguł
Rozpatrując sposób uzyskiwania ostatecznych konkluzji w procesie wnioskowania, wyszczególnia się dwa rodzaje reguł:
reguły proste - w postaci wniosków pośrednich,
reguły złożone - umożliwiają wyznaczenie wniosków w sposób bezpośredni.
Jeśli chodzi o reguły proste, to nie posiadają one zbyt rozbudowanych przesłanek. "Niezbędne jest przeprowadzenie rozumowania polegającego na uszczegółowieniu wniosków pośrednich". Proces ten kończy się w momencie uzyskania konkluzji. Udowodnione wnioski pośrednie stanowią łańcuch obrazujący proces wnioskowania. Łatwość weryfikacji zbioru reguł, a także ograniczenie ich redundancji, to cechy charakterystyczne reguł prostych. Ich największą wadą jest złożoność wnioskowania i dłuższy czas udowadniania hipotezy. Reguły złożone nie wymagają skomplikowanych modułów wnioskowania o skomplikowanym sposobie działania. Bardzo ważne jest to, że "każda z reguł w konkluzji zawiera jakiś wniosek końcowy". By osiągnąć wynik, niejednokrotnie wystarczy uaktywnić tylko jedną regułę. Niestety trudno tutaj sformułować odpowiedni zbiór reguł. Wadą reguł złożonych jest także skomplikowany sposób weryfikacji i uzupełniania bazy reguł .
Wady i zalety regułowej reprezentacji wiedzy
Zapis informacji z danej dziedziny wiedzy powinien być prosty, wyczerpujący oraz zwięzły. Nie może zawierać elementów domyślnych, niezrozumiałych bądź wieloznacznych. Niestety w chwili obecnej ciężko o jakąkolwiek standaryzację i formalizację sposobów zapisywania wiedzy. Największy problem stanowi zapis informacji warunkowych, sprzecznych, a także wyjątków. Kłopot stanowi także ocena prawdziwości informacji - zwłaszcza w przypadku, gdy pośród specjalistów z danej dziedziny panują skrajnie różne opinie na dany temat. Istnieje także ryzyko w stosunku do reguł prawdziwych z dużym prawdopodobieństwem w większości przypadków, iż zapis może prowadzić do sprzeczności. Oto powszechnie znany przykład:
"każdy ptak potrafi latać",
"struś jest ptakiem",
"struś nie potrafi latać" [7].
Zalety regułowej reprezentacji wiedzy:
stosunkowo łatwe zastosowanie takiej reprezentacji wiedzy w procesie wnioskowania,
łatwa interpretacja oraz przejrzystość bazy wiedzy,
baza wiedzy zostaje zmodularyzowana, przez co każda reguła odwzorowuje inną porcję wiedzy,
system ekspertowy na podstawie wspomnianej reprezentacji wiedzy, posiada zdolność do generowania objaśnień drogi wnioskowania oraz uzasadniania stosowania pytań do użytkownika.
Wady regułowej reprezentacji wiedzy:
istnieje trudność w reprezentacji wiedzy wspomagającej,
objaśnienia kompleksowe (dotyczące strategii postępowania) są problematyczne w implementacji,
kolejność wyboru reguł znacznie wpływa na efektywność pracy systemu,
problem z zapisem wiedzy negatywnej, atrybutów specjalnych oraz wartości atrybutów nie zdefiniowanych w syntaktyce.
Mimo tych wszystkich wad i ograniczeń, regułowa reprezentacja wiedzy nadal pozostaje najpopularniejszą metodą zapisu wiedzy. Naturalność zapisu i znaczna niezależność reguł, to cechy stanowiące o wyższości tej metody nad pozostałymi.
Systemy ekspertowe należą do dziedziny systemów sztucznej inteligencji. Zajmuje się ona poznaniem ludzkiego rozumowania w celu odwzorowania tego procesu poprzez systemy komputerowe. System ekspertowy jest programem umożliwiającym rozwiązanie danego problemu w sposób przypominający postępowanie eksperta lub specjalisty z pewnej wąsko określonej dziedziny [8]. Mianem eksperta określa się osobę posiadającą szeroką wiedzę oraz umiejętności zdobyte przez doświadczenie. Ekspert nabył bardzo szczegółową wiedzę teoretyczną oraz praktyczną z danej specjalizacji. Ponadto jest on obdarzony intuicją oraz cechami takimi jak: profesjonalizm czy umiejętność uczenia się przez doświadczenie.
Struktura systemu ekspertowego - właściwości jego elementów.
Kompletny system ekspertowy składa się z wielu elementów. Oto one:
baza wiedzy (ang. knowledge base) - wiedza eksperta zapisana w postaci reguł,
baza danych (ang. data base) - zawiera fakty zapisane w systemie, udowodnione konkluzje oraz częściowe wyniki wnioskowania,
moduł wnioskowania (ang. inference engine) - kluczowy element każdego systemu ekspertowego, odpowiedzialny za przeprowadzenie procesu wnioskowania,
moduł objaśniający (ang. explanation facility) - ma za zadanie objaśnienie strategii wnioskowania; pośredniczy między użytkownikiem a systemem,
moduł pozyskiwania wiedzy - najtrudniejszy etap w realizacji każdego systemu ekspertowego; kluczowy element dla Inżyniera wiedzy, który pozyskuje wiedzę od eksperta, a następnie zapisuje ją w bazie wiedzy [7].
Uwzględniając wszystkie elementy systemu ekspertowego wymienione przed chwilą, jego strukturę można przedstawić tak jak na rysunku:
Jak jest różnica pomiędzy bazą danych a bazą wiedzy.
Baza danych- występuje w każdym systemie ekspertowym. Zawiera dane i fakty z danej dziedziny
Baza wiedzy- tworzona jest na podstawie od eksperta poprzez zastosowanie określonej jej reprezentacji. Baza wiedzy jest jednym z podstawowych modułów Systemów Ekspertowych, albowiem od niej zależy sposób wykorzystania systemu. Typowa baza wiedzy powinna zawierać zarówno fakty opisujące pewne obiekty lub sytuacje jak i reguły odtwarzające istotne procesy rozumowania wykorzystane w systemie.
Jakie klasy systemów informatycznych obejmuje dziedzina o nazwie sztuczna inteligencja.
Technologie oparte na logice rozmytej - powszechnie stosowane do np. sterowania przebiegiem procesów technologicznych w fabrykach w warunkach "braku wszystkich danych".
Systemy ekspertowe - czyli rozbudowane bazy danych z wszczepioną "sztuczną inteligencją" umożliwiającą zadawanie im pytań w języku naturalnym i uzyskiwanie w tym samym języku odpowiedzi. Systemy takie stosowane są już w farmacji i medycynie.
Maszynowe tłumaczenie tekstów - systemy takie jak SYSTRANS, jakkolwiek wciąż bardzo ułomne, robią szybkie postępy i zaczynają się nadawać do tłumaczenia tekstów technicznych.
Sieci neuronowe - stosowane z powodzeniem w wielu zastosowaniach łącznie z programowaniem "inteligentnych przeciwników" w grach komputerowych
Eksploracja danych - omawia obszary, powiązanie z potrzebami informacyjnymi, pozyskiwaniem wiedzy, stosowane techniki analizy, oczekiwane rezultaty
Rozpoznawanie optyczne - stosowane są już programy rozpoznające osoby na podstawie zdjęcia twarzy lub rozpoznające automatycznie zadane obiekty na zdjęciach satelitarnych.
Rozpoznawanie mowy (identyfikacja treści wypowiedzi) i rozpoznawanie mówców (identyfikacja osób) - stosowane już powszechnie na skalę komercyjną
Rozpoznawanie ręcznego pisma - stosowane już masowo np. do automatycznego sortowania listów, oraz w elektronicznych notatnikach.
Deep Blue - program, który ograł Garri Kasparowa w szachy
Sztuczna twórczość - istnieją programy automatycznie generujące krótkie formy poetyckie, komponujące, aranżujące i interpretujące utwory muzyczne, które są w stanie skutecznie "zmylić" nawet profesjonalnych artystów, w sensie, że nie rozpoznają oni tych utworów jako sztucznie wygenerowanych.
W ekonomii, powszechnie stosuje się systemy automatycznie oceniające m.in. zdolność kredytową, profil najlepszych klientów, czy planujące kampanie medialne. Systemy te poddawane są wcześniej automatycznemu uczeniu na podstawie posiadanych danych (np. klientów bank)
Jakie podstawowe metody wnioskowania są wykorzystywane w systemach ekspertowych
Dochodzenie do jakiegoś wniosku poprzez zaakceptowanie pewnych przesłanek nazywamy wnioskowaniem. Systemy ekspertowe oparte są na wnioskowaniu, które to wywodzi się z logiki matematycznej. Pozwala ona w jednoznaczny sposób stwierdzić "czy z założeń wynikają konkluzje, niezależnie o d ich prawdziwości lub fałszywości i niezależnie od tego, jakich spraw dotyczą".
W systemach ekspertowych najczęściej występują trzy podstawowe strategie wnioskowania:
wnioskowanie w przód (zwane też progresywnym),
wnioskowanie wstecz (zwane też regresywnym),
wnioskowanie mieszane.
Oprócz tych najpopularniejszych metod, spotyka się także wnioskowanie rozmyte stosowane w sytuacjach, w których mamy do czynienia z wiedzą niepewną
Wnioskowanie w przód
Wnioskowanie w przód niekiedy określa się terminem "sterowane danymi" (ang. data driven). Wynika to z tego, że na początku dostępne są tylko znane fakty oraz reguły, które stanowią bazę wnioskowania [7]. Mechanizm wnioskowania jest dosyć prosty. Otóż generujemy nowe fakty, aż do chwili, gdy pośród wygenerowanych faktów znajdzie się zadany cel (hipoteza) lub gdy w bazie wiedzy nie znajduje się już żadna reguła do uaktualnienia. Cechą charakterystyczną wnioskowania progresywnego jest stale zwiększająca się liczba faktów. Niekiedy postrzega się jako jedną z największych wad tego wnioskowania. W skrajnym wypadku generowanie dużej ilości faktów może prowadzić do całkowitego zapełnienia pamięci [6]. Algorytm wnioskowania w przód można przedstawić w postaci następujących kroków:
Krok 1: Sprawdzamy, czy przesłanki którejś z reguł można dopasować do faktów w bazie wiedzy. Jeżeli odpowiedź jest pozytywna, wówczas dana reguła zostaje uaktywniana. W tym celu należy użyć odpowiedniej (zadeklarowanej wcześniej) strategii sterowania wnioskowaniem.
Krok 2: Z wybranej w ten sposób reguły, odczytujemy konkluzję, która następnie umieszczana jest w bazie wiedzy jako nowy fakt. By algorytm wnioskowania nie wpadł w niekończącą się pętlę, zapisujemy, że dana reguła została już wykorzystana.
Krok 3: W sytuacji, gdy cel wnioskowania nie został osiągnięty i gdy nie wszystkie reguły zostały jeszcze użyte - wracamy do Kroku 1, czyli do początku wnioskowania [7].
W celu lepszej ilustracji mechanizmu wnioskowania, konieczna jest przykładowa baza wiedzy, zawierająca reguły oraz fakty
Reguła 1: IF a AND b THEN c
Reguła 2: IF d AND e THEN a
Reguła 3: IF c AND f THEN g
Fakty: b, d, e, f .
Przebieg wnioskowania w przód w takiej bazie wiedzy:
Patrzymy na Krok 1 algorytmu wnioskowania, Gdy dopasowujemy przesłanki reguł do faktów zauważamy, że Regułę 2 należy uaktywnić i wtedy na tej podstawie dopisać konkluzję wspomnianej reguły do bazy wiedzy. W tej sytuacji stan bazy wiedzy wygląda następująco: b, d, e, f, a (dopisany ostatnio).
Ponownie rozpatrujemy dopasowanie przesłanek reguł do faktów. Widzimy, że Reguła 1 może z ostać uaktywniona. Dopisujemy zatem fakt c do bazy wiedzy. Odnotowujemy także, że Reguła 1 została już wykorzystana. Oto zawartość listy faktów: b, d, e, f, a, c.
Pozostało nam już tylko i wyłącznie uaktywnić Regułę 3. Do bazy wiedzy zostaje dodany fakt g. W tym momencie proces wnioskowania skończył się. Wszystkie reguły zostały wykorzystane. Wygenerowaliśmy także wszystkie nowe fakty.
Wnioskowanie wstecz
Nie trudno się domyślić, że wnioskowanie wstecz przebiega w odwrotną stronę niż wspomniane wcześniej wnioskowanie w przód. Wnioskowanie regresywne określa się także mianem "sterowane celem" (ang. goal driven). Związane jest to z tym, że proces wnioskowania zaczyna się od postawienia hipotezy, która może zostać potwierdzona lub nie (poprzez szukanie odpowiednich dowodów) [7]. Inaczej mówiąc, polega na "wykazaniu prawdziwości hipotezy głównej na podstawie prawdziwości przesłanek"[6]. Wnioskowanie wstecz zwane też wnioskowaniem regresywnym, oparte jest na regule modus toluens [7].
Wnioskowanie wstecz znacznie różnie się od wnioskowania w przód. Przede wszystkim liczba generowanych faktów jest mniejsza oraz nie można dowodzić w tym samym czasie kilku hipotez (jak to miało miejsce w procesie wnioskowania w przód). "Ogólnie w typowych zastosowaniach wnioskowanie wstecz jest efektywniejsze i bardziej rozpowszechnione. Należy również podkreślić, że przy wnioskowaniu wstecz czas oczekiwania na osiągnięcie rozwiązania postawionej hipotezy jest w wielu przypadkach dużo krótszy niż przy wnioskowaniu w przód".
Oto kroki algorytmu wnioskowania wstecz:
Krok 1: Na początku sprawdzamy, czy wybrana hipoteza jest faktem w bazie wiedzy. Jeśli odpowiedź jest negatywna, przechodzimy do następnych kroków, w których należy wykazać jej prawdziwość.
Krok 2: Kolejnym etapem jest sprawdzenie czy główna hipoteza, którą chcemy udowodnić jest konkluzją jakiejś reguły. Jeśli taka sytuacja ma miejsce, wówczas konkluzja tej reguły jest automatycznie uznawana za prawdziwą. W momencie, gdy któraś z przesłanek nie jest faktem w bazie wiedzy, wtedy jest ona postulowana i udowadniana zgodnie z algorytmem.
Krok 3: Dopóki hipoteza główna nie zostanie potwierdzona lub obalona, powtarzamy cały algorytm. Jeśli zostanie potwierdzona lub obalona - wówczas kończymy cały algorytm [7].
W celu lepszej ilustracji mechanizmu wnioskowania wstecz, konieczna jest przykładowa baza wiedzy zawierająca reguły oraz fakty.
Reguła 1: IF a AND b THEN c
Reguła 2: IF d AND e THEN a
Reguła 3: IF c AND f THEN g
Fakty: b, d, e, f
Załóżmy, że chcemy udowodnić hipotezę g. Proces ten będzie wyglądał następująco:
Sprawdzamy czy baza wiedzy zawiera fakt w postaci hipotezy głównej g. Jeśli g nie jest faktem, to przechodzimy do następnego kroku.
Zgodnie z Krokiem 2 algorytmu wnioskowania, sprawdzamy czy g jest konkluzją jakiejś reguły. Okazuje się, że g jest konkluzją Reguły3. Następnie sprawdzamy czy przesłanki tej reguły są faktami w bazie wiedzy. Jak widać, pierwsza przesłanka Reguły 3 - c, nie jest faktem. Jest ona postulowana i zostanie udowodniona w następnym kroku.
Przyglądamy się bliżej przesłance c i sprawdzamy, czy jest konkluzją jakiejś innej reguły. Okazuje się, że tak - przesłanka c, to wniosek Reguły 1. Przechodzimy do wykazywania tejże reguły. Pierwsza przesłanka Reguły 1 (czyli a), nie jest faktem w bazie wiedzy. Widzimy, że a jest wnioskiem Reguły 2, którą teraz się zajmiemy.
By udowodnić prawdziwość Reguły 2, należy wykazać czy jej przesłanki są faktami w bazie wiedzy. Stwierdzamy, że fakt a jest prawdziwy, ponieważ d i e są faktami w bazie wiedzy.
Następnie powracamy do Reguły 1. Sprawdzamy czy druga przesłanka reguły (przesłanka b) jest prawdziwa. By była prawdziwa musi być faktem w bazie wiedzy. Konkluzja Reguły 1 okazuje się prawdziwa, gdyż b jest faktem w bazie.
Ponownie zajmujemy się Regułą 3 wracając tym samym do Kroku 2 wnioskowania. Sprawdzamy prawdziwość przesłanki f. Ponieważ jest ona faktem w bazie wiedzy, konkluzja Reguły 3 jest prawdziwa. Hipoteza główna g została wykazana poprzez prawdziwość przesłanek c i f. To kończy proces wnioskowania [7].
11
Instrukcje
Proste
Strukturalne
Przypisania
Procedury
Skoku
Pusta
Złożone
Warunkowe
Jeżeli
Wyboru
Pętle
Dopóki
Wiążąca
Powtarzaj
Dla
Elementarne
Instrukcje
Bezpostaciowe
Tekstowe
Bezpostaciowe
Typowe
Rekordy
Zbiory
Łańcuchy
Tablica
Rzeczywiste
Porządkowe
Wskaźnikowe
Strukturalne
Skalarne
Typy danych
Dla
Powtarzaj
Dopóki
Iteracyjne
Wyboru
Jeżeli
Warunkowe
Wyrażeniowa
Proste
Continue
Proste
Break
goto
Sterujące
return
złożone
proste
Typy danych
Arytmetyczne
Wskaźnikowe
Referencyjne
Tablice
Struktury
Unie
Klasy
Bezpostaciowe
Typowe
Całkowite
Rzeczywiste
Wierzchołek stosu
NIL
Początek kolejki
NIL Wejście