Спонсор: Microsoft
Опубликован: 24.09.2008 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт

Лекция 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. Доказательство алгоритма программы завершено.
Александр Медов
Александр Медов

Здравствуйте,при покупке печатной формы сертификата,будут ли выданы обе печатные сторны?

Александр Медов
Александр Медов

Здравствуйте, прошел курс МБА Управление ИТ-проектами и направил документы на получение диплома почтой. Подскажите, сроки получения оного в бумажной форме?

:

Константин Андреев
Константин Андреев
Россия, Петрозаводск, Петрозаводский государственный университет, 2001
Станислав Кравченко
Станислав Кравченко
Россия, Москва, МЭГУ, 2006