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.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-конструкцию интерфейсной операции для последующей её обработки: