Inductive Operations Using
Inductive Operations Using
РОССИЙСКОЙ ФЕДЕРАЦИИ
ИНДУКТИВНЫЕ ОПЕРАЦИИ
НАД ПОСЛЕДОВАТЕЛЬНОСТЬЮ ДАННЫХ
И ИХ ИСПОЛЬЗОВАНИЕ В ПРОГРАММНЫХ СИСТЕМАХ
Методические указания
к лабораторным работам по дисциплине
«Алгоритмы и методы организации программных систем»
для студентов направления подготовки бакалавра
11.03.01 «Радиотехника» и специальности
11.05.01 «Радиоэлектронные системы и комплексы»
очной формы обучения
УДК 519.6
Редактор
Формулировка задачи
На вход системы последовательно и неограниченно во времени
поступают элементы x i , где i — порядковый номер элемента, начиная с
1. Все элементы имеют одну и ту же природу, то есть являются
однотипными. Над набором элементов X (n)=⟨ x 1 , x 2 , x 3 ,…, x n ⟩
выполняется некоторая операция f ( X (n)) . Результатом ее выполнения
является набор выходных значений Y (n)=⟨ y (n) (n) (n) (n)
1 , y 2 , y 3 ,…, y k (n) ⟩
. Все
элементы выходного набора также имеют одну и ту же природу, то есть
являются однотипными. При этом типы элементов на входе и выходе
системы в общем случае отличаются.
Указанная операция выполняется каждый раз при поступлении
очередного элемента x n+1 для набора X (n+1) .
Классы операций
Все операции над набором данных подразделяются на два класса:
− вычисление значения характеристики набора;
− порождение наборов данных.
Для класса вычисления значения характеристики количество
элементов в выходном наборе k (n)≡1 . Эта характеристика может быть
скалярной величиной, может состоять из набора элементов разной
природы или представлять собой набор однотипных значений.
Существенным является конечный размер выходного элемента, не
зависящий от n.
Для этого класса можно определить выходную последовательность
3
Y '(n)=⟨ y (1) (2) (3) (n)
1 , y 1 , y 1 ,…, y 1 ⟩
, расширяющуюся во времени по мере
поступления на вход системы обработки очередных входных элементов
xn .
Отличием операций, относящихся к другому классу является
неограниченный рост количества элементов k (n) в выходном наборе Y (n)
так, что ∄ K : ∀ n ⇒ k (n)<K .
Для данного класса в качестве выходной последовательности Y ' (n)
можно рассмотреть Y (n) , то есть Y ' (n)=Y ( n) , но только при определенных
условиях, а именно:
(n+1)
=⟨ y (n+1) (n+1)
∀ n ⇒ Y (n+1)=Y (n)∗q(n+1) , где q k (n)+1 ,…, y k (n+1) ⟩ и * —
операция присоединения.
В этом случае выходная последовательность
' (n) (1) (2) (n)
Y =Δ∗q ∗q ∗…∗q , (1)
где Δ — пустая последовательность, т. е. для нее количество
элементов n=0. Заметим, что в данных обозначениях для первого класса
операций ∀ k : q(k)=⟨ y(k) 1 ⟩.
Индуктивная функция
Функцию f : Ω( x)→Ω(Y ) назовем индуктивной, если
f (ω∗x)=f (ω)∗q(ω∗x) , причем q(ω∗x )= F ' q ( S(ω∗x) , x ) , а S (ω∗x)
можно вычислить, зная S (ω) и x, т. е. если для нее существует функция
F S ( y , x) такая, что
S (ω∗x)=F S (S(ω), x ) . (2)
Также предполагаем, что значение S от пустой последовательности
S (Δ) известно. Положим его равным S(0) , имея в виду, что значение
верхнего индекса имеет смысл количества элементов в
последовательности, т. е. в данном случае в пустой последовательности.
Тогда для последовательности ω с количеством элементов (длиной) n
введем обозначения S(n)=S(ω) и q(n) =q (ω) . С учетом этого:
(n+1) (n)
S =F S (S , x) ,
(n+1) (n+1) (n) (n)
(3)
q =F ' q (S , x)=F ' q ( F S ( S , x ))= F q (S , x) .
В этом случае вектор-функцию F (s , x)=⟨ F q (s , x) , F S (s , x )⟩ назовем
функцией перевычисления. Она позволяет рассчитать новые значения
(n+1)
q и S(n+1) для расширенной последовательности, используя текущее
значение S(n) и очередной поступивший элемент x входной
последовательности.
4
С точки зрения изначально поставленной задачи величину S можно
понимать как некоторое состояние вычислителя. Для выполнения
требуемой обработки элементов входной последовательности в
большинстве случае удобно или даже необходимо использовать
некоторые вспомогательные величины. Они будут рассчитываться, а
точнее перевычисляться каждый раз при поступлении очередного
элемента последовательности. Тогда совокупность таких величин примем
в качестве рассматриваемого S, т. е. S=⟨ s1 , s2 ,…, s k ⟩ .
Допустим, что удалось найти такой состав S и получить выражение
для функции перевычисления. В таком случае решение исходной задачи
удалось представить с помощью индуктивной функции.
Для индуктивных функций можно получить в общем виде простой
однопроходный алгоритм обработки последовательно поступающих
данных:
вычислить начальное S=f (Δ)
пока есть непрочитанные элементы
нц
получить очередное значение x
вычислить ⟨q , S ⟩=⟨ F q ( S , x) , F S ( S , x)⟩
выдать q
кц
При этом расчет нового значения S и формирование выхода q
выполняются одновременно, на основе текущего состояния S . Учитывая
(3), алгоритм можно записать следующим образом:
вычислить начальное S=f (Δ)
пока есть непрочитанные элементы
нц
получить очередное значение x
вычислить S=F S (S , x )
'
вычислить q= F q (S , x )
выдать q
кц
В этом случае при вычислении q используется обновленное
состояние S . Выбор варианта алгоритма пересчета определяется
конкретной задачей, исходя из критерия более простой и понятной формы
записи правила формирования выхода вычислителя. Сам вычислитель,
работающий по приведенной схеме, назовем индуктивным вычислителем.
Примеры индуктивных функций:
− сумма элементов последовательности. Обозначим искомую
величину как s. Индуктивная функция записывается в следующем
5
виде:
S=⟨ s ⟩ ,
(0)
s =0 ,
s=s+ x ,
'
q= F q (S , x )=⟨ s⟩ .
− длина последовательности. Обозначим искомую величину как n.
S=⟨ n⟩ ,
(0)
n =0 ,
n=n+1 ,
'
q= F q (S , x )=⟨n ⟩ .
− последний элемент. Обозначим искомую величину как v.
S=⟨ v ⟩ ,
(0)
v — любое,
v =x ,
'
q= F q (S , x )=⟨ v ⟩ .
Индуктивное расширение
Подавляющее большинство полезных функций не являются
индуктивными, поскольку при в записи их функции перевычисления в
правой части, кроме S и x присутствуют другие переменные величины.
Однако такие функции могут быть приведены к классу индуктивных
посредством рассмотрения их индуктивного расширения.
Пусть для целевой задачи получено некоторое правило
формирования выхода вычислителя, как отклика на поступление одного
очередного элемента входной последовательности. Пусть также в записи
этого правила присутствуют величины, отличные от входного элемента и
составных частей описания T y . Совокупность таких величин обозначим
как ⃗v =(v 1 , v 2 ,… v r ) . Рассмотрим новую операцию f z ( x) , результатом
которой является набор, состоящий из элементов z=( y , ⃗v ) типа T z .
Новый тип является составным типом и включает в себя элемент типа T y
и набор величин ⃗v , т. е. T z=(T y , ⃗v ) . Операцию f z ( x) назовем
индуктивным расширением операции f (x ) , если она удовлетворяет
определению (2). Для этого случая (1) можно переписать в следующем
виде:
' (n) (1) (2) (n)
Z =Δ∗q z ∗q z ∗…∗q z . (4)
(n+1) (n+1) (n+1)
Здесь q z =⟨ z k (n)+1 ,… zk (n+1) ⟩ — отклик вычислителя,
выполняющего операцию f z ( x) , на поступление очередного элемента
6
x n+1 входной последовательности X. Для полученного индуктивного
расширения S z (ω∗x)=Φ S (S z (ω), x ) , а сама Φ S () вместе с Φ q ( S z , x)
составляет новую функцию перевычисления Φ( z , x) .
Поскольку исходная задача состоит в выполнении операции f (x ) , то
для получения результата ее выполнения из элементов выходной
последовательности Z необходимо выделять составляющую y.
Величины, входящие в набор ⃗v , назовем элементами
индуктивного расширения. Они являются вспомогательными для
формирования результатов выполнения исходной задачи и внутренними
деталями реализации вычислителя. С точки зрения внешней среды,
которая использует вычислитель, вопрос существования элементов
индуктивного расширения и, тем более, их природы, отсутствует.
С практической точки зрения при рассмотрении индуктивного
расширения, компоненты ⃗v добавляются в исходное состояние S и
приводятся правила их пересчета, а также указываются начальные
значения.
Если при записи пересчета этих величин в правой части их формул
появились новые величины, то указанную операцию надо повторить и для
них.
Обычно операции являются параметризованными, т. е. в их
формулировке присутствуют параметры, величины, значения которых
считаются известными и не меняются во время работы вычислителя. В
этом смысле они являются константами, их нет необходимости заново
вычислять при поступлении очередного x, и поэтому их присутствие в
правой части не нарушает требования к функции перевычисления.
Архитектура программной компоненты вычисления индуктивной
функции
В области программной реализации вычислитель индуктивной
функции определяется набором следующих программных компонент:
− тип элемента входной последовательности ( OperationInputItem),
который должен определяться в отдельном модуле;
− тип элемента выходной последовательности ( OperationOutputItem),
который должен определяться в отдельном модуле;
− тип выхода вычислителя, как отклика на поступление очередного
входного элемента, q (OperationOutput), который приводится в
модуле вычислителя;
− тип, описывающий набор параметров обработки
(OperationParameters), который приводится в модуле вычислителя;
− тип, описывающий индуктивное расширение операции
7
(OperationExtension), который приводится в модуле вычислителя;
− класс индуктивной операции (Operation).
Класс индуктивной операции удобно представить в виде класса
функциональных объектов. В этом классе конструктор определяет
начальное значение результата обработки для пустой входной
последовательности (начальные значения), а деструктор содержит
действия, необходимые для корректного завершения работы с
вычислителем. Центральное место в классе занимает реализация функции
перевычисления. Представим ее в виде перегруженной операции вызова
функции с двумя аргументами, значением очередного элемента входной
последовательности и переменной, куда необходимо поместить результат
обработки q.
8
индуктивного расширения.
4. Определите класс для представления индуктивного вычислителя,
используя вспомогательные типы данных.
5. Получите реализацию методов класса.
6. Подготовьте тесты для решаемой задачи, охватывающие как можно
больше различных сценариев поступления данных.
7. Получите реализацию тестовой программы для проверки
подготовленных тестов.
8. Проведите тестирование полученной программной реализации и при
необходимости выполните её отладку для устранения выявленных на
этапе тестирования ошибок. Данный этап необходимо выполнять до
успешного прохождения всех подготовленных тестов.
9. В целях самоконтроля ответьте на вопросы раздела
10. По завершении разработки программы продемонстрируйте её работу
преподавателю и ответьте на его вопросы.
11. Доработайте программу с учётом изменений, предложенных
преподавателем и продемонстрируйте работу изменённой программы
преподавателю.
9
компонентам индуктивного вычислителя?
10. Перечислите составные части индуктивного вычислителя.
11. Какая структура элемента входной последовательности данных
выбрана Вами для разработанного индуктивного вычислителя?
12. Какая структура элемента выходной (результирующей)
последовательности данных выбрана Вами для разработанного
индуктивного вычислителя?
13. Поясните определение структуры параметров обработки
реализованного индуктивного вычислителя.
14. Детально объясните определение структурного типа данных для
представления индуктивного расширения с точки зрения его
соответствия математического представления индуктивного
вычислителя .
15. Поясните разработанный Вами алгоритм обработки данных на
основе математической записи.
16. Дайте подробное объяснение программной реализации функции
обработки элемента входной последовательности.
17. Опишите реализованную схему тестовой программы.
10
2. Лабораторная работа №2 «Использование плагинов в
программных системах»
11
предыдущей лабораторной работы.
8. В разрабатываемой библиотеке определите ее интерфейс в виде
функции создания объекта индуктивного вычислителя. Представьте
ее отдельным модулем в составе библиотеки.
9. Получите двоичный образ разделяемой библиотеки, как результат
сборки проекта.
10. В проекте основной программы через представление Project
Explorer создайте специальный каталог plugins
11. Имеющийся плагин (двоичный образ разделяемой библиотеки)
необходимо поместить в созданный каталог.
12. Реализуйте основную программу, обеспечивающую загрузку
плагина системными средствами из библиотеки libdl и выполнение
обработки поступающих данных индуктивным вычислителем из
плагина.
13. Для использования функций управления динамически
загружаемыми библиотеками в настройках проекта основной
программы следует выбрать ветвь C/C++ Build / Settings. На форме
во вкладке Tool Settings в левом списке следует выбрать GCC C++
Linker / Libraries и добавить в список подключаемых библиотек
библиотеку libdl без указания в предлагаемом поле ввода префикса
lib.
14. Проведите тестирование полученной программной реализации и
при необходимости выполните её отладку для устранения
выявленных на этапе тестирования ошибок. Данный этап
необходимо выполнять до успешного прохождения всех
подготовленных тестов.
15. По завершении разработки программы продемонстрируйте её
работу преподавателю и ответьте на его вопросы.
16. Доработайте программу с учётом изменений, предложенных
преподавателем и продемонстрируйте работу изменённой
программы преподавателю.
12
3. Лабораторная работа №3 «Функции высшего порядка»
13
элемента входной последовательности с учетом предъявляемых к ней
требований.
7. В основном модуле программы реализуйте функцию выдачи элемента
выходной последовательности.
8. В основной (тестовой) программе обеспечьте создание вычислителя с
его настройкой, настройку операций ввода и вывода, а также вызов
функции использования вычислителя.
9. Выполните тестирование полученной программной реализации и при
необходимости проведите доработку.
10. После успешного завершения тестирования продемонстрируйте
результаты выполнения работы преподавателю и ответьте на его вопросы.
11. Выполните предложенную преподавателем доработку программы.
12. Продемонстрируйте преподавателю работы измененной программы и
поясните сделанные изменения.
14
4. Лабораторная работа №4 «Управляемое устройство
индуктивной обработки»
15
━ текущее состояние автомата;
━ матрица переходов;
━ таблица связи символов выходного алфавита с действиями
исполнительной компоненты
2.3. В файле реализации модуля контроллера определите
конструктор, в котором задайте начальное состояние автомата, таблицы
связи и обеспечьте формирование таблицы переходов.
2.4. Получите реализацию функции обработки символа и функции
установления связи выхода с действием.
3. Получите реализацию исполнительной компоненты в соответствии со
следующими рекомендациями.
3.1. В качестве основы компоненты используйте реализацию
индуктивного вычислителя из первой лабораторной работы, внедрив ее в
проект.
3.2. В интерфейсную часть добавьте тип данных для представления
функции обратного вызова, для выдачи элемента выходной
последовательности и метод указания способа выдачи элемента.
3.3. В интерфейсную часть добавьте описания функций обратного
вызова, реализующих действия исполнительной компоненты.
3.4. Добавьте свойства, определяющие способ выдачи элемента
выходной последовательности.
3.5. Получите реализации всех методов, добавленных в класс
индуктивного вычислителя.
4. Получите реализацию класса управляемого устройства в соответствии
со следующими рекомендациями.
4.1. Создайте в проекте новый модуль для реализации управляемого
устройства
4.2. В заголовочном файле определите класс управляемого
устройства со следующими компонентами:
━ метод, реализующий работу устройства;
━ функцию обратного вызова для выдачи элемента выходной
последовательности;
━ объект контроллера и объект исполнительной компоненты.
4.3. Получите реализацию конструктора, в котором обеспечьте
приведение в начальное состояние всех элементов устройства и настройте
все необходимые связи.
4.4. Реализуйте модель работы управляемого устройства, в виде
бесконечного цикла. На каждой его итерации от пользователя
принимается символ из входного алфавита, который должен передаваться
в контроллер на обработку.
16
5. В отдельном модуле реализуйте основную управляющую программу по
созданию управляемого устройства и запуска его работы.
6. Выполните тестирование полученной программной реализации и при
необходимости проведите доработку.
7. После успешного завершения тестирования продемонстрируйте
результаты выполнения работы преподавателю и ответьте на его вопросы.
8. Выполните предложенную преподавателем доработку программы.
9. Продемонстрируйте преподавателю работы измененной программы и
поясните сделанные изменения.
17
5. Список литературы
1. Паттерны объектно-ориентированного проектирования : [пер. с
англ.] / Э. Гамма [и др.]. — СПб. : Питер, 2020. – 448 с.
2. Кушниренко, А.Г. Программирование для математиков : учеб.
пособие / А. Г. Кушниренко, Г. В. Лебедев. – М. : Наука, 1988. – 384 с.
3. Пселтис, Э. Потоковая обработка данных. Конвейер реального
времени / Э. Пселтис. – М.:ДМК Пресс, 2018. – 218 с.
4. Поликарпова, Н.И. Автоматное программирование / Н.И. Поликар-
пова, А.А. Шалыто. – СПб., 2008. – 167 с.
5. С.Б.Сидоров Использование среды Eclipse для разработки программ
на языке программирования С++, методические указания к
лабораторным работам, 2023. - 26 с, ил.
6. С.Б.Сидоров Реализация индуктивного вычислителя «Прореживание
потока данных». Исходные тексты программ,
localhost://home/students/materials/aimops/lab01/example/
7. С.Б.Сидоров Реализация и использование плагина индуктивного
вычислителя. Исходные тексты программ
localhost://home/students/materials/aimops/lab02/example/
8. С.Б.Сидоров Примеры определения и использования функций
высшего порядка. Исходные тексты программ
localhost://home/students/materials/aimops/lab03/example/
9. С.Б.Сидоров Программная реализация управляемого устройства
прореживания потока данных. Исходные тексты программ
localhost://home/students/materials/aimops/lab04/example/
18