Правила в CLIPS

Содержание

Слайд 2

ОСНОВНЫЕ ПОЛОЖЕНИЯ Правила в CLIPS служат для представления эвристик или так

ОСНОВНЫЕ ПОЛОЖЕНИЯ

Правила в CLIPS служат для представления эвристик или так называемых

"эмпирических
правил", которые определяют набор действий, выполняемых при возникновении некоторой ситуации. Разработчик экспертной системы определяет набор правил, которые вместе работают над решением некоторой задачи. Правила состоят из предпосылок и бедствия.
Предпосылки называются также ЕСЛИ-частъю правила, левой частью правила или LHS правила (left-hand side of rule). Следствие называется ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule).
Предпосылки правила представляют собой набор условий (или условных элементов), которые должны удовлетвориться, для того чтобы правило выполнилось. Предпосылки правил удовлетворяются в зависимости от наличия или отсутствия некоторых заданных фактов в списке фактов или некоторых созданных объектов, являющихся экземплярами классов, определенных пользователем.
Один из наиболее распространенных типов условных выражений в CLIPS — образцы
(patterns). Образцы состоят из набора ограничений, которые используются для определения того, удовлетворяет ли некоторый факт или объект условному элементу. Другими словами, образец задает некоторую маску для фактов или объектов. Процесс сопоставления образцов фактам или объектам называется процессом сопоставления образцов (pattern-matching). CLIPS предоставляет механизм, называемый механизмом логического вывода (inference engine), который автоматически сопоставляет образцы с текущим списком фактов и определенными объектами в поисках правил, которые применимы в данный момент.
Слайд 3

СЛЕДСТВИЯ Следствие правила представляется набором некоторых действий, которые необходимо выполнить, в

СЛЕДСТВИЯ

Следствие правила представляется набором некоторых действий, которые необходимо выполнить, в случае

если правило применимо к текущей ситуации. Таким образом, действия, заданные вследствие правила, выполняются по команде механизма логического вывода, если все предпосылки правила удовлетворены.
В случае если в данный момент применимо более одного правила, механизм логического вывода использует так называемую стратегию разрешения конфликтов (conflict resolution strategy), которая определяет, какое именно правило будет выполнено. После этого CLIPS выполняет действия, описанные вследствие выбранного правила (которые могут оказать влияние на список применимых правил), и приступает к выбору следующего правила. Этот процесс продолжается до тех пор, пока список применимых правил не опустеет.
Чтобы лучше понять сущность правил в CLIPS, их можно представить в виде оператора IF-THEN, используемого в процедурных языках программирования, например, таких как Ada или С. Однако условия выражения IF-THEN в процедурных языках вычисляются только тогда, когда поток управления программы непосредственно попадает на данное выражение путем последовательного перебора выражений и операторов, составляющих программу. В CLIPS, в отличие от этого, механизм логического вывода создает и постоянно модифицирует список правил, условия которых в данный момент удовлетворены.
Слайд 4

Создание правил. Конструктор defrule (defrule [ ] [ ] ; левая

Создание правил. Конструктор defrule

(defrule
<имя-правила>
[<комментарии>]
[<определение-свойства-правила>]
<предпосылки > ; левая часть правила
=>
<следствие> ; правая

часть правила
)
Имя правила должно быть значением типа symbol. В качестве имени правила нельзя использовать зарезервированные слова CLIPS, которые были перечислены ранее. Повторное определение существующего правила приводит к удалению правила с тем же именем, даже если новое определение содержит ошибки.
Комментарии являются необязательными, и, как правило, описывают назначения правила.
Комментарии необходимо заключать в кавычки. Эти комментарии сохраняются и в дальнейшем могут быть доступны при просматривании определения правила.
Определение правила может содержать объявление свойств правила, которое следует непосредственно после имени правила и комментариев.
Слайд 5

Программа "Hello-World!" (clear) (defrule Hello-World "My FirstCLIPS Rule" => (printout t

Программа "Hello-World!"

(clear)
(defrule
Hello-World
"My FirstCLIPS Rule"
=>
(printout t crlf crlf)
(printout t ******************** crlf)
(printout t

"* HELLO WORLD!!! *" crlf)
(printout t ******************** crlf)
128
(printout t crlf crlf)
Слайд 6

ПРОГРАММА «Go To Credit?!» (defrule data-input (initial-fact) => (printout t crlf

ПРОГРАММА «Go To Credit?!»

(defrule data-input
(initial-fact)
=>
(printout t crlf "Input days for discipline

credit (integer): ")
(bind ?days (read))
(if (numberp ?days)
then (assert (days ?days))
else (printout t "Input number" crlf))
(printout t crlf "Enter the number of labs outstanding (in %): ")
(bind ?works (read))
(assert (works ?works))
(printout t crlf "Enter the number of unfinished practical work (in %): ")
(bind ?prworks (read))
(assert (prworks ?prworks)))
Слайд 7

ПРОДОЛЖЕНИЕ (defrule R1 (days ?days) (works ?works) (test (and (= ?days

ПРОДОЛЖЕНИЕ

(defrule R1
(days ?days)
(works ?works)
(test (and (= ?days 1) (<> ?works

0)))
=>
(printout t crlf crlf "Time is going to FINISH! ATTENTION!" crlf)
(assert (freetime "no")))
(defrule R2
(days ?days)
(works ?works)
(test (and (= ?days 2) (>= ?works 10)))
=>
(printout t crlf crlf "Time is going to FINISH! LETS GO TO FINISH!" crlf)
(assert (freetime "no")))
(defrule R3
(days ?days)
(works ?works)
(test (and (= ?days 2) (< ?works 10)))
=>
(printout t crlf crlf "Little free time!" crlf)
(assert (freetime "a-little")))
Слайд 8

ПРОДОЛЖЕНИЕ (defrule R4 (days ?days) (works ?works) (test (and (= ?days

ПРОДОЛЖЕНИЕ

(defrule R4
(days ?days)
(works ?works)
(test (and (= ?days 3) (> ?works 25)))(
=>
(printout

t crlf crlf "No free time!" crlf)
(assert (freetime "no")))
(defrule R5
(days ?days)
(works ?works)
(prworks ?prworks)
(test (and (= ?days 3) (> ?works 25) (> ?prworks 25)))
=>
(printout t crlf crlf "No free time!ALLES" crlf)
(assert (freetime "no")))
Слайд 9

ОКОНЧАНИЕ ПРОГРАММЫ «Go To Credit» (defrule R6 (days ?days) (works ?works)

ОКОНЧАНИЕ ПРОГРАММЫ «Go To Credit»

(defrule R6
(days ?days)
(works ?works)
(prworks ?prworks)
(test (and (<

?days 3) (> ?works 25) (> ?prworks 25)))
=>
(printout t crlf crlf "No free time!ALLES!ALLES!!" crlf)
(assert (freetime "no")))
(defrule R7
(days ?days)
(works ?works)
(prworks ?prworks)
(test (and (= ?days 1) (> ?works 50) (> ?prworks 50)))
=>
(printout t crlf crlf "ALLES CAPUT!GO TO OUT!BYE!BYE!!!" crlf)
(assert (freetime "no")))
Слайд 10

ВЫПОЛНЕНИЕ ПРОГРАММЫ CLIPS> (clear) CLIPS> (reset) ==> Focus MAIN ==> instance

ВЫПОЛНЕНИЕ ПРОГРАММЫ

CLIPS> (clear)
CLIPS> (reset)
<== Focus MAIN
==> Focus MAIN
==> instance [initial-object] of

INITIAL-OBJECT
MSG >> create ED:1 ()
HND >> create primary in class USER
ED:1 ()
HND << create primary in class USER
ED:1 ()
MSG << create ED:1 ()
MSG >> init ED:1 ()
HND >> init primary in class USER
ED:1 ()
HND << init primary in class USER
ED:1 ()
MSG << init ED:1 ()
==> f-0 (initial-fact)
CLIPS> (load "C:/CLIPS/PC/PROGRAMS/EXAMPLES/OTHER/ZACREDIT4.CLP")
Defining defrule: data-input +j
==> Activation 0 data-input: f-0
Defining defrule: R1 +j+j
Defining defrule: R2 =j+j
Defining defrule: R3 =j+j
Defining defrule: R4 =j+j
Defining defrule: R5 =j+j+j
Defining defrule: R6 =j=j+j
Defining defrule: R7 =j=j+j
TRUE
Слайд 11

ВЫПОЛНЕНИЕ ПРОГРАММЫ CLIPS> (run) FIRE 1 data-input: f-0 Input days for

ВЫПОЛНЕНИЕ ПРОГРАММЫ

CLIPS> (run)
FIRE 1 data-input: f-0
Input days for discipline credit (integer):

2
==> f-1 (days 2)
Enter the number of labs outstanding (in %): 7
==> f-2 (works 7)
==> Activation 0 R3: f-1,f-2
Enter the number of unfinished practical work (in %): 3
==> f-3 (prworks 3)
FIRE 2 R3: f-1,f-2
Little free time!
==> f-4 (freetime "a-little")
<== Focus MAIN
2 rules fired Run time is 41.9949999999999 seconds.
0.0476247172282416 rules per second.
3 mean number of facts (5 maximum).
1 mean number of instances (1 maximum).
Слайд 12

ВЫПОЛНЕНИЕ ПРОГРАММЫ CLIPS> (run) FIRE 1 data-input: f-0 Input days for

ВЫПОЛНЕНИЕ ПРОГРАММЫ

CLIPS> (run)
FIRE 1 data-input: f-0
Input days for discipline credit (integer):

1
==> f-1 (days 1)
Enter the number of labs outstanding (in %): 51
==> f-2 (works 51)
==> Activation 0 R1: f-1,f-2
Enter the number of unfinished practical work (in %): 51
==> f-3 (prworks 51)
==> Activation 0 R7: f-1,f-2,f-3
==> Activation 0 R6: f-1,f-2,f-3
FIRE 2 R6: f-1,f-2,f-3
No free time!ALLES!ALLES!!
==> f-4 (freetime "no")
FIRE 3 R7: f-1,f-2,f-3
ALLES CAPUT!GO TO OUT!BYE!BYE!!!
FIRE 4 R1: f-1,f-2
Time is going to FINISH! ATTENTION!