Фрейм как высшая стадия структурированияОдним из средств структурирования, которое находит в настоящее время все возрастающее применение, является система фреймов. В статье рассматриваются особенности ее построения и применения на практике
В свое время идея Н.Вирта, выраженная в названии его известной книги «Алгоритмы + структуры данных = программы», обусловила стремление группировать, концентрировать данные (знания) в единое целое и появление в программировании задач различного назначения таких понятий, как структурированный объект, структурированные данные и знания. Первоначально естественным и удобным помощником в реализации этой идеи явилась теория графов. В графе узлы хранят информацию о сущностях, а дуги определяют взаимоотношения между этими сущностями. Дальнейшим развитием механизма структурирования оказалась разновидность графа — сеть, представляющая собой взвешенный ориентированный граф. Распространение получили два класса сетей — семантические и ассоциативные. В семантической сети узлы являются концептами (понятиями), а дуги описывают отношения между концептами. В ассоциативной сети присутствуют узлы двух видов — узлы–типы и узлы–лексемы. Смысл узла–лексемы определяется ссылкой на соответствующие узлы–типы. Еще одним средством представления взаимосвязанных данных (знаний), объединенных в единое целое, явились порождающие правила. Если графы и сети отражают такие взаимосвязи между сущностями, как "тип—подтип", "часть—целое", "до—после", "и—или—не", то порождающие правила дают ответ на вопрос "Что делать, если &hellip?", формализуя связи состояния некоторой сущности с действиями, которые необходимо предпринять для продвижения к искомому решению. Естественное желание объединить вместе представление данных (знаний) посредством графов, сетей и правил привело к появлению теории фреймов (frame — остов, скелет, костяк, каркас). Ее автор М.Минский определил фрейм как "структуру данных для представления стереотипных ситуаций". Реализованная им идея заключалась в том, чтобы сконцентрировать все данные (знания) о конкретном объекте или событии в единой структуре, а не распределять ее между множеством более мелких структур. Конструктивно фрейм представляет собой запись, состоящую из слотов и заполнителей. Слоты играют ту же роль, что и поля в списке. Заполнители — это значения, хранящиеся в полях. Таким образом, во фрейме свойства и отношения объектов и событий кодируются с помощью представлений "слот—заполнитель", а не маркировкой связей между узлами в графе или сети. Каждый фрейм имеет имя — специальный слот, заполненный наименованием сущности, которую представляет фрейм. Другие слоты заполнены значениями разнообразных атрибутов, ассоциирующихся с сущностью. Исходя из этого выполнение большей части вычислений, связанных с решением проблемы сущности, является эффектом передачи данных во фрейм или извлечения данных из него. Передать данные во фрейм, т.е. заполнить его слоты можно несколькими способами — по умолчанию при конструировании фрейма, через вызов функции, указанной в слоте, через присоединенную к слоту процедуру, которая называется демоном, из диалога с пользователем, через наследование свойств от других фреймов, из базы данных. Перечисленные свойства фрейма оказываются очень удобными для явного представления предметной области, позволяющего выразить ситуационные знания, т.е. знания о том, какое суждение или вывод можно сделать из имеющихся фактов (данных). С этой целью помимо данных, специфичных для предметной области, в конструкции фрейма предусматриваются управляющие слоты, содержащие данные, которые предназначены для реагирования на подтверждение или отклонение фрейма и для вывода сообщения, содержащего окончательное решение. Теоретических рассуждений достаточно. Перейдем к практической реализации. Рассмотренная далее задача навеяна высказываниями директоров по продажам и маркетингу ведущих отечественных компьютерных фирм. Из них следует, что "основная сложность продажи компьютеров заключается в том, что ПК в понимании розничного покупателя все еще далек от разряда обычной бытовой техники. При том, что многие уже сегодня испытывают необходимость в ПК, однако незнание этого устройства удерживает их от приобретения". Помощников у розничного покупателя для осознанного приобретения ПК не так уж и много. Во–первых, это прайс–листы. Но для их чтения нужны знания хотя бы терминологии и, самое ужасное, разных аббревиатур. Далее, это советы знакомых. Но, как отмечают директора по продажам и маркетингу, эти советы заканчиваются тем, "что составляется конфигурация оптимальная не для покупателя, а для советчика". А как же "выбор редакции" (читай — выбор магазина)? Его можно было бы сформировать путем общения покупателя с продавцом. Но этому препятствует элементарная боязнь покупателя спросить что–то не то. Выходом из положения может стать компьютерная программа, которая беспристрастно выясняет, зачем человеку нужен ПК и предлагает то или иное решение с учетом пожеланий клиента и "выбора редакции". Положительный опыт общения с программами такого рода уже имеется. Например, получение наличных в банкомате. В частности рассмотрим фрагмент программы, предназначенный для формулирования рекомендации по выбору такого узла ПК, как видеокарта. В качестве исходных данных примем следующие:
Прежде всего сконструируем шаблон для фрейма, из которого будет формироваться модель предметной области. В языке CLIPS это можно сделать несколькими способами, простейшим из которых является использование конструктора deftemplate. Для данной задачи его синтаксис может быть таким: (deftemplate имя_фрейма (slot атрибут_1 (тип)[значение_по_умолчанию]) (slot атрибут_2 (тип)[значение_по_умолчанию]) ………………….. (slot атрибут_N (тип)[значение_по_умолчанию])) Как видно из этого определения, наличие в слотах фрейма поля "значение_по_умолчанию" не является обязательным. Не претендуя на оригинальность, дадим фрейму имя vcard. Атрибуты слотов выберем из таких соображений. Пусть атрибут первого слота имеет имя parametr, представляет параметры выбора и может принимать одно из следующих символьных значений —ensp;overclock, modding, mount, vram, cool, mass, prog_test. Пусть атрибут второго слота имеет имя status и представляет отношение пользователя к параметру выбора. Если пользователь отвечает на поставленные вопросы неотрицательно и не испытывает затруднений с ответом, атрибут status принимает символьное значение yes. В противном случае атрибут status принимает символьное значение no. Пусть атрибут третьего слота имеет имя brand, представляет тип видеокарты и может принимать одно из следующих символьных значений — Radeon или GeForce. И, наконец, поместим во фрейм еще один слот, который будет характеризовать, насколько важен для пользователя тот или иной параметр выбора. Важность параметра выбора будем обозначать целым положительным числом. Пусть атрибут этого слота имеет имя pref (сокращение от preference — предпочтение) и значение по умолчанию, равное нулю. После того, как фрейм сконструирован, он может представлять модель предметной области в соответствии с чьими-либо пожеланиями. Для этого необходимо реализовать процесс приобретения знаний (knowledge acquisition), под которым подразумевается передача информации, полученной от некоторого источника знаний, в программу, а если конкретно — заполнение полей слотов фрейма соответствующими значениями. В CLIPS процесс приобретения знаний отлично выполняют правила. Они будут задавать пользователю вопросы и помещать в слоты значения, связанные с ответами. В данной задаче характер задаваемых вопросов, возможные ответы и значения слота brand отражают субъективное мнение автора, сформированное из анализа различных публикаций. В идеальном случае содержание вопросов и процесс приобретения знаний в целом должны быть результатом совместного творчества инженера по знаниям, эксперта по продажам ПК и программиста. Очевидно, что правил должно быть семь — по количеству параметров выбора. Кроме основного назначения предусмотрим в конструкции правила действие, которое будет помещать в рабочую память интерпретатора CLIPS факт (имя_правила done). Такой факт будет сигнализировать, что данное правило свою работу выполнило, и запускать на выполнение следующее правило. Это позволит обеспечить очередность работы правил независимо от принятой в интерпретаторе стратегии их выполнения. Все изложенное выше нашло свое отражение в следующем тексте программы. Программа начинается с объявления шаблона фрейма с именем vcard. В поле (type SYMBOL) содержимому слотов parametr, status и brand назначается символьный тип. В поле (type NUMBER) содержимому слота pref назначается числовой тип, а в поле (default 0) ему присваивается значение по умолчанию, равное нулю. Далее в программе представлены объявления пользовательских функций ask_vram (), ask_cool (), ask_mass () и ask_prog-test () для формулирования дополнительных вопросов и вариантов ответов на них. Эти функции не имеют параметров, т.к. единственное действие, которое они выполняют — вывод текстовой информации на экран монитора. Завершают программу семь правил, первым из которых начинает работу правило overclock, активизируясь системным начальным фактом (initial-fact). Своим последним действием оно помещает в рабочую память интерпретатора CLIPS факт (overclock done). Этот факт активизирует правило modding, которое по завершении своей работы удалаяет факт (overclock done) из памяти и помещает туда факт (modding done). Факт (modding done) активизирует правило mount и т.д. О необходимости такой организации взаимодействия правил говорилось ранее. Но главное предназначение правил в программе не в этом. Их главная задача — сформировать систему фреймов, моделирующих предметную область. Для этого в правой части правил пользователю предлагается ответить на основной вопрос относительно того или иного параметра видеокарты. Если пользователь дает неотрицательный ответ или не испытывает затруднений с ответом, ему предлагается ответить на дополнительный вопрос. В правилах vram, cool, mass и prog–test это делается путем вызова объявленных выше пользовательских функций. Вот, например, как происходит диалог с пользователем при работе правила prog–test: Тестам какой программы Вы отдаете предпочтение при выборе видеокарты?
Ваш ответ: 1 Насколько важны для Вас результаты тестирования?
Ваш ответ: 2 Приняв ответ пользователя, правила создают в рабочей памяти интерпретатора CLIPS фрейм с именем vcard и заполняют его слоты соответствующими значениями. Такие действия выполняются командой assert: (assert (vcard (parametr значение) (status значение) (brand значение) (pref (read)))) Обратите внимание, что в отличие от других слотов, слот pref получает значение при помощи вызова встроенной функции read, которая возвращает значение, введенное со стандартного устройства ввода (клавиатуры). Однако это происходит тогда, когда слот status имеет значение yes. Если его значение равно no, слот pref принимает значение по умолчанию, равное нулю. Результат работы программы можно посмотреть, не выходя из интерпретатора CLIPS, по команде (facts). Вот, например, как моделируется предметная область системой фреймов для случая, когда некоторый пользователь выбирает варианты ответов на поставленные вопросы, руководствуясь предложениями программы: (vcard (parametr overclock)(status no)(brand Radeon)(pref 0)) (vcard (parametr modding)(status yes)(brand GeForce)(pref 1)) (vcard (parametr mount)(status yes)(brand Radeon)(pref 2)) (vcard (parametr vram)(status no)(brand GeForce)(pref 0)) (vcard (parametr cool)(status yes)(brand Radeon)(pref 2)) (vcard (parametr mass)(status yes)(brand GeForce)(pref 1)) (vcard (parametr prog_test)(status no)(brand GeForce)(pref 1)) Как видно из представленной модели, структурирование на основе системы фреймов обладает важными преимуществами. Прежде всего, такая структура является очень информативной, т.к. явно и четко показывает, что стоит за каждым слотом и как содержимое слотов связано между собой. Причем эта связь видна не столько визуально, сколько алгоритмически, что позволяет легко ее программировать. Последнее обстоятельство обуславливает другое преимущество на основе системы фреймов — удобство формулирования суждений и выводов. Что, собственно, требуется в задаче? Требуется сформулировать рекомендацию, какую видеокарту выбрать. Обработка хранящейся в структуре информации позволяет это сделать. Стратегий здесь может быть несколько. Самая тривиальная — выбрать ту видеокарту, которая большее количество раз встречается в слоте brand. Можно сделать это с учетом содержимого управляющего слота status и отбросить те фреймы, у которых значение слота status равно no. Можно учесть содержимое другого управляющего слота pref и принимать во внимание, например, только те фреймы, у которых значение слота pref является максимальным. Можно добавить во фреймы слоты, хранящие какую-то статистическую информацию в виде условных вероятностей или коэффициентов уверенности и т.д. и т.п. А что делать с программой? Дело за малым — инженеру по знаниям, эксперту по продажам ПК и программисту "уточнить" процесс приобретения знаний, добавить программный код, формулирующий рекомендации по выбору ПК из данных модели предметной области, и приделать графический интерфейс пользователя. А дальше можно продвигать продукт на рынке товаров и услуг. Трофимов В.Е. Фрейм как высшая стадия структурирования// Компьютеры+программы. — 2004. — N 7. — C. 45–54 ©Трофимов В.Е., vovic@ukr.net |