Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CLIPS.docx
Скачиваний:
3
Добавлен:
25.12.2018
Размер:
79.82 Кб
Скачать

Управление правилами

В системе 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)

Достигнуть целевой ячейки не удалось

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]