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

Шаблонные факты

Упорядоченные факты обладают рядом недостатков:

  • параметры не имеют имени — из-за этого для доступа к параметру нужно помнить его положение в списке параметров. Также это снижает понятность программы, поскольку взаимное расположение параметров менее информативно, чем символические имена;

  • в команде assert, а также в образце факта в левой части правила необходимо явно перечислять все параметры — из-за этого увеличивается трудоемкость изменения программы при изменении состава параметров. Также это снижает читабельность программы, поскольку вынуждает использовать заполнители для пропуска параметров, значение которых не важно;

  • нет контроля допустимости значений параметров — из-за этого ошибки, вызванные использованием недопустимых значений, трудно обнаруживать.

Перечисленных недостатков нет у фактов, создаваемых на основе шаблонов. Описание шаблона представляет собой конструкцию deftemplate и состоит из имени, необязательного комментария и набора описаний параметров, называемых слотами. Шаблон может иметь произвольное количество слотов (в том числе ни одного). Описание каждого слота представляет собой список, вложенный в конструкцию deftemplate, причем первый элемент этого списка задает вид слота. Поддерживаются слоты следующих видов:

  • slot — единичный слот, предназначенный для хранения единичного значения;

  • multislot — мультислот, предназначенный для хранения последовательности значений.

Вне зависимости от вида описание каждого слота состоит из имени, необязательной спецификации значения по умолчанию и необязательного набора ограничений на значение слота. Порядок, в котором описания слотов встречаются в описании шаблона, значения не имеет. Пример:

CLIPS> (deftemplate circle

(slot name)

(slot radius)

(multislot center))

В команде assert шаблонный факт задается списком, первый элемент которого — это имя шаблона, а остальные элементы — вложенные списки, задающие значения слотов. Первый элемент каждого такого вложенного списка — имя слота, а остальные — значения слота; для единичных слотов должно быть указано в точности одно значение, а для мультислотов — произвольное количество значение (в том числе и ни одного). Разумеется, значение слота может быть результатом вычисления значения функции. Пример:

CLIPS> (assert (circle (name c-1) (radius 7) (center 1 2)))

<Fact-1>

CLIPS> (assert (circle (name c-2) (center 4 3) (radius 5)))

<Fact-2>

CLIPS> (facts)

f-0 (initial-fact)

f-1 (circle (name c-1) (radius 7) (center 1 2))

f-2 (circle (name c-2) (radius 5) (center 4 3))

For a total of 3 facts.

В левой части правила образец шаблонного факта также задается списком, первый элемент которого — имя шаблона, а остальные элементы — вложенные списки, первый элемент каждого из которых — имя слота. Остальные элементы вложенных списков — ограничения на значение слота, допустимое количество которых определяется видом слота. Если во вложенном списке единственным ограничением является заполнитель, то такой вложенный список можно опустить. Пример:

CLIPS> (defrule print-circle-area

(circle (name ?n) (radius ?r))

=>

(printout t "Площадь окружности " ?n " равна " (* (pi) ?r ?r) crlf))

CLIPS> (run)

Площадь окружности c-2 равна 78.5398163397448

Площадь окружности c-1 равна 153.9380400259

Задаваемая в описании слота спецификация значения по умолчанию является списком, первый элемент которого определяет момент вычисления значения по умолчанию, а остальные элементы — собственно само значение (если спецификация относится к единичному слоту, то должно быть указано в точности одно значение). Возможны следующие моменты вычисления значения по умолчанию:

  • default — один раз во время определения шаблона. Т. е. во всех фактах, при создании которых значение этого слота задано не было, этот слот будет иметь одно и то же значение;

  • default-dynamic — каждый раз во время создания факта. Т. е. в разных фактах этот слота может иметь разные значения даже если при создании этих фактов значение слота задано не было.

При задании самого значения по умолчанию помимо обычных значений можно использовать два специальных символа:

  • ?DERIVE — значение по умолчанию определяется на основе ограничений на допустимые значения слота; если ограничение нет, то используется символ nil;

  • ?NONE — значения по умолчанию нет, т. е. при создании факта явное задание значения соответствующего слота обязательно (в противном случае система выдаст сообщение об ошибке).

Отсутствие в описании слота спецификации значения по умолчанию равносильно использованию спецификации со специальным символом ?DERIVE. Примеры:

CLIPS> (clear)

CLIPS> (deftemplate circle

(slot name

(default-dynamic (gensym*)))

(slot radius

(default 1))

(multislot center

(default ?NONE)))

CLIPS> (assert (circle (center 1 2)))

<Fact-1>

CLIPS> (assert (circle (radius 2)))

[TMPLTRHS1] Slot center requires a value because of its (default ?NONE) attribute.

CLIPS> (assert (circle (center 2 3)))

<Fact-2>

CLIPS> (facts)

f-0 (initial-fact)

f-1 (circle (name gen1) (radius 1) (center 1 2))

f-2 (circle (name gen2) (radius 1) (center 2 3))

For a total of 3 facts.

Примечание: gensym* — это функция, возвращающая каждый раз новый уникальный символ. Нумерация уникальных символов, возвращаемых этой функций, сбрасывается только при перезапуске системы CLIPS.

Помимо спецификации значения по умолчанию в описании слота можно указать произвольное количество ограничений на значения слота. Каждое ограничение задаются в виде списка, первый элемент которого определяет вид ограничения, а остальные являются параметрами ограничения. Поддерживаются следующие виды ограничений:

  • type — ограничивает тип данных. Параметры — один или несколько символов, задающих допустимые типы данных, среди которых: SYMBOL — символ, STRING — строка, LEXEME — лексема (символ или строка), INTEGER — целое число, FLOAT — вещественное число, NUMBER — любое число (целое или вещественное), FACT-ADDRESS (адрес факта). Также параметром данного ограничения может быть единственный специальный символ ?VARIABLE, означающий, что данный слот может содержать значения любого типа. В случае мультислота ограничение типа применяется к каждому элементу последовательности;

  • allowed-symbols, allowed-strings, allowed-lexemes, allowed-integers, allowed-floats, allowed-numbers — ограничивают возможные значения слота, принадлежащие соответствующему типу данных (на значения других типов данных эти ограничения не распространяются). Параметры — одно или несколько значений соответствующего типа данных, задающих множество допустимых значений, либо специальный символ ?VARIABLE;

  • allowed-values — ограничивает возможные значения слота без учета типов данных. Параметры — множество допустимых значений либо специальный символ ?VARIABLE;

  • range — ограничивает диапазон допустимых числовых значений. Параметров два: минимальное и максимальное значение. Если минимальное или максимальное значение не ограничено, то соответствующий параметр следует задать специальным символом ?VARIABLE;

  • cardinality — ограничивает количество значений мультислота. Параметры — как у ограничения range.

Пример:

CLIPS> (deftemplate circle

(slot name

(default-dynamic (gensym*))

(type SYMBOL))

(slot radius

(default 1)

(type NUMBER)

(range 0 ?VARIABLE))

(multislot center

(default ?NONE)

(type NUMBER)

(cardinality 2 2))

(slot color

(allowed-values red yellow green)))

CLIPS> (assert (circle (name c-1) (center 1 2)))

<Fact-1>

CLIPS> (assert (circle (name c-2) (center 1)))

[CSTRNCHK1] Literal slot values found in the assert command

does not satisfy the cardinality restrictions for slot center.

CLIPS> (facts)

f-0 (initial-fact)

f-1 (circle (name c-1) (radius 1) (center 1 2) (color red))

For a total of 2 facts.

По умолчанию система CLIPS проверяет ограничения во время анализа текста команды, а не во время ее выполнения. Поэтому, если значение слота определить только на основе анализа текста самой команды невозможно (например, если это значение задается переменной), то соответствующие ограничения не проверяется. Чтобы включить проверку во время выполнения (в дополнение к проверке при анализе текста) используется команда set-dynamic-constraint-checking. Проверка во время выполнения служит лишь для диагностики; на результат выполнения команды она влияет. Пример:

CLIPS> (reset)

CLIPS> (bind ?r abc)

abc

CLIPS> (assert (circle (name c-1) (radius ?r) (center 0 0)))

<Fact-1>

CLIPS> (set-dynamic-constraint-checking TRUE)

FALSE

CLIPS> (assert (circle (name c-2) (radius ?r) (center 1 0)))

[CSTRNCHK1] Slot value abc found in fact f-2

does not match the allowed types for slot radius.

<Fact-2>

CLIPS> (facts)

f-0 (initial-fact)

f-1 (circle (name c-1) (radius abc) (center 0 0) (color red))

f-2 (circle (name c-2) (radius abc) (center 1 0) (color red))

For a total of 3 facts.

Помимо команд assert и retract с шаблонными фактами можно использовать команды duplicate и modify. Команда duplicate добавляет в список фактов новый факт, полученный путем копирования существующего. Первый параметр команды должен быть номером или адресом копируемого факта, а остальные параметры — вложенными списками, определяющими значения слотов нового факта. Если какой-либо слот в команде duplicate не указан, то его значение берется из копируемого факта. Команда modify имеет те же параметры, что и команда duplicate но отличается от последней тем, что удаляет копируемый факт. Пример:

CLIPS> (reset)

CLIPS> (assert (circle (name c-1) (radius 5) (center 1 2)))

<Fact-1>

CLIPS> (watch facts)

CLIPS> (duplicate 1 (name c-2))

==> f-2 (circle (name c-2) (radius 5) (center 1 2) (color red))

<Fact-2>

CLIPS> (modify 2 (radius 7))

<== f-2 (circle (name c-2) (radius 5) (center 1 2) (color red))

==> f-3 (circle (name c-2) (radius 7) (center 1 2) (color red))

<Fact-3>

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