Рассмотрим конкретные структуры моделей представления знаний фреймами, основанные на изложенных выше концепциях теории фреймов. Теория фреймов — это теория научных концепций и, хотя модели представления знаний фреймами основываются на этой теории, она полностью не охватывает их. В последнее время вместо названия фреймовый используются названия объектно-ориентированный, структурированный объект и т. п. Эти названия, как далее будет показано, характерны для языка типа Смолток, относящегося к так называемым объектно-ориентированным языкам, в которых имеется много общего со структурой программ и механизмами управления выполнением.
Другими словами, переменные (структуры данных) и касающиеся их процедуры обработки образуют объект, а схожие объекты имеют иерархическую структуру типа IS-А. Это напоминает рассмотренную ранее иерархическую структуру, основанную на отношениях IS-А между объектами. Управление исполнением производится с помощью передачи сообщений между объектами, что почти аналогично механизму управления выводом с помощью передачи сообщений между фреймами. Однако в отличие от объектно-ориентированного языка, который имеет парадигмы для универсального программирования, модели представления знаний фреймового типа имеют парадигмы для управления представлением знаний (или памятью) и выводами, т.е. по основным идеям и конкретной реализации они имеют много отличий.
Структуры данных фрейма
Фрейм, как показано на рис. 3.6, представлен определенной структурой данных. Фреймовая система — это иерархическая структура, узлами которой являются подобные фреймы. Значение каждого элемента, показанного на рис. 3.6, рассмотрено ниже.
1) Имя фрейма — это идентификатор, присваиваемый фрейму. Фрейм должен иметь имя, единственное в данной фреймовой системе (уникальное имя). Каждый фрейм как показано на рис. 3.6, состоит из произвольного числа слотов, причем несколько из них обычно определяются самой системой для выполнения специфических функций, а остальные определяются пользователем. В их число входят слот IS-А, показывающий фрейм-родитель данного фрейма, слот указателей дочерних фреймов, который является списком указателей этих фреймов, слот для ввода имени пользователя, даты определения, даты изменения, текста комментария и другие слоты. Каждый слот, в свою очередь, так же представлен определенной структурой данных.
2) Имя слота — это идентификатор, присваиваемый слоту. Слот должен иметь уникальное имя во фрейме, к которому он принадлежит. Обычно имя слота не несет никакой смысловой нагрузки и является лишь идентификатором данного слота, но в некоторых случаях оно может иметь специфический смысл. К таким именам, помимо IS-А (отношение IS-А), DDESENDANTS (указатель прямого дочернего фрейма), FINEDBY (пользователь, определяющий фрейм), DEFINEDON (дата определения фрейма), MODIFIEDON (дата модификации фрейма), COMMENT (комментарий) и т. п., относятся имена, используемые для представления структурированных объектов, например, HASPART, RELATIONS и другие. Эти слоты называются системными и используются при редактировании базы знаний и управлении выводом.
3) Указатели наследования. Эти указатели касаются только фреймовых систем иерархического типа, основанных на отношениях “абстрактное — конкретное”, они показывают, какую информацию об атрибутах слотов во фрейме верхнего уровня наследуют слоты с такими же именами во фрейме нижнего уровня. Типичные указатели наследования: Unique (U: уникальный), Same (S: такой же), Range (R: установление границ), Override (O: игнорировать) и т. п.
U показывает, что каждый фрейм может иметь слоты с различными значениями; S — что все слоты должны иметь одинаковые значения, R — значения слотов фрейма нижнего уровня должны находиться в пределах, указанных значениями слотов фрейма верхнего уровня, О — при отсутствии указания значение слота фрейма верхнего уровня становится значением слота фрейма нижнего уровня, но в случае определения нового значения слотов фреймов нижних уровней указываются в качестве значений слотов. О выполняет одновременно функции указателей U и S.
Несмотря на то, что в большинстве систем допускается несколько вариантов указания наследования, существует немало и таких, где допускается только один вариант. В данном случае можно считать, что используется указатель О значения по умолчанию. На рис. 3.7 показаны три варианта указания наследования и приведены значения, выдаваемые при запросе значений слотов соответствующих фреймов.
4) Указание типа данных. Указывается, что слот имеет численное значение, либо служит указателем другого фрейма (т.е. показывает имя фрейма). К типам данных относятся FRAME (указатель), INTEGER (целый), REAL (действительный), BOOL (булев), LISP (присоединенная процедура), ТЕХТ (текст), LIST (список), TABLE (таблица), ЕXРRESSION (выражение) и другие.
5) Значение слота. Пункт ввода значения слота. Значение слота должно совпадать с указанным типом данных этого слота, кроме того, должно выполняться условие наследования.
6) Демон. Здесь дается определение демонов типа IF-NEEDED, IF-ADDED, IF-REMOVED и т. д. Демоном называется процедура, автоматически запускаемая при выполнении некоторого условия. Демоны запускаются при обращении к соответствующему слоту. Например, демон IF-NEEDED запускается, если в момент обращения к слоту его значение не было установлено, IF-ADDED запускается при подстановке в слот значения, IF-REMOVED запускается при стирании значения слота. Кроме того, демон является разновидностью присоединенной процедуры.
7) Присоединенная процедура. В качестве значения слота можно использовать программу процедурного типа, называемую служебной (servant) (в языке Лисп) или методом (в языке Смолток). В данном случае присоединенная процедура запускается по сообщению, переданному из другого фрейма (поскольку состояние выполнения в этом случае такое же, как и в объектно-ориентированном языке, то язык фреймового типа называют еще объектно-ориентированным языком, однако во избежание путаницы с языком типа Смолток, обычно выделяют название “язык фреймового типа”). Когда мы говорим, что в моделях представления знаний фреймами объединяются процедурные и декларативные знания, то считаем демоны и присоединенные процедуры процедурными знаниями. Кроме того, в языке представления знаний фреймами отсутствует специальный механизм управления выводом, поэтому пользователь должен реализовать данный механизм с помощью присоединенной процедуры. Однако данный язык обладает очень высокой универсальностью, что позволяет, помимо иерархического и сетевого представления знаний с помощью фреймовой системы, эффективно писать любую программу управления выводом с помощью присоединенной процедуры. В то же время это дополнительная нагрузка для пользователя. Следовательно, язык представления знаний фреймами можно назвать языком, ориентированным на специалистов по искусственному интеллекту, а также языком, ориентированным на сложные прикладные проблемы.
Известны также примеры систем, допускающих применение правил продукций в качестве типа данных. Это обусловлено, с одной стороны, тем, что большинство систем, ориентированных на решение сложных проблем, содержит в качестве составляющей продукционную систему, а с другой стороны — снижением нагрузки на пользователя. Кроме того, известны примеры систем типа ZERO, допускающие применение функций Пролога в качестве присоединенной процедуры.