Файл: Технология раработки програмного обеспечения УП.pdf

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 
 

81

граммы.

Эти

правила,

называемые

правилами

следствия,

фор-

мулируются

следующим

образом:

1)

если

{P}S{Q}

и

Q 

⇒ R,

то

{P}S{R};

2)

если

{Q}S{R}

и

P 

⇒ Q,

то

{P}S{R}.

Первое

правило

заключается

в

следующем:

«Если

P

предусловие

для

Q

и

если

Q 

⇒ R

является

теоремой

исчисления

предикатов,

то

P

предусловие

для

R».

Таким

образом,

если

P

истинно

и

выполняется

S,

то

R

(так

же,

как

и

Q)

истинно.

Второе

правило

следствия

аналогично

данному.

Эти

пра-

вила

следствия

можно

представить

в

более

формальном

виде:

числитель

выражения

является

посылкой,

а

знаменатель

за-

ключением:

1)

{ } { }

{ } { }

;

,

P S Q

Q

R

P S R

2)

{ } { }

{ } { }

.

,

Q S R

P

Q

P S R

Правила

следствия

используются

для

доказательства

сложных

элементов

программы.

Пусть

программа

представлена

в

виде

структуры

(рис.

5.1),

где

S

i

— операторы,

а

P

i

— преди-

каты,

соответствующие

дугам.

Рис.

5.1

Структура

программы

Предположим,

что

доказаны

следующие

утверждения:

{P

1

}S

1

{P

1

'}

и

{P

2

}S

2

{P

2

'}

для

некоторых

предикатов

P

1

'

и

P

2

'.

Если

можно

доказать,

что

P

1

⇒  P

2

и

P

2

⇒  P

3

,

то,

используя

правила

следствия,

можно

доказать,

что

{P

1

}S

1

;S

2

{P

3

}

истинно.

Следует

определить,

какие

операторы

программы

явля-

ются

правильными.

Предполагается,

что

программа

состоит

только

из

последовательности

операторов

присвоения

и

опера-

торов

if

и

do

while

.

Начало

Конец

S

1

S

2

P

1

P

2

P

3


background image

 
 

82

Так

как

только

оператор

присвоения

может

изменять

зна-

чение

переменных,

то

для

определения

правильности

оператора

присвоения

нужно

добавить

только

одну

аксиому,

она

называ-

ется

аксиомой

присвоения

и

формулируется

следующим

обра-

зом:

( )

(

)

{

}

( )

{ }

.

expr,

expr

expr

x

P x

P

x

P x

=

=

В

соответствии

с

этой

аксиомой

устанавливается,

что

ес-

ли

P

— утверждение,

содержащее

переменную

x,

истинно,

то

P

должно

быть

истинно

и

до

выполнения

оператора

присвоения,

если

x

изменяется

expr.

Например,

если

P(x)

является

предикатом

x > 0

и

x = x + 1

оператор

присвоения,

то

P(x + 1)

является

предикатом

x + 1 > 0

или

x > –1.

По

правилам

следствия,

если

можно

доказать,

что

Q 

⇒ 

P(x + 1)

для

некоторого

предиката

Q,

то

справедливо

утвержде-

ние

{Q}x = x + 1{x > 0}

и

предикат

является

предусловием

для

P.

Осталось

определить

правильные

управляющие

структу-

ры.

Введем

следующие

аксиомы.

Аксиома

следования:

{ } { } { } { }

{ }

{ }

1

2

1

2

.

,

;

P S Q

Q S

R

P S S

R

Два

оператора

программы

могут

быть

объединены.

Если

после

выполнения

S

1

предикат

Q

остается

истинным

и

Q

есть

предусловие

для

оператора

S

2

,

то

P

является

предусловием

для

операторов

S

1

S

2

.

Аксиома

цикла:

{

} { }

{ }

( )

{

}

.

&

;

;

&

P

B S P

P do while B and

B

P

¬

Утверждается,

что

если

истинность

P

не

изменяется

опе-

ратором

S

(т.е.

является

инвариантом),

то

P

инвариантно

отно-

сительно

цикла,

содержащего

S.

Кроме

того,

при

выходе

из

цикла

значение

выражения

B

ложно.

Аксиома

выбора:


background image

 
 

83

а)

{

} { } {

} { }

{ }

{ }

1

1

2

;

&

,

&

2

;

P

B S Q

P

B S

Q

P if B then S else S

Q

¬

б)

{

}

{ }

{ }

1

1

.

&

,

&

P

B S P

B

Q

P if B then S Q

¬ ⇒

Эти

аксиомы

устанавливают

простые

соотношения

для

оператора

if

.

5.2 

Правила

преобразования

данных

Коммутативность:

;

.

x

y

y

x

x

y

y

x

+ = +

× = ×

Ассоциативность:

(

)

(

)

(

)

(

)

;

.

x

y

z

x

y

z

x

y

z

x

y

z

+

+ = +

+

× × = × ×

Дистрибутивность:

(

) (

) (

)

.

x

y

z

x

y

x

z

×

+

=

×

+

×

Вычитание:

.

x

y

y

x

− + =

Обработка

констант:

0

;

0

0;

1

.

x

x

x

x

x

+ =

× =
× =

5.3 

Доказательства

правильности

программ

Используя

приведенные

выше

правила

и

аксиомы,

можно

осуществлять

доказательство

правильности

программ.

Рассмот-

рим

следующую

программу:

1.

MULTIPLY (R,A,B);

2.

declare

 X;

3.

declare

 R;   /*    R=A*B     */

4.

declare

 A,B; /*    B

≥0       */

5.

R=0;


background image

 
 

84

6.

X=B;

7.

do while

 (X

≠0);

8.

R=R+A;

9.

X=X-1;

10.

end

;

11.

end

 MULTIPLY; 

Входным

утверждением

является

предикат

B ≥ 0,

выход-

ное

утверждение

R = A×B.

Общая

схема

доказательства

правильности

программы:

Строка

5.

{0 = 0 & B ≥ 0} R = 0 {R = 0 & B ≥ 0}

по

аксиоме

при-

сваивания;

{B ≥ 0} R = 0 {R = 0 & B ≥ 0} по

правилу

следствия

в

связи

с

тем,

что

истинны

следующие

утверждения:

истинно 

⇒ 0 = 0;

B ≥ 0 

⇒ (B ≥ 0 & истинно).

Строка

6.

{B = B & R = 0 & B ≥ 0} X = B {X = B & R = 0 & B ≥ 0}

по

аксиоме

присвоения;

{R = 0 & B ≥ 0} X = B {X = B & R = 0 & B ≥ 0} по

ак-

сиоме

следования; 

{B ≥ 0} R = 0; X = B {X = B & R = 0 & B ≥ 0} по

аксиоме

следования. 

Таким

образом,

показано,

что

если

B ≥ 0

(входное

преду-

словие),

то

после

выполнения

строки

6

выражение

{X = B & R = 

= 0 & B ≥ 0}

истинно.

Строки

7–10.

Необходим

инвариант

для

предиката

P

цикла

do

while

.

Этот

инвариант

должен

описывать

работу,

выполняемую

цик-

лом.

В

нашем

случае

цикл

вычисляет

произведение;

таким

об-

разом,

инвариантом

может

быть

R = A×(B – X).

В

соответствии

с

аксиомой

цикла,

если

можно

показать,

что

это

выражение

инва-

риантно

относительно

цикла

и

что

оно

истинно,

когда

цикл

за-

канчивается,

то

возникает

следующая

ситуация:

R = A×(B – X)

инвариант

цикла;

X = 0

выражение

внутри

цикла

ложно.


background image

 
 

85

Таким

образом,

если

выражение

R = A×(B – X) &

(X = 0)

истинно,

то

истинно

и

выражение

R = A×(B – 0) &

(X = 0),

а

это

приводит

к

истинности

соотношения

R = A×B,

что

и

требова-

лось

доказать.

Следовательно,

для

того,

чтобы

завершить

дока-

зательство,

нужно,

чтобы

выражение

R = A×(B – X)

в

строке

7

было

истинно

и

оно

является

инвариантом

цикла.

Доказательство

того,

что

указанное

выражение

есть

инва-

риант

цикла,

проводится

следующим

образом:

Строка

8.

{R + A = A×B – A×X + AR = R + A {R = A×B – A×X + A
по

аксиоме

присвоения; 

{R = A×B – A×X}  R = R + A  {R = A×B – A×X + A}  по

правилам

целочисленной

арифметики; 

{R = A×(B – X)} R = R + A {R = A×B – A×X + A} по

пра-

вилам

дистрибутивности. 

Строка

9.

{R = A×(B – (X – 1))} X = X – 1 {R = A×(B – X)}

по

ак-

сиоме

присвоения;

{R = A×B – A×(X – 1)} X = X – 1 {R = A×(B – X)}

по

пра-

вилам

целочисленной

арифметики.

Объединение

строк

8

и

9

в

соответствии

с

аксиомой

сле-

дования

дает

выражение

{R = A×(B – X)} R = R + AX = X – 1 {R= 

A×(B – X)}, которое

является

желаемым

инвариантом

соотно-

шения. 

Теперь

следует

показать,

что

инвариантное

выражение

в

строке

7

истинно,

а

это

эквивалентно

доказательству

с

помощью

правил

следования

следующей

теоремы:

X = B & R = 0 & B ≥ 0

ис-

тинно

в

строке

6

⇒ R = A×(B – X).

Остановимся

на

нескольких

важных

моментах

в

связи

с

доказательством

правильности

программ.

Доказательства

длинны

и

сложны

даже

для

простой

программы.

Если

оперировать

нецелочисленными

данными,

то

формулировка

аксиом

становится

затруднительной.

Операции

со

строками,

плавающей

точкой,

доступ

к

базам

данных

вызывают

серьезные

осложнения

при

аксиоматическом

подходе.