Теперь посмотрим, каким соотношениям должны удовлетворять перемен-
ные на разных участках кода.
{((x ≥ 0) ∧ (y > 0))}
q = 0;
r = x;
{((x = q ∗ y + r) ∧ (0 ≤ r))}
while (r ≥ y) {
{((x = q ∗ y + r) ∧ (0 < y ≤ r))}
r = r − y;
q = 1 + q; }
{((x = q ∗ y + r) ∧ (0 ≤ r < y))}
Критерий корректности программы выражается соотношением
(x = q ∗ y + r) ∧ (0 ≤ r < y),
которое должно иметь место при завершении программы, если соотношение
(х ≥ 0) ∧ (у > 0) справедливо перед ее выполнением. Именно это и следует
доказать.
Рассмотрим сначала цикл в приведенной программе, представленный
на рис. 7.11. В этом примере B имеет вид (r ≥ у). Если теперь заме-
тить, что выходное соотношение на рис. 7.11 может быть переписано как
(x = q ∗ у + r) ∧ (r ≥ 0) ∧ ¬(r ≥ у), то ясно, что это как раз и есть P ∧ ¬B,
где
P − это (x = q ∗ y + r) ∧ (r ≥ 0). (7.22)
S
2
?
¡
¡
@
@
¡
¡
@
@
r≥ y
?
-
-
?
Ложь
Истина
{((x = q ∗ y + r) ∧ (0 ≤ r))}
{((x = q ∗ y + r) ∧ (0 ≤ r < y))}
Рис. 7.11
Другими словами, наша задача при верификации рис. 7.11 показать, что
{P }while(r ≥ y)S
2
{P ∧ ¬(r ≥ y)}, где инвариант цикла P задается соотно-
шением (7.22). Но правило вывода (7.18) гарантирует, что это утверждение
должно быть истинным постольку, поскольку можно доказать
{P ∧ (r ≥ y)}S
2
{P } (7.23)
для P , задаваемого (7.22) и S
2
, задаваемого {r = r − у; q = 1 + q; }.
81