Концепция фреймов является одним из способов представления знаний о ситуациях. Каждый фрейм содержит слоты (в буквальном переводе - щели), которые идентифицируют тип ситуации или задают параметры конкретной ситуации. К примеру, фрейм, описывающий ситуацию на собрании, может иметь слот тип, значение которого будет определять тип собрания. В этом фрейме могут также присутствовать слоты время и место, значениями которых будут параметры конкретного собрания. Формализм фреймов можно рассматривать как обобщение формализма семантических сетей. Иерархия - это одна из важнейших концепций формализма фреймов, поэтому данный формализм также пригоден для представления таксономий знаний.
Выражение, записанное на языке фреймов, таком как FRL, декларирует существование фрейма. В нижеследующем примере упоминаются три фрейма – МЕРОПРИЯТИЕ, СОБРАНИЕ и СОБРАНИЕ_38. Фрейм МЕРОПРИЯТИЕ - наиболее общий, фрейм СОБРАНИЕ - более конкретный, описывающий вид МЕРОПРИЯТИЯ, а фрейм СОБРАНИЕ_38 - наиболее уточненный фрейм, описывающий конкретное СОБРАНИЕ. Фрейм СОБРАНИЕ называется субфреймом фрейма МЕРОПРИЯТИЕ, а фрейм СОБРАНИЕ_38 будет субфреймом фрейма СОБРАНИЕ.
Наследование значений слотов. Другой важнейшей концепцией формализма фреймов является наследование. Можно дать указание о том, что если значение слота в одном из фреймов не задается, то фрейм должен унаследовать умалчиваемое значение этого слота из фрейма более высокого уровня. Наследование фреймами значений слотов будет осуществляться в том случае, если в фрейме будет присутствовать слот РАЗНОВИДНОСТЬ, в котором содержится имя другого фрейма. Например, слоты ВРЕМЯ и МЕСТО фрейма СОБРАНИЕ будут унаследованы фреймом СОБРАНИЕ_38. Слот РАЗНОВИДНОСТЬ языка фреймов аналогичен дуге "является" семантической сети в том смысле, что он представляет отношение включения в класс или отношение принадлежности к классу.
Оценка формализма фреймов. Фрейм лучше всего трактовать как некоторую разновидность структур данных. Наследование от фрейма к фрейму реализуется процедурами, которые осуществляют доступ к конкретным экземплярам структур данных. Если язык фреймов не обеспечивает тот тип вывода, который нужен программисту, то программист может написать новую процедуру, обеспечивающую такой вывод. В худшем случае это означает, что каждый возможный вывод потребуется записывать в явной форме. Для действительного понимания смысла программы, написанной на языке фреймов, необходимо соотнести выражения на языке фреймов с процедурами, реализующими выводы для фреймов. Это может оказаться весьма сложным, так как процедуры записываются на языке, отличном от языка фреймов.
Реализация фрейм-программы на Прологе. Нижеследующая Пролог-программа выражает структуру приведенного выше примера СОБРАНИЕ.
разновидность (собрание, мероприятие).
разновидность (собрание_38, собрание).
% локальные значения слотов для фрейма СОБРАНИЕ:
собрание (время, 'Среда 14.00').
собрание (место, 'Зал заседаний').
% локальные значения слотов для фрейма СОБРАНИЕ_38:
собрание_38 (присутствуют, [роман, анна, борис]). % (1)
% правило наследования
собрание_38 (Атрибут, Значение) :- % (2)
разновидность (собрание_38, Фрейм),
подцель =. . [фрейм, Атрибут, Значение],
подцель.
Обратите внимание на то, что и "собрание", и "собрание_38" - это базы данных, в которых хранятся атрибуты. База данных "собрание" связана с базой данных "собрание_38" при помощи факта «разновидность(собрание_38, собрание)». Правило наследования позволяет "собранию_38" наследовать любые значения атрибутов от "собрания" Если запросить время проведения "собрания_38":
? - собрание_38 (время, X).
Х='Среда.14.00'
то ответ будет получен по факту "собрание" при помощи правила наследования.
Факты, противоречащие друг другу. Представьте себе, что сперва планировалось провести "собрание_38" в принятое по умолчанию время (Среда, 14.00), но потом по какой-то причине понадобилось его перенести. Посмотрим, что получится, если в базу данных "собрание_38" добавить атрибут "время", противоречащий уже имеющемуся атрибуту.
собрание_38 (время, 'Четверг 9.00').
Теперь в слоте "время" фрейма "собрание_38" будут находиться два значения - локальное значение и унаследованное значение:
?- собрание_38 (время, X).
Х = 'Четверг 9.00';
Х = 'Среда 14.00';
нет
Здесь трудность состоит в том, что "собрание_38" должно описывать реальное собрание, которое может быть проведено только один раз. Иными словами, отношение между собранием и временем его проведения должно регулироваться ограничением вида один-к-одному, обеспечивающим целостность отношения. Однако в дайной версии программы запрос вырабатывает два значения времени проведения собрания. Значение «Четверг 9.00» должно перекрывать умалчиваемое значение «Среда 14.00», так что запрос подобный приведенному выше, должен вырабатывать только значение «Четверг 9.00».
Запрет наследования. Проблема решается при помощи приводимой ниже программы. Предикат "сократить" в первом правиле "собрание_38" гарантирует то, что если у фрейма "собрание_38" будет иметься локальное значение слота, то этот фрейм не сможет унаследовать другое значение того же самого слота от фрейма "собрание".
разновидность: (собрание, мероприятие).
разновидность (с_38, собрание).
% значения слотов фрейма "собрание":
собрание (время. 'Среда 14.00').
собрание (место, 'Зал заседаний').
% локальное правило
собрание_38 (Атрибут, Значение) :-
с_38 (Атрибут, Значение),!.
% правило наследования
собрание_38 (Атрибут, Значение) :-
разновидность (с_38, Фрейм),
Подцель =..[Фрейм, Атрибут, Значение],
Подцель.
% значения слотов, локальные по отношению к фрейму
% "собрание_38":
с_38 (присутствуют, [роман, анна, борис]).
с_38 (время, 'Четверг 9.00').
Все атрибуты, являющиеся локальными для фрейма "собрание_38", теперь хранятся в базе данных "с_38". Первое правило "собрание_38" проверяет, имеется ли в базе данных "с_38" фраза с требуемым атрибутом. Если имеется, то возвращается нужное значение, а предикат "сократить" предотвращает дальнейшую выдачу ответов. Если такой фразы нет в базе данных "с_38", то второе правило "собрание_38" ищет требуемый атрибут в базе данных "собрание". Теперь запрос о времени проведения собрания выдает единственный ответ:
?- собрание_38 (время, X).
Х = 'Четверг 9.00'; %по «с_38»
нет
?- собрание_38 (место, X). %по «собрание_38»
Х = 'Четверг 9.00';
Х = 'Зал заседаний';
нет
|