Разработки интеллектуальной справочной системы по музыкальным произведениям
1
Разработки интеллектуальной справочной системы по музыкальным произведениям
ОГЛАВЛЕНИЕ
Перечень условных обозначений
Введение
1. Технико-экономическое обоснование проектируемой интеллектуальной системы
1.1 Актуальность разработки интеллектуальной справочной системы по музыкальным произведениям
1.2 Категории пользователей системы
1.2.1 Меломан
1.2.2 Начинающий слушатель
1.2.3 Владелец музыкального магазина или интернет-магазина
1.2.4 Исполнитель
1.3 Анализ аналогичных систем
1.3.1 All Music Guide
1.3.2 MusicBrainz!
1.3.3 Музыкальный словарь Гроува
1.3.4 Сравнение аналогичных систем с интеллектуальным справочником по музыкальным произведениям
2. База знаний проектируемой интеллектуальной системы
2.1 Задачно-ориентированная спецификация базы знаний проектируемой интеллектуальной системы
2.1.1 Тестовый сборник вопросов
2.1.2 Список используемых в базе знаний проектируемой интеллектуальной справочной системы ip-компонентов
2.2 Онтология базы знаний проектируемой интеллектуальной системы
2.3 Содержательная декомпозиция базы знаний проектируемой интеллектуальной системы
2.4 Исходные тексты базы знаний прототипа интеллектуальной системы
2.5 Верификация и отладка базы знаний прототипа интеллектуальной системы
2.6 Спецификация разработанной базы знаний интеллектуальной системы и сертификация разработанных ip-компоненто
3. Машина обработки знаний проектируемой интеллектуальной справочной системы
3.1 Задачно-ориентированная спецификация машины обработки знаний проектируемой интеллектуальной справочной системы
3.1.1 Тестовый список задач
3.1.2 Содержательная классификация задач
3.1.3 Список используемых в операциях ip-компонентов
3.1.4 Классификация и спецификация операций проектируемой машины обработки знаний
3.1.5 Декомпозиция операций на подпрограммы и содержательная структура библиотеки программ специфицированных операций
3.2 Алгоритмы и исходные тексты программ, реализующие операции машины обработки знаний прототипа интеллектуальной справочной системы
3.3 Верификация и отладка программ специфицированных операций
3.4 Спецификация разработанных операций и библиотеки программ, сертификация разработанных ip-компонентов
4. Пользовательский интерфейс проектируемой интеллектуальной справочной системы
4.1 Задачно-ориентированная спецификация пользовательского интерфейса проектируемой интеллектуальной системы
4.1.1 Декомпозиция пользовательского интерфейса
4.1.2 Список используемых ip-компонентов пользовательского интерфейса
4.2 Проектирование интерфейсных подсистем
4.3 Верификация и отладка пользовательского интерфейса
4.4 Спецификация разработанного пользовательского интерфейса, сертификация разработанных ip-компонентов
5. Интеграция разработанной системы с другими системами
6. Направления дальнейшего развития прототипа интеллектуальной справочной системы и пути промышленного изготовления спроектированной интеллектуальной системы
7. Вклад в развитие семантических технологий проектирования интеллектуальных систем
7.1 Список выявленных ошибок среды проектирования интеллектуальных систем
7.2 Список предложений по совершенствованию среды проектирования интеллектуальных систем
7.3 Список предложений по совершенствованию семантических технологий проектирования интеллектуальных систем
7.4 Создание и использование ip-компонентов
Библиографический указатель
Перечень условных обозначений
МП – музыкальные произведения
БЗ – база знаний
ИСС – интеллектуальная справочная система
МОЗ – машина обработки знаний
ПИ – пользовательский интерфейс
Введение
Независимо от рода деятельности, возраста и пола, любому из нас приходилось сталкиваться с таким понятием как музыка. И если раньше это было мало распространенным, доступным для узкого круга людей, то в наши дни трудно встретить человека, который никогда не слышал «волшебных» звуков музыки. В наши дни можно говорить о целой музыкальной индустрии, людей и средств, в которой задействовано не меньше, чем в автомобилестроении или разработке IT-технологий. Одни зарабатывают на этом деньги: устраивая звукозаписывающие лейблы и студии, предоставляя свои услуги по записи, продюсированию исполнителей; открывают обычные и интернет-магазины, где успешно и не очень занимаются продажей уже готовой продукции (кассеты, компакт-диски, DVD-диски, и даже, для особых «гурманов», виниловые пластинки с композициями различных жанров и направлений). У других музыка – это способ самовыражения: поиск сподвижников, создание группы, а возможно выступление соло, написание текста и сочинение музыки, затем запись на студии, организация концертов. Третьи выступают в роли потребителей: скупают компакт-диски с альбомами любимых групп и исполнителей, посещают концерты, чтобы вживую услышать кумиров. Не стоит забывать и про тех, для кого музыка это просто приятный фон дома, на работе или в авто, который помогает скрасить серые будни мегаполисов.
Хочу обратить внимание на термины: звукозаписывающие лейблы, компакт-диски, виниловые пластинки, группы, направление, жанры и т.д. и т.п.. И если с пониманием что это и для чего оно нужно помогут справиться какая-нибудь музыкальная энциклопедия или вездесущий Google. То, что делать и у кого просить помощи, когда любимая композиция после н-ного раза прослушивания перестает нравиться, а домашняя коллекция прослушана и переслушана вдоль и поперек. Да, песен и исполнителей в мире много. Есть маленькое «но» - их слишком много! Так в электронной версии «Музыкального словаря Гроува» содержится 27000 композиций поп-музыки или более 50 дней непрерывного прослушивания (если допустить, что средняя продолжительность композиции около 3 минут). А ведь жанров и направлений не меньше сотни! Так и целой жизни будет мало, чтобы переслушать все, что сочинил музыкальный гений человека, и выбрать именно то, что подходит по вкусу.
Можно выделить несколько аспектов проблемы выбора и поиска музыкальных произведений:
- большой объем неструктурированной информации, хранящейся в различных местах;
- трудность формализации, а порой и отсутствие, правил описания и оценки музыкальных произведений;
- формулирование запроса для поиска композиции. Как говорил известный герой не менее известного фильма: «А ну, сочини для меня что-нибудь такое, чтоб душа сначала развернулась, а потом обратно завернулась».
Такие тяжеловесы как Microsoft Corp. и Yahoo Inc. тратят миллиарды долларов, пытаясь отобрать у Google хотя бы небольшой сегмент рынка интернет-поиска. Но параллельно этому, растущие нишевые поисковые системы переосмысляют способ поиска информации, разрабатывая инструменты, которые тщательно ищут истинный смысл слов на веб-страницах вместо того, чтобы просто предоставить список сайтов с совпадающими ключевыми словами, эти претенденты надеются создать сервисы, которые помогут пользователям быстрее находить то, что те ищут. Потребители хотят находить информацию быстрее, и они ищут инструменты, которые помогли бы им сделать это. Такие поисковые системы используют семантическую науку, изучающую смысл слов, чтобы производить более релевантный поиск. Дело в том, что уровень контекста позволяет семантическим поисковым системам представлять информацию в соответствии с тем, как обычно думают люди. Семантический поиск представляет интерес, как для частных предпринимателей, так и для крупных компаний. Ключ к успеху семантического поиска в том, чтобы выдать результаты в контексте. Это сложно, так как объём информации всё возрастает. Причина, по которой люди хотят разрабатывать семантические поисковые системы, в том, что это лучший способ нахождения информации. Учитывая, что объём контента растёт всё быстрее, поисковые системы должны быть более эффективны и работать по образцу того, как думают люди. Подобные инструменты поиска показывают связи между различными документами и сайтами, основываясь не на ссылках, а на информации, содержащейся на страницах с помощью технологии под названием «графики семантических кластеров». Она отображает результаты в виде, который напоминает паучью паутину.
Одним из примеров интеллектуальных «помощников» является Семантическая Справочная Система (SRS), на базе которой была построена справочная система по музыкальным произведениям. SRS состоит из трех компонентов:
База знаний (БЗ),
Машина обработки знаний,
Пользовательский интерфейс.
Уточним задачи компонентов:
База знаний необходима для хранения знаний о предметной области в системе.
Машина обработки знаний необходима для осуществления поиска, навигации и обработки знаний.
Пользовательский интерфейс необходим для осуществления взаимодействия пользователя с системой.
Наполнение базы знаний новыми знаниями значительно улучшит прикладную интеллектуальную систему. Пользователь сможет получить более подробную и более полную информацию о данной предметной области.
Разработка машины обработки знаний переведет прикладную систему на качественно новый уровень – уровень интеллектуального решателя задач предметной области.
В результате разработки пользовательского интерфейса появятся новые возможности, связанные с поиском по базе знаний, редактированием базы, что облегчит пользователям работу с прикладной интеллектуальной системой.
Целью работы является разработка проекта интеллектуальной справочной системы.
Задачи курсового проекта:
технико-экономическое обоснование проектируемой интеллектуальной справочной системы;
разработка базы знаний проектируемой интеллектуальной справочной системы;
разработка машины обработки знаний проектируемой интеллектуальной справочной системы;
разработка пользовательского интерфейса интеллектуальной справочной системы;
реализация прототипа интеллектуальной справочной системы.
1. Технико-экономическое обоснование проектируемой интеллектуальной системы
1.1 Актуальность разработки интеллектуальной справочной системы по музыкальным произведениям
Людям, которые желают приобрести музыкальный компакт-диск или скачать композицию из Интернета, не всегда удается затратить на это минимум своего свободного времени и средств и добиться при этом максимальной результативности. Информации содержащейся в буклете компакт-диска или полученной от продавца чаще всего недостаточно для осознанного выбора. Данная интеллектуальная справочная система предназначена для того чтобы облегчить процесс выбора для некомпетентного потребителя музыкальной индустрии.
Перечислим наиболее распространенные вопросы, интересующие людей в отношении музыкальных произведений:
Общие вопросы:
Какие музыкальные жанры существуют?
На каких носителях можно приобрести муз.произведения?
Какие типы музыкальных коллективов бывают?
и т.д.
Вопросы для конкретного произведения:
Кто автор текста, музыки?
Кто исполнитель?
В какой альбом входит?
В каком году издано?
и т.д.
Для нескольких произведений, альбомов, исполнителей:
Что общего между этими альбомами?
и т.д.
Поиск музыкальных произведений:
Поиск по описанию текста, музыки.
Поиск по году издания, жанру, рейтингу в чартах.
Поиск по исполнителю, альбому.
Поиск автора и названия по фрагменту композиции.
Разрабатываемая интеллектуальная система ответит на подобные вопросы пользователя. Дополненная база знаний позволит осуществить расширенный и углубленный поиск. Удобный интерфейс позволит интуитивно и просто найти все интересующие пользователя сведения. Именно поэтому разработка справочника является актуальной и востребованной.
1.2 Категории пользователей системы
Разрабатываемая интеллектуальная справочная система имеет обширную базу знаний и множество функциональных возможностей. Вследствие этого она поддерживает работу широкого круга пользователей. Можно выделить следующие категории пользователей:
меломан
начинающий слушатель
владелец музыкального магазина или интернет-магазина
исполнитель
Далее приведены портреты пользователей системы.
1.2.1 Меломан
Портрет:
В данную категорию пользователей попадают люди, хорошо владеющие предметной областью. Они знают историю музыки, ориентируются в жанрах и направлениях. Могут четко сформулировать поисковый запрос, определенно знают, что ищут. Они имеют возможность добавить новые знания, отредактировать или уточнить уже имеющиеся.
Функциональные возможности:
добавление и удаление видеоклипов
добавление и удаление аудиоматериала
редактирование имеющихся знаний
просмотр знаний содержащихся в БЗ
поиск композиций по ключевым словам, по четким критериям
Цели:
пополнение своих знаний
поиск музыкальных произведений
заимствование своего опыта для менее «продвинутых» пользователей
1.2.2 Начинающий слушатель
Портрет:
В данную категорию пользователей входят люди, которые желают найти для себя новую музыку, но возможно схожую с той, что ранее они слушали. Желающие познакомиться ближе с миром музыки, разобраться в ее жанрах и направлениях, открыть для себя новых исполнителей и группы. Начинающий слушатель не может четко сформулировать поисковый запрос, поэтому для него разработаны специальные возможности поиска.
Функциональные возможности:
просмотр знаний содержащихся в БЗ
просмотр видеоклипов
прослушивание музыкальных композиций
поиск исполнителя по фрагменту музыкального произведения
поиск композиций по ключевым словам в описании
поиск композиций по эмоциональной окраске музыки и текста
поиск композиций по жанрам
поиск композиций с помощью временной ленты
получение ответа на нетривиальные вопросы о музыкальных произведениях
Цели:
получение базовых знаний в предметной области
помощь в ориентировании по музыкальным произведениям
поиск музыкальных произведений по различным признакам
1.2.3 Владелец музыкального магазина или интернет-магазина
Портрет:
В данную категорию пользователей входят люди занимающиеся продажей носителей информации с музыкальными произведениями, клипами, записями концертов и выступлений. Для них главное структурировать информацию о продукции, для облегчения дальнейшей работы. Предоставление информации по имеющемуся ассортименту конечным потребителям.
Функциональные возможности:
просмотр информации об исполнителях, альбомах и композициях
добавление информации о новых исполнителях, альбомах, композициях
поиск музыкальных произведений
Цели:
пополнение базы знаний новой информацией об исполнителях, альбомах и композициях
предоставлении информации конечному потребителю
1.2.4 Исполнитель
Портрет:
В данную категорию пользователей входят люди, занимающиеся творческим процессом: написанием музыки, текстов – созданием новых музыкальных произведений. Для них будет интересно просмотреть готовые композиции, чтобы ориентироваться в современной музыке.
Функциональные возможности:
поиск музыкальных произведений
сравнение музыкальных произведений
Цели:
ориентирование в современной музыкальной индустрии
1.3 Анализ аналогичных систем
1.3.1 All Music Guide
Крупная онлайновая музыкальная база данных, принадлежащая организации All Media Guide. Данный продукт является энциклопедией с удобным графическим интерфейсом и поиском по ключевым словам, названиям произведений, альбомов, исполнителей, содержит хорошо проработанную БД с большим количеством информации. Язык интерфейса английский.
1.3.2 MusicBrainz!
Проект создания открытой музыкальной энциклопедии. MusicBrainz хранит сведения о музыке, которая когда-либо была записана, а не саму музыку. Все основные данные, хранимые в MusicBrainz (зафиксированные данные об исполнителях, альбомах, треках и т.п.) считаются общественным достоянием, а дополнительные сведения, такие, как данные о модерациях, распространяются под лицензией Creative Commons non-commercial share-and-share-alike. Язык интерфейса английский.
1.3.3 Музыкальный словарь Гроува
Британское справочное издание, посвящённое академической музыке. Под редакцией Лоры Мейси работает постоянно обновляемая и пополняемая сетевая версия словаря. Годовая подписка на пользование ею составляет 300 долларов. Права на издание и онлайн-версию с 2004 г. принадлежат издательству Оксфордского университета, вследствие чего сайт из Grove Music Online был переименован в Oxford Music Online. Включает в себя более 50000 статей и 28000 биографий, внесенных более чем 6000 ученых со всего мира. Язык интерфейса английский.
1.3.4 Сравнение аналогичных систем с интеллектуальным справочником по музыкальным произведениям
В аналогичных системах не предусмотрен диалог пользователя и системы, то есть, нет возможности задать справочникам вопросы. В отличие от них в интеллектуальной справочной системе по музыкальным произведениям такая возможность есть. Возможность диалога с системой отображает ее интеллектуальные способности в полной мере. Она способно ответить на все многообразие вопросов, которые могут возникнуть у пользователя в процессе поиска композиции, альбома или исполнителя.
Так же можно сказать о том, что у интеллектуальной справочной системе довольно простой интерфейс. Пользователь сможет быстро разобраться с методами получения необходимой ему информации.
2. База знаний проектируемой интеллектуальной системы
2.1 Задачно-ориентированная спецификация базы знаний проектируемой интеллектуальной системы
2.1.1 Тестовый сборник вопросов
Описание тестовых вопросов:
Все известные исполнители.
Фотография конкретного исполнителя.
Альбомы выбранного исполнителя.
Изображение обложки альбома.
Сравнение двух альбомов по их характеристикам.
Композиции входящие в выбранный альбом.
Прослушивание композиции.
Просмотр видеоклипа на выбранную композицю.
Поиск альбома по его характеристикам.
Поиск композиции по ее характеристикам.
Описание музыкального жанра.
Виды носителей.
Авторы текста и композиторы.
Перечень демонстрационных вопросов:
Получение всех исполнителей БЗ.
Описание основных характеристик исполнителя.
Просмотр фотографии исполнителя.
Альбомы выбранного исполнителя.
Просмотр обложки альбома.
Описание основных характеристик альбома.
Композиции входящие в данный альбом.
Описание основных характеристик композиции.
Поиск композиций по рейтингу.
2.1.2 Список используемых в базе знаний проектируемой интеллектуальной справочной системы ip-компонентов
В данной интеллектуальной справочной системе использованы исходные разделы база знаний help-системы:
ИсхБз. SC-ядро
ИсхБз. SCg-язык
ИсхБз. SС-язык множеств
ИсхБз. SС-язык отношений
ИсхБз. SС-язык числовых систем
ИсхБз. Логический SС-язык
ИсхБз. Гипермедийный SС-язык
ИсхБз. Дидактический SС-язык
ИсхБз. SС-язык описания ошибок
ИсхБз. Пользовательский интерфейс SRS
Включение этого компонента в проектируемую систему позволяет уменьшить сроки разработки, так как нет необходимости повторного проектирования данных фрагментов.
2.2 Онтология базы знаний проектируемой интеллектуальной системы
Бинарные отношения:
«альбом*» - бинарное отношение между исполнителем и его альбомами.
«композиция*» - бинарное отношение между альбомом и композициями в него входящими.
«описание*» - бинарное отношение между объектом и параметрами, его характеризующими.
«страна*» - бинарное отношение между исполнителем и страной исполнителя.
«год*» - бинарное отношение между исполнителем и годом его основания.
«вид*» - бинарное отношение между исполнителем и его видом (группа, соло и т.д.).
«обложка*» - бинарное отношение между альбомом и его обложкой.
«год выпуска*» - бинарное отношение между альбомом и годом его выпуска.
«носитель*» - бинарное отношение между альбомом и носителем, на котором он был издан.
«тип записи*» - бинарное отношение между альбомом и типом его записи.
«объем*» - бинарное отношение между альбомом и его объемом.
«награды*» - бинарное отношение между альбомом и его наградами.
«музыка*» - бинарное отношение между композицией и его музыкой.
«текст*» - бинарное отношение между композицией и его текстом.
«время*» - бинарное отношение между композицией и его продолжительностью.
«место в чарте*» - бинарное отношение между композицией и местом в чарте.
«лейбл*» - бинарное отношение между композицией и лейблом звукозаписи.
«композитор*» - бинарное отношение между музыкой композиции и его композитором.
«автор*» - бинарное отношение между текстом композиции и его автором.
«тема*» - бинарное отношение между текстом композиции и его темой.
Всего: 20 бинарных отношений.
«Исполнители» - группа всех исполнителей.
«Альбомы» - группа всех альбомов.
«Композиции» - группа всех композиций.
«Носители» - группа всех носителей.
«Композиторы»» - группа всех композиторов музыки.
«Авторы» - группа всех авторов текста.
Всего: 6 узлов групп.
2.3 Содержательная декомпозиция базы знаний проектируемой интеллектуальной системы
Базу знаний можно поделить на фрагменты, в которых дается описание исполнителей, альбомов, МП и отношений между ними.
Так при описании исполнителя представлены следующие характеристики: страна*, год основания*, вид*. Пример описания одного из исполнителей представлен на рисунке 2.3.1.
Рисунок 2.3.1. – Описание исполнителя
При описании альбома в качестве его характеристик представлены: обложка альбома*, год выпуска*, носитель*, тип записи*, объем*, награды*. Пример описания альбома представлен на рисунке 2.3.2.
Рисунок 2.3.2. – Описание альбома
Пример описания МП представлен на рисунке 2.3.3.
Рисунок 2.3.3. – Описание МП
Пример описания структуры отношений представлен на рисунке 2.3.4.
Рисунок 2.3.4. – Описание структуры отношений
2.4 Исходные тексты базы знаний прототипа интеллектуальной системы
Исходные тексты базы знаний прототипа интеллектуальной системы хранятся в следующих файлах:
8diagrams_album.gwf
bringdaruckus_track.gwf
clapyohands_track.gwf
enterthewutang_album.gwf
familytree_track.gwf
iicons_album.gwf
intro.gwf
naughtybynature_artist.gwf
naughtybynature_struct.gwf
oldergods_track.gwf
povetry`sparadise_album.gwf
protectyaneck_track.gwf
shameonanigga_track.gwf
whatyouwannado_track.gwf
wutangclan_artist.gwf
wutangclan_struct.gwf
wutangforever_album.gwf
elmanana_track.gwf
feelgoodinc_track.gwf
ogreenworld_track.gwf
kidswithguns_track.gwf
lastlivingsouls_track.gwf
intro_track.gwf
demondays_album.gwf
gorillaz_struct.gwf
rockthehouse_track.gwf
doublebass_track.gwf
soundcheck_track.gwf
punk_track.gwf
manresearch_track.gwf
clinteastwood_track.gwf
newgenius_track.gwf
tomorrowcomestoday_track.gwf
54_track.gwf
re-hash_track.gwf
gorillaz_album.gwf
gorillaz_artist.gwf
Пример содержания этих файлов можно увидеть на рисунках 2.3.1, 2.3.2, 2.3.3, 2.3.4.
2.5 Верификация и отладка базы знаний прототипа интеллектуальной системы
Верификация базы знаний в текущей версии интеллектуальной справочной системы по МП не производилась, так как в предыдущей версии системы база знаний была грамотно организована. База была дополнена новыми исполнителями, альбомами и композициями. Дополнение и проверка производилась с помощью SRS Studio.
2.6 Спецификация разработанной базы знаний интеллектуальной системы и сертификация разработанных ip-компонентов
В базе знаний на данный момент содержится 3 исполнителя, 7 альбомов и более 20 композиций.
В качестве ip-компонентов могут быть использованы:
Определения понятий (МП, альбом, исполнитель, жанр и т.д.).
Музыкальные композиции.
Видеоклипы к музыкальным произведениям.
3. Машина обработки знаний проектируемой интеллектуальной справочной системы
3.1 Задачно-ориентированная спецификация машины обработки знаний проектируемой интеллектуальной справочной системы
3.1.1 Тестовый список задач
Под предметными задачами будем понимать все задачи, специфичные для данной предметной области:
поиск исполнителей по описанию
поиск информации об исполнителях
поиск альбомов по описанию
поиск информации об альбомах
поиск МП по описанию
сравнение альбомов
3.1.2 Содержательная классификация задач
Множество предметных задач с точки зрения методов их решения можно разбить на два класса:
информационно-поисковые задачи, ответы на которые присутствуют в базе знаний решателя предметных задач и, следовательно, их надо только найти;
задачи, ответы на которые требуется построить.
Среди информационно-поисковых задач можно выделить задачи, в которых цель поиска может быть точно описана «шаблоном» поиска, т.е. результатом решения задачи будут все фрагменты семантической сети базы знаний, удовлетворяющие этому шаблону. Примерами таких задач является
поиск информации о МП;
поиск информации об альбоме;
поиск информации об исполнителе.
Другим классом информационно-поисковых задач являются задачи, результат решения которых не описывается шаблоном, а осуществляется с помощью scp-программы. Примерами таких задач являются:
сравнение альбомов;
поиск альбомов по нескольким характеристикам;
поиск МП по нескольким характеристикам.
3.1.3 Список используемых в операциях ip-компонентов
В данной интеллектуально справочной системе были использованы следующие операции, являющиеся Ip-компонентами, и предоставленные вместе со средой разработки интеллектуальных справочных систем:
all_input
all_output_all_types
analogy
example
graph
lib
logic_queries
logical_hierarhy
paramsProcessing
printSetArcs
printSetElems
main_close
main_open
open
pack_menu
peresechenie
reduce_menu
remove_menu_item
searchEnvironmentSmart
searchPatternEx
synonym_by_node
synonym_by_node_ui
synonym_by_term_ui
tests
ui_io_build_srs
ui_io_copy_scg
ui_io_erase_scg_countur
ui_io_erase_scg_el
ui_io_exec_command
ui_io_gen_srswindow
ui_io_increase
ui_io_load_folder
ui_io_load_scg
ui_io_modify_scg_el_content
ui_io_modify_scg_el_name
ui_io_modify_scg_el_type
ui_io_paste_scg
ui_io_reduction
ui_io_save_scg
ui_io_select_all
ui_registration_type_wnd
ui_show_content
ui_show_content_swf
ui_unregistration_type_wnd
update_menu
ways
whatisknown
3.1.4 Классификация и спецификация операций проектируемой машины обработки знаний
1. Классификация операции all_performers.m4scp.
Название операции: all_performer.
Предметная ориентация: МП.
Входные параметры: нет.
Выходные параметры: все известные исполнители.
Способ вызова: автоматически, при создании окна пользовательского интерфейса.
Спецификация операции all_performers.m4scp.
Идентификатор операции: descr_all_performer.
Полное имя: \operation\ all_performers.m4scp.
Комментарий: операция поиска в БЗ всех известных исполнителей.
Автор: Лукша Н.В.
2. Классификация операции all_albums_this_performer.m4scp.
Название операции: all_albums_this_performer.
Предметная ориентация: МП.
Входные параметры: узел с именем исполнителя.
Выходные параметры: все альбомы данного исполнителя.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции all_albums_this_performer.m4scp.
Идентификатор операции: descr_all_albums_this_performer.
Полное имя: \operation\all_albums_this_performer.m4scp.
Комментарий: операция поиска в БЗ всех альбомов данного исполнителя.
Автор: Лукша Н.В.
3. Классификация операции all_tracks_this_album.m4scp.
Название операции: all_tracks_this_album.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: все МП данного альбома.
Способ вызова: при выборе альбома из ListBox.
Спецификация операции all_tracks_this_album.m4scp.
Идентификатор операции: descr_all_tracks_this_album.
Полное имя: \operation\all_tracks_this_album.m4scp.
Комментарий: операция поиска в БЗ всех МП из данного альбома.
Автор: Лукша Н.В.
4. Классификация операции country_of_performer.m4scp.
Название операции: country_of_performer.
Предметная ориентация: МП.
Входные параметры: узел с именем исполнителя.
Выходные параметры: страна данного исполнителя.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции country_of_performer.m4scp.
Идентификатор операции: descr_country_of_performer.
Полное имя: \operation\country_of_performer.m4scp.
Комментарий: операция поиска в БЗ страны данного исполнителя.
Автор: Лукша Н.В.
5. Классификация операции kind_of_performer.m4scp.
Название операции: kind_of_performer.
Предметная ориентация: МП.
Входные параметры: узел с именем исполнителя.
Выходные параметры: вид данного исполнителя.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции kind_of_performer.m4scp.
Идентификатор операции: descr_kind_of_performer.
Полное имя: \operation\kind_of_performer.m4scp.
Комментарий: операция поиска в БЗ вида данного исполнителя.
Автор: Лукша Н.В.
6. Классификация операции year_of_foundation.m4scp.
Название операции: year_of_foundation.
Предметная ориентация: МП.
Входные параметры: узел с именем исполнителя.
Выходные параметры: год основания данного исполнителя.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции year_of_foundation.m4scp.
Идентификатор операции: descr_year_of_foundation.
Полное имя: \operation\year_of_foundation.m4scp.
Комментарий: операция поиска в БЗ года основания данного исполнителя.
Автор: Лукша Н.В.
7. Классификация операции type_rec.m4scp.
Название операции: type_rec.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции type_rec.m4scp.
Идентификатор операции: descr_type_rec.
Полное имя: \operation\type_rec.m4scp.
Комментарий: операция поиска в БЗ типа записи данного альбома.
Автор: Лукша Н.В.
8. Классификация операции vol.m4scp.
Название операции: vol.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции vol.m4scp.
Идентификатор операции: descr_vol.
Полное имя: \operation\vol.m4scp.
Комментарий: операция поиска в БЗ типа записи данного альбома.
Автор: Лукша Н.В.
9. Классификация операции style_of_track.m4scp.
Название операции: style_of_track.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции style_of_track.m4scp.
Идентификатор операции: descr_style_of_track.
Полное имя: \operation\style_of_track.m4scp.
Комментарий: стиль МП.
Автор: Лукша Н.В.
10. Классификация операции rewards.m4scp.
Название операции: rewards.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции rewards.m4scp.
Идентификатор операции: descr_rewards.
Полное имя: \operation\rewards.m4scp.
Комментарий: награды данного альбома.
Автор: Лукша Н.В.
11. Классификация операции type_rec.m4scp.
Название операции: type_rec.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции type_rec.m4scp.
Идентификатор операции: descr_type_rec.
Полное имя: \operation\type_rec.m4scp.
Комментарий: операция поиска в БЗ типа записи данного альбома.
Автор: Лукша Н.В.
12. Классификация операции rating.m4scp.
Название операции: rating.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции rating.m4scp.
Идентификатор операции: descr_rating.
Полное имя: \operation\rating.m4scp.
Комментарий: рейтинг данной композиции.
Автор: Лукша Н.В.
13. Классификация операции label_rec.m4scp.
Название операции: label_rec.
Предметная ориентация: МП.
Входные параметры: узел с именем альбома.
Выходные параметры: тип записи данного альбома.
Способ вызова: при выборе исполнителя из ListBox.
Спецификация операции label_rec.m4scp.
Идентификатор операции: descr_label_rec.
Полное имя: \operation\label_rec.m4scp.
Комментарий: поиск лейбла звукозаписи.
Автор: Лукша Н.В.
3.1.5 Декомпозиция операций на подпрограммы и содержательная структура библиотеки программ специфицированных операций
В написанных scp-операциях подпрограммы не использовались.
3.2 Алгоритмы и исходные тексты программ, реализующие операции машины обработки знаний прототипа интеллектуальной справочной системы
поиск альбома по описанию (файл search_by_param.m4scp)
входные параметры: узлы, характеризующие искомый альбом;
выходные параметры: все альбомы подходящие под данное описание.
Алгоритм:
Делаем копию входных параметров.
Проверяем первый параметр.
Находим все альбомы, которые удовлетворяют п.2 и объединяем их в множество 1.
Проверяем второй параметр (если такового нет, переходим п.10).
Находим все альбомы, которые удовлетворяют п.4 и объединяем их в множество 2.
Проверяем третий параметр (если такового нет, переходим в п.9).
Находим все альбомы, которые удовлетворяют п.6 и объединяем их в множество 3.
Находим пересечение множеств 1 и 3 и записываем в множество 1.
Находим пересечение множеств 1 и 2 и записываем в множество 1.
Выводим множество 1 на новый лист.
Пример диалога:
Рисунок 3.2.1 - вопрос «Поиск альбома по описанию»
Рисунок 3.2.2 - ответ на вопрос «Поиск альбома по описанию»
Исходный текст операции:
//#Операция поиска альбома по его описанию
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(search_by_param,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
"MB_TEXT_ERROR1" = /"Не равны"/;
"MB_TEXT_ERROR2" = /"А сломалося!"/;
"Альбомы";
"описание*";
"тип записи*"
]],
[{
sheet,
shift,
node,
node1,
node_temp,
node_temp1,
arc,
arc1,
arc2,
attr_arc,
selected_els,
selected_els_copy,
result_set,
result_set1,
result_set2,
temp_node_with_param,
test_node,
node_param,
result,
set_albums_copy,
node_album,
set_album_param,
temp_node,
temp_set_1,
temp_set_2,
temp_set_3,
temp_set_5,
temp_set_0,
resultSet1,
resultSet2,
resultSet3,
resultSet4,
node_out_resSet2,
node_out_resSet3,
node_out_resSet4,
output_set
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
genEl([
1_: assign_: node_: output_set
])
genEl([
1_: assign_: node_: result_set
])
genEl([
1_: assign_: node_: result_set1
])
genEl([
1_: assign_: node_: result_set2
])
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
])
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler)
genElStr3([
1_: fixed_: result_set,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album,)
label(not_other_album)
////////////////////////////////////////////////////////////////////////
////
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
],,output)
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album1)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album1)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler1)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album1)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler1)
genElStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album1,)
////////////////////////////////////////////////////////////////////////
label(not_other_album1)
////////////////////////////////////////////////////////////////////////
//
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
],,output)
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album2)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album2)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler2)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album2)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler2)
genElStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album2,)
////////////////////////////////////////////////////////////////////////
label(not_other_album2)
//////////////////////////
label(output)
////////////////////////////////////////////////////////////////////////
searchSetStr3([
1_: fixed_: result_set,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: fixed_: output_set
])
//#Проверим является ли множество result_set1 пустым
searchElStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node
],,out)
selectYStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: output_set
])
//#Проверим является ли множество result_set2 пустым
searchElStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node
],,out)
selectYStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: output_set
])
////////////////////////////////////////////////////////////////////////
label(out)
ui_sheet_create([
1_: assign_: sheet,
2_: fixed_: sheet_type,
3_: fixed_: sheet_title,
4_: fixed_: layout
])
ui_output([1_: fixed_: sheet, 2_: fixed_: output_set])
return()
end
поиск альбома по типу записи (файл search_by_type.m4scp)
входные параметры: узел, содержащий тип записи;
выходные параметры: все альбомы с данным типом записи.
Пример диалога:
Рисунок 3.2.3 - вопрос «Поиск альбома по типу записи»
Рисунок 3.2.4 - ответ на вопрос «Поиск альбома по типу записи»
Алгоритм:
Делаем копию входных параметров.
Находим все узлы альбомов, подходящие под введенное описание и записываем их в множество 1.
Выводим на новый лист множество 1.
Исходный текст операции:
//#Операция поиска альбома по его описанию
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(search_by_type,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
"MB_TEXT_ERROR1" = /"Не равны"/;
"MB_TEXT_ERROR2" = /"А сломалося!"/;
"Альбомы";
"описание*";
"тип записи*"
]],
[{
sheet,
shift,
node,
node1,
node_temp,
node_temp1,
arc,
arc1,
arc2,
attr_arc,
selected_els,
selected_els_copy,
result_set,
temp_node_with_param,
test_node,
node_param,
result,
set_albums_copy,
node_album,
set_album_param,
temp_node,
temp_set_1,
temp_set_2,
temp_set_3,
temp_set_5,
temp_set_0,
resultSet1,
resultSet2,
resultSet3,
resultSet4,
node_out_resSet2,
node_out_resSet3,
node_out_resSet4
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
genEl([
1_: assign_: node_: result_set
])
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
])
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "тип записи*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler)
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#--------_Выделяем одно из описаний типа записи node_param_----------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_param
])
//#--------_Проверка равенства найденного описания и введенного пользователем_-----
ifCoin([
1_: fixed_: node_param,
2_: fixed_: temp_node_with_param
],,other_album)
//#--------_Если альбом удовлетворяет условию, то заносим его в result_set_-------
genElStr3([
1_: fixed_: result_set,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album,other_album,other_album)
label(not_other_album)
ui_sheet_create([
1_: assign_: sheet,
2_: fixed_: sheet_type,
3_: fixed_: sheet_title,
4_: fixed_: layout
])
ui_output([1_: fixed_: sheet, 2_: fixed_: result_set])
return()
end
сравнение альбомов (файл ass.m4scp)
входные параметры: альбомы для сравнения;
выходные параметры: общие характеристики для сравниваемых альбом.
Пример диалога:
Рисунок 3.1.5 - вопрос «Поиск альбома по типу записи»
Рисунок 3.1.6 - ответ на вопрос «Поиск альбома по типу записи»
Алгоритм:
Делаем копию входных данных.
Находим все параметры описания для первого альбома и записываем в множество 1.
Находим все параметры описания для второго альбома и записываем в множество 2.
Находим пересечение множеств 1 и 2, записываем результат в множество 1.
Выводим на новый лист множество 1.
Исходный текст операции:
//#Операция общее между двумя альбомами
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(ass,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
"MB_TEXT_ERROR1" = /"Не равны"/;
"MB_TEXT_ERROR2" = /"А сломалося!"/;
"Альбомы";
"описание*";
"тип записи*"
]],
[{
sheet,
shift,
node,
node1,
node_temp,
node_temp1,
arc,
arc1,
arc2,
attr_arc,
selected_els,
selected_els_copy,
result_set,
result_set1,
result_set2,
temp_node_with_param,
test_node,
node_param,
result,
set_albums_copy,
node_album,
set_album_param,
temp_node,
temp_set_1,
temp_set_2,
temp_set_3,
temp_set_5,
temp_set_0,
resultSet1,
resultSet2,
resultSet3,
resultSet4,
node_out_resSet2,
node_out_resSet3,
node_out_resSet4,
output_set,
set1,
set2,
set3,
set4,
node_in,
node_to_result_set1,
node_to_result_set2,
node_out,
node_to_description,
node_start_descr,
set_with_node_start_descrp,
node_to_result,
set_album1,
set_album2
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
genEl([
1_: assign_: node_: output_set
])
genEl([
1_: assign_: node_: result_set
])
genEl([
1_: assign_: node_: result_set1
])
genEl([
1_: assign_: node_: result_set2
])
genEl([
1_: assign_: node_: result
])
genEl([
1_: assign_: node_: set_album1
])
genEl([
1_: assign_: node_: set_album2
])
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: node_album
])
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchElStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node_to_description,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
])
//#---------------2_проходим тройку_------------------
searchSetStr3([
1_: fixed_: node_to_description,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_start_descr,
set3_: assign_: set_with_node_start_descrp
])
//#--------------_Записываем все параметры в сеты для каждого альбома----------------
label(next_descrp)
searchElStr3([
1_: fixed_: set_with_node_start_descrp,
2_: assign_: arc,
3_: assign_: node_in
],,next_album)
//#----_ydalili dugu k yzly_---
eraseEl([
1_: fixed_: arc
])
//#--------_Пройдем пятерочку_----
searchElStr5([
1_: assign_: node_out,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_in,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_: atr1
])
searchElStr5([
1_: fixed_: node_out,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node_to_result,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_: atr2
])
genElStr3([
1_: fixed_: set_album1,
2_: assign_: arc_: arc,
3_: fixed_: node_to_result
],next_descrp,)
//#-----_povtaryaem vse dlya vtorogo alboma_--------
label(next_album)
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: node_album
])
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchElStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node_to_description,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
])
//#---------------2_проходим тройку_------------------
searchSetStr3([
1_: fixed_: node_to_description,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_start_descr,
set3_: assign_: set_with_node_start_descrp
])
//#--------------_Записываем все параметры в сеты для каждого альбома----------------
label(next_descrp2)
searchElStr3([
1_: fixed_: set_with_node_start_descrp,
2_: assign_: arc,
3_: assign_: node_in
],,out)
//#----_ydalili dugu k yzly_---
eraseEl([
1_: fixed_: arc
])
//#--------_Пройдем пятерочку_----
searchElStr5([
1_: assign_: node_out,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_in,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_: atr1
])
searchElStr5([
1_: fixed_: node_out,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node_to_result,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_: atr2
])
genElStr3([
1_: fixed_: set_album2,
2_: assign_: arc_: arc,
3_: fixed_: node_to_result
],next_descrp2,)
label(out)
//#--------_Naxodim obschie elementy_--------
selectYStr3([
1_: fixed_: set_album2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: set_album1
])
//#--------_Вывод_-------
ui_sheet_create([
1_: assign_: sheet,
2_: fixed_: sheet_type,
3_: fixed_: sheet_title,
4_: fixed_: layout
])
ui_output([1_: fixed_: sheet, 2_: fixed_: set_album1])
return()
end
поиск года основания исполнителя (файл year_of_foundation.m4scp)
входные параметры: узел, содержащий название исполнителя;
выходные параметры: год основания исполнителя.
Пример диалога:
Рисунок 3.2.6 - вопрос год основания исполнителя
Алгоритм:
Делаем копию входных параметров.
Ищем год основания исполнителя.
Формируем результирующее множество.
Исходный текст операции:
//#Операция получения года основания выбранного исполнителя
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(year_of_foundation,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
sall = "/etc/im_keynode/get_year";
cmd = "/operation/ui_io_exec_command_par/exec_command_par";
beg = /"...!!year_of_found_performer!!..\n"/;
"описание*";
"год основания*";
"Исполнители"
]],
[{
sheet,
shift,
node,
node1,
node2,
node3,
node4,
node5,
performer,
arc,
arc1,
arc2,
arc3,
selected_els,
selected_els_copy,
set,
set1,
set2,
set3,
set4,
result_set,
output_set,
out,
descr
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
label(other_copy)
//#Выделяем один из элементов performer множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: const_: arc,
3_: assign_: const_: performer
])
//#Удаляем дугу arc проведенную из selected_els_copy к performer
eraseEl([
1_: fixed_: arc
])
//#Проходим первую пятерку пары
searchSetStr5([
1_: assign_: const_: node1,
2_: assign_: const_: arc1,
3_: fixed_: performer,
4_: assign_: const_: arc2,
5_: fixed_: atr1,
set1_: assign_: set
],,other_copy,other_copy)
//#Под отношением описание*
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set1
])
//#Находим пересечение множеств set и set1
selectYStr3([
1_: fixed_: set1,
2_: assign_: const_: arc3,
3_: assign_: node_ : node2,
set3_: fixed_: set
],,other_copy,other_copy)
searchElStr3([
1_: fixed_: set,
2_: assign_: const_: arc,
3_: assign_: const_: node3
])
//#Проходим вторую пятерку пары
searchSetStr5([
1_: fixed_: node3,
2_: assign_: const_: arc1,
3_: assign_: node4,
4_: assign_: const_: arc2,
5_: fixed_: atr2,
set3_: assign_: set2
],,other_copy,other_copy)
searchElStr3([
1_: fixed_: set2,
2_: assign_: const_: arc,
3_: assign_: const_: node1
])
//#Проходим тройку
searchSetStr3([
1_: fixed_: node1,
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set
])
label(other_node)
searchElStr3([
1_: fixed_: set,
2_: assign_: const_: arc,
3_: assign_: const_: node5
])
//#Удаляем дугу arc
eraseEl([
1_: fixed_: arc
])
//#Проходим первую пятерку второй пары
searchSetStr5([
1_: assign_: const_: node1,
2_: assign_: const_: arc1,
3_: fixed_: node5,
4_: assign_: const_: arc2,
5_: fixed_: atr1,
set1_: assign_: set3
],,other_node,other_node)
//#Под отношением год основания*
searchSetStr3([
1_: fixed_: "год основания*",
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set4
])
//#Находим пересечение множеств set3 и set4
selectYStr3([
1_: fixed_: set4,
2_: assign_: const_: arc3,
3_: assign_: node_ : node2,
set3_: fixed_: set3
],,other_node,other_node)
searchElStr3([
1_: fixed_: set3,
2_: assign_: const_: arc,
3_: assign_: const_: node3
])
//#Проходим вторую пятерку второй пары
searchSetStr5([
1_: fixed_: node3,
2_: assign_: const_: arc1,
3_: assign_: const_: node5,
4_: assign_: const_: arc2,
5_: fixed_: atr2,
set3_: assign_: out
])
printNl([1_: fixed_: beg])
callReturn([1_: fixed_: cmd,
2_: fixed_:{[
1_: out,
2_: sheet,
3_: sall
]}
], descr)
return()
end
поиск композиции по рейтингу (файл search_by_rating.m4scp)
входные параметры: узел, содержащий название исполнителя;
выходные параметры: год основания исполнителя.
Пример диалога:
Рисунок 3.2.7 - вопрос композиции с выбранным рейтингом
Алгоритм:
Делаем копию входных параметров.
Ищем композиции по рейтингу.
Формируем результирующее множество.
Исходный текст операции:
//#Операция получения страны выбранного исполнителя
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(search_by_rating,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
sall = "/etc/im_keynode/get_search_rating";
cmd = "/operation/ui_io_exec_command_par/exec_command_par";
beg = /"...!!search_by_rating!!..\n"/;
"описание*";
"место в чарте*";
"Исполнители"
]],
[{
sheet,
shift,
node,
node1,
node2,
node3,
node4,
node5,
node6,
performer,
arc,
arc1,
arc2,
arc3,
selected_els,
selected_els_copy,
output_set,
set,
set1,
set2,
set3,
set4,
set_bean,
out,
descr
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
genEl([
1_: assign_: node_: out
])
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
label(other_copy)
//#Выделяем один из элементов performer множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: const_: arc,
3_: assign_: const_: performer
])
//#Удаляем дугу arc проведенную из selected_els_copy к performer
eraseEl([
1_: fixed_: arc
])
//#Проходим первую пятерку пары
searchSetStr5([
1_: assign_: const_: node1,
2_: assign_: const_: arc1,
3_: fixed_: performer,
4_: assign_: const_: arc2,
5_: fixed_: atr2,
set1_: assign_: set_bean
],,other_copy,other_copy)
//#Под отношением место в чарте*
searchSetStr3([
1_: fixed_: "место в чарте*",
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set1
])
//#Находим пересечение множеств set и set1
selectYStr3([
1_: fixed_: set1,
2_: assign_: const_: arc3,
3_: assign_: node_ : node2,
set3_: fixed_: set_bean
],,other_copy,other_copy)
label(other_bean)
//#Выделяем один из элементов
searchElStr3([
1_: fixed_: set_bean,
2_: assign_: const_: arc,
3_: assign_: const_: node6
],,to_end,to_end)
//#Удаляем дугу arc проведенную
eraseEl([
1_: fixed_: arc
])
searchSetStr5([
1_: fixed_: node6,
2_: assign_: const_: arc1,
3_: assign_: const_: node5,
4_: assign_: const_: arc2,
5_: fixed_: atr1,
set3_: fixed_: out
],other_bean)
label(to_end)
printNl([1_: fixed_: beg])
callReturn([1_: fixed_: cmd,
2_: fixed_:{[
1_: out,
2_: sheet,
3_: sall
]}
], descr)
return()
end
поиск композиции по рейтингу (файл search_by_rating.m4scp)
входные параметры: узел, содержащий название альбома;
выходные параметры: обложка альбома.
Пример диалога:
Рисунок 3.2.8 - вопрос композиции с выбранным рейтингом
Алгоритм:
Делаем копию входных параметров.
Ищем композиции по рейтингу.
Формируем результирующее множество.
Исходный текст операции:
//#Операция поиска альбома по его описанию
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(search_by_param,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
"MB_TEXT_ERROR1" = /"Не равны"/;
"MB_TEXT_ERROR2" = /"А сломалося!"/;
"Альбомы";
"описание*";
"тип записи*"
]],
[{
sheet,
shift,
node,
node1,
node_temp,
node_temp1,
arc,
arc1,
arc2,
attr_arc,
selected_els,
selected_els_copy,
result_set,
result_set1,
result_set2,
temp_node_with_param,
test_node,
node_param,
result,
set_albums_copy,
node_album,
set_album_param,
temp_node,
temp_set_1,
temp_set_2,
temp_set_3,
temp_set_5,
temp_set_0,
resultSet1,
resultSet2,
resultSet3,
resultSet4,
node_out_resSet2,
node_out_resSet3,
node_out_resSet4,
output_set
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
genEl([
1_: assign_: node_: output_set
])
genEl([
1_: assign_: node_: result_set
])
genEl([
1_: assign_: node_: result_set1
])
genEl([
1_: assign_: node_: result_set2
])
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
])
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler)
genElStr3([
1_: fixed_: result_set,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album,)
label(not_other_album)
////////////////////////////////////////////////////////////////////////
////
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
],,output)
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album1)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album1)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler1)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album1)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler1)
genElStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album1,)
////////////////////////////////////////////////////////////////////////
label(not_other_album1)
////////////////////////////////////////////////////////////////////////
//
//#Выделяем один из элементов temp_node_with_param множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: temp_node_with_param
],,output)
//#Удаляем дугу arc проведенную из selected_els_copy к temp_node
eraseEl([
1_: fixed_: arc
])
//#Делаем копию set_albums_copy всех альбомов
searchSetStr3([
1_: fixed_: "Альбомы",
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: set_albums_copy
])
//#Проверяем описание каких альбомов удовлетворяет узел temp_node_with_param
//#Берем один альбом node_album из множества альбомов set_albums_copy
label(other_album2)
searchElStr3([
1_: fixed_: set_albums_copy,
2_: assign_: arc_: pos_: const_: arc,
3_: assign_: node_: const_: node_album
],,not_other_album2)
//#Удаляем дугу arc проведенную из set_albums_copy к node_album
eraseEl([
1_: fixed_: arc
])
//#Найдем множество set_album_param всех описаний альбома node_album
//#---------------1_проходим первую пару_------------------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_album,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
])
searchElStr3([
1_: fixed_: resultSet2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet2
])
searchSetStr5([
1_: fixed_: node_out_resSet2,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: const_: node_: node,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set3_: assign_: resultSet3
])
//#---------------2_проходим тройку_------------------
searchElStr3([
1_: fixed_: resultSet3,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet3
])
searchSetStr3([
1_: fixed_: node_out_resSet3,
2_: assign_: pos_: arc_: const_: arc,
3_: assign_: node,
set3_: assign_: resultSet4
])
//#Альбомы описываются по трем критериям, проверяем каждый из
//#---------------1_Проверка по типу записи_--------------
label(other_handler2)
searchElStr3([
1_: fixed_: resultSet4,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node_out_resSet4
],,other_album2)
//#Удаляем дугу arc проведенную из resultSet4 к node_out_resSet4
eraseEl([
1_: fixed_: arc
])
//#--------Ищем альбом по его введенному описанию---------
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: node_out_resSet4,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr1,
set1_: assign_: resultSet1
])
searchSetStr5([
1_: assign_: const_: node_: node,
2_: assign_: pos_: arc_: const_: arc,
3_: fixed_: temp_node_with_param,
4_: assign_: pos_: arc_: const_: arc1,
5_: fixed_:atr2,
set1_: assign_: resultSet2
])
selectYStr3([
1_: fixed_: resultSet1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: resultSet2
],,other_handler2)
genElStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: fixed_: node_album
],other_album2,)
////////////////////////////////////////////////////////////////////////
label(not_other_album2)
//////////////////////////
label(output)
////////////////////////////////////////////////////////////////////////
searchSetStr3([
1_: fixed_: result_set,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: fixed_: output_set
])
//#Проверим является ли множество result_set1 пустым
searchElStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node
],,out)
selectYStr3([
1_: fixed_: result_set1,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: output_set
])
//#Проверим является ли множество result_set2 пустым
searchElStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node
],,out)
selectYStr3([
1_: fixed_: result_set2,
2_: assign_: const_: pos_: arc,
3_: assign_: node_ : node,
set3_: fixed_: output_set
])
////////////////////////////////////////////////////////////////////////
label(out)
ui_sheet_create([
1_: assign_: sheet,
2_: fixed_: sheet_type,
3_: fixed_: sheet_title,
4_: fixed_: layout
])
ui_output([1_: fixed_: sheet, 2_: fixed_: output_set])
return()
end
поиск композиции по рейтингу (файл type_rec.m4scp)
входные параметры: узел, содержащий название альбома;
выходные параметры: тип альбома.
Пример диалога:
Рисунок 3.2.9 - вопрос тип выбранного альбома
Алгоритм:
Делаем копию входных параметров.
Ищем тип записи альбома.
Формируем результирующее множество.
Исходный текст операции:
//#Операция получения типа записи альбома
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
procedure(type_rec,
[[
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
sheet_title = /"Операция прошла успешно"/;
atr1 = "/proc/keynode/1_";
atr2 = "/proc/keynode/2_";
ui_information;
layout;
"MB_TITLE_QUERY_RESULT" = /"Результат запроса"/;
"MB_TEXT_METKA" = /"Метка"/;
sall = "/etc/im_keynode/get_type";
cmd = "/operation/ui_io_exec_command_par/exec_command_par";
beg = /"...!!type_of_track!!..\n"/;
"описание*";
"тип записи*";
"Исполнители"
]],
[{
sheet,
shift,
node,
node1,
node2,
node3,
node4,
node5,
performer,
arc,
arc1,
arc2,
arc3,
selected_els,
selected_els_copy,
set,
set1,
set2,
set3,
set4,
result_set,
output_set,
out,
descr
}],
{[
1_: in_: selected_els,
2_: in_: sheet,
3_: in_: shift
]}
)
//#Копия selected_els_copy входных данных
searchSetStr3([
1_: fixed_: selected_els,
2_: assign_: const_: pos_: arc_: arc,
3_: assign_: node_: const_: node,
set3_: assign_: selected_els_copy
])
label(other_copy)
//#Выделяем один из элементов performer множества selected_els_copy
searchElStr3([
1_: fixed_: selected_els_copy,
2_: assign_: const_: arc,
3_: assign_: const_: performer
])
//#Удаляем дугу arc проведенную из selected_els_copy к performer
eraseEl([
1_: fixed_: arc
])
//#Проходим первую пятерку пары
searchSetStr5([
1_: assign_: const_: node1,
2_: assign_: const_: arc1,
3_: fixed_: performer,
4_: assign_: const_: arc2,
5_: fixed_: atr1,
set1_: assign_: set
],,other_copy,other_copy)
//#Под отношением описание*
searchSetStr3([
1_: fixed_: "описание*",
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set1
])
//#Находим пересечение множеств set и set1
selectYStr3([
1_: fixed_: set1,
2_: assign_: const_: arc3,
3_: assign_: node_ : node2,
set3_: fixed_: set
],,other_copy,other_copy)
searchElStr3([
1_: fixed_: set,
2_: assign_: const_: arc,
3_: assign_: const_: node3
])
//#Проходим вторую пятерку пары
searchSetStr5([
1_: fixed_: node3,
2_: assign_: const_: arc1,
3_: assign_: node4,
4_: assign_: const_: arc2,
5_: fixed_: atr2,
set3_: assign_: set2
],,other_copy,other_copy)
searchElStr3([
1_: fixed_: set2,
2_: assign_: const_: arc,
3_: assign_: const_: node1
])
//#Проходим тройку
searchSetStr3([
1_: fixed_: node1,
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set
])
label(other_node)
searchElStr3([
1_: fixed_: set,
2_: assign_: const_: arc,
3_: assign_: const_: node5
])
//#Удаляем дугу arc
eraseEl([
1_: fixed_: arc
])
//#Проходим первую пятерку второй пары
searchSetStr5([
1_: assign_: const_: node1,
2_: assign_: const_: arc1,
3_: fixed_: node5,
4_: assign_: const_: arc2,
5_: fixed_: atr1,
set1_: assign_: set3
],,other_node,other_node)
//#Под отношением тип записи*
searchSetStr3([
1_: fixed_: "тип записи*",
2_: assign_: const_: arc,
3_: assign_: const_: node,
set3_: assign_: set4
])
//#Находим пересечение множеств set3 и set4
selectYStr3([
1_: fixed_: set4,
2_: assign_: const_: arc3,
3_: assign_: node_ : node2,
set3_: fixed_: set3
],,other_node,other_node)
searchElStr3([
1_: fixed_: set3,
2_: assign_: const_: arc,
3_: assign_: const_: node3
])
//#Проходим вторую пятерку второй пары
searchSetStr5([
1_: fixed_: node3,
2_: assign_: const_: arc1,
3_: assign_: const_: node5,
4_: assign_: const_: arc2,
5_: fixed_: atr2,
set3_: assign_: out
])
printNl([1_: fixed_: beg])
callReturn([1_: fixed_: cmd,
2_: fixed_:{[
1_: out,
2_: sheet,
3_: sall
]}
], descr)
return()
end
3.3 Верификация и отладка программ специфицированных операций
Отладка производилась с помощью Notepad++, SRS Studio и сообщений в командной строке. В процессе отладки текущей версии системы был выявлен следующий ряд ошибок:
1. Добавление в файл menu.scsy нового пункта меню: SRS Studio запускалась, но меню было не доступно .
Типовые ошибки:
стояли лишние запятые в тексте программы;
не хватало запятых;
не хватало закрывающих list_next скобок.
2. Добавление nsm-комманд в файл event.scsx: при попытке нажать на пункт меню, соответствующий nsm-комманде выводилось сообщение «Ошибка!Описание данного события не найдено!»
Ошибка: в файле event.scsx указан неправильный id или ссылка на операцию.
Типовые ошибки, допущенные в процессе написания SCP-программы:
не объявлены используемые переменные;
поставлены лишние запятые;
не проставлены необходимые запятые;
проставлены лишние пробелы (при копировании операторов из Руководства по SCP v0.7);
проставлены атрибуты fixed_ вместо assign_ и наоборот.
В результате таких ошибок при выборе соответствующего пункта меню ничего не происходило.
3.4 Спецификация разработанных операций и библиотеки программ, сертификация разработанных ip-компонентов
В процессе разработки был реализовано более 20 различных scp-операций поиска. Выделить среди них какой-либо ip-компонент, на данный момент, не представляется возможным, т.к. тема проекта довольно специализированная и интеграции с другими системами не призводилось.
4. Пользовательский интерфейс проектируемой интеллектуальной справочной системы
4.1 Задачно-ориентированная спецификация пользовательского интерфейса проектируемой интеллектуальной системы
4.1.1 Декомпозиция пользовательского интерфейса
Пользовательский интерфейс данной интеллектуальной справочной системы можно разделить на ряд подсистем в зависимости от задачи, на которую они ориентированы:
Подсистема диалога с пользователем (windows-окна, scs-окна, диалоговые окна, элементы управления);
Подсистема трансляции с языка SC на естественный язык;
Подсистема обработки действий пользователя;
Подсистема хранения данных для отображения на экране.
4.1.2 Список используемых ip-компонентов пользовательского интерфейса
Для разработки данной интеллектуальной справочной системы были использованы следующие ip-компоненты:
Окна scs-интерфейса
диалоговые scs-окна
Окно раздела справочной информации SRS
это srs-окно,
класс sheet
класс shell
атомарные системные интерфейсные команды:
main_menu
update_menu
reduce_menu
load_folder
load_scg
save_scg
build_srs
erase_set
open_gwf
change_colour
reduction
increase
select_all
modify_scg_el_content
modify_scg_el_type
modify_scg_el_name
erase_scg_countur
erase_scg_el
paste
copy
gen_srswindow
child_command
4.2 Проектирование интерфейсных подсистем
Интерфейсная подсистема является интеллектуальной системой, построенной по семантическим технологиям. Поэтому для каждой интерфейсной подсистемы проектируется своя база знаний и машина обработки знаний.
База знаний пользовательского интерфейса интеллектуальной справочной системы по МП включает в себя ключевые узлы интерфейсных команд (файл em_keynode), описание обработчиков интерфейсных команд(event.scsy), дерево событий(event.scsy).
Машина обработка знаний пользовательского интерфейса включает в себя следующие классы интерфейсных операций:
• рецепторные операции(пользователь-память)
• системные эффекторные операции(память-память)
• пользовательские эффекторные операции (память-пользователь)
Примером рецепторной операции является функция обработки нажатия кнопки, она осуществляет генерацию множества выходных параметров:
void pluginView::OnBnClickedButton2()
{
CComboBox *combo = new CComboBox();
combo = (CComboBox*)GetDlgItem(IDC_COMBO1);
CString str;
int index = combo->GetCurSel();
combo->GetLBText(index, str);
m_pSheet->sendMyEv("323322222222222221", str);//получить композиции с таким рейтингом
}
Примером системных эффекторных операций является операция ui_io_exec_command, которая генерирует результирующую sc-конструкцию интерфейсной операции для последующей её обработки:
///////////////////////////////////////////////////////////////////////////////
//
//
#include "scp_keynodes.scsy"
#include "../seb/planimetry.scsy"
#include "im_keynodes.scsy"
procedure(exec_command,
[[
"main window"= "/etc/im_keynode/main window";
ch_comm = "/etc/im_keynode/child_command";
$errors_found = /"Неверно заданы аргументы."/;
sheet_type = "/proc/agents/shell/keynode/SCgSheet";
layout =c= /"logical"/;
p_sheet_title =c= /"Результаты верификации"/;
1_, 2_;
]],
[{
notfound,main_wnd,show_set,comm,p2,s,cmd,
arc,a,arc2,
resultall,
command,
segment,scg_el,wnd,sheet,set_scg_el
}],
{[
1_: in_: set_scg_el,
2_: in_: sheet,
3_: in_: cmd
]}
)
genEl([
1_: assign_: node_:const_:resultall
])
searchElStr3([1_: fixed_: "main window",
2_: assign_: a,
3_: assign_: main_wnd],,notfound)
sys_get_location([1_: fixed_: main_wnd, 2_: assign_: segment])
sys_set_default_segment([1_: fixed_: segment])
genEl([
1_: assign_: node_:const_:command
])
genElStr3([
1_: fixed_: ch_comm,
2_: assign_: arc_:const_: pos_: arc,
3_: fixed_: command
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: ch_comm
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: command
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: arc
])
///////////////////////////////////////////////
// создание параметров команды
//
// первый параметр
genElStr5([1_: fixed_: command,
2_: assign_: const_: actual_: pos_: temporary_: arc,
3_: fixed_: sheet,
4_: assign_: const_: actual_: pos_: temporary_: arc2,
5_: fixed_: 1_
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: sheet
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: 1_
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: arc
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_:const_: pos_: a,
3_: fixed_: arc2
])
// генерация узла связки второго параметра команды
genElStr5([1_: fixed_: command,
2_: assign_: const_: actual_: pos_: temporary_: arc,
3_: assign_: const_: node_: p2,
4_: assign_: const_: actual_: pos_: temporary_: arc2,
5_: fixed_: 2_
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: p2
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: 2_
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc2
])
// генерация второго параметра
genElStr5([1_: fixed_: p2,
2_: assign_: const_: actual_: pos_: temporary_: arc,
3_: assign_: const_: node_: s,
4_: assign_: const_: actual_: pos_: temporary_: arc2,
5_: fixed_: 1_
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: s
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc2
])
// формируем дочернюю команду
genElStr5([1_: fixed_: cmd,
2_: assign_: const_: actual_: pos_: temporary_: arc,
3_: assign_: const_: node_: comm,
4_: assign_: const_: actual_: pos_: temporary_: arc2,
5_: fixed_: s
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: comm
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc2
])
genElStr3([
1_: fixed_: s,
2_: assign_: arc_: const_: pos_: arc,
3_: fixed_: comm
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc
])
genElStr3([
1_: fixed_: s,
2_: assign_: arc_: const_: pos_: arc,
3_: fixed_: cmd
])
genElStr3([
1_: fixed_: resultall,
2_: assign_: arc_: const_: pos_: a,
3_: fixed_: arc
])
varAssign([1_:assign_:wnd,2_:fixed_:main_wnd],ok_msg,ok_msg)
// если произошла ошибочная ситуация
label(err_msg)
genElStr3([1_: fixed_:resultall,
2_: assign_: const_: temporary_: actual_: pos_: a,
3_: fixed_: $errors_found])
ui_sheet_create([ 1_: assign_: const_: node_: wnd,
2_: fixed_: sheet_type,
3_: fixed_: p_sheet_title,
4_: fixed_: layout])
printEl([1_: resultall])
// вывод результата
label(ok_msg)
ui_send([1_: fixed_: wnd, 2_: fixed_: resultall])
eraseEl([1_:fixed_: f_: resultall])
return()
end
Примером пользовательской эффекторной операции (память-пользователь) является функция setAlbumList, которая обрабатывает ключевой узел интерфейсной команды для отображения идентификаторов выходных параметров в элемент управления:
void pluginSheet::setAlbumList(sc_addr addr)
{
CArray<sc_string, sc_string&> albumList;
albumList.FreeExtra();
Shell* shell = Shell::getInstance();
sc_session* s = shell->getSession();
sc_iterator* it = s->create_iterator(sc_constraint_new(CONSTR_3_f_a_a, addr, 0, 0),true);
for(; !it->is_over(); it->next())
{
sc_addr album_addr = it->value(2);
sc_string str = s->get_idtf(album_addr);
albumList.Add(str);
}
m_pView->UpdateListBox2(albumList);
}
4.3 Верификация и отладка пользовательского интерфейса
Для реализации и тестирования базы данных использовался SRS Studio. Для написания кода операций использовал Notepad++, интерфейс реализован по средствам библиотек MFC на языке программирования С++, верификация и тестирование с помощью SRS Studio, Microsoft Visual Studio .NET 2003 и лога pm в командной строке.
4.4 Спецификация разработанного пользовательского интерфейса, сертификация разработанных ip-компонентов
5. Интеграция разработанной системы с другими системами
Интеллектуальная справочная система может быть интегрирована с другими система, работающими в данной предметной области.
Кроме этого могут быть заимствованы операции и ip-компоненты для качественного улучшения системы.
Интеграция позволит расширить как базу знаний, так и перечень реализуемых операций, что сделает систему еще более востребованной для конечного пользователя.
Но вместе с тем необходимо оценить затраты необходимые для интеграции (приведение базы знаний к одинаковым ключевым элементам, использование одинаковых конструкций, соответствующая реализация определенных операций), и на основе анализа выбрать наилучшую стратегию.
С целью облегчения процесса интеграции необходимо разрабатывать ip-компоненты всех подсистем интеллектуальной системы (базы знаний, машины обработки знания и пользовательского интерфейса), которые не зависят от реализации конкретной базы знаний.
6. Направления дальнейшего развития прототипа интеллектуальной справочной системы и пути промышленного изготовления спроектированной интеллектуальной системы
Для полноценного функционирования справочной системы и достижения главной цели – способность системы отвечать на самые нетривиальные вопросы и привлекать широкие массы пользователей, нужно:
Дальнейшие развитие базы знаний, добавление новых предметных узлов и ключевых элементов. Кроме этого база должна пополняться и расширяться новыми знаниями, которые будут генерироваться при работе операций.
Развитие машины обработки заключается в увеличении количества классов задач, которые будет решать данная интеллектуальная справочная система.
Пользовательский интерфейс прикладной системы должен давать возможность работать как с информацией, представленной на языках, являющихся подмножествами языка SC, так и на естественном языке.
В первую очередь необходимо уделить большое внимание естественно-языковому интерфейсу, так как SCg-конструкции, которые система генерирует на данный момент, являются слишком громоздкими и не удобными для восприятия. Ответ на формальном языке представляет собой дополнительный барьер для понимания информации и делает систему не пригодной для пользователей, не знакомых с теорией множеств и языком SC.
Пользовательский интерфейс должен давать возможность пользователю сосредоточиться на постановке задачи, а не на способе её достижения. Время и усилия, которые необходимы пользователю для достижения цели, должны сводиться к минимуму.
Следует уделить внимание «дружелюбности» интерфейса. Необходимо стремиться к тому, чтобы даже не опытному пользователю было понятно, как работать с системой. Время, которое необходимо для освоения навыков работы со средой интеллектуальной справочной системы должно сводиться к минимуму.
7. Вклад в развитие семантических технологий проектирования интеллектуальных систем
7.1 Список выявленных ошибок среды проектирования интеллектуальных систем
После закрытия всех окон SRS-Studio, в системе остаётся незавершенный процесс, который не даёт запуститься собранной системе или ещё одной копии SRS-Studio.
При загрузке sc-элементов в память не загружаются дуги.
7.2 Список предложений по совершенствованию среды проектирования интеллектуальных систем
Доработка руководства пользователя по операциям на языке SCP.
Разработка инструментария для написания scp-программ (минимум отладчика).
Написание новых scp-функций (например, переход по паре).
Исправление указанных ошибок.
Создание ip-компонентов базы знаний, машины обработки знаний, пользовательского интерфейса.
Отладка текущего инструментария для уменьшения используемых ресурсов.
7.3 Список предложений по совершенствованию семантических технологий проектирования интеллектуальных систем
Необходима разработка инструментария качественно нового уровня (предложения по развитию представлены в разделе 7.3.), так как работа с инструментарием на данном этапе затрудняет использование данной технологии.
Изучение в рамках учебного процесса студентами теоретических основ, необходимых для использования и внедрения данной технологии (теория множеств, модели представления знаний, язык программирования scp и др.)
Так же важным этапом в развитии технологии является создание ip-компонентов, задача которых упростить и ускорить процесс разработка за счёт повторного использования каких-либо элементов интеллектуальной системы. Важным является создание ip-компонентов всех подсистем: базы знаний, машины обработки знаний, пользовательского интерфейса.
7.4 Создание и использование ip-компонентов
Созданная БЗ, набор операций и отдельные элементы пользовательского интерфейса могут быть использованы в интеллектуальных справочных системах смежных областей, в качестве ip-компонентов. Что позволит ускорить их разработку, расширить функционал. Таким образом с бесконечным числом интеграций с другими интеллектуальными справочными системами, получится система, которая будет хранить бесконечное количество информации, отвечать на любые поставленные нетривиальные вопросы, а общение между пользователем и системой будет происходить посредством дружелюбного пользовательского интерфейса.
Библиографический указатель
Режим доступа: http://www.skilfully.org/18.08.2008/1. - Дата доступа: 21.12.2008.
Режим доступа: http://www.encyclopedia.ru/news/enc/detail/2321/. – Дата доступа: 21.12.2008.
Справочно-информационный портал Википедия. - Режим доступа: http://ru.wikipedia.org/wiki/Семантическая_паутина. - Дата доступа: 20.12.2008.
The Semantic Web. Scientific American, 17 мая 2001, русский перевод: Семантическая Сеть.
Справочно-информационный портал Википедия. - Режим доступа: http://ru.wikipedia.org/wiki/Семантическая_сеть. - Дата доступа: 21.12.2008.
http://www.trizland.ru/trizba.php?id=186. – Дата доступа: 21.12.2008.
Руководство разработчика семантической справочной системы, Минск, 2008.
Руководство по программированию на языке SCP, Минск, 2005.
1