- •Введение
- •Арифметика
- •Ввод-вывод при работе с консолью
- •Управление средой
- •Правила
- •Управление правилами
- •Использование переменных в правилах
- •Наборы фактов
- •Конструкции
- •Правила-2 Активации и повестка
- •Диагностические сообщения
- •Получение адреса факта
- •Сложные условия
- •Правила-3 Условия с кванторами
- •Вызовы функций в качестве ограничений параметров фактов
- •Сложные ограничения на параметры фактов
- •Поддержка истинности
- •Стратегии
- •Последовательности
- •Шаблонные факты
Правила
Правило — это конструкция, предписывающая системе CLIPS исполнить определенные действия в определенной ситуации. Для определения правила используется команда defrule. Эта команда имеет следующие параметры:
-
имя (идентификатор) правила, задаваемое символом;
-
необязательный комментарий, задаваемый строкой;
-
условия, описывающие ситуацию. Если условий несколько, то правило срабатывает только в том случае, когда выполняются все эти условия;
-
символ стрелки, отделяющий условия от действий;
-
действия в виде последовательности команд.
Используются следующее термины: часть определения правила, содержащую условия называют антецедентом, частью «если» или левой частью, а часть правила, содержащую действия — консеквентом, частью «то» или правой частью.
Одним из видов условий является наличие в списке фактов факта, соответствующего некоторому образцу. В простейшем случае образец состоит из символа, задающего тип факта и выражений, задающих параметры факта. Про факт соответствующий образцу, заданному в условии некоторого правила говорят, что он активизирует это правило. Пример определения простейшего правила:
CLIPS> (defrule greeting "Печатать приветствие"
(time-of-day morning)
=>
(printout t "Доброе утро!" crlf))
Само по себе определение правила не приводит непосредственно к исполнению каких-либо действий. Вместо этого, для запуска определенных в системе правил используется команда run. По умолчанию система запускает все правила, условия которых выполняются; однако, если в команде run имеется параметр, то общее количество запусков будет ограничено значением этого параметра. Пример:
CLIPS> (assert (time-of-day morning))
<Fact-1>
CLIPS> (run)
Доброе утро!
Часто действие правил заключается в добавлении новых фактов в список фактов. Пример:
CLIPS> (defrule check-monitor-plugged
(observation no-picture-on-monitor)
(observation beep-noise)
=>
(assert (possible-cause monitor-not-plugged)))
Рассмотрим действие этого правила:
CLIPS> (reset)
CLIPS> (assert (observation no-picture-on-monitor))
<Fact-1>
CLIPS> (assert (observation beep-noise))
<Fact-2>
CLIPS> (run)
CLIPS> (facts)
f-0 (initial-fact)
f-1 (observation no-picture-on-monitor)
f-2 (observation beep-noise)
f-3 (possible-cause monitor-not-plugged)
For a total of 4 facts
Замечание: определения правил, будучи конструкциями, не удаляются командой reset.
Добавляя новые факты в список фактов, одни правила, запускаясь, могут создавать условия для запуска других правил. Пример:
CLIPS> (defrule print-monitor-not-plugged
(possible-cause monitor-not-plugged)
=>
(printout t "Возможно, монитор не подключен" crlf))
Рассмотрим совместное действие двух последних правил:
CLIPS> (reset)
CLIPS> (assert (observation no-picture-on-monitor))
<Fact-1>
CLIPS> (assert (observation beep-noise))
<Fact-2>
CLIPS> (run)
Возможно, монитор не подключен
Если необходимо, чтобы какое-либо правило запускалось вне зависимости от каких-либо фактов, то можно использовать начальный факт initial-fact либо вовсе не указывать никакого условия. Пример:
CLIPS> (defrule ask-picture-on-monitor
=>
(printout t "Есть ли картинка на мониторе (y/n)? ")
(assert (answer picture-on-monitor (readline))))
CLIPS> (defrule ask-beep-noise
=>
(printout t "Есть ли звуковой сигнал (y/n)? ")
(assert (answer beep-noise (readline))))
CLIPS> (defrule analyse-picture-on-monitor
(answer picture-on-monitor "n")
=>
(assert (observation no-picture-on-monitor)))
CLIPS> (defrule analyse-beep-noise
(answer beep-noise "y")
=>
(assert (observation beep-noise)))
Рассмотрим эффект от действия всех вышеприведенных правил:
CLIPS> (reset)
CLIPS> (run)
Есть ли картинка на мониторе (y/n)? n
Есть ли звуковой сигнал (y/n)? y
Возможно, монитор не подключен