Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / PZ00 / Логические спецификации.doc
Скачиваний:
32
Добавлен:
23.03.2015
Размер:
93.18 Кб
Скачать

Если p{ а }q и q{ b }r, то выполняется p{ a;b }r.

или в другой форме записи

P{ А }Q и Q{ B }R

P{ A;B }R.

Т.е., если A таково, что его выполнение при верном P приводит к ситуации, в которой Q верно и выполнение B при верном Q приводит к ситуации, в которой верно R, то выполнение B вслед за A, отправляясь от ситуации, в которой верно P, приведет к конечной ситуации, где верно R.

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

Рассмотрим пример.

Пример 3. Доказать формулу

{0 < X < 1} X:=1/X+Y; X:=X+1 {X>Y+2}. (3)

Доказательство. На основании примера 2 можно утверждать

{0<X<1} X:=1/X+Y {X>Y+1}.

Если обозначить n=Y+1, то на основании примера 1 можно заключить справедливость формулы

{X>Y+1} X:=X+1 {X>Y+2}.

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

Аксиома ветвления.

Если B не имеет побочных эффектов, то доказательство

{P} if B then S1 else S2 {Q}

эквивалентно доказательству пары

{P&B} S1 и {P&~B} S2 {Q}

или более кратко

без побочных эффектов B, {P&B} S1, {P&~B} S2 {Q}

.

{P} if B then S1 else S2 {Q}

Рассмотрим пример.

Пример 4. Доказать формулу

{(X=1) | (X=0)}

if X=1 then Y:=0 else X:=Y

{(Y=0)}

На основании аксиомы ветвления доказательство этой формулы сводится к доказательству трех условий:

  1. без побочных эффектов (X=1);

  2. {((X=1)|(X=0))&(X=1)} Y:=0 {(Y=0)};

  3. {((X=1)|(X=0))&~(X=1)} Y:=X {(Y=0)};

Истинность первого условия следует из того, что операция сравнения (=) ничего не модифицирует.

Проектирование цикла с помощью инварианта Задача 1. Найти сумму величин 1/I от 1 до тех пор, пока она не станет больше некоторого наперед заданного числа a.

АНАЛИЗ ЗАДАЧИ. Прежде всего выясним, что дано (предусловие P) и, что надо получить (постусловие Q).

  1. P: Подготовить вещественное число a.

  1. Q: 1 + ½ + 1/3 + … + 1/i > a & 1 + ½ + 1/3 + … + 1/(i-1)  a .

Разработаем стратегию решения задачи: будем последовательно накапливать n-ые частичные суммы, начиная от n=1.

  1. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Последовательное получение величин Sn = 1 + ½ + 1/3 + … + 1/n, начиная от n=1.

Ясно, что решение задачи будет представлять собой цикл с неопределенным количеством повторений. В этом цикле будут последовательно формироваться n-ые частичные суммы Sn. Номер частичной суммы будет определяться величиной n (параметр цикла). Сформулируем инвариант цикла.

4) ИНВАРИАНТ ЦИКЛА I: <Частичная сумма Sn> = 1 + ½ + 1/3 + … + 1/n.

Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:

5) СТРУКТУРА ЦИКЛА:

ВЫХОД

Компоненты цикла будем искать, исходя из стратегии задачи и условия истинности инварианта:

А) перед первым входом в цикл;

Б) после завершения тела цикла;

В) после выхода из цикла.

Введем параметр цикла n – номер уже полученной частичной суммы. Частичную сумму обозначим переменной S. Исходя из стратегии решения задачи (суммирование от начала последовательности) присвоим n значение 0. Чтобы сохранить истинность инварианта необходимо переменной S также присвоить значение 0.

6) ПОДГОТОВКА ЦИКЛА: n:=0; S:=0;

Условие продолжения цикла (обозначим B) найдем, принимая во внимание постусловие Q.

7) УСЛОВИЕ ПРОДОЛЖЕНИЯ ЦИКЛА B: Sa.

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

8) МОДИФИКАТОР ЦИКЛА: inc(n).

Заметим, что в этот момент условие инварианта цикла I нарушилось (номер частичной суммы n мы увеличили, а значение частичной суммы S осталось прежним. Восстановим это соответствие, добавив очередное слагаемое.

9) ТЕЛО ЦИКЛА: S:=S+1/n.

Теперь инвариант цикла восстановлен и можно вернуться к заголовку цикла с целью проверить условие выхода из цикла.

Соберем наши элементы программы вместе. Получим программу:

10) ТЕКСТ ПРОГРАММЫ:

<< Подготовить a (например, ввести) >>

n:=0; S:=0;

while Sa do begin

inc(i);

S:=S+1/n

end;

Теперь докажем правильность этой программы (ее соответствие спецификации).

11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Это следует из того, что мы выйдем из цикла только тогда, когда нарушится условие B, т.е. S станет больше a. Из условия истинности инварианта (он будет справедлив при выходе из цикла), учитывая стратегию решения задачи (последовательное получение всех частичных сумм) можно заключить, что это произойдет впервые (т. е. предыдущая частичная сумма еще была меньше a). А это и есть требования постусловия Q – ч.т.д.

12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из теории рядов известно, что наш ряд расходится, т.е. последовательность частичных сумм стремится к бесконечности. Поэтому обязательно наступит такой момент, когда при некотором n наша частичная сумма станет больше любого наперед заданного числа a, что означает нарушение условия продолжения цикла – ч.т.д.

Таким образом доказательство полной корректности цикла гарантирует, что цикл обязательно завершится, а доказательство частичной корректности показывает, что цикл завершится именно в состоянии Q. Итак, мы доказали, что наша программа решает поставленную задачу.

Задача 2. Найти количество значащих цифр в натуральном числе n.

  1. P: Подготовить натуральное число n.

  2. Q: k = <Количество значащих цифр в числе n>.

  3. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать младшие цифры числа. Текущее обрезаемое число обозначим C, а количество уже отрезанных цифр будем хранить в переменной k.

  4. ИНВАРИАНТ ЦИКЛА I:

< Количество значащих цифр в числе n> = < Количество значащих цифр в числе C> + < количество уже отрезанных цифр, т.е. k>.

5) СТРУКТУРА ЦИКЛА:

ВЫХОД

  1. ПОДГОТОВКА ЦИКЛА:

C:=n; { Начнем с исходного числа}

k:=0; { Из условия истинности инварианта}

  1. УСЛОВИЕ ЦИКЛА: C<>0.

  2. МОДИФИКАТОР ЦИКЛА:

C:=C div 10; { В соответствии со стратегией задачи }

9) ТЕЛО ЦИКЛА:

inc(i); { Из условия сохранения инварианта цикла }

  1. ТЕКСТ ПРОГРАММЫ:

<< Подготовить n (например, ввести) >>

C:=n; k:=0;

while C<>0 do begin

C:=C div 10;

inc(i);

end;

11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) следует, что в переменной k учтены все значащие цифры числа – ч.т.д.

12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.

Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q (В k находится количество значащих цифр числа).

Задача 3. Найти сумму цифр натурального числа n.

  1. P: Подготовить натуральное число n.

  2. Q: S = <Сумма цифр числа n>.

  3. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать число справа. Текущее обрезаемое число обозначим C, а сумму уже отрезанных цифр будем хранить в переменной S.

  4. ИНВАРИАНТ ЦИКЛА I:

< Сумма цифр числа n> = < Сумма цифр числа C> + < Сумма уже отрезанных цифр, т.е. S>.

5) СТРУКТУРА ЦИКЛА:

ВЫХОД

6) ПОДГОТОВКА ЦИКЛА:

C:=n; { Начнем с исходного числа}

S:=0; { Из условия истинности инварианта}

  1. УСЛОВИЕ ЦИКЛА: C<>0.

  2. ТЕЛО ЦИКЛА:

S:=S+C mod 10; { В соответствии со стратегией задачи }

  1. МОДИФИКАТОР ЦИКЛА:

C:=C div 10; { Из условия сохранения инварианта цикла }

  1. ТЕКСТ ПРОГРАММЫ:

<< Подготовить n (например, ввести) >>

C:=n; S:=0;

while C<>0 do begin

S:=S+C mod 10;

C:=C div 10;

end;

11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) следует, что в переменной S просуммированы все цифры числа – ч.т.д.

12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.

Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q (В S находится сумма всех цифр числа).

Задача 4. Найти старшую цифру натурального числа n.

  1. P: Подготовить натуральное число n.

  2. Q: k = <Старшая цифра числа n>.

  3. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать число справа, пока не доберемся до старшей цифры числа.Текущее обрезаемое число обозначим C. Очередную отрезанную цифру будем хранить в переменной k.

  4. ИНВАРИАНТ ЦИКЛА I:

< k есть старшая цифра числа n> ИЛИ C<>0

5) СТРУКТУРА ЦИКЛА:

ВЫХОД

6) ПОДГОТОВКА ЦИКЛА:

C:=n; { Начнем с исходного числа}

  1. УСЛОВИЕ ЦИКЛА: C<>0.

  2. ТЕЛО ЦИКЛА:

k:=C mod 10; { В соответствии со стратегией задачи }

  1. МОДИФИКАТОР ЦИКЛА:

C:=C div 10; { В соответствии со стратегией задачи }

  1. ТЕКСТ ПРОГРАММЫ:

<< Подготовить n (например, ввести) >>

C:=n;

while C<>0 do begin

k:=C mod 10;

C:=C div 10;

end;

11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) и условия сохранения инварианта следует, что в переменной k находится старшая цифра числа (один из операндов логической функции ИЛИ – ЛОЖЬ, тогда, чтобы инвариант остался истинным, необходимо, чтобы второй операнд стал истинным, т.е. k – старшая цифра числа) - ч.т.д.

12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.

Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q (В k находится старшая цифра числа).