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

Правила

Правило — это конструкция, предписывающая системе 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

Возможно, монитор не подключен

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