logo search
Учебник_Final

10.2.2. Факты

Факты являются одной из основных форм представления информации в системе CLIPS. Каждый факт представляет собой фрагмент информации, помещенный в текущий список фактов, − так называемый fact-list. Факт представляет собой основную единицу данных, используемую правилами.

Количество фактов в списке и объем информации, который может быть сохранен в факте, ограничивается только размером памяти компьютера. При попытке добавления к списку нового факта, идентичного одному из фактов, уже включенных в список, операция игнорируется (хотя такое поведение можно изменить).

Факт может описываться индексом или адресом. При каждом добавлении или изменении факта, ему присваивается уникальный целочисленный индекс. Индексы фактов начинаются с нуля и для каждого нового или измененного факта увеличиваются на единицу. Каждый раз после выполнения команд reset и clear выделение индексов начинается с нуля.

Факт также может задаваться при помощи адреса. Адрес факта может быть получен путем сохранения возвращаемого значения команд, которые возвращают в качестве результата адрес факта (таких как assert, modify и duplicate), или путем связывания переменной с адресом факта в левой части правила (см. далее).

Идентификатор факта – это короткая запись для отображения факта на экране, состоящая из символа f и записанного через тире индекса факта. Например, запись f-10 служит для обозначения факта с индексом 10. Существует два формата представления фактов: позиционный и непозиционный.

Позиционные факты

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

Пример.

(The pump is on)

(Altitude is 10000 feet)

(Grocery_list bread milk eggs)

Поля в позиционных фактах могут быть любого простого типа (за исключением первого поля, которое всегда должно быть типа symbol). На порядок следования полей также не накладывается никаких ограничений.

Ряд символьных выражений зарезервированы и не должны использоваться в качестве первого поля любых видов фактов, как позиционных, так и нет: test, and, or, not, declare, logical, object, exists u forall.

Непозиционные факты

Для того чтобы обратиться к информации, содержащейся в позиционном факте, пользователь должен знать, не только какие данные содержатся в факте, но и то, в каком поле они хранятся. Непозиционные (шаблонные) факты дают возможность пользователю абстрагироваться от структуры факта, задавая имена каждому из полей факта. Для задания шаблона, который затем может использоваться при доступе к полям по именам, используется конструкция deftemplate. Эта конструкция подобна структуре или записи в языках программирования Borland C и Pascal.

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

(deftemplate <имя шаблона>) (slot-1) (slot-2) … (slot-N)

Пример. Шаблон со значениями слотов, заданными по умолчанию

(deftemplate prospect)

(slot name

(default ?DERIVE)

(slot assets

(default rich)

(slot age

(default 80)))

Шаблонные факты отличаются от позиционных первым полем в факте. Первое поле всех фактов должно быть типа symbol, но если это символьное выражение соответствует имени шаблона, то этот факт – шаблонный. За первым полем шаблонного факта следует список из нуля или более слотов. Как и позиционные, шаблонные факты заключаются в скобки.

Пример. Шаблонные факты

(client (name "Joe Brown") (id X9345A))

(point-mass (x-velocity 100) (y-velocity -200))

(class (teacher "Martha Jones") (#-students 30)

(room "37A"))

(grocery-list (#-of-items 3) (items bread milk eggs))

Заметим, что порядок следования слотов в шаблонном факте не важен.

Манипуляции над фактами

Факты могут добавляться к списку фактов (с помощью команды assert), удаляться из него (с помощью команды retract), изменяться (с помощью команды modify) и дублироваться (с помощью команды duplicate) самим пользователем или программой. Например: (assert (light green)).

Кроме того, конструкция deffacts позволяет определить множество исходных или априорных знаний в виде набора фактов.

Пример.

(deffacts walk "Some facts about, walking"

(status walking)

(walk-sign walk))

Когда производится сброс состояния среды CLIPS (с помощью команды reset), все факты, описанные в конструкции deffacts, добавляются к списку фактов. Кроме того, по этой команде в список фактов заносится исходный факт (initial-fact). Этот факт включается в список фактов всегда с идентификатором f-0. Его назначение будет рассмотрено далее.