ZW/LS/L2
From WikiZMSI
Spis treści |
Laboratorium 2 --- wstęp do CLIPSa
CLIPS jest narzędziem do budowania systemów ekspertowych w postaci regułowej (IF THEN) i lub obiektowej.
CLIPS zapewnia środowisko do opisywania wiedzy zgodnie z trzema paradygmatami programowania: regułowy, obiektowy i proceduralny.
Otwarcie i zamknięcie programu
CLIPS zgłasza się znakiem zachęty CLIPS> i oczekuje na komendy. Kilka użytecznych poleceń:
- (exit) zamyka CLIPSa.
- (clear) usuwa wszystkie programy i dane z pamięci (podobne do procedury restart).
- (reset) usuwa dynamiczne dane z pamięci
- (run) uruchamia program
- CTRL+C kończy pętlę
Fakty
1. W CLIPS można tworzyć bazę wiedzy, która zawiera fakty i reguły. Fakty można wprowadzać poleceniem (assert) np.
CLIPS>(assert (kolor zielony)) <Fact-1>
Polecenie (assert), jak równiez inne polecenia, instrukcje lub fakty sa objete nawiasami.
2. Aby sprawdzić listę wprowadzonych faktów należy podać komendę (facts).
3. Fakty można usuwać poleceniem (retract nr_faktu). Zawsze trzeba podać numer faktu. Numer faktu usuniętego nie jest ponownie wykorzystywany.
CLIPS> (assert (kolor czerwony)) ; Komentarz <Fact-2>
CLIPS> (facts) f-0 (initial-fact) f-1 (kolor zielony) f-2 (kolor czerwony) For a total of 3 facts.
CLIPS> (retract 1)
CLIPS> (facts) f-0 (initial-fact) f-2 (kolor czerwony) For a total of 2 facts.
4. Komentarz rozpoczyna się średnikiem i trwa do końca linijki.
5. Polecenie (clear) kasuje wszystko, przywraca stan początkowy.
6. W celu unikniecia koniecznosci wielokrotnego wpisywania pojedynczych faktów mozna zdefiniowac blok faktów, uzywajac polecenia (deffacts), np.
(deffacts skrzyzowanie (status stoj) (status idz))
Po słowie kluczowym deffacts podaje sie nazwe definiowanego bloku, a nastepnie fakty (w nawiasach). Cała instrukcja jest ujeta w nawiasy. Fakty zdefiniowane w ten sposób sa wprowadzane na liste faktów przez polecenie (reset).
7. Polecenie (reset) usuwa wszystkie fakty z listy, a nastepnie wprowadza fakty zdefiniowane przez (deffacts) oraz fakt (initial-fact) z indeksem f-0.
8. Fakty zdefiniowane przez (deffacts) i wprowadzone na liste faktów, przez (reset) moga byc w prosty sposób usuniete z tej listy przez uzycie słowa kluczowego (undeffacts) wraz z nazwa bloku faktów np.
(undeffacts skrzyzowanie)
9. Definiowanie struktury faktów przy użyciu konstrukcji (deftemplate). Podaje się strukturę, która opisuje pewien obiekt i jakie jego cechy mogą być podane.
(deftemplate <relation-name> [<optional comment>] <slot-definition>*)
(deftemplate osoba (slot imie) (slot wiek) (slot kolor-wlosow) (multislot bracia) (multislot siostry))
10. Na podstawie wzorca można wprowadzać fakty wykorzystując polecenie assert. Zaleta deftemplate: nie ma potrzeby wypełniania wszystkich slotów a ich kolejność nie jest obowiązkowa.
(assert (osoba (imie greg))) (assert (osoba (imie joe)(wiek 32)(kolor-wlosow brazowy)(bracia mat mik)(siostry jane))) (assert (osoba (wiek 44)(imie ken)))
11. Wprowadzanie faktów ze wzorca może też być wykonane przez polecenie (deffacts):
deffacts <deffacts name> [<optional comment>] <facts>)
(deffacts znajomi (osoba (imie greg)) (osoba (wiek 44)(imie ken)) (osoba (siostry mary)))
12. Polecenie musi być poprzedzone deftemplate (o ile korzystamy ze wzorców). Po wykonaniu polecenia (reset) CLIPS umieści fakty w liście faktów.
Reguły
W Clipsie reguły maja konstrukcje zblizona do instrukcji (IF ... THEN ...), używanych w powszechnie stosowanych jezykach programowania. Słowo IF dla uproszczenia jest pomijane, słowo THEN jest zastepowane symbolem =>:
(defrule <rule-name> <facts>+ => <actions>*)
Przykład:
(defrule kaczka (zwierze kaczka) => (assert (dzwiek kwacze)))
Jeżeli w bazie jest fakt, że istnieje zwierzę kaczka, to dodaj kolejny fakt do bazy, że kaczka kwacze.
Reguła Clipsu składa sie z nastepujacych elementów:
- Nawiasy. Cała reguła musi byc umieszczona w nawisach.
- Słowo kluczowe defrule. Oznacza, ze nastepujacych dalej ciag znaków definiuje
regułe.
- Obligatoryjna nazwa reguły. Uzycie po raz drugi tej samej nazwy powoduje
usuniecie poprzednio wprowadzonej reguły o tej nazwie. Nazwa reguły moze byc tylko atom zaczynajacy sie od litery.
- Opcjonalny komentarz (w cudzysłowie).
- Pole warunków. Moze ono zawierac jeden lub wiecej warunków. Jesli wszystkie
warunki sa spełnione, to reguła przechodzi do zbioru reguł zwanego agenda. Tylko reguły z tego zbioru moga byc pózniej uaktywnione.
- Symbol => reprezentuje w regule słowo THEN.
- Lista działan, jakie zostana podjete w chwili uaktywnienia reguły.
Zadanie 1:
- Wyczyść pamięć
- Dodaj do bazy regułę o kaczce. Polecenie (rules) wyświetla listę wszystkich reguł w obowiązującej bazie. Natomiast polecenie (ppdefrule <rule-name>) wyświetla pełną definicję reguły.
- Dodaj fakt, że jest zwierz kaczka.
- Wypisz wszystkie fakty (facts).
- Wykonaj polecenie (run).
- Sprawdź ponownie listę faktów. (Nowe fakty są wynikiem wnioskowania z reguły kaczka).
Zadanie 2:
1 Dodaj do bazy regułę:
(defrule czy-to-kaczka ;Ta reguła ma dwa fakty (połączone spójnikiem AND) w IF i obie muszą być spełnione (zwierze-ma pletwy) (zwierze-ma piora) => (assert (zwierze kaczka)))
2. Wpisz (reset), które wyczyści z pamięci fakty, a reguły nadal pozostaną w bazie.
3. Wprowadź fakty, że zwierzę ma płetwy i pióra. Aby jakas reguła została ponownie uaktywniona, użyte przez nia fakty muszą być usunięte z listy faktów, po czym jeszcze raz za nia wprowadzone. Uruchom wnioskowanie (run).
4. Clips umożliwia kontrolę wykonywania programu dzięki zastosowaniu polecenia (watch).
- (watch facts) - wprowadzenia faktów i usuwania faktów,
- (watch rules) - wykonywania reguł,
- (watch activations) - uaktywniania reguł.
Reguły z komunikatem
W celu lepszej komunikacji z użytkownikiem można stosować komunikaty na ekranie:
(defrule kaczka (zwierze kaczka) => (assert (dzwiek kwacze)) (printout t "To jest kaczka" crlf))
Wprowadzić regułę i doprowadzić do jej odpalenia (run).
Zmienne
Reguły ze zmiennymi używają ?symbol do reprezentowania pewnej grupy obiektów, na których reguła działa.
(defrule drapieznik (ma-pazury ?x) => (assert (jest-drapieznik ?x)))
Dodaj fakt, że pantera ma pazury, odpal reguły poleceniem (run) i zobacz jaki fakt powstanie.
Zadania do samodzielnego wykonania
Zadanie 1:
- Pobierz plik Przyklad
- Wczytaj go podając polecenie (load "Przyklad.clp")
- Jakie w pliku są fakty? Jakie są reguły?
- Jakie fakty można wywnioskować z danych?
- Dodaj elementy wypisujące komunikaty o wnioskach na ekranie.
Zadanie 2:
- Zadaniem jest stworzenie systemu wnioskującego o tym co można ugotować na podstawie zawartości lodówki (kuchni).
- Zdefiniuj fakty o tym co jest w lodówce (kuchni) np. fakt, że mamy mąkę można zapisać jako (assert (maka)).
- Zdefiniuj reguły na przepisy np. Aby zrobić jajecznicę potrzebujemy jaja i masło.
- Reguły mają się kończyć wypisaniem na ekranie jakie dania jesteśmy w stanie przygotować mając do dyspozycji pewną liczbę produktów).
- Kod zapisać w pliku.
Zadanie 3:
1. Pobierz schemat przedstawiający drzewo decyzyjne o usterce w samochodzie Schemat
2. Zapisz reguły zgodnie z tym co sugeruje drzewo. Każdy liść, to zalecenie, wniosek, prawdopodobnie wypisany na ekranie np. BUY PETROL! Każdy blok kwadratowy to jest dowód, reprezentowany przez fakt, który wskazuje na daną usterkę np. (starter_turning yes) i (petrol no). Te fakty mogłyby być podane przez użytkownika w sesji pytań i odpowiedzi lub po prostu z konsoli CLIPSa.
CLIPS> (assert (petrol no) (starter_turning yes))
Każda ścieżka do liścia reprezentuje jedną regułę, np. IF starter is turning AND there is no petrol THEN buy some petrol.
3. Sprawdź działanie przez załadowanie reguł i podanie faktów, które są wiadome użytkownikowi samochodu, a które mogą wskazywać na daną usterkę.
Zadanie 4:
- Wykorzystaj schemat zależności rodzinnych z poprzednich zajęć.
- Napisz bazę wiedzy zawierającą fakty o rodzicach i płci osób.
- zdefiniuj reguły na: matkę, ojca, dziadka itp.