Спонсор: Microsoft
Московский физико-технический институт
Опубликован: 24.09.2008 | Доступ: свободный | Студентов: 2634 / 769 | Оценка: 4.52 / 4.48 | Длительность: 25:15:00
Специальности: Системный архитектор

Лекция 7: Формальные спецификации, доказательство и верификация программ

6.2.2. Доказательство конкретности с помощью утверждений

Рассмотрим формальное доказательство программы, заданной структурной логической схемой и совокупностью утверждений, задаваемых логическими операторами, комбинациями переменных (true/false), операциями (конъюнкция, дизъюнкция и др.) и кванторами всеобщности и существования (табл. 6.1).

Таблица 6.1. Список логических операций
Логические операции
Название Примеры Значение
Конъюнкция x \; \& \; y x и y
Дизъюнкция x * y x или y
Отрицание \neg x не x
Импликация x \to y если x то y
Эквивалентность х = у x равнозначно y
Квантор всеобщности \forall{х}\;Р(х) для всех x, условие истинно
Квантор существования \exists{х}\;Р(х) существует x, для которого Р(х) истина

Цель алгоритма программы - построение для массива целых чисел T длины N (array Т[1:N]) эквивалентного массива Т^\prime той же длины N, что и массив Т. Элементы в массиве Т^\prime должны располагаться в порядке возрастания их значений. Данный алгоритм реализуется сортировкой элементов исходного массива Т по их возрастанию. Доказательство правильности алгоритма сортировки элементов массива Т проводится с использованием ряда утверждений относительно элементов этого алгоритма, которые описываются пунктами П1- П6.

  1. Входное условие алгоритма задается в виде начального утверждения:
    А_{beg}: (Т [1:N]\text{ - массив целых}) \;\& \; (Т^\prime[1:N ]\text{ - массив целых })

    Выходное утверждение А_{end} - это конъюнкция таких условий:

    • (Т\text{ - массив целых}) & (Т^\prime\text{ - массив целых}),
    • (\forall{i}\text{, если }i \le N\text{, то }\exists{j}(T^\prime(i) \le T^\prime(j))),
    • (\forall{i}\text{, если }i \le N\text{, то }(T^\prime(i) \le T^\prime(i+1)),

    т.е.

    А_{beg} \text{ - это }(Т [1:N]\text{ - массив целых}) \;\& \; (Т^\prime[1:N ]\text{ - массив целых }) \\
      \& \; \forall{i}\text{, если }i \le N\text{, то }\exists{j}(T^\prime(i) \le T^\prime(j)),\\
      \& \; \forall{i}\text{, если }i \le N\text{, то }(T^\prime(i) \le T^\prime(i+1)).

    Расположение элементов массива T в порядке возрастания их величин в массиве T осуществляется алгоритмом пузырьковой сортировки, суть которого заключается в предварительном копировании массив T в массив Т^\prime, а затем проводится сортировка элементов согласно условия их возрастания. Алгоритм сортировки представлен на блоксхеме (рис. 6.2).

    Операторы алгоритма размещены в прямоугольниках, условия выбора альтернативных путей - параллелограммами, точки с начальным A_{beg} и конечным A_{end} условиями и состояниями алгоритма - кружками. В кружках также заданы: начальное состояние - 0, состояние после обмена местами двух соседних элементов в массиве Т - одна звездочка, состояние после обмена местами всех пар за один проход всего массива Т - две звездочки.

    Кроме уже известных переменных Т, Т^\prime и N, в алгоритме использованы еще две переменные: i - целое и М - булева переменная, значением которой являются логические константы true и false.

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

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

    Так, оператор присваивания означает, что для всех i ( i \le N & i\ge0 ) выполняется ( T^\prime[i] : = T[i] ). Результат выполнения алгоритма в точке с нулем может быть выражен утверждением

    (T[1: N]\text{ - массив целых}) \;\&\; (T^\prime[1: N]\text{ - массив целых})\\
        \&\; (\forall{i}\text{, если }i \le N (T[i] = T[i])).

    Доказательство очевидно, поскольку за семантикой оператора присваивания (поэлементная пересылка чисел из Т в T^\prime ) сами элементы при этом не изменяются, к тому же в данной точке их порядокв Т и T^\prime одинаковый. Итак, получили, что выполняется условие б) исходного утверждения.

    Схема сортировки элементов массива Т

    увеличить изображение
    Рис. 6.2. Схема сортировки элементов массива Т

    Заметим, что первая строка доказанного утверждения совпадает с условием а) исходного утверждения А_{end} и остается справедливой до конца работы алгоритма, поэтому в следующих утверждениях приводиться не будет.

    В точке с одной звездочкой выполнен оператор (i < N )\; (T^\prime(i)) > T^\prime(i+1) \to (T^\prime(i)\text{ и }T^\prime(i+1)
      , который меняет местами элементы.

    В результате работы оператора будет справедливым такое утверждение:

    \exists{i}\text{, если }i<N\text{, то }(T^\prime(i) < T^\prime(i + 1),

    которое является частью условия в) утверждения А_{end} (для одной конкретной пары смежных элементов массива T^\prime ). Очевидно также, что семантика оператора обмена местами не нарушает условие б) выходного утверждения А_{end}.

    В точке с двумя звездочками выполнены все возможные обмены местами пар смежных элементов массива T^\prime за один проход через T^\prime, т.е. оператор обмена работал один или больше раз. Однако пузырьковая сортировка не дает гарантии, что достигнуто упорядочение за один проход по массиву T^\prime, поскольку после очередного обмена индекс i увеличивается на единицу независимо от того, как соотносится новый элемент T^\prime(i) с элементом T^\prime(i-1).

    В этой точке также справедливо утверждение

    \exists{i}\text{, если }i < N\text{, то }T^\prime(i) < T^\prime(i+1).

    Часть алгоритма, обозначенная точкой с двумя звездочками, выполняется до тех пор, пока не будет упорядочен весь массив, т.е. не будет выполняться условие в) утверждения А_{еnd} для всех элементов массива T^\prime: \foralli, если i < N, то T^\prime(i) < T^\prime(i+1).

    Итак, выполнение исходных условий обеспечено порядком и соответствующей cемантикой операторов преобразования массива.

    Доказано, что выполнение алгоритма программы завершено успешно, что означает ее правильность.

  3. Этот алгоритм можно представить в виде серии теорем, которые доказываются. Начиная с первого утверждения и переходя от одного преобразования к другому, определяется индуктивный путь вывода. Если одно утверждение - истинно, то истинно и другое. Иными словами, если дано первое утверждение А_{1} и первая точка преобразования А_{2}, то первая теорема - А_{1} \to А_{2}.

    Если А_{3} - следующая точка преобразования, то второй теоремой будет А_{2} \to А_{3}.

    Таким образом, формулируется общая теорема А_{i} \to А_{j}, где А_{i} и А_{j} - смежные точки преобразования. Эта теорема формулируетсятак, что если условие "истинное" в последней точке, то истинно и выходное утверждение А_{k} \to А_{end}.

    Следовательно, можно возвратиться к точке преобразования А_{end} и к предшествующей точке преобразования. Доказав, что А_{k} \to А_{end} верно, значит, верно и А_{j} \to А_{j+1} и так далее, пока не получим, что А_{1} \to А_{0}.

  4. Далее специфицируются утверждения типа if - then.
  5. Чтобы доказать, что программа корректная, необходимо последовательно расположить все утверждения, начиная с А_{1} и заканчивая А_{end}, этим подтверждает истинность входного и выходного условий.
  6. Доказательство алгоритма программы завершено.
Максим Цапко
Максим Цапко

Я наконец закончил курс "Управление ИТ-проектами". Как получить документ об окончании курса.

давайн Нкунда
давайн Нкунда
Владимир Карпенко
Владимир Карпенко
Украина, Киев, Национальный Авиационный Университет, 2009
Михаил Адигеев
Михаил Адигеев
Россия