Управление правилами
В системе 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) Достигнуть целевой ячейки не удалось
|