Существуют два подхода к проверке программ - прагматический и доказательный. При прагматическом подходе проверка программ выполняется на ЭВМ путем тестирования.
Тестирование - это проверка программ на ЭВМ с помощью некоторого набора тестов. Ясно, что тестирование не дает гарантий правильности выполнения программ на всех допустимых данных. Следовательно, тестирование в общем случае не может дать и не дает полных гарантий отсутствия ошибок в программах.
Напомним, что отладка программ - это процесс поиска и исправления ошибок в программах на ЭВМ. Однако поскольку поиск ошибок при отладке программ проводится с помощью тестов, то полных гарантий нахождения и исправления всех ошибок в программах отладка не дает и в принципе дать не может.
По этой же причине не ясно, когда процесс отладки программ - процесс поиска и исправления ошибок на ЭВМ - может считаться завершенным. А выявлены или нет все ошибки в программе при ее отладке не может сказать никто.
Таким образом, прагматический подход чреват созданием программ, содержащих ошибки даже после «завершения» отладки, что и наблюдается практически во всех больших программах для ЭВМ.
Рассмотрим в качестве иллюстрации принципов тестирования алгоритм и программу вычисления максимума из трех чисел: а, b, с.
алг «максимум трех чисел»'максимум трех чисел
нач cls
ввод (а, b, с) input a, b, с
если а > b то if а > b then
тах := a max = a
инеc b > с то elseif b > с then
тах := bmах = b
инеc с > а то elseif с > a then
тах:= с mах = с
кесли end if
вывод («тах=»,тах)? «mах=»; mах
кон end
Запуск этой программы на ЭВМ можно проверить на следующих данных:
Tecт1 Тест2 Тест3
? 1 1 2 ? 1 2 3 ? 3 2 1
max = 2 max = 3 max = 3
Все три результата правильные. Отладку программы после запуска этих примеров можно было бы считать завершенной. Однако есть контрпример:
Контрпример1
? 2 1 3
max = 2
Но этот результат - неправильный. Следовательно, алгоритм и программа содержат ошибки. Но сколько этих ошибок - одна, две, а может быть больше?
При доказательном подходе разработка алгоритмов и программ предполагает составление спецификаций и доказательство их правильности по отношению к этим спецификациям. Процесс разработки программ считается завершенным после проверки их на ЭВМ и предоставлении доказательств отсутствия ошибок.
Доказательства правильности алгоритмов и программ, равно как и любые другие доказательства, строятся на основе суждений и рассуждений. В данном случае суждения и рассуждения касаются результатов выполнения алгоритмов и программ с теми или иными данными.
Конструктивно, доказательства правильности алгоритмов и программ строятся на суждениях и утверждениях о результатах выполнения каждого из составляющих их действий и операций в соответствии с порядком их выполнения.
В качестве примера проведем анализ результатов алгоритма, состоящего из трех присваиваний.
алг«у = х5» Результаты Утверждения
нач
v := х×х v1 = х×х Þ v1 = x2v := v×vv2 = v1×v1Þv2 = x4
у := v×x у = v2×xÞ у = х5
кон
Справа от алгоритма приведены результаты выполнения присваиваний. Результатом первого присваивания v := х×х будет значение v1 = х×х переменной v. Результат следующего присваивания v := v×v - второе значение переменной v, равное v2= v1×v1. Результатом третьего присваивания у := v×x будет значение у = v2×x .
На основе приведенных рассуждений, можно сделать три утверждения о промежуточных и конечных результатах вычислений:
РезультатыУтверждения
{ v1 = х×х Þ v1 = х2
{ v2 = v1×v1Þ v2 = x4
{ у = v2×xÞ у = х5
Таким образом можно высказать окончательное
Утверждение. Конечным результатом выполнения будет
у = х5 для любых значений х.
Доказательство. Исходя из описания результатов выполнения присваиваний значение у будет равно
у = v2×x = (v1×v,)×x = ((х×х).(х×х))) ×х = x5.
Что и требовалось доказать.
Техника анализа и доказательства правильности алгоритмов и программ во многом совпадает с техникой доказательства любых других утверждений и состоит в применении следующих четырех приемов:
· разбор случаев;
· подбор контрпримеров;
· выделение лемм;
· индуктивный вывод.
Разбор случаев применяется для анализа результатов выполнения конструкций альтернативного выбора. В качестве примера проведем анализ приведенного выше алгоритма «выбора» максимума трех чисел, содержащего выбор альтернатив.
алг «у = тах(а, b,с)»Результаты
нач
если а > b топри а > b у := а у = а инес b > с то при b > су := b у = b
инес с > а топри с > ау := с у = с
кеслипри не (b > с)
кон
Справа от алгоритма приведены результаты вычислений с указанием условий, при которых они получаются. На основании этих фактов можно заключить, что конечные результаты вычисления имеют три варианта:
а, при а > b,у = b, при b > с и b ³ а,
с, при с > а и с ³ b.
В то же время значение максимума должно быть равно:
а, при а ³ b и а ³ с,mах = b, при b ³ с и b ³ а,
с, при с ³ а и с ³ b.
Во всех трех случаях видны различия в условиях получения и определения максимальных значений. Покажем, что эти различия существенны и утверждение о том, что алгоритм дает правильные результаты для всех данных, неверно.
Для опровержения общего утверждения достаточно указать хотя бы один контрпример. В данном случае утверждение о правильности алгоритма гласило бы: для любых значений переменных а, b, с конечным было бы значение mах (а, b, с).
Контрпримером в данном случае будут значения: а = 2, b = 1, с = 3. Для этих данных по определению mах = 3, а по результатам выполнения алгоритма у = 2. Следовательно, в алгоритме содержится ошибка.
Однако оказывается, что это не единственная ошибка. Более тонкие ошибки вскрывает второй контрпример: а = 1, b = 1, c = 1. Для этих данных в алгоритме вовсе не определен результат вычислений у = ? и конечный результат выполнения программы будет непредсказуем!?
Правильное решение этой задачи можно получить применением систематических методов, составив постановку и описание метода решения.
Постановка задачиМетод решения
Вычисление mах (а, b, с).
Дано: а, b, с - три числа, mх = mах(mах(а,b),с)
Треб.: mх - максимум, mах(х,у) = х, при х ³ уГде: mх = mах (а, b, с). у, при у ³ х
Данный метод решения непосредственно состоит из формул определения максимумов из трех и двух чисел. Реализация этого метода в форме алгоритма может быть такой:
алг «тх = тах(а,b,с)»Результаты
нач
если а³b топри а ³ bтх:= а mx = a
иначепри b > аmх:= b mх = b
кесли { mх = mах(а,b) }при с < mх
если с ³ mх то при с ³ mхmх := сmх' = с
кесли
кон
Доказательство правильности алгоритмов можно проводить двумя способами. Первый способ - анализ правильности при построении алгоритмов. Второй способ - анализ правильности после построения алгоритмов.
Первый способ - показать, что алгоритм является корректной реализацией метода решения, и доказать, что метод - правильный. Для рассмотренного алгоритма это доказательство изложено выше.
Привлечение для создания алгоритмов известных методов решения, для которых доказана их правильность, позволяет существенно упростить обоснование правильности программ. При этом центр тяжести проблем смещается к созданию и обоснованию гарантированно правильных методов решения задач.
Второй способ - исчерпывающий анализ результатов выполнения алгоритма на соответствие постановке решаемых задач для любых допустимых данных. Это - доказательство путем исчерпывающего анализа результатов выполнения алгоритмов и программ.
Результаты выполнения рассматриваемого алгоритма вычисления максимума трех чисел приведены справа от него. Анализ результатов алгоритмов, содержащих конструкцию выбора, требует разбора случаев. Отметим, что все эти случаи были уже указаны ранее при разборе ошибочной версии алгоритма.