Programowanie w CLIPS
Wiedza początkowa Reguły oraz fakty początkowe dodane na początku programu za pomocą deffacts. (deffacts people "Znajomi" (person (name "Adam Kowalski") (age 24) (eye-color blue) (hair-color black)) (person (name "Jan Kowalski") (age 24) (eye-color blue) (hair-color black)) (person (name "Katarzyna Nowak") (age 36) (eye-color green) (hair-color red))) Uwaga: polecenie (reset) powoduje wyczyszczenie istniejących faktów i ponowne dodanie faktów początkowych (deffacts)
Odczyt z terminala Polecenia: bind, read, readline (defrule regula1 (initial-fact) => (printout t Jak masz na imie? ) (bind?imie (read)) (assert (imie?imie))?imie zmienna lokalna reguły
Odczyt z terminala read odczyt jednego pola readline odczyt wielu pól bind załadowanie do zmiennej
(defrule regula1 (initial-fact) => (printout t Jak masz na imie? ) (bind?imie (read)) (assert (imie?imie)) (defrule regula2 (imie?imie) => (printout t Witaj,?imie! crlf crlf) (printout t Wybierz opcje: (a/b/c) crlf) (printout t a) crlf) (printout t b) crlf) (printout t c) crlf) (bind?odp (read)) (assert (odp?odp)) )
(defrule regula_a (odp a) => (printout t Wybrales odpowiedz a crlf)) (defrule regula_b (odp b) => (printout t Wybrales odpowiedz b crlf)) (defrule regula_c (odp c) => (printout t Wybrales odpowiedz c crlf))
Odczyt z terminala Polecenie: readline oraz assert-string (defrule regula1 (initial-fact) => (printout t Podaj kilka wyrazów oddzielonych spacjami: crlf) (bind?string (readline)) (assert (napis?string)) (assert-string?string)) assert-string tworzy fakt złożony z wielu symboli na podstawie ciągu znaków oddzielonych spacjami
Odczyt z terminala Polecenie: readline oraz assert-string CLIPS> (reset) CLIPS> (run) Podaj kilka wyrazów odzielonych spacjami: Ala ma kota CLIPS> (facts) f-0 (initial-fact) f-1 (napis Ala ma kota ) f-2 (Ala ma kota) Fakt f-2 został dodany przez assert-string.
Zmienne Jednopolowe:?x?y?ilosc?nazwa Wielopolowe: $?napis $?ciag_liczb $?lista (defrule zmienne (x $?x) => (printout t?x =?x crlf) (printout t?x = $?x crlf)) CLIPS> (deffacts zmienna (x 15 20 14.8)) CLIPS> (reset) CLIPS> (run)?x = (15 20 14.8) $?x = (15 20 14.8) Uwaga: W LHS symbol $ jest istotny, w RHS nie.
Zmienne wielopolowe - funkcje (create$ ) - tworzy jedną wartość wielopolową łącząc dowolną ilość pól: CLIPS> (create$ a ab abcd) (a ab abcd) CLIPS> (create$ (+ 2 3) (* 2 3) (- 8 6)) (5 6 2) (nth$ ) - wybiera z wartości wielopolowej jedno pole: CLIPS> (nth$ 3 (create$ 10 21 23 44)) 23 CLIPS> (nth$ 2 (create$ Ala ma kota)) ma
Zmienne wielopolowe - funkcje (member$ ) - wskazuje, czy dany element znajduje się w wartości wielopolowej i określa jego położenie: CLIPS> (member$ ab (create$ a ab abcd)) 2 CLIPS> (member$ 7 (create$ (+ 2 3) (* 2 3) (- 8 6))) FALSE (delete$ ) - usuwa podzbiór: CLIPS> (delete$ (create$ 22 3 4 23 44) 2 3) (22 23 44)
Zmienne wielopolowe - funkcje (insert$ ) - wstawia do wartości wielopolowej na zadane miejsce: CLIPS> (insert$ (create$ a ab abcd) 2 xy) (a xy ab abcd) Pozostałe: (length$ ) (replace$ ) (first$ )
Operacje arytmetyczne +, -, *, /, ** (potęgowanie): np. (+?x?y?z) :?x +?y +?z (-?x?y?z) :?x -?y -?z (+ (-?x?y) (*?x 2)) : (?x -?y) + (?x * 2) (- (+?x (*?y?z)) (/?x?z)) : (?x +?y *?z) -?x /?z
Funkcje matematyczne (cos?x) (sin?x) itd... (abs?x) (exp?x) (log?x) (sqrt?x) itd...
(defrule start (initial-fact) => (printout t Program oblicza pierwiastki r. kwadratowego: crlf) (printout t Podaj a : ) (bind?a (read)) (printout t Podaj b : ) (bind?b (read)) (printout t Podaj c : ) (bind?c (read)) (assert (a?a) (b?b) (c?c))) (defrule licz-delte (a?a) (b?b) (c?c) => (bind?delta (- (*?b?b) (* 4?a?c))) (assert (delta?delta)))
(defrule licz-pierwiastki_delta_zero (delta?delta) (a?a) (b?b) (test (=?delta 0)) => (bind?x1 (/ (- 0?b) (* 2?a))) (bind?x2?x1) (assert (x1?x1) (x2?x2))) (defrule licz-pierwiastki_deltawiekszaodzera itd. (defrule pisz-wynik (x1?x1) (x2?x2) => (printout t X1 =?x1,x2 =?x2 crlf) )
Funkcja test (test (funkcja_porównująca argumenty)) - porównuje liczby, łańcuchy, zmienne Zawsze po lewej stronie reguły (LHS)! Reguła, która ma po lewej stronie funkcję (test...), zostanie uaktywniona tylko, gdy będzie spełniony warunek w tej funkcji (oraz inne fakty w LHS). Funkcje porównujące: =, <>, >=, >, <=, < Można używać funkcji logicznych (and, or ) Np. (test (>?delta 0)) (test (<> wynik -1))
Funkcje definiowane przez użytkownika Składnia: (deffunction nazwa_funkcji (?arg1?arg2?argn) (akcja1) (akcja2) (akcjam)) ;TYLKO OSTATNIA AKCJA ZWRACA WARTOŚĆ!
Funkcje definiowane przez użytkownika Składnia: (deffunction ostatnia-akcja (?a?b) ;argumenty (printout t Wartości wejściowe:?a?b crlf) (+?a?b) (-?a?b) (*?a?b)) CLIPS> (ostatnia-akcja 4 2) Wartości wejściowe: 4 2 8 CLIPS>
Operacje na łańcuchach znaków (assert-string ) - (omówiona wcześniej) tworzy fakt wielopolowy z łańcucha (str-cat ) - łączy w jeden łańcuch pojedyncze elementy: CLIPS> (str-cat raz dwa trzy) razdwatrzy (str-index ) - zwraca pozycję podanego ciągu znaków w łańcuchu: CLIPS> (str-index abc abcdef ) 1 CLIPS> (str-index xyz abcdef ) FALSE
Operacje na łańcuchach znaków (sub-string ) - zwraca podłańcuch: CLIPS> (sub-string 2 4 abcdef ) bcd Inne: (str-compare ) (str-length ) (upcase ) (lowcase...)
Zmienne globalne Wszystkie zmienne, których do tej pory używaliśmy były zmiennymi lokalnymi poszczególnych reguł. Zmienna lokalna jest znana tylko w regule, w której jest zdefiniowana. Zmienne globalne mają zakres całego programu są znane we wszystkich regułach.
Zmienne globalne Uwaga!: Wszędzie tam gdzie to możliwe należy używać faktów, a nie zmienny globalnych!
Zmienne globalne Definicja: (defglobal?*zmienna1* = wartość1?*zmienna2* = wartość2 )
Zmienne globalne np. CLIPS> (defglobal?*a* = 1) CLIPS>?*a* 1 CLIPS> (bind?*a* 5) CLIPS>?*a* 5 CLIPS> (reset) CLIPS>?*a* 1
Zmienne globalne Użycie w regułach: ŹLE!: (defrule zla-regula (y?*x*) => ) OK: (defrule regula-ok (y?y) (test (=?y?*x*) =>...)
Śledzenie wykonania programu (run 5) spowoduje uruchomienie 5 reguł i zatrzymanie programu (step) [to samo co (run 1)] (set-break nazwa_reguły) zatrzyma wykonanie programu przed regułą (remove-break nazwa_reguły) usuwa punkt stopu (show-breaks)