- •Введение
- •Арифметика
- •Ввод-вывод при работе с консолью
- •Управление средой
- •Правила
- •Управление правилами
- •Использование переменных в правилах
- •Наборы фактов
- •Конструкции
- •Правила-2 Активации и повестка
- •Диагностические сообщения
- •Получение адреса факта
- •Сложные условия
- •Правила-3 Условия с кванторами
- •Вызовы функций в качестве ограничений параметров фактов
- •Сложные ограничения на параметры фактов
- •Поддержка истинности
- •Стратегии
- •Последовательности
- •Шаблонные факты
Наборы фактов
Вместо того чтобы вводить факты, описывающие общие закономерности задачи, при помощи безусловного правила, лучше явно задать начальные факты в конструкции deffacts. Команда deffacts имеет следующие параметры:
-
имя набора фактов, задаваемое символом;
-
необязательный комментарий, задаваемый строкой;
-
собственно сами факты.
Пример:
CLIPS> (deffacts legal-moves "Допустимые ходы"
(legal-move 2 3)
(legal-move 3 2)
(legal-move 3 -2)
(legal-move 2 -3)
(legal-move -2 -3)
(legal-move -3 -2)
(legal-move -3 2)
(legal-move -2 3))
В отличие от команды assert команда deffacts не добавляет перечисленные факты в список фактов непосредственно. Вместо этого факты, перечисленные в команде deffacts, попадаются в список фактов в результате выполнения команды reset. Пример:
CLIPS> (facts)
f-0 (initial-fact)
For a total of 1 fact.
CLIPS> (reset)
CLIPS> (facts)
f-0 (initial-fact)
f-1 (legal-move 2 3)
f-2 (legal-move 3 2)
f-3 (legal-move 3 -2)
f-4 (legal-move 2 -3)
f-5 (legal-move -2 -3)
f-6 (legal-move -3 -2)
f-7 (legal-move -3 2)
f-8 (legal-move -2 3)
For a total of 9 facts.
По аналогии с конструкцией defrule для конструкции deffacts в системе CLIPS имеются команды ppdeffacts, list-deffacts и undeffacts. Также в меню можно выбрать Browse → Deffacts Manager.
Задание начальных фактов и использование переменных в образцах сопоставления с фактами позволяет сделать код более лаконичным. Пример:
CLIPS> (defrule print-possible-cause
(cause ?c ?ph)
(possible-cause ?c)
=>
(printout t ?ph crlf))
CLIPS> (defrule select-question
(question ?q ? ?)
=>
(assert (selected-question ?q)))
CLIPS> (defrule ask-question
(selected-question ?q)
=>
(printout t ?q)
(assert (answer ?q (readline))))
CLIPS> (defrule analyse-answer
(question ?q ?a ?o)
(answer ?q ?a)
=>
(assert (observation ?o)))
CLIPS> (deffacts questions
(question "Есть ли картинка на мониторе (y/n)? " "n" no-picture-on-monitor)
(question "Есть ли звуковой сигнал (y/n)? " "y" beep-noise))
CLIPS> (deffacts causes
(cause monitor-not-plugged "Возможно, монитор не подключен"))
Конструкции
Определение правила (как уже упоминалось) является примером конструкции. Поскольку конструкции могут быть весьма длинными удобно не вводить их в консоль в интерактивном режиме, а, вместо этого загружать их из текстового файла с помощью команды load или load*. Параметром этих команд этих команд является строка, задающая имя файла. Пример:
CLIPS> (load "C:/CLIPS/ComputerProblems.clp")
*****$$
TRUE
Вместо команды load в меню можно выбрать File → Load или же нажать комбинацию клавиш Ctrl + L.
Для сохранения всех имеющихся в системе конструкций в файл используется команда save, параметр которой является строка, задающая имя файла.
Команда reset не удаляет конструкции. Для удаления конструкций следует использовать команду clear.
Правила-2 Активации и повестка
Правило, вместе с комбинацией фактов, соответствующих условию этого правила, называется активацией правила (или просто активацией). В зависимости от того, что в текущий момент содержится в списке фактов у одного и того же правила может быть одна активация, несколько активаций либо вовсе ни одной активации. Все активации хранятся системой CLIPS в списке активаций называемом повесткой (agenda). Система добавляет активации в повестку в следующих случаях:
-
при добавлении фактов в список фактов (командами assert и reset) в том случае, если в системе уже есть правила, условия которых соответствуют вновь добавленным фактам (возможно в комбинации с фактами, уже присутствовавшими в списке фактов);
-
при определении правил (конструкцией defrule) в том случае, если в списке правил уже есть факты,
-
при выполнении команды refresh.
Система удаляет активации из повестки в следующих случаях:
-
при срабатывании активации (во время выполнения команды run);
-
при удалении фактов из списка фактов (командами retract и reset) в том случае, если удаляемые факты соответствовали условиям правил, породивших активации;
-
при удалении самих правил (командами undefrule и clear).
Для просмотра повестки используется команда agenda, не имеющая параметров. Вместо нее в меню можно выбрать Window → Agenda. Пример:
CLIPS> (defrule print-sum
(summand ?x)
(summand ?y)
=>
(printout t "Сумма чисел " ?x " и " ?y " равна " (+ ?x ?y) crlf))
CLIPS> (agenda)
CLIPS> (assert (summand 4))
<Fact-1>
CLIPS> (agenda)
0 print-sum: f-1,f-1
For a total of 1 activation.
CLIPS> (assert (summand 5))
<Fact-2>
CLIPS> (agenda)
0 print-sum: f-2,f-2
0 print-sum: f-2,f-1
0 print-sum: f-1,f-2
0 print-sum: f-1,f-1
For a total of 4 activations.
CLIPS> (retract 1)
CLIPS> (agenda)
0 print-sum: f-2,f-2
For a total of 1 activation.
CLIPS> (run)
Сумма чисел 5 и 5 равна 10
CLIPS> (agenda)
Команда refresh повторно добавляет в повестку правила, которые ранее были удалены из нее в результате выполнения команды run. Параметром команды refresh является имя правила. Пример:
CLIPS> (reset)
CLIPS> (assert (summand 3))
<Fact-1>
CLIPS> (agenda)
0 print-sum: f-1,f-1
For a total of 1 activation.
CLIPS> (run)
Сумма чисел 3 и 3 равна 6
CLIPS> (agenda)
CLIPS> (refresh print-sum)
CLIPS> (agenda)
0 print-sum: f-1,f-1
For a total of 1 activation