CLIPS - wprowadzenie
Transkrypt
CLIPS - wprowadzenie
CLIPS - wprowadzenie Witold Paluszyński [email protected] http://sequoia.ict.pwr.wroc.pl/∼ witold/ c 2003-2008 Witold Paluszyński Copyright All rights reserved. Niniejszy dokument zawiera materialy do wykladu na temat programowania w je֒ zyku CLIPS. Jest on udoste֒ pniony pod warunkiem wykorzystania wyla֒cznie do wlasnych, prywatnych potrzeb i może być kopiowany wyla֒cznie w calości, razem z niniejsza֒ strona֒ tytulowa֒. Regulowe systemy produkcji Regulowe systemy produkcji sa֒ jednym z ważnych paradygmatów konstrukcji praktycznych systemów sztucznej inteligencji, gdzie wiedza systemu jest zebrana w postaci zestawu regul produkcji. Każda z tych regul przedstawia soba֒ pojedynczy fakt skojarzeniowy skladaja֒cy sie֒ z zalożeń i wniosków. Proces wnioskowania przeprowadzany jest przez calkowicie ogólna֒ procedure֒ , która rozumie jedynie strukture֒ (a nie treść) regul i potrafi wybierać odpowiednie reguly i prowadzić wnioskowanie kieruja֒c sie֒ calkowicie ogólnymi strategiami. ' $ $ ? ? PR: Pamieć ֒ robocza (lista faktów i obiektów) PP PP PP PP PP q BW: Baza wiedzy (lista regul produkcji) ) UW: Urza֒dzenie wnioskuja֒ce (interpreter regul produkcji) & Regulowe systemy produkcji zmiany % 1 Cykl roboczy systemu produkcji Praca systemu produkcji polega na cyklicznym wybieraniu i wykonywaniu jednej reguly, której cześć ֒ warunkowa jest spelniona przez aktualna֒ zawartość pamie֒ ci roboczej PR. Taki schemat nazywany jest schematem rozpoznaj-dzialaj (recognize-act cycle). Realizuje go element wykonawczy, urza֒dzenie wnioskuja֒ce UW. Jest to interpreter regul produkcji, który poza ogólna֒ strategia֒ wyboru, zna jedynie skladnie֒ regul i potrafi je wykonywać. PR := opis stanu pocza֒tkowego ' ? ZK := zbiór produkcji ze spelnionymi warunkami (jeśli pusty to system kończy prace֒ ) ? R := regula wybrana ze ZK zgodnie ze strategia֒ ? wykonanie reguly R: PR := R(PR), BW := R(BW) & Regulowe systemy produkcji % 2 Po wste֒ pnym wpisaniu danych pocza֒tkowych do pamie֒ ci roboczej, w pierwszym kroku cyklu roboczego UW bada cześ ֒ ci warunkowe wszystkich regul. Te, których warunki sa֒ spelnione tworza֒ tzw. zbiór konfliktowy ZK (conflict set). Konflikt wynika z faktu, że tylko jedna regula może być wybrana do wykonania. W drugim kroku interpreter regul wybiera jedna֒ regule֒ ze zbioru konfliktowego, by naste֒ pnie w kroku trzecim ja֒ wykonać. Wykonywanie reguly nazywane jest jej odpalaniem. Sposób wyboru reguly do odpalenia, zwany strategia֒, może być różny w różnych realizacjach systemów produkcji, natomiast sposób i skutki odpalenia reguly określa jej cześć ֒ wykonawcza, zwana ”akcja” ֒ . Akcja może dodawać, usuwać, lub modyfikować dane w pamie֒ ci roboczej. Może również spowodować jakiś efekt uboczny typu operacji I/O na urza֒dzeniu zewne֒ trznym. W niektórych realizacjach systemów produkcji akcje moga֒ również modyfikować reguly BW (dodawać, usuwać). Jest to równoważne samomodyfikacji programu. Regulowe systemy produkcji 3 CLIPS: wprowadzenie CLIPS jest narze֒ dziem do budowy i osadzania systemów doradczych opartych o reprezentacje֒ regulowa֒, ale umożliwia również wykorzystanie programowania proceduralnego i obiektowego. Ze wzgle֒ du na doste֒ pność w wersji źródlowej jest możliwe zarówno importowanie zewne֒ trznych procedur napisanych w C, jak i zanurzanie aplikacji napisanych w CLIPS-ie w innych programach. Pierwsza wersja CLIPSa zostala napisana w polowie lat 80-tych (ubieglego wieku) w ośrodku NASA Johnson Space Center. Jego pierwotnym przeznaczeniem bylo pisanie systemów wspomagaja֒cych podejmowanie decyzji dotycza֒cych planowania lotów promów kosmicznych. CLIPS byl prawie od pocza֒tku doste֒ pny w źródle dla zainteresowanych, choć przez szereg lat NASA sprzedawala licencje do zastosowań komercyjnych. Obecnie NASA pozbyla sie֒ praw i obowia֒zków zwia֒zanych z CLIPS-em i jest on doste֒ pny na zasadzie public domain dla dowolnych zastosowań. CLIPS — wprowadzenie 4 CLIPS: fakty proste Proste fakty nie maja֒ żadnej struktury, istotny jest w nich tylko porza֒dek. Dlatego sa֒ również nazywane faktami uporza֒dkowanymi (ordered facts). Definiujemy je funkcja֒ assert: (assert (jas)) (assert (ma jas klocki)) (assert (ma jas malgosia)) (facts) (clear) ; ; ; (reset) ; ; ; (exit) ; kasuje wszystko, przywraca stan poczatkowy Clipsa kasuje efekty dzialania programu, umozliwia restart konczy prace CLIPSa CLIPS — wprowadzenie sierra-41> clips CLIPS (V6.10 07/01/98) CLIPS> (assert (jas)) <Fact-0> CLIPS> (assert (ma jas klocki)) <Fact-1> CLIPS> (assert (ma jas malgosia)) <Fact-2> CLIPS> (facts) f-0 (jas) f-1 (ma jas klocki) f-2 (ma jas malgosia) For a total of 3 facts. CLIPS> (clear) CLIPS> (facts) CLIPS> (exit) sierra-42> 5 Zasady budowania faktów prostych Kolejne elementy listy tworza֒cej fakt prosty sa֒ polami, których znaczenie jest glównie pozycyjne. Z pewnych wzgle֒ dów najważniejsze jest pierwsze pole, w którym normalnie umieszcza sie֒ symbol relacji wiaż ֒ a֒cej dalsze pola. Przy systematycznym budowaniu zestawu faktów można przypisać konkretne pozycje do cech lub zestawów cech, które na danej pozycji moglyby wysta֒pić. Można stosować wartości typu nic” tylko dlatego, że wcześniejsze pole musi coś ” zawierać, jeśli ważne sa֒ dalsze pola. (assert (assert (assert (assert (assert (assert (ma jas (ma jas (ma jas (jas ma (ma jas (ma jas kolekcja motyli)) ; dobrze kolekcja tropikalnych motyli)) ; zle kolekcja motyli tropikalnych)) ; lepiej ciekawa kolekcja tropikalnych motyli)) ; zle hodowle motyli)) - motyli)) ; kolekcje/hodowle/encyklopedie Jak wkrótce zobaczymy, istnieja֒ w CLIPSie konstrukcje, które nadaja֒ sie֒ do wyrażania zjawisk o skomplikowanej strukturze lepiej niż fakty proste. CLIPS — wprowadzenie 6 Fakty uporza֒dkowane nie moga֒ mieć struktury, ale wywolania CLIPSa moga֒ być zlożone i zawierać wywolania funkcji: CLIPS> (assert (ma jas (kolekcja motyli))) [EXPRNPSR3] Missing function declaration for kolekcja. CLIPS> (assert (ma jas (+ 3 4) lat)) <Fact-0> CLIPS> (facts) f-0 (ma jas 7 lat) For a total of 1 fact. Jak już zauważyliśmy, fakty otrzymuja֒ chronologiczne indeksy o postaci typu: f-0, f-1, itp. Indeksy te pozwalaja֒ odnosić sie֒ do konkretnego faktu, np. w celu jego skasowania: (retract 1) (retract *) ; niebezpieczne Chronologia faktów jest istotna w dzialaniu programów, na przyklad jest wykorzystywana jako element strategii. CLIPS — wprowadzenie 7 CLIPS — wprowadzenie 8 Reguly CLIPS pozwala na definiowanie regul zawieraja֒cych warunki i akcje. Regula której warunek jest spelniony przez aktualny zbiór faktów może zostać w każdej chwili odpalona” przez CLIPS, tzn. jej akcja wykonana. Akcje regul moga֒ ” dodawać, usuwać lub zmieniać fakty, wyświetlać na terminalu, wykonywac operacje na plikach, a także tworzyć nowe reguly. (defrule beztroska (ma jas kolekcja motyli) => (assert (ma jas szczesliwe-dziecinstwo))) (defrule niestety (ma jas kolezanka malgosia) => (assert (ma jas klopoty))) CLIPS — wprowadzenie 9 Śledzenie zmian w pamieci roboczej ֒ Funkcja watch pozwala śledzić zmiany zachodza֒ce w środowisku roboczym w trakcie pracy programu. Nie jest to potrzebne przy tworzeniu lub kasowaniu faktów z palca” lecz przy uruchamianiu regul staje sie֒ cennym narze֒ dziem: ” CLIPS> (assert (ma jas kolega zdzich)) <Fact-0> CLIPS> (watch facts) CLIPS> (assert (ma jas kolezanka malgosia)) ==> f-1 (ma jas kolezanka malgosia) <Fact-1> CLIPS> (retract 0) <== f-0 (ma jas kolega zdzich) CLIPS — wprowadzenie 10 Uruchamianie systemu regulowego CLIPS> (defrule beztroska (ma jas kolekcja motyli) => (assert (ma jas szczesliwe-dziecinstwo))) CLIPS> (defrule niestety (ma jas kolezanka malgosia) => (assert (ma jas klopoty))) CLIPS> (rules) beztroska niestety For a total of 2 defrules. CLIPS> (assert (ma jas kolekcja motyli)) <Fact-0> CLIPS> (assert (ma jas kolezanka malgosia)) <Fact-1> CLIPS> (agenda) 0 niestety: f-1 0 beztroska: f-0 For a total of 2 activations. CLIPS> (watch facts) CLIPS — wprowadzenie 11 CLIPS> (run) ==> f-2 (ma jas klopoty) ==> f-3 (ma jas szczesliwe-dziecinstwo) CLIPS> (facts) f-0 (ma jas kolekcja motyli) f-1 (ma jas kolezanka malgosia) f-2 (ma jas klopoty) f-3 (ma jas szczesliwe-dziecinstwo) For a total of 4 facts. CLIPS> (unwatch facts) CLIPS> (reset) CLIPS> (rules) beztroska niestety For a total of 2 defrules. CLIPS> (facts) f-0 (initial-fact) For a total of 1 fact. CLIPS> (clear) CLIPS> (rules) CLIPS> (exit) CLIPS — wprowadzenie 12 Wzorce Reguly moga֒ zawierać w cześ ֒ ci warunkowej wzorce, pozwalaja֒ce wyrażać pewne zależności ogólne. Wzorce zwykle wprowadzaja֒ zmienne, zapisywane ze znakiem zapytania, co pozwala tworzyć akcje zależne od konkretnej postaci faktu dopasowanego do danego wzorca. Zakresem zmiennej jest zawieraja֒ca go regula. (defrule lubi-to-co-ma (ma ?x ?y) => (assert (lubi ?x ?y))) (defrule lubi-to-co-ma-2 (ma ?x ?y $?z) => (assert (lubi ?x ?y ?z))) (defrule szczesliwy-ten-co-ma-co-lubi (ma ?x ?y $?) (lubi ?x ?y $?) => (assert (szczesliwy ?x))) Poza zwyklymi zmiennymi, Clips posiada zmienne wielopozycyjne”, zapisywane ” z dodatkowym znakiem dolara, pod które dopasowuje cia֒gi n-elementowe (0 lub wie֒ cej). CLIPS — wprowadzenie 13 Wzorcami moga֒ być fakty, ale moga֒ być również wyrażenia warunkowe obliczane przez Clips, zapisywane z wywolaniem funkcji test. (defrule niestety-2 (ma ?x kolezanka ?y) (wiek ?y ?z) (test (> ?z 16)) => (assert (ma ?x klopoty))) (defrule klopoty-biora-gore (ma ?x klopoty) ?f <- (szczesliwy ?x) => (retract ?f)) CLIPS — wprowadzenie 14 Przydatne funkcje pomocnicze Spróbujmy teraz uruchomić jakieś proste reguly na utworzonych przykladowych faktach. Aby ulatwić sobie wielokrotne powtarzanie danego ćwiczenia, warto pewne konstrukcje zapamie֒ tać w pliku dyskowym. Zestaw definicji regul możemy zapisać na pliku i ladować je do CLIPSa funkcja֒ load. Z jakichś powodów nie możemy tak samo posta֒pić z deklaracjami tworzenia faktów assert, lecz jest to możliwe dla konstrukcji deffacts, nawet bardziej przydatnej. (defrule lubi-co-ma-2 (ma ?x ?y $?z) => (assert (lubi ?x ?y ?z))) (deffacts koledzy-jasia (ma jas kolega zdzich) (ma jas kolezanka malgosia) (ma jas kolekcja motyli) (wiek jas 15)) CLIPS — wprowadzenie 15 CLIPS> (load "konstrukcje.clips") CLIPS> (facts) CLIPS> (reset) CLIPS> (facts) f-0 (initial-fact) f-1 (ma jas kolega zdzich) f-2 (ma jas kolezanka malgosia) f-3 (ma jas kolekcja motyli) f-4 (wiek jas 15) For a total of 5 facts. CLIPS> (run) CLIPS> (facts) f-0 (initial-fact) f-1 (ma jas kolega zdzich) f-2 (ma jas kolezanka malgosia) f-3 (ma jas kolekcja motyli) f-4 (wiek jas 15) f-5 (lubi jas kolekcja motyli) f-6 (lubi jas kolezanka malgosia) f-7 (lubi jas kolega zdzich) For a total of 8 facts. CLIPS> (exit) CLIPS — wprowadzenie 16 Przyklad: Jaś i klopoty Poniższy przyklad pokazuje prosty system wycia֒gaja֒cy wnioski z malego zestawu faktów. Niestety, wnioski sa֒ czasami zbyt daleko ida֒ce (np. że Jaś lubi swoje klopoty, albo, że jest szcześ ֒ liwy gdy jednocześnie ma klopoty). Konieczne jest uwgle֒ dnianie takich wyja֒tków albo przez uszczególowienie reguly, albo przez dodanie innej reguly koryguja֒cej już wycia֒gnie֒ te wnioski. (deffacts jas_przyjaciele (ma jas kolega zdzich) (wiek zdzich 18) (ma jas kolega rychu) (wiek rychu 19) (ma jas kolezanka malgosia) (wiek malgosia 17)) (defrule niestety-2 (ma ?x kolezanka ?y) (wiek ?y ?z) (test (> ?z 16)) => (assert (ma ?x klopoty))) CLIPS — wprowadzenie 17 ;;;(defrule ;;; ;;; ;;; => ;;; lubi-to-co-ma-2a (ma ?x ?y $?z) (test (not (eq ?y klopoty))) (assert (lubi ?x ?y ?z))) (defrule lubi-to-co-ma-2b (ma ?x ?y&~klopoty $?z) => (assert (lubi ?x ?y ?z))) (defrule szczesliwy-ten-co-ma-co-lubi (ma ?x ?y $?) (lubi ?x ?y $?) => (assert (szczesliwy ?x))) (defrule klopoty-biora-gore (ma ?x klopoty) ?f <- (szczesliwy ?x) => (retract ?f)) CLIPS — wprowadzenie 18 Dalsze funkcje wspomagajace debuggowanie i inne ֒ (set break <nazwa-reguly>) (remove-break <nazwa-reguly>) (show-breaks) (agenda) ; wyswietla zestaw regul mozliwych do odpalenia (matches <nazwa-reguly>) ; wyswietla fakty spelniajace warunki reguly (ppdefrule <nazwa-reguly>) ; wyswietla "pieknie" sformatowana regule (list-defrules) (save "nazwa-pliku") (read) ; czyta jedno slowo z wejscia, zwraca jako symbol (readline) ; czyta jeden wiersz z wejscia, zwraca jako string (printout t "Wartosc zmiennej: " ?x crlf crlf) CLIPS — wprowadzenie 19 Fakty strukturalne deftemplate Fakty deftemplate trzeba zdefiniować przed użyciem, ale daja֒ one dodatkowe mechanizmy, jak również wie֒ ksza֒ elastyczność poslugiwania sie֒ . CLIPS> (deftemplate osoba (slot imie (default ?NONE)) (slot wiek (type INTEGER)) (slot plec (type SYMBOL) (allowed-symbols M K) (default ?NONE))) CLIPS> (assert (osoba (wiek 0))) [TMPLTRHS1] Slot imie requires a value because of its (default ?NONE) attribute. CLIPS> (assert (osoba (imie jacus) (wiek 0))) [TMPLTRHS1] Slot plec requires a value because of its (default ?NONE) attribute. CLIPS> (assert (osoba (imie jacus) (wiek zero) (plec M))) [CSTRNCHK1] A literal slot value found in the assert command does not match the allowed types for slot wiek. CLIPS> (assert (osoba (imie jacus) (wiek 0) (plec M))) <Fact-1> CLIPS> (assert (osoba (imie filip) (wiek 23) (plec M+K))) [CSTRNCHK1] A literal slot value found in the assert command does not match the allowed values for slot plec. CLIPS — wprowadzenie 20 (deffacts jas_przyjaciele (osoba (imie jas) (wiek 16) (plec M)) (osoba (imie zdzich) (wiek 18) (plec M)) (osoba (imie rychu) (wiek 19) (plec M)) (osoba (imie malgosia) (wiek 17) (plec K)) (koledzy (osoba1 jas) (osoba2 zdzich)) (koledzy (osoba1 jas) (osoba2 rychu)) (koledzy (osoba1 jas) (osoba2 malgosia))) (deftemplate koledzy (slot osoba1) (slot osoba2)) (defrule koledzy-symetria (koledzy (osoba1 ?o1) (osoba2 ?o2&~?o1)) => (assert (koledzy (osoba1 ?o2) (osoba2 ?o1)))) (defrule koledzy-przechodniosc (koledzy (osoba1 ?o1) (osoba2 ?o2)) (koledzy (osoba1 ?o2) (osoba2 ?o3&~?o1)) => (assert (koledzy (osoba1 ?o1) (osoba2 ?o3)))) CLIPS — wprowadzenie 21 CLIPS> (run) CLIPS (V6.24 06/15/06) CLIPS> (facts) CLIPS> (load jas_struct.clp) f-0 (initial-fact) Defining deftemplate: osoba f-1 (osoba (imie jas) (wiek 16) (plec M)) Defining deftemplate: koledzy f-2 (osoba (imie zdzich) (wiek 18) (plec M)) Defining deffacts: jas_przyjaciele f-3 (osoba (imie rychu) (wiek 19) (plec M)) Defining defrule: koledzy-symetria +j f-4 (osoba (imie malgosia) (wiek 17) (plec K)) Defining defrule: koledzy-przechodniosc +j+j f-5 (koledzy (osoba1 jas) (osoba2 zdzich)) TRUE f-6 (koledzy (osoba1 jas) (osoba2 rychu)) CLIPS> (reset) f-7 (koledzy (osoba1 jas) (osoba2 malgosia)) CLIPS> (facts) f-8 (koledzy (osoba1 malgosia) (osoba2 jas)) f-0 (initial-fact) f-9 (koledzy (osoba1 malgosia) (osoba2 rychu)) f-1 (osoba (imie jas) (wiek 16) (plec M)) f-10 (koledzy (osoba1 rychu) (osoba2 malgosia)) f-2 (osoba (imie zdzich) (wiek 18) (plec M)) f-11 (koledzy (osoba1 rychu) (osoba2 jas)) f-3 (osoba (imie rychu) (wiek 19) (plec M)) f-12 (koledzy (osoba1 rychu) (osoba2 zdzich)) f-4 (osoba (imie malgosia) (wiek 17) (plec K)) f-13 (koledzy (osoba1 zdzich) (osoba2 rychu)) f-5 (koledzy (osoba1 jas) (osoba2 zdzich)) f-14 (koledzy (osoba1 zdzich) (osoba2 jas)) f-6 (koledzy (osoba1 jas) (osoba2 rychu)) f-15 (koledzy (osoba1 zdzich) (osoba2 malgosia)) f-7 (koledzy (osoba1 jas) (osoba2 malgosia)) f-16 (koledzy (osoba1 malgosia) (osoba2 zdzich)) For a total of 8 facts. For a total of 17 facts. CLIPS — wprowadzenie 22 System obiektowy CLIPS — wprowadzenie 23 Strategia, refrakcja, priorytety Stategie doste֒ pne w CLIPS’ie (funkcja set-strategy): • wgla֒b (dopasuj reguly do ostatnio utworzonych faktów) - DOMYŚLNA • wszerz (dopasuj reguly do najdawniej utworzonych faktów) • specjalizacji (dopasuj reguly z najwie֒ ksza֒ liczba֒ najbardziej skomplikowanych warunków) • przypadkowa • jeszcze kilka innych Aktywacja raz odpalona nie be֒ dzie ponownie utworzona, chyba, że fakt, na którym zostala dopasowana otrzyma nowy indeks (stempel czasowy). Priorytety regul (salience) daja֒ metode֒ kontroli sekwencyjności wykonywania regul. Jednak NA OGÓL korzystanie z nich na stanowi bla֒d metodologiczny, podobny do wykorzystania goto w je֒ zyku proceduralnym. Nawet jeśli chcemy wprowadzić bardzo zgrubne i tylko pomocnicze sekwencjonowanie wykonania regul (np. po pola֒czeniu dwóch zestawów regul dotycza֒cych oddzielnych faz rozwia֒zywania zadania) to lepiej i czyściej jest zrobić to za pomoca֒ tzw. faktów kontrolnych. CLIPS — wprowadzenie 24 ;;; zwykle zle rozwiazanie (defrule pierwsza (declare (salience 2000)) ... ) (defrule druga (declare (salience 1000)) ... ) ;;; lepiej (defrule pierwsza ... => (assert (lec-druga)) ) (defrule druga (lec-druga) ... => ) CLIPS — wprowadzenie 25 Przyklady z zestawu wine.clp: moduly, obliczanie wartosci pewnosci rpc.clp: strategia random CLIPS — wprowadzenie 26 Przyklad: prosty uklad logiczny W poniższym przykladzie przedstawiony jest zestaw instrukcji je֒ zyka CLIPS tworza֒cy prosty uklad logiczny z dwoma wejściami (SYGNAL), jedna֒ bramka֒ logiczna֒ (OR), i jednym wyjściem (LED). Klauzule ze slowem kluczowym stanowia֒cym nazwe֒ elementu logicznego określaja֒ typ użytych elementów, natomiast klauzule ze slowem kluczowym “polaczenie” określaja֒ uklad pola֒czeń. Pierwszy argument w tych klauzulach podaje element, z którego wyjście pola֒czone jest z elementem podanym w drugim argumencie. W przypadkach gdy dany element ma wie֒ cej niż jedno wejście lub wyjście w klauzuli podany jest również numer wejścia lub wyjścia. (assert (assert (assert (assert (assert (assert (assert CLIPS — przyklad (SYGNAL S-1)) (SYGNAL S-2)) (OR O-1)) (LED L-1)) (polaczenie S-1 O-1 1)) (polaczenie S-2 O-1 2)) (polaczenie O-1 L-1)) 27 Przyklad: Uklad z elementem POWIEL Warto zwrócić uwage֒ na przyje֒ ta֒ konwencje֒ polegaja֒ca֒ na tym, że pola֒czenia istnieja֒ wyla֒cznie mie֒ dzy pojedynczymi zaciskami elementów. Każde pola֒czenie biegnie od dokladnie jednego wyjścia jakiegoś elementu do dokladnie jednego wejścia innego. Nie dopuszczamy zatem możliwości zwierania ze soba֒ wielu wejść. Aby taka֒ możliwość zapewnić wprowadzamy specjalny element, o nazwie POWIEL, jednym wejściu i dwóch wyjściach, który pozwala dowolny sygnal rozmnożyć. Kolejny przyklad przedstawia uklad, w którym jeden sygnal źródlowy podany jest jednocześnie na oba wejścia bramki XOR. (assert (assert (assert (assert (assert (assert (assert (assert CLIPS — przyklad (SYGNAL S-1)) (POWIEL P-1)) (BRAMKA-XOR X-1)) (LED L-1)) (polaczenie S-1 P-1)) (polaczenie P-1 1 X-1 1)) (polaczenie P-1 2 X-1 2)) (polaczenie X-1 L-1)) 28 Przyklad: Struktura do deklaracji bramek logicznych (deftemplate BRAMKA "struktura do reprezentacji bramek logicznych" (slot typ (type SYMBOL) (allowed-symbols NAND AND NOR OR NOT) (default ?NONE)) (slot nazwa (type SYMBOL) (default ?NONE)) (slot liczba-wejsc (type INTEGER) (default 2)) (multislot wejscia (type SYMBOL)) (slot stan-wyjscia (type SYMBOL) (allowed-symbols NIEZNANY NISKI WYSOKI) (default NIEZNANY))) CLIPS — przyklad 29 Przyklad: Regula obliczajaca stan bramki ֒ Jak widać, aby przedstawiona regula miala spelniony komplet warunków, w pamie֒ ci danych musi istnieć bramka NAND z określonymi elementami podla֒czonymi do jej wejść (to znaczy, nie be֒ dzie dopasowania gdy dla jakiejś bramki NAND wejścia be֒ da֒ nieznane). Bramki, które sa֒ podla֒czone do wejść przedmiotowej bramki NAND również musza֒ istnieć w pamie֒ ci danych. Nie jest istotny ich typ, a nawet nie jest istotne czy ich typ jest znany, ale istotne jest, że stany ich wyjść musza֒ być określone. (defrule wyznacz-wyjscie-NAND (BRAMKA (typ NAND) (nazwa ?n) (wejscia ?e1 ?e2)) (BRAMKA (nazwa ?e1) (stan-wyjscia ?s1 & WYSOKI|NISKI)) (BRAMKA (nazwa ?e2) (stan-wyjscia ?s2 & WYSOKI|NISKI)) => (bind ?w (if (and (eq ?s1 WYSOKI) (eq ?s2 WYSOKI)) then NISKI else WYSOKI)) (printout t Wyznaczony " " stan " " wyjscia " " bramki " " ?n " " jest " " ?w crlf)) CLIPS — przyklad 30 Przyklad: Fakty strukturalne definiujace maly uklad ֒ testowy (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (BRAMKA (typ (typ (typ (typ (typ (typ (typ (typ (typ (typ OR) (nazwa O-1) (stan-wyjscia WYSOKI)) OR) (nazwa O-2) (stan-wyjscia WYSOKI)) OR) (nazwa O-3) (stan-wyjscia NISKI)) OR) (nazwa O-4) (stan-wyjscia NISKI)) OR) (nazwa O-5) (stan-wyjscia NIEZNANY)) NAND) (nazwa N-1) (wejscia O-1 O-2)) NAND) (nazwa N-2) (wejscia O-2 O-3)) NAND) (nazwa N-3) (wejscia O-4 O-1)) NAND) (nazwa N-4) (wejscia O-3 O-4)) NAND) (nazwa N-5) (wejscia O-4 O-5)) Poza bramkami OR niezbe֒ dnymi w tym przykladzie dla dostarczenia sygnalów wejściowych dla badanej bramki NAND, których sygnaly wyjściowe sa֒ znane (WYSOKI lub NISKI) w przykladzie wprowadzono również dodatkowa֒ bramke֒ N-5 typu NAND, która jest zasilana w taki sposób, że jeden z sygnalów na jej wejściu jest NIEZNANY. CLIPS — przyklad 31 Przyklad: Wyniki obliczenia sygnalów wyjściowych bramek sierra-41> clips CLIPS (V6.0 05/12/93) CLIPS> (load "regula.clp") Redefining deftemplate: BRAMKA Defining defrule: wyznacz-wyjscie-NAND +j+j+j TRUE CLIPS> (load-facts "bramki.clp") TRUE CLIPS> (run) Wyznaczony stan wyjscia bramki N-4 jest WYSOKI Wyznaczony stan wyjscia bramki N-3 jest WYSOKI Wyznaczony stan wyjscia bramki N-2 jest WYSOKI Wyznaczony stan wyjscia bramki N-1 jest NISKI CLIPS> CLIPS — przyklad 32 Przyklad: Regula wyznaczajaca stan bramki w ukladzie ֒ Wcześniejsza֒ regule֒ można w prosty sposób rozszerzyć w taki sposób, aby obliczony stan wyjściowy bramki logicznej byl wpisywany do ukladu, zamiast być jedynie wyświetlany na ekranie terminala. Pozwoli to z kolei obliczyć stany wyjściowe innych bramek, zasilanych z danej, i w efekcie obliczyć wartości wszystkich wyjść ukladu (zakladaja֒c, że nie zawiera on pe֒ tli). (defrule wyznacz-wyjscie-NAND ?nand <- (BRAMKA (typ NAND) (nazwa ?n) (wejscia ?e1 ?e2)) (BRAMKA (nazwa ?e1) (stan-wyjscia ?s1 & WYSOKI|NISKI)) (BRAMKA (nazwa ?e2) (stan-wyjscia ?s2 & WYSOKI|NISKI)) => (bind ?w (if (and (eq ?s1 WYSOKI) (eq ?s2 WYSOKI)) then NISKI else WYSOKI)) (modify ?nand (stan-wyjscia ?w))) CLIPS — przyklad 33 Przyklad: Hierarchia klas do określania elementów ukladu (defclass ELEMENT (is-a USER) (slot ID# (create-accessor write))) (defclass BEZ-WYJSC (is-a USER) (slot liczba-wyjsc (access read-only) (default 0) (create-accessor read))) (defmessage-handler BEZ-WYJSC oblicz-wyjscie ()) (defclass JEDNO-WYJSCIE (is-a BEZ-WYJSC) (slot liczba-wyjsc (access read-only) (default 1) (create-accessor read)) (slot wyjscie-1 (default NIEOKRESL) (create-accessor write)) (slot wyjscie-1-zlacze (default ZIEMIA) (create-accessor write)) (slot wyjscie-1-zacisk (default 1) (create-accessor write))) CLIPS — przyklad 34 (defmessage-handler JEDNO-WYJSCIE put-wyjscie-1 after (?value) (send ?self:wyjscie-1-zlacze (sym-cat put-wejscie- ?self:wyjscie-1-zacisk) ?value)) (defclass DWA-WYJSCIA (is-a JEDNO-WYJSCIE) (slot liczba-wyjsc (access read-only) (default 2) (create-accessor read)) (slot wyjscie-2 (default NIEOKRESL) (create-accessor write)) (slot wyjscie-2-zlacze (default ZIEMIA) (create-accessor write)) (slot wyjscie-2-zacisk (default 1) (create-accessor write))) (defmessage-handler DWA-WYJSCIA put-wyjscie-1 after (?value) (send ?self:wyjscie-2-zlacze (sym-cat put-wejscie- ?self:wyjscie-2-zacisk) ?value)) (defclass BEZ-WEJSC (is-a USER) (slot liczba-wejsc (access read-only) (default 0) (create-accessor read))) CLIPS — przyklad 35 (defclass JEDNO-WEJSCIE (is-a BEZ-WEJSC) (slot liczba-wejsc (access read-only) (default 1) (create-accessor read)) (slot wejscie-1 (default NIEOKRESL) (visibility public) (create-accessor read-write)) (slot wejscie-1-zlacze (default ZIEMIA) (create-accessor write)) (slot wejscie-1-zacisk (default 1) (create-accessor write))) (defmessage-handler JEDNO-WEJSCIE put-wejscie-1 after (?value) (send ?self oblicz-wyjscie)) (defclass DWA-WEJSCIA (is-a JEDNO-WEJSCIE) (slot liczba-wejsc (access read-only) (default 2) (create-accessor read)) (slot wejscie-2 (default NIEOKRESL) (visibility public) (create-accessor write)) (slot wejscie-2-zlacze (default ZIEMIA) (create-accessor write)) CLIPS — przyklad 36 (slot wejscie-2-zacisk (default 1) (create-accessor write))) (defmessage-handler DWA-WEJSCIA put-wejscie-2 after (?value) (send ?self oblicz-wyjscie)) (defclass SYGNAL (is-a BEZ-WEJSC JEDNO-WYJSCIE ELEMENT) (role concrete) (slot wyjscie-1 (default NIEOKRESL) (create-accessor write))) (defclass SINK (is-a JEDNO-WEJSCIE BEZ-WYJSC ELEMENT) (role concrete) (slot wejscie-1 (default NIEOKRESL) (create-accessor read-write))) CLIPS — przyklad 37 Przyklad: Klasy określajace elementy logiczne ֒ (defclass BRAMKA-NOT (is-a JEDNO-WEJSCIE JEDNO-WYJSCIE ELEMENT) (role concrete)) (deffunction not# (?x) (- 1 ?x)) (defmessage-handler BRAMKA-NOT oblicz-wyjscie () (if (integerp ?self:wejscie-1) then (send ?self put-wyjscie-1 (not# ?self:wejscie-1)))) (defclass BRAMKA-AND (is-a DWA-WEJSCIA JEDNO-WYJSCIE ELEMENT) (role concrete)) (deffunction and# (?x ?y) (if (and (!= ?x 0) (!= ?y 0)) then 1 else 0)) (defmessage-handler BRAMKA-AND oblicz-wyjscie () (if (and (integerp ?self:wejscie-1) (integerp ?self:wejscie-2)) then (send ?self put-wyjscie-1 (and# ?self:wejscie-1 ?self:wejscie-2)))) CLIPS — przyklad 38 (defclass BRAMKA-OR (is-a DWA-WEJSCIA JEDNO-WYJSCIE ELEMENT) (role concrete)) (deffunction or# (?x ?y) (if (or (!= ?x 0) (!= ?y 0)) then 1 else 0)) (defmessage-handler BRAMKA-OR oblicz-wyjscie () (if (and (integerp ?self:wejscie-1) (integerp ?self:wejscie-2)) then (send ?self put-wyjscie-1 (or# ?self:wejscie-1 ?self:wejscie-2)))) (defclass BRAMKA-NAND (is-a DWA-WEJSCIA JEDNO-WYJSCIE ELEMENT) (role concrete)) (deffunction nand# (?x ?y) (if (not (and (!= ?x 0) (!= ?y 0))) then 1 else 0)) (defmessage-handler BRAMKA-NAND oblicz-wyjscie () (if (and (integerp ?self:wejscie-1) (integerp ?self:wejscie-2)) then CLIPS — przyklad 39 (send ?self put-wyjscie-1 (nand# ?self:wejscie-1 ?self:wejscie-2)))) (defclass BRAMKA-XOR (is-a DWA-WEJSCIA JEDNO-WYJSCIE ELEMENT) (role concrete)) (deffunction xor# (?x ?y) (if (or (and (= ?x 1) (= ?y 0)) (and (= ?x 0) (= ?y 1))) then 1 else 0)) (defmessage-handler BRAMKA-XOR oblicz-wyjscie () (if (and (integerp ?self:wejscie-1) (integerp ?self:wejscie-2)) then (send ?self put-wyjscie-1 (xor# ?self:wejscie-1 ?self:wejscie-2)))) (defclass POWIEL (is-a JEDNO-WEJSCIE DWA-WYJSCIA ELEMENT) (role concrete)) (defmessage-handler POWIEL oblicz-wyjscie () (if (integerp ?self:wejscie-1) then (send ?self put-wyjscie-1 ?self:wejscie-1) CLIPS — przyklad 40 (send ?self put-wyjscie-2 ?self:wejscie-1))) (defclass LED (is-a JEDNO-WEJSCIE BEZ-WYJSC ELEMENT) (role concrete)) (deffunction LED-odpowiedz () (bind ?odpowiedz (create$)) (do-for-all-instances ((?led LED)) TRUE (bind ?odpowiedz (create$ ?odpowiedz (send ?led get-wejscie-1)))) ?odpowiedz) CLIPS — przyklad 41 Przyklad: Funkcja wirtualna polaczenie (defgeneric polaczenie) (defmethod polaczenie ((?out JEDNO-WYJSCIE) (?in JEDNO-WEJSCIE)) (send ?out put-wyjscie-1-zlacze ?in) (send ?out put-wyjscie-1-zacisk 1) (send ?in put-wejscie-1-zlacze ?out) (send ?in put-wejscie-1-zacisk 1)) (defmethod polaczenie ((?out JEDNO-WYJSCIE) (?in DWA-WEJSCIA) (?in-pin INTEGER)) (send ?out put-wyjscie-1-zlacze ?in) (send ?out put-wyjscie-1-zacisk ?in-pin) (send ?in (sym-cat put-wejscie- ?in-pin -zlacze) ?out) (send ?in (sym-cat put-wejscie- ?in-pin -zacisk) 1)) (defmethod polaczenie ((?out DWA-WYJSCIA) (?out-pin INTEGER) (?in JEDNO-WEJSCIE)) (send ?out (sym-cat put-wyjscie- ?out-pin -zlacze) ?in) (send ?out (sym-cat put-wyjscie- ?out-pin -zacisk) 1) (send ?in put-wejscie-1-zlacze ?out) (send ?in put-wejscie-1-zacisk ?out-pin)) CLIPS — przyklad 42 (defmethod polaczenie ((?out DWA-WYJSCIA) (?out-pin INTEGER) (?in DWA-WEJSCIA) (?in-pin INTEGER)) (send ?out (sym-cat put-wyjscie- ?out-pin -zlacze) ?in) (send ?out (sym-cat put-wyjscie- ?out-pin -zacisk) ?in-pin) (send ?in (sym-cat put-wejscie- ?in-pin -zlacze) ?out) (send ?in (sym-cat put-wejscie- ?in-pin -zacisk) ?out-pin)) ;;; Deklaracja funkcji polacz-uklad niezbednej do uruchomienia ;;; systemu produkcji. (deffunction polacz-uklad ()) CLIPS — przyklad 43 Przyklad: Pomocnicze zmienne globalne oraz regula startowa (defglobal ?*kod-gray* = (create$) ?*sygnaly* = (create$) ?*przebiegi-petli* = 0) (defrule start => (polacz-uklad) (bind ?*sygnaly* (find-all-instances ((?x SYGNAL)) TRUE)) (do-for-all-instances ((?x SYGNAL)) TRUE (bind ?*kod-gray* (create$ ?*kod-gray* 0))) (bind ?*przebiegi-petli* (round (** 2 (length ?*sygnaly*)))) (assert (przebieg-petli 0))) CLIPS — przyklad 44 Przyklad: Reguly do obliczania odpowiedzi ukladu (defrule wylicz-pierwszy-raz ?f <- (przebieg-petli 0) => (do-for-all-instances ((?source SYGNAL)) TRUE (send ?source put-wyjscie-1 0)) (assert (result ?*kod-gray* =(str-implode (LED-odpowiedz)))) (retract ?f) (assert (przebieg-petli 1))) (deffunction zmien-bit (?x) (bind ?i 1) (while (and (evenp ?x) (!= ?x 0)) do (bind ?x (div ?x 2)) (bind ?i (+ ?i 1))) ?i) (defrule wylicz-nastepny-raz ?f <- (przebieg-petli ?n&~0&:(< ?n ?*przebiegi-petli*)) => (bind ?pos (zmien-bit ?n)) CLIPS — przyklad 45 (bind ?nv (- 1 (nth ?pos ?*kod-gray*))) (bind ?*kod-gray* (replace$ ?*kod-gray* ?pos ?pos ?nv)) (send (nth ?pos ?*sygnaly*) put-wyjscie-1 ?nv) (assert (result ?*kod-gray* =(str-implode (LED-odpowiedz)))) (retract ?f) (assert (przebieg-petli =(+ ?n 1)))) CLIPS — przyklad 46 Przyklad: Reguly do formatowania tabelki przejść ukladu (defrule polacz-odpowiedzi (declare (salience 10)) ?f1 <- (result $?b ?x $?e ?odpowiedz) ?f2 <- (result $?b ~?x $?e ?odpowiedz) => (retract ?f1 ?f2) (assert (result $?b * $?e ?odpowiedz))) (defrule wyswietl-naglowek (declare (salience -10)) => (assert (wyswietl-wyniki)) (do-for-all-instances ((?x SYGNAL)) TRUE (format t " %3s " (sym-cat ?x))) (printout t " | ") (do-for-all-instances ((?x LED)) TRUE (format t " %3s " (sym-cat ?x))) (format t "%n") (do-for-all-instances ((?x SYGNAL)) TRUE (printout t "-----")) (printout t "-+-") (do-for-all-instances ((?x LED)) TRUE (printout t "-----")) CLIPS — przyklad 47 (format t "%n")) (defrule wyswietl-wyniki (wyswietl-wyniki) ?f <- (result $?wejscie ?odpowiedz) (not (result $?wejscie-2 ?odpowiedz-2&:(< (str-compare ?odpowiedz-2 ?odpowiedz) 0))) => (retract ?f) (while (neq ?wejscie (create$)) do (printout t " " (nth 1 ?wejscie) " ") (bind ?wejscie (rest$ ?wejscie))) (printout t " | ") (bind ?odpowiedz (str-explode ?odpowiedz)) (while (neq ?odpowiedz (create$)) do (printout t " " (nth 1 ?odpowiedz) " ") (bind ?odpowiedz (rest$ ?odpowiedz))) (printout t crlf)) CLIPS — przyklad 48 Przyklad: Deklaracja elementów przykladowego ukladu (definstances przyklad (S-1 of SYGNAL) (S-2 of SYGNAL) (S-3 of SYGNAL) (S-4 of SYGNAL) (S-5 of SYGNAL) (S-6 of SYGNAL) (P-1 of POWIEL) (P-2 of POWIEL) (P-3 of POWIEL) (P-4 of POWIEL) (N-1 of BRAMKA-NOT) (N-2 of BRAMKA-NOT) (N-3 of BRAMKA-NOT) (O-1 of BRAMKA-OR) (O-2 of BRAMKA-OR) (X-1 of BRAMKA-XOR) (X-2 of BRAMKA-XOR) (A-1 of BRAMKA-AND) (D-1 of BRAMKA-NAND) (D-2 of BRAMKA-NAND) CLIPS — przyklad 49 (L-1 of LED) (L-2 of LED) (L-3 of LED)) CLIPS — przyklad 50 Przyklad: Definicja polaczeń przykladowego ukladu ֒ (deffunction polacz-uklad () (polaczenie [S-1] [P-1]) (polaczenie [S-2] [P-2]) (polaczenie [S-3] [P-3]) (polaczenie [S-4] [A-1] 2) (polaczenie [S-5] [D-1] 2) (polaczenie [S-6] [O-2] 2) (polaczenie [P-1] 1 [O-1] 1) (polaczenie [P-1] 2 [N-1]) (polaczenie [P-2] 1 [N-2]) (polaczenie [P-2] 2 [A-1] 1) (polaczenie [P-3] 1 [X-1] 2) (polaczenie [P-3] 2 [D-1] 1) (polaczenie [N-1] [X-1] 1) (polaczenie [N-2] [O-1] 2) (polaczenie [O-1] [X-2] 1) (polaczenie [X-1] [X-2] 2) (polaczenie [A-1] [D-2] 1) (polaczenie [D-1] [O-2] 1) (polaczenie [X-2] [P-4]) (polaczenie [O-2] [D-2] 2) CLIPS — przyklad 51 (polaczenie (polaczenie (polaczenie (polaczenie CLIPS — przyklad [P-4] [P-4] [D-2] [N-3] 1 [N-3]) 2 [L-2]) [L-3]) [L-1])) 52 Przyklad: Wyniki dzialania programu CLIPS> (load "przyklad.clp") Defining definstances: przyklad Redefining deffunction: polacz-uklad TRUE CLIPS> (reset) CLIPS> (run) S-1 S-2 S-3 S-4 S-5 S-6 | L-1 L-2 L-3 -------------------------------+---------------* 1 0 1 * * | 0 1 0 1 0 0 1 * * | 0 1 1 0 0 1 * * * | 0 1 1 0 1 0 0 * * | 0 1 1 1 * 0 0 * * | 0 1 1 * 1 1 1 0 0 | 1 0 0 * 1 1 1 * 1 | 1 0 0 * 1 1 0 0 0 | 1 0 1 * 1 1 * 1 0 | 1 0 1 1 0 1 * * * | 1 0 1 * 1 1 0 * 1 | 1 0 1 0 0 0 * * * | 1 0 1 CLIPS> CLIPS — przyklad 53 Proces tworzenia systemów doradczych • reprezentacja wiedzy = identyfikacja, konceptualizacja, formalizacja, implementacja • pozyskiwanie wiedzy = przeksztalcenie wiedzy z formy w jakiej jest doste֒ pna na przyje֒ ta֒ forme֒ reprezentacji wiedzy w systemie Tworzenie regulowych systemów doradczych 54 Waskie gardlo procesu pozyskiwania wiedzy ֒ • wiedza jest pozyskiwana w procesie interakcji mie֒ dzy ludźmi • eksperci dostarczaja֒ wiedze֒ niepelna֒, niekoniecznie poprawna֒ • eksperci nie potrafia֒ w pelni wyrazić swej wiedzy • czasami eksperci sa֒ trudno doste֒ pni, a moga֒ także przyjmować stanowisko nieche֒ tne • kompilacja wiedzy pochodza֒cej z różnych źródel jest trudna a czasami niemożliwa ze wzgle֒ du na różne systemy pojeć ֒ , poziomy wyrażenia, przyjmowane a priori zależenia Tworzenie regulowych systemów doradczych 55 Problem generacji uzasadnień • wyjaśnienia skierowane do: użytkowników (w tym ksztalcenie), ekspertów, twórców systemu • niezbe֒ dne do: zrozumienia rozwia֒zania, wzmocnienia zaufania odbiorcy do wyników uzyskanych przez system, debugowania bazy wiedzy, w celach edukacyjnych, w celach dokumentacyjnych Tworzenie regulowych systemów doradczych 56 Proces wnioskowania • forward chaining: wycia֒gaj wnioski zaraz jak tylko jest to możliwe Tak dzialaja֒ niektóre systemy produkcji, również CLIPS. • backward chaining: najpierw sprawdzaj czy cel zostal osia֒gnie֒ ty, a jeśli nie to czego brak dla osia֒gnie֒ cia celu, i naste֒ pnie postaw to czego brakuje jako podcel tymczasowy Tworzenie regulowych systemów doradczych 57 Schemat wnioskowania systemów produkcji W trakcie pracy system produkcji wykonuje wiele kroków zwia֒zanych z odpalaniem konkretnych regul. Kroki te generuja֒ dodatkowe informacje rozszerzaja֒ce pocza֒tkowa֒ baze֒ danych o problemie aż do momentu, w którym zawiera ona również opis rozwia֒zania. Kroki te można zgrupować w trzy fazy. Abstrakcja danych dopasowanie heurystyczne - Abstrakcja rozwia֒zania 6 uogólnienie konkretyzacja ? Dane Tworzenie regulowych systemów doradczych Rozwia֒zanie 58 Pierwsza faza polega na uogólnianiu, tzn. abstrahowania (pominie֒ ciu) pewnych szczególów i wyodre֒ bnieniu kluczowych cech problemu, aby zaliczyć go do określonej klasy. Druga faza — heurystyczna — sugeruje ogólne formy rozwia֒zań dla ogólnie sformulowanych klas problemów. Trzecia faza jest faza֒ konkretyzacji, gdzie ogólnie sformulowane rozwia֒zanie jest uszczególowione i dostosowane do konkretnego problemu. W fazie pierwszej i trzeciej rozumowanie jest zwykle systematyczne, gdzie reguly rza֒dza֒ce kolejnymi krokami maja֒ zwykle solidne uzasadnienie i wiedza fachowa z danej dziedziny dobrze je określa. W fazie drugiej kroki maja֒ charakter wie֒ kszych przeskoków, pomijaja֒c wnioski pośrednie, których sformulowanie może być klopotliwe. Schemat ten zostal w sposób systematyczny zbadany i nazywany klasyfikacja֒ heurystyczna֒. Określenie klasyfikacja odzwierciedla fakt, że musi istnieć określony zbiór typowych schematów rozwia֒zań i musza֒ być znane bezpośrednie powia֒zania pomie֒ dzy typowymi schematami problemu a schematami rozwia֒zań. W efekcie systemy te moga֒ operować jedynie na malej liczbie schematów rozwia֒zań, co najwyżej sparametryzowanych. Ich rola֒ jest jedynie wybór wlaściwego rozwia֒zania. Tworzenie regulowych systemów doradczych 59