9.5. Пример доказательства свойства программы.
На основании доказанных правил верификации программ можно доказывать свойства программ, состоящих из операторов присваивания и пустых операторов и использующих три основные композиции структурного программирования. Для этого, анализируя структуру программы и используя заданные ее пред- и постусловия, необходимо на каждом шаге анализа применять подходящее правило верификации. В случае применения композиции повторения потребуется подобрать подходящий инвариант цикла.
В качестве примера докажем свойство (9.4). Это доказательство будет состоять из следующих шагов.
(Шаг 1). n>0 (n>0, p любое, m любое).
(Шаг 2). Имеет место
{n>0, p любое, m любое} p:=1 {n>0, p=1, m любое}.
По теореме 9.2.
(Шаг 3). Имеет место
{n>0, p=1, m любое} m:=1 {n>0, p=1, m=1}.
По теореме 9.2.
(Шаг 4). Имеет место
{n>0, p любое, m любое} p:=1; m:=1 {n>0, p=1, m=1}.
По теореме 9.3 в силу результатов шагов 2 и 3.
Докажем, что предикат p= m! является инвариантом цикла, т.е. {p=m!} m:=m+1; p:=pm {p=m!}.
(Шаг 5). Имеет место {p= m!} m:= m+1 {p= (m1)!}.
По теореме 9.2, если представить предусловие в виде {p= ((m+1)1)!}.
(Шаг 6). Имеет место {p= (m1)!} p:= pm {p= m!}.
По теореме 9.2, если представить предусловие в виде {pm= m!}.
(Шаг 7). Имеет место инвариант цикл
{p= m!} m:= m+1; p:= pm {p= m!}.
По теореме 9.3 в силу результатов шагов 5 и 6.
(Шаг 8). Имеет место
{n>0, p=1, m=1} ПОКА m <> n ДЕЛАТЬ
m:= m+1; p:= pm
ВСЕ ПОКА {p= n!}.
По теореме 9.6 в силу результата шага 7 и имея в виду, что (n>0, p=1, m= 1) p= m!; (p= m!, m= n) p= n!.
(Шаг 9). Имеет место
{n>0, p любое, m любое} p:=1; m:=1;
ПОКА m <> n ДЕЛАТЬ
m:= m+1; p:= pm
ВСЕ ПОКА {p= n!}.
По теореме 9.3 в силу результатов шагов 3 и 8.
(Шаг 10). Имеет место свойство (9.4) по теореме 9.5 в силу результатов шагов 1 и 9.
Упражнения к лекции 9.
9.1. Что такое триада Хоора?
9.2. Что такое свойство программы?
9.3. Пусть заданы описания
const n= <конкретное целое значение>;
var k, m: integer;
x: array[1..n] of integer;
Доказать свойство программы:
{n>0}
m:= x[1]
k:=1;
ПОКА k<n ДЕЛАТЬ
k:= k+1;
ЕСЛИ x[k]<m ТО
m:= x[k]
ВСЕ ЕСЛИ
ВСЕ ПОКА;
{n>0 & m<= x[i] для всех i, 1<=i<= n}
Литература к лекции 9.
9.1. С.А. Абрамов. Элементы программирования. - М.: Наука, 1982. С. 85-94.
9.2. М. Зелковец, А. Шоу, Дж. Гэннон. Принципы разработки программного обеспечения. - М.: Мир, 1982. С. 98-105.