Спецификация программ и преобразователь предикатов
Спецификация программы и преобразователь предикатов wp
Для того чтобы доказывать правильность программ необходимо прежде всего дать строгое определение понятию правильная программа. Ясно, что оно зависит не только от результата, который должен быть получен в процессе выполнения программы, но и от того, в каких условиях начинается ее выполнение.
Определение 6.1. Спецификацией программы
,
где
и
— предикаты, называется предикат, означающий,
что если выполнение
началось в состоянии, удовлетворяющем
, то имеется гарантия, что
оно
завершится через конечное время в состоянии, удовлетворяющем
.
Под программой в данном определении может пониматься один
или несколько
отдельных операторов или же действительно целая большая программа.
Определение 6.2.
Предикат называется предусловием или входным
утверждением
;
— постусловием или выходным утверждением программы
.
Так как спецификация программы является предикатом, то она может быть истинной, а может быть и ложной. Возможна и такая ситуация, когда в некоторых состояниях она истинна, а в других — ложна. Вот соответствующие примеры.
Спецификация является
тавтологией,
спецификация
ложна во всех
состояниях,
а спецификация
истинна при
и ложна
в остальных состояниях.
Спецификация программы является единственным корректным способом постановки задачи. Только четко сформулировав пред- и постусловия, можно обсуждать затем правильность программы.
Определение 6.3.
Программа является правильной при заданных
и
,
если спецификация
является тавтологией.
С практической точки зрения особый интерес представляют программы, которые позволяют получить нужный результат при минимальных требованиях к начальным условиям, а также программы, позволяющие достичь как можно большего при фиксированном предусловии.
Слабейшее предусловие — предикат, описывающий максимально широкое
множество в пространстве состояний переменных программы , на
котором
гарантируется получение постусловия
. Сильнейшее
постусловие
— предикат, описывающий максимально сильные ограничения на состояние
переменных программы
, которые могут быть получены при данном
предусловии
.
Для целей доказательства правильности программ особенно важен следующий предикат.
Определение 6.4. Слабейшее предусловие — предикат, представляющий
множество
всех состояний переменных программы
, для которых выполнение
команды
,
начавшееся в таком состоянии, обязательно закончится через конечное время в
состоянии, удовлетворяющем
.
Проиллюстрируем введенное понятие на нескольких примерах.
, так как если
переменная
удовлетворяла условию
, то
после выполнения
программы
она действительно будет удовлетворять
неравенству
.
, ибо
выполнение программы
при любых начальных условиях приведет к тому, что переменная
станет равной максимальному значению из величин
и
.
,
потому что
будет равно максимуму из чисел
и
(а именно
таково будет
после выполнения программы
) тогда и только тогда, если
именно
переменная
имеет большее значение.
. Это (пустое
множество
состояний) означает, что ни при каких начальных условиях программа
не сможет сделать величину
меньше,
чем
.
, ибо
только при
таком начальном условии после выполнения приведенной программы переменная
станет равной
.
Заметим, что из определений спецификации программы и ее слабейшего предусловия вытекает следующее утверждение.
Предложение 6.1. .
Определение 6.5. Преобразователем предикатов (обозначаемый через )
называют
когда фиксируют программу
и рассматривают
как функцию
одной переменной
.
Предложение 6.2.
Преобразователь предикатов обладает следующими
свойствами:
1) (закон исключенного чуда);
2) (дистрибутивность
конъюнкции);
3)
(закон монотонности);
4)
(дистрибутивность дизъюнкции).
Величина описывает такое множество начальных условий,
при которых
выполнение программы
завершится через конечное время в
состояний,
удовлетворяющем
, то есть ни в каком состоянии. Этого, конечно,
быть не
может, что и поясняет название свойства — закон исключенного чуда.
Докажем аккуратно дистрибутивность конъюнкции. Для доказательства
эквивалентности достаточно показать, что из условия ,
стоящего в левой части, вытекает условие
,
размещенное в
правой, и наоборот. Для доказательства импликации
рассмотрим
произвольное
состояние
, удовлетворяющее условию
. Так как
выполнение программы
, начавшееся в
, завершится
при истинных
и
,
то истинным будет и предикат
.
Для доказательства обратной импликации
рассмотрим состояние
, удовлетворяющее условию
. Тогда
выполнение
, начавшееся в
, обязательно завершится
в некотором
состоянии
, удовлетворяющем
. Но любое
такое
обязательно
удовлетворяет и
и
, так что
удовлетворяет и
и
,
что и завершает доказательство.
Закон монотонности докажите самостоятельно, а вот по поводу последнего
свойства преобразователя предикатов — дистрибутивности дизъюнкции —
надо сделать некоторые замечания. Дело в том, что если в качестве
рассмотреть операцию бросания монеты, которая может завершиться либо выпадением
герба (
), либо решки (
), то
, ибо нельзя
гарантированно предсказать результат бросания ни при каких начальных условиях.
С другой стороны,
, так как всегда выпадет
либо герб,
либо решка.
Если является недетерминированной, то эквивалентность
в законе дистрибутивности дизъюнкции превращается в импликацию. Однако
для программ
, реализованных с помощью большинства языков
программирования,
подобная ситуация невозможна.