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