274.19K
Категория: ПрограммированиеПрограммирование

Правила в CLIPS

1.

Правила.

2.

Правила в 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
<имя-правила>
[<комментарии>]
[<определение-свойства-правила>]
<предпосылки > ; левая часть правила
=>
<следствие> ; правая часть правила
)
Имя правила должно быть значением типа symbol. В качестве имени правила
нельзя использовать зарезервированные слова CLIPS, которые были
перечислены ранее. Повторное определение существующего правила приводит к
удалению правила с тем же именем, даже если новое определение содержит
ошибки.
Комментарии являются необязательными, и, как правило, описывают
назначения правила.
Комментарии необходимо заключать в кавычки. Эти комментарии сохраняются
и в дальнейшем могут быть доступны при просматривании определения
правила.
Определение правила может содержать объявление свойств правила, которое
следует непосредственно после имени правила и комментариев.

5.

(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.

(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 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 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.

(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
==> Focus MAIN
==> instance [initial-object] of INITIAL-OBJECT
MSG >> create ED:1 (<Instance-initial-object>)
HND >> create primary in class USER
ED:1 (<Instance-initial-object>)
HND << create primary in class USER
ED:1 (<Instance-initial-object>)
MSG << create ED:1 (<Instance-initial-object>)
MSG >> init ED:1 (<Instance-initial-object>)
HND >> init primary in class USER
ED:1 (<Instance-initial-object>)
HND << init primary in class USER
ED:1 (<Instance-initial-object>)
MSG << init ED:1 (<Instance-initial-object>)
==> 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 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 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!

13.

CLIPS> (run)
FIRE 1 data-input: f-0
Input days for discipline credit (integer): 3
==> f-1 (days 3)
Enter the number of labs outstanding (in %): 33
==> f-2 (works 33)
==> Activation 0
R4: f-1,f-2
Enter the number of unfinished practical work (in %): 33
==> f-3 (prworks 33)
==> Activation 0
R5: f-1,f-2,f-3
FIRE 2 R5: f-1,f-2,f-3
No free time!ALLES
==> f-4 (freetime "no")
FIRE 3 R4: f-1,f-2
No free time!
<== Focus MAIN
3 rules fired
Run time is 33.1810000000005 seconds.
0.0904131882703944 rules per second.
4 mean number of facts (5 maximum).
1 mean number of instances (1 maximum).
1 mean number of activations (2 maximum).
CLIPS>
English     Русский Правила