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

Наборы фактов

Вместо того чтобы вводить факты, описывающие общие закономерности задачи, при помощи безусловного правила, лучше явно задать начальные факты в конструкции 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

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