Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7.2.docx
Скачиваний:
4
Добавлен:
12.09.2019
Размер:
119.46 Кб
Скачать
      1. Последовательность шагов по доказательству корректности схем-алгоритмов программ

Пример.

Рассмотрим определение результата деления двух натуральных чисел А и В в виде пары чисел «частное» и «остаток», не используя операции умножения и деления.

Обозначим:

СН – частное;

АА – остаток;

А – делимое;

В – делитель.

Схема алгоритма деления приведена на Рис. 5 .3.

Представим алгоритм, приведённый на рис. 5.3, в форме, принятой при верификации программ (Рис. 5 .4).

Рис. 5.3. Пример алгоритма деления натуральных чисел

Рис. 5.4. Представление алгоритма в форме, принятой при верификации программ

Обычно при доказательстве правильности (корректности) операторы ввода вывода игнорируется.

Шаги по доказательству корректности программ выглядят следующим образом.

  1. На схеме алгоритма выделяем точки разреза. Всегда будет нулевая точка лежащая на дуге исходящей из вершины “начало” и точки, на каждой дуге ведущей к вершине “конец” алгоритма. Кроме того, вводятся точки разреза как минимум на каждый цикл по одной точке.

  2. На алгоритме выделяем множество путей, при этом путь должен обладать следующими свойствами:

    1. путь должен начинаться и заканчиваться в точке разреза;

    2. путь не должен содержать других точек разреза;

    3. множество всех выделенных путей должно покрывать все ветви алгоритма, т.к. в данной схеме алгоритма 3 ветви, то выделяем 3 следующих пути:

α01 = {«0», 2, «1»}

α11 = {«1», 3, 4, «1»}

α12 = {«1», 3, 5, «2»}

  1. Формулируем предикаты, т.е. с каждой точкой разреза связывается предикат или некоторое индуктивное утверждение.

Назначение предиката состоит в том, чтобы описать соотношение между переменными в этой точке. Это индуктивное утверждение должно обладать тем свойством, что всякий раз, когда исполнение программы достигает данной точки, предикат должен быть истинным для текущих значений входящих в него переменных в данной точке.

Входной предикат связывается с начальной точкой разреза программы, а выходной с конечной точкой разреза.

Р0: А, В – натуральные числа

Р1: АА = А – СН * ВВ

Р2: С = (A – R) / В

АА - это текущий остаток в цикле;

СН – текущее частное;

ВВ – делитель;

R – конечный остаток от деления.

Входное утверждение Р0 (входной предикат) описывает все необходимые условия для нашего алгоритма. Выходное утверждение Р2 (выходной предикат) описывает связь выхода с входом, т.е. ожидаемый результат. Предикат Р1 вводится таким образом, чтобы он отражал основные свойства цикла.

  1. Формулируем условия прохождения пути:

α01: W01 = истина

α11: W11 = AA ≥ BB

α12: W12 = AA < BB

  1. Строим для каждого пути αij, ведущего из точки разреза i в точку j, некоторое верификационное условие

α01: [P0 ^ W01]→[P1] (5.1)

α11: [P1 ^ W11]→[P1] (5.2)

α12: [P1 ^ W12]→[P2]. (5.3)

Cуть метода заключается в демонстрации того, что из входного утверждения P0 и преобразование выполняемого на данном пути следует утверждение, сформулированное в конце пути, например в точке “1” и так вплоть до выходного утверждения P2

  1. Доказательство корректности верификационных условий. Все три условия имеют вид p→q. Обычный метод доказательства таких утверждений сводится к тому, чтобы показать, что q истинно всякий раз, когда истинно Р, т.е. нужно доказать истинность q при условии истинности p.

Докажем истинность предложения (5.1) для пути α01.

α01: [(А, В: натуральные числа) ^ истина] → [АА = А – СН*ВВ]

P1

Подставляем в предикат P1 значения переменных после выполнения блока 2 схемы алгоритма (рис. 5.4).

А = А – 0 * В следовательно А = А (истинно)

Т.о. всё предложение истинно. Докажем истинность предложения (5.2) для пути α11.

α11: [(AA=A – CH*BB) ^ (AA ≥ BB)] → [AA = A – CH*BB] (5.4)

P1 P1

Чтобы доказать истинность предиката в конце пути (точка разреза «1»), достаточно доказать:

    1. истинность P1 при первом попадании в точку «1»;

    2. истинность P1(n+1) при условии, что справедливо P1(n), где n – параметр цикла.

Т.о. необходимо доказать истинность предложения P1(n) → P1(n+1), т.е. при условии, что P1(n) – истинно, доказать, что P1(n+1) – истинно, и т.о. P1(n) будет истинным для любого значения n.

Докажем истинность предиката P1 при первом попадании в точку разреза «1», т.е. докажем истинность предложения (5.4).

AA – BB = A – (CH+1)*BB

AA – BB = A – CH*BB – BB

AA = A – CH*BB

Т.о. истинность предложения (5.4) на первой итерации доказана.

Пусть P1 истинно на n-й итерации.

AA – n*BB = A – (CH+n)*BB

Докажем истинность на (n+1)-ой итерации:

AA – (n+1)*BB = A – (CH+n+1)*BB

AA – n*BB – BB = A – (CH+n)*BB – BB

AA – n*BB = A – (CH+n)*BB

Т.о. истинность на (n+1)-ой итерации доказана и т.о. предложение (5.4) истинно для любого n в рамках ограничений предложения (5.4).

Докажем истинность предложения (5.3) на пути α12.

α12: [(AA = A – CH*BB) ^ (AA < BB)] → [C = (A – R)/B]

P1 P2

Подставляем в предикат P2 значения переменных после выполнения блока 5 схемы алгоритма (рис. 5.4).

CH = (A – AA)/B

AA = A – CH*B

Т.к. B ≡ BB (нигде не менялось), то получаем предикат P1, истинность которого доказана.

AA = A – CH*BB

Поэтому предложение (5.3) истинно.

Данный подход позволяет обнаруживать ошибки. Например, внесём ошибку в блок 2 схемы алгоритма (рис. 5.4).

(AA, BB, CH) ← (A, B, 1)

Тогда α01: [(A, B: натуральные числа) ^ истина] →

[AA = A – CH*BB]

A = A – 1*B

A ≠ A – B (ошибка).

Т.о. мы доказали, что схема алгоритма правильна по отношению к входному и выходному утверждению Р0 и Р2 , но то что программа не будет находиться в бесконечном цикле еще не доказано. Нет общего метода доказательства завершаемости программ, но обычно бывает достаточно неформальных рассуждений. В нашем случае алгоритм заканчивается только тогда когда AA < BB. Согласно входному утверждению Р0, АА первоначально положительно и уменьшается при каждом повторении цикла на положительное число равное ВВ. Т.о. неформально установлено, что выполнение программы закончится.

Из анализа данного примера видно, что доказательство правильности весьма трудоемкий процесс и доказательство всегда длиннее самой программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]