- •Введение
- •Арифметика
- •Ввод-вывод при работе с консолью
- •Управление средой
- •Правила
- •Управление правилами
- •Использование переменных в правилах
- •Наборы фактов
- •Конструкции
- •Правила-2 Активации и повестка
- •Диагностические сообщения
- •Получение адреса факта
- •Сложные условия
- •Правила-3 Условия с кванторами
- •Вызовы функций в качестве ограничений параметров фактов
- •Сложные ограничения на параметры фактов
- •Поддержка истинности
- •Стратегии
- •Последовательности
- •Шаблонные факты
Управление правилами
В системе CLIPS определен ряд служебных команд для работы с определениями привил: так для просмотра ранее определенного правила используется команда ppdefrule (pp означает pretty print), параметром которой является имя правила. Пример:
CLIPS> (ppdefrule greeting)
(defrule MAIN::greeting "Печатает приветствие"
(time-of-day morning)
=>
(printout t "Доброе утро!" crlf)
Также можно просмотреть список ранее определенных правил. Пример:
CLIPS> (list-defrules)
greeting
check-monitor-plugged
print-monitor-not-plugged
ask-picture-on-monitor
ask-beep-noise
analyse-picture-on-monitor
analyse-beep-noise
For a total of 7 defrule
Команды ppdefrule и list-defrules особенно полезны в том случае, когда определения правил загружаются из файла, а не вводятся в интерактивном режиме.
Для удаления ранее определенного правила используется команда undefrule, параметром которой является имя удаляемого правила. Пример:
CLIPS> (undefrule greeting)
Вместо использования команд ppdefrule, list-defrules и undefrule в меню можно выбрать Browse → Defrule Manager.
Использование переменных в правилах
Образец, используемый для сопоставления с фактами, может содержать переменные. В этом случае побочным эффектом выполнения условия будет присваивание значения этим переменным. Отметим, что если образец некоторого правила содержит переменные, то в списке фактов может одновременно оказаться несколько фактов, активизирующих это правило. Пример:
CLIPS> (defrule mark-square-reachable "Сделать какой-нибудь допустимый ход"
(legal-move ?df ?dr)
(square-reachable ?f ?r ?m)
=>
(assert (square-reachable (+ ?f ?df) (+ ?r ?dr) (+ ?m 1))))
CLIPS> (defrule define-legal-moves "Определить допустимые ходы"
=>
(assert
(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)))
Рассмотрим использование данного правила (перед этим надо удалить предыдущие правила):
CLIPS> (reset)
CLIPS> (assert (square-reachable 0 0 0))
<Fact-1>
CLIPS> (set-strategy breadth)
depth
CLIPS> (run 50)
CLIPS> (facts 40)
f-40 (square-reachable -1 -1 2)
f-41 (square-reachable -4 -6 2)
f-42 (square-reachable -5 -5 2)
f-43 (square-reachable -5 -1 2)
f-44 (square-reachable -4 0 2)
For a total of 5 facts.
Замечание: команда set-strategy задает стратегию разрешения конфликтов. В данном случае устанавливается стратегия поиска в ширину. Подробнее о стратегиях разрешения конфликтов будет сказано далее.
Одна и та же переменная может встречаться в условиях правила несколько раз. В этом случае присваивание значения этой переменной происходит только в самом первом вхождении; во всех остальных вхождениях переменная рассматривается как ограничения, т. е. так же, как если бы на ее месте была константа. Пример:
CLIPS> (defrule check-target-square-reached "Проверить достигнута ли целевая ячейка"
(target-square ?f ?r)
(square-reachable ?f ?r ?m)
=>
(printout t "Целевая ячейка достигнута на " ?m "-м шаге" crlf)
(halt))
Рассмотрим использование данного правила:
CLIPS> (reset)
CLIPS> (assert (square-reachable 0 0 0))
<Fact-1>
CLIPS> (assert (target-square 3 3))
<Fact-2>
CLIPS> (run)
Целевая ячейка достигнута на 6-м шаге
Если для некоторого правила конкретное значение какого-либо параметра некоторого факта не имеет значения, то в образце на месте такого параметра следует указать безымянную переменную. Просто пропустить параметр факта (даже если этот параметр последний) нельзя. Пример:
CLIPS> (defrule check-move-number "Проверить не сделано ли слишком много ходов"
(maximal-move-number ?m)
(square-reachable ? ? ?m)
=>
(printout t "Достигнуть целевой ячейки не удалось" crlf)
(halt))
Рассмотрим использование данного правила:
CLIPS> (reset)
CLIPS> (assert (square-reachable 0 0 0))
<Fact-1>
CLIPS> (assert (target-square 3 3))
<Fact-2>
CLIPS> (assert (maximal-move-number 5))
<Fact-3>
CLIPS> (run)
Достигнуть целевой ячейки не удалось