Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pred_prog_tutor.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.03 Mб
Скачать

2.4. Система правил доказательства корректности операторов

Понятие корректности, введенное для программы в целом, применимо также к произвольным операторам программы. Допустим, для некоторого оператора S имеется спецификация в виде тройки Хоара {P(x)} S {Q(x, y)}. В качестве оператора S будем рассматривать оператор суперпозиции A; B, параллельный оператор A || B или условный оператор if (C) A else B, определенные в разд. 2.2. Нашей задачей является конкретизация формулы корректности (2.10) для каждого из трех операторов. Естественным требованием является корректность операторов A и B. Условия корректности каждого из трех операторов формулируются в виде правил вывода, с помощью которых можно доказывать корректность оператора. Правила вывода для этих операторов не используют формулы LS(A) и LS(B)  только спецификации (предусловия и постусловия) операторов A и B встречаются в правилах. Эта особенность является существенным преимуществом правил.

2.4.1. Правила для корректного оператора

Для произвольного корректного оператора B перепишем условия корректности (2.72.9) в виде правил вывода.

Лемма 2.3. Пусть имеется оператор B со спецификацией в виде тройки Хоара {PB(x)} B {QB(x, y)}. Предполагается, что оператор B является корректным, т. е. для него истинна соответствующая общая формула корректности (2.10) и формулы (2.72.9). Тогда истинны следующие правила вывода.

Правило E1. PB(x) ├ $y. QB(x, y).

Правило E2. PB(x) ├ $y. LS(B)(x, y).

Правило E3. PB(x) ├ LS(B)(x, y)  QB(x, y).

2.4.2. Правила корректности для параллельного оператора

Рассмотрим спецификацию параллельного оператора в виде тройки Хоара:

{P(x)} A || B {Q(x, y, z)} . (2.11)

Допустим, операторы A и B корректны. Их спецификации представлены тройками:

{PA(x)} A {QA(x, y)}, {PB(x)} B {QB(x, z)} .

Определим правила, гарантирующие корректность параллельного оператора.

Правило RP1. P(x) ├ PA(x) & PB(x).

Правило RP2. QA(x, y), QB(x, z) ├ Q(x, y, z).

Лемма 2.4. Пусть предусловие P(x) истинно. Допустим, операторы A и B корректны. Если правила RP1 и RP2 истинны (т. е. правая часть доказуема из левой части для каждого правила), то параллельный оператор (2.11) является корректным.

Доказательство. Для доказательства корректности оператора (2.11) в соответствии с формулой (2.10) достаточно доказать реализуемость LS(A || B)(x, y, z) и выводимость постусловия Q(x, y, z) из LS(A || B)(x, y, z). В соответствии с (2.2) формула LS(A || B)(x, y, z) эквивалентна формуле LS(A)(x, y) & LS(B)(x, z).

Из истинности предусловия P(x) по правилу RP1 следует истинность PA(x) и PB(x). Далее, по правилу E2 становятся истинными формулы $y. LS(A)(x, y) и $z. LS(B)(x, z). Их конъюнкция определяет реализуемость LS(A || B)(x, y, z).

Докажем выводимость постусловия Q(x, y, z) из LS(A)(x, y) & LS(B)(x, z). Допустим, истинна формула LS(A)(x, y) & LS(B)(x, z). Применим правило E3 для PA(x) и PB(x), истинность которых определена выше. Получаем истинность формул LS(A)(x, y)  QA(x, y) и LS(B)(x, z)  QB(x, z). Как следствие, будут истинны QA(x, y) и QB(x, z). Применяя правило RP2, получаем истинность постусловия Q(x, y, z). □

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]