КУБИЧЕСКИЕ ПОКРЫТИЯ ЛОГИЧЕСКИХ УСЛОВИЙ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ И ПРОГРАММ
О.Ф. Немолочнов, А.Г. Зыков, В.И. Поляков
Рассматривается модель вычислительных процессов и программ. Предлагается на основе алгебро-топологических методов новый подход к верификации и тестированию программ с применением модели программы в виде булева графа.
Введение
Вычислительные процессы (СР) и программы, их реализующие, в самом общем виде могут быть разделены на два класса: СР без памяти и с памятью. Как правило, СР с памятью являются управляющими процессами и содержат в себе некоторые внутренние переменные, которые запоминают состояние управляемого объекта. Функционально процессы без памяти реагируют на изолированные воздействия независимо от их порядка и предыдущих воздействий. Процессы с памятью реагируют на последовательности входных воздействий и в обязательном порядке должны содержать начальные установки, фиксирующие внутренние параметры в определенные значения.
Сложность вычислительных процессов определяется в основном не количеством линейных операторов, а числом безусловных и условных точек ветвлений процесса, которые и определяют логику принятия решений, искусственный интеллект процесса или программы. Поэтому для решения задач анализа и тестирования представляется целесообразным выделение всех условий ветвления процесса в отдельное множество и обработка его отдельно от линейных операторов, реализующих алгебраические выражения. Затем каждое условие (предикат) может быть представлено логической переменной, а, соответственно, множество условий - логической функцией. Это позволит перейти от смысловых понятий условий - предикатов к переменным и выражениям на языке алгебры логики и использовать аппарат булевой алгебры.
Так как любая булева функция/=/(х], х2,..., хп) от п переменных может быть представлена на п-мерном двоичном кубе Е2, в виде кубического комплекса Кф или его покрытия Сф [1, 2], то необходимо рассмотреть вопросы перехода от условий - предикатов к логическим переменным в виде координат куба Е2, и покрытиям Сф кубических комплексов Кф, задающих топологическое пространство булевых функций/=/(х],
х2, ..., хп) в кубе Е2, .
Для упрощения введения алгебро-топологического аппарата исчисления кубических комплексов ограничимся рассмотрением вычислительных процессов без памяти. Отметим также, что аппарат исчисления кубических комплексов является ориентированным на применение его в системах автоматизированного проектирования (САПР).
Некоторые модели вычислительных процессов и программ.
Проектирование программного продукта можно представить в виде некоторого технологического процесса, состоящего в переходе от технического задания (ТЗ) к системе программ или, в частном случае, к одной программе (Р), реализуемым в заданной вычислительной среде. Обобщенная схема процесса программирования показана на рис. 1. Приведенная схема не претендует на полноту отображения всех аспектов технологии программирования и ориентирована в основном на задачи и методы синтеза тестов СР. Например, на схеме не отображены этапы и модели тестопригодного проектирования, самоконтроля и самодиагностики, которые могут возникать при проектирова-
нии толерантных систем. Однако для рассматриваемых вопросов схема является достаточной.
Рис. 1.Основные этапы и модели проектирования программного продукта
Граф-схема СР является более детальным описанием его по сравнению с ТЗ. На граф-схеме:
• вводится множество входных, промежуточных и выходных переменных, описываются их типы;
• задаются циклические вычисления, их вложенность и тип (переборный или итерационный);
• намечаются точностные параметры для итерационных циклов, диапазоны изменения задаваемых и вычисляемых переменных;
• выделяются общие фрагменты СР с последующим оформлением их в виде отдельных процедур, к которым будет возможно обращение из разных точек вычислительного процесса;
• намечаются точки входа и выхода СР, условия параллелизма и последовательности вычислений параметров и т.д.
Выделим два типа вычислений переменных - в виде линейных и интервальных формул, которые в данном рассмотрении являются принципиально различными. Линейная формула вычисляет некоторую переменную на безальтернативной основе и реализуется в дальнейшем в виде последовательности операторов (машинных операций в исполнительных программах). Интервальная формула вычисляет одну и ту же переменную по двум или более линейным формулам в зависимости от некоторых заданных условий. Интервальная формула в дальнейшем реализуется в виде параллельной структуры, в которой существуют условия компенсации значений вычисляемой переменной. Указанная структура характеризуется одной точкой входа (точкой ветвления) и одной точкой выхода (точкой объединения ветвей). В программах эти точки реализуются с
помощью команд безусловной и условной передачи управления, так как исполнительная программа записывается в виде линейной последовательности операторов, если она реализуется на одном вычислителе.
Заметим, что на граф-схеме СР могут существовать параллельные ветви вычислений разных переменных в зависимости от некоторых условий. Но в таких структурах не возникают условия компенсаций, и поэтому их анализ при поиске решений сводится к анализу обычных линейных формул в несколько усложненном варианте, связанном с вычислением условий.
Рис. 2. Примеры реализации интервальной формулы (1) параллельными структурами
01(0Р), 02(0Р) и ОЭ(ОР)
Переход от граф-схемы вычислительного процесса ОБ(СР) к графу вычислительного процесса О(СР) состоит в основном в формировании циклов и условий выхода из циклов (в начале или в конце цикла, до или после наращивания параметра цикла) и оформлении параллельных структур для интервальных формул. Дело в том, что на граф-схеме СР интервальные условия для наглядности самой формулы записываются, как правило, в избыточном виде и не указывается порядок их вычислений, который в программах задается в виде строго определенной последовательности выполнения. Итак, граф-схема СР ориентирована на разработчика ТЗ, а граф вычислительного процесса - на разработчика программного продукта. Логический граф вычислительного процесса ЬО(СР) носит вспомогательный характер и предназначен для формализации анализа принятых решений на О(СР) и синтеза тестовых последовательностей по законам булевой алгебры.
Пример 1. В качестве примера рассмотрим построение параллельной структуры с компенсациями для некоторой простой интервальной формулы. Отметим, что циклы и
г =
(1)
обращения к процедурам сами по себе не создают параллельных структур и сводятся к линейным формулам, если в них, в свою очередь, не содержится внутренних интервальных формул. Поэтому их анализ не требует специального рассмотрения.
Пусть задана некоторая интервальная формула: ЬЕЯ 1, при х < к 1 или х > к 2; ЬЕЯ 2, при к 1 < х < к 2.
Переменная г вычисляется по линейным формулам Ь¥К1 и ЬЕЯ2 в зависимости от значения переменной х, диапазон значений которой разбит на три интервала константами к1 и к2.
Из (1) видно, что условия вычисления г по формуле Ь¥К1 или ЬЕЯ2 заданы в избыточной форме, и, с учетом перестановок, существует восемь различных сочетаний последовательного их вычисления. Соответственно, потенциально существует и восемь различных параллельных структур на графе вычислительного процесса, реализующих одну и ту же интервальную формулу (1). Отсюда и следует разнообразие различных программных реализаций.
Примеры трех различных реализаций (1) в виде графов 01(СР), 02(СР), 03(СР), как наиболее характерных, приведены на рис.2.
Закодировав условия х < к1 через а, х >к1 через а , х > к2 через Ь, х < к2 через Ь , где а и Ь - булевы переменные, можно построить булевы графы Б01(СР), Б02(СР) и Б03(СР), соответственно, что и показано на рис. 3. Здесь а и Ь, равные Т, соответствуют выполнению условий, а а и Ь, равные Е, - невыполнению (аналогично и для а и Ь ).
Рис. 3. Булевы графы Б01(0Р), В02(СР) и ВОЭ(ОР) интервальной формулы (1)
Покрытия логических условий программ
Возвращаясь к рис.1, рассмотрим некоторые вопросы анализа по кубическим покрытиям логических условий в программах. В качестве объекта исследований выберем программу в машинных кодах, чтобы избавиться от особенностей конкретного алгоритмического языка и различных трансляторов с него.
Для программы в машинных кодах можно построить модель в виде графа программы О(Р) [3], который состоит из множеств условий-предикатов, меток-адресов и линейных последовательностей операторов-дуг. Воссоздав линейные и интервальные формулы, на основе О(Р) можно построить граф-схему программы - ОБ(СР), а, закодировав условия-предикаты булевыми переменными, построить и булев граф программы ВО (Р).
Построенные таким образом графовые модели программ являются аналогами соответствующих моделей вычислительного процесса и могут использоваться в этом качестве при построении тестов программных продуктов различного назначения [4].
Рассмотрим некоторые методы построения тестов программ практической сложности на основе описанных моделей с ориентацией их на САПР.
Наименее формализованной моделью является граф-схема программы. К ней наиболее применимы эвристические методы, в том числе и методы случайной генерации тестовых наборов, с последующим использованием их для моделирования рабочих программ. Качество тестов в этих методах обеспечивается трудолюбием и квалификацией разработчика.
Метод ветвей и границ позволяет в какой-то мере автоматизировать генерацию тестовых наборов по модели в виде О(Р). Суть метода состоит в следующем. В общем случае программа может содержать некоторое множество входов в программу и некоторое множество выходов из программы. Поэтому, чтобы упорядочить переборный процесс поиска решений в виде тестовых наборов, граф О(Р) необходимо предварительно декомпозировать на подграфы, содержащие один вход и выход. Метод принципиально носит переборный характер и состоит из прямой (активизация условий) и обратной (отсечка компенсаций) фаз.
На прямой фазе намечается некоторый путь I от входа до выхода графа, состоящий из условных и безусловных вершин и дуг графа.
Активизация условных вершин состоит в следующем: если путь приходит на вершину по разветвлению Т, то необходимо подобрать значения переменных, образующих условие, чтобы оно выполнялось, а по разветвлению Е, чтобы оно не выполнялось. Активизированные значения условий образуют границы набора в виде определенных значений переменных, входящих во все условия вдоль намеченного пути I.
На обратной фазе рассматриваются все ответвления активного пути I, и, если они замыкаются в виде петель на I, то их необходимо отсечь, т.е. исключить компенсации по ним. Это реализуется следующим образом: если петля замыкается через еще не определенное (не вычисленное) условие по выходу Т, то необходимо подобрать значения переменных, входящих в условие, чтобы оно не выполнялось, и наоборот, при выходе из условия по Е. Основные сложности возникают здесь при обработке параллельных структур, реализующих интервальные формулы. Метод ветвей и границ можно реализовать в диалоговом режиме.
Наиболее формализованной моделью является модель в виде булева графа -ВО(Р). Данная модель позволяет упорядочить перебор и сделать его направленным при поиске решений. Предварительно для логических условий, заданных булевыми переменными, необходимо построить покрытия С(Р)={с1 ,с2 ,..., сп}, где каждый куб с, содержит в себе условия вдоль некоторого пути I на графе ВО(Р). Координаты куба с, могут принимать значения: 0, 1 и х [1]. Значение 0 соответствует значению Е, значение 1 -
Г,а х - неопределенному значению условия, закодированному некоторой булевой переменной. Другими словами, значение координаты, равное 1, соответствует выполнению условия, значение, равное 0 - невыполнению условия, а значение, равное х, соответствует неопределенному условию, которое произвольно может быть доопределено как в 0, так ив 1. Покрытие С(Р) полностью соответствует определению покрытия в исчислении кубических комплексов, и поэтому к покрытиям С(Р) и кубам с, применимы алгебро-топологические операции: пересечение (П), звездчатое произведение (*) и вычитание (#) [2].
Операция пересечения может применяться для установления соотношения включения между отдельными кубами и покрытиями и для активизации условий-координат. Звездчатое произведение кубов позволяет упрощать кубические покрытия с целью поиска минимальных решений, например, путем построения множества простых кубов комплекса К(Р), задаваемого покрытием С(Р). Операция вычитания позволяет устанавливать соотношения включения, поглощения и эквивалентности между различными покрытиями С(Р).
Рассмотрим построение покрытий С(Р) и некоторые из его применений на конкретном примере.
Пример2. Пусть заданы две программы Р1 и Р2, для которых построены графы О(Р0 и в(Р2) (рис.4).
Рис. 4. Графы 0(Р1) и 0(Р2) программ Р1 и Р2
Сравнивая параллельные структуры графов, можно убедиться, что графы различаются между собой и, следовательно, программы, вычисляющие одну и ту же переменную г, различаются между собой.
Эквивалентность вычислений г программами Р1 и Р2 можно проверить, построив тесты Тк(Р1) и Тк(Р2) методом ветвей и границ по графам 0(Р1) и 0(Р2), проведя перекрестное моделирование. В случае равенства результатов моделирования программы будут эквивалентны и не эквивалентны в противном случае.
Данный результат можно получить более строго и формально алгебро-топологическими методами по кубическим покрытиям С(Р1) и С(Р2) логических условий программ Р1 и Р2. Закодируем условия, полученные на графах 0(Р1) и 0(Р2), булевыми переменными а, Ь, с, й следующим образом:
х1 < к1 - а, х1 >к1 - а , х2> к2 - Ь, х2 <к2 - Ь ,
х3 = к3 - с, х3ф к3 - ^ , х4ф 0 - й, х4 = 0 - й и построим булевы графы БО(Р1) и БО(Р2), соответственно, для программ Р1 и Р2 (рис.
5).
{^Начало
Рис. 5 Булевы графы БО(Р1) и БО(Р2) программ Р1 и Р2 На основе БО(Р1) и БО(Р2) построим кубические покрытия С(Р1) и С(Р2):
ОД) =
аЬсй/ г
1 х1 х1 ¿¥Я1 011 х1 ¿¥Я1 00 х 11 ¿¥Я1
1 х0х0 ¿¥Я2 010 х 0 1¥К2 00 х 00 1¥К2
С1(Р)
С0(Р1)
с (Р2) =
аЬсй / г
00 х 11 Ь¥Я1
101 х 1 Ь¥Я1 С1(Р2)
х 11 х1 Ь¥Я1
00х00 Ь¥Я2
100 х 0 Ь¥Я2 С0(Р2)
х 10 х 0 Ь¥Я2 _1
где/- некоторая промежуточная булева функция, введенная для удобства вычислений, а через С1(Р) и С0(Р) обозначены единичное и нулевое покрытия комплекса К(Р), заданного вырожденным покрытием С(Р)= С1 (Р) иС0(Р).
Сравнивая покрытия С(Р1) и С(Р2):, можно убедиться, что они содержат разные наборы кубов, и между ними нет прямого равенства множеств кубов между собой. Этого и следовало ожидать, так как они описывают разные программные реализации.
Эквивалентность покрытий С(Р1) и С(Р2): и, соответственно, программ Р1 и Р2 между собой можно определить с помощью операции вычитания (#). Выполнив операцию вычитания покрытий друг из друга, получим: С(Р1) # С(Р2 ) = ф и С(Р2) # С(Р1) = ф. Это свидетельствует о том, что покрытия С(Р1) и С(Р2):эквивалентны между собой и, соответственно, программы Р1 и Р2 реализуют одну и ту же интервальную формулу для переменной г. В этом можно убедиться и с помощью аналитической записи интервальной формулы:
г Г ЬЖ 1 при / = 1; (2)
[Ь¥Я 2, при / = 0.
По кубическим покрытиям удобно строить различные тесты для программ путем активации булевых переменных. Построим в качестве примера Тк(Р2) по покрытию С(Р2), для чего подберем последовательно парные кубы для каждой булевой переменной, такие, что сгеС1(Р2 ) и суеС0(Р2 ) ине пересекающиеся только по одной координате, которая и будет активизировать соответствующую булеву переменную и, следовательно, соответствующее условие в программе Р2. Проведя описанные вычисления, получим:
Тк (Р2)
аЬ с й / г {с1с]} {*}
0' 00 11' Ь¥Я 1 ч
1' 0010' Ь¥Я 2 с1 ^ с 5 * 2
0 1' 101' Ь¥Я 1 * 3
00' 100' Ь¥Я 2 с 3 ^ с 4 * 4
101' х 1' Ь¥Я 1 * 5
100' х 0' Ь¥Я 2 с 2 ^ с 5 * 6
00 х 1' 1' Ь¥Я 1 * 7
00 х 0' 0' Ь¥Я 2 с1 ^ с 4 * 8
при | Ь¥Я1 |ы| Ь¥Я2 |
Приведенные в тесте значения булевых переменных 0 и 1 легко переводятся в соответствующие значения условий: 0 соответствует невыполнению условия, а 1 - его вы-
полнению. Естественно, значения переменной г, формируемые по формулам ЬГЯ1 и ЬЕЯ2, должны различаться при изменении условий, что в тесте помечено как 0' и 1' .
В общем случае, для любой программы может существовать некоторое множество контролирующих тестов - {Тк(Р)}, что связано с перебором при выборе пар кубов из покрытий С1 (Р) и С0(Р), и сами тесты могут содержать неминимальное число наборов. Заметим, что тесты можно минимизировать с использованием следующего правила: если в тесте Тк(Р) существует два набора - кубы и и, пересечение которых не пусто, то наборы и и могут быть заменены в тесте Тк(Р) на набор .= Ь П ^ без потери контролирующих свойств теста, так как в этом случае набор и. несет в себе контролирующие свойства как набора и так и набора . Применив указанное правило к наборам теста Тк(Р2), получим минимальный тест:
аЬ с й / г {ti о и .}
Tk (P2) =
0'001Т LFR 1 1' 0 0 '10 ' 01'1 0 1' LFR 1 0 0 1 0 0
1 0 1' х 1' LFR 1 t при|LFR1|ы|LFR2|
t1 о t71
LFR 2 12 о 16
LFR 2 14 о t8
Выводы
Кубические покрытия логических условий программ позволяют формализовать процедуры верификации программ и построения тестов для них с использованием машинно-ориентированного аппарата исчисления кубических комплексов, что является актуальной задачей при создании САПР программных продуктов.
3
5
Литература
1. Проектирование цифровых вычислительных машин / Под ред. С.А.Майорова. М.: Высш. шк., 1972. 344 с.
2. Немолочнов О.Ф. Методы технической диагностики. Методические указания к курсовойработе. Л.: ЛИТМО, 1976.
3. Лаздин A.B., Немолочнов О.Ф. Метод построения графа функциональной программы для решения задач верификации и тестирования / Научно-технический вестник СПб ГИТМО(ТУ). Выпуск 6. Информационные, вычислительные и управляющие системы / Гл. ред. В.Н. Васильев. СПб: СПб ГИТМО (ТУ), 2002.С 109-111
4. Зыков А.Г., Немолочнов О.Ф., Поляков В.И. Верификация в исследовательских, учебных и промышленных системах / Научно-технический вестник СПб ГИТ-МО(ТУ). Выпуск 11. Актуальные проблемы анализа и синтеза сложных технических систем / Гл. ред. В.Н. Васильев. СПб.: СПб ГУ ИТМО , 2003. С 146-151