Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект МК2 федяев.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
440 Кб
Скачать
☆

Правильность элементарных программ

Если верифицируемая программа P является ациклической, то доказательство может быть проведено непосредственным построением [P] по E-схеме и сравнением [P] с заданной функцией f.

Если P является циклической, то при доказательстве правильности вначале необходимо установить неизбежность ее окончания.

Условимся, что если P заканчивается для , то некоторый предикат (обозначим его fin(f,P)) принимает значение «истина».

Верификацию циклических программ типа

while-do

do-until

do-while-do

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

Лемма о сведении итерационных программ к рекурсивным

Пусть даны функции f, g, h и предикат p. Тогда справедливы 3 случая:

  1. while-do

(f=[ while p do g od]) (fin(f, while p do g od )^f=[ if p then g; f fi ])

  1. do-until

(f=[ do g until p od ]) (fin(f, do g until p od)^f=[g; if ¬p then f fi])

  1. do-while-do

(f=[ do1 g while p do2 h od ]) (fin(f, do1 g while p do2 h od)^f=[g; if p then h; f fi])

Методика верификации циклических программ типа while-do, do-until, do-while-do

  1. Формулируется гипотеза о программной функции (в частном случае гипотеза может быть задана).

  2. На основе субъективного анализа программы устанавливается истинность условия ограничения: fin(f,P)=true.

  3. С использованием леммы о рекурсивном представлении программа приводится к рекурсивной форме.

  4. С помощью трассировочных таблиц строится программная функция рекурсивной программы.

  5. Проводится сравнение полученной функции с гипотезой и делается вывод о правильности программы.

Трассировочные таблицы

Они предназначены для формальной записи вывода программных функций.

Номер операторов

Операторы программы

Элемент данных

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

Пример 1.

P=( if x 0 then x:=x-y

else y:=y-x fi;

if y 0 then y:=x+y

else x:=y-x fi)

[P]=?

В программе есть 4 пути от входа к выходу. Поэтому строим 4 трассировочные таблицы.

№

Операторы

Предикаты

Значение предикатов

Данные

X

Y

1

x 0

(x0 0)=true

x1=x0

y1=y0

2

x:=x-y

x2=x1-y1

y2=y1

3

0

(y2 0)=true

x3=x2

y3=y2

4

y:=x+y

x4=x3

y4=x3+y3

Их таблицы выводим программную функцию для выбранного пути

- предикат пути

(x0 0)^ (y2 0)= (x0 0)^ (y1 0)= (x0 0)^ (y0 0)=True

- данные

x4=x3=x2=x1-y1=x0-y0

y4=x3+y3= x2+y2= x1-y1+y1=x0

- функция

(x 0)^ (y 0)→x,y:=x-y,x

№

Операторы

Предикаты

Значение предикатов

Данные

X

Y

1

x 0

(x0 0)=false

x1=x0

y1=y0

2

y:=y-x

x2=x1

y2=y1-x1

3

0

(y2 0)=true

x3=x2

y3=y2

4

y:=x+y

x4=x3

y4=x3+y3

Вывод программной функции:

- предикат пути

(x0 0)^ (y2 0)= (x0 0)^ ((y1-x1) 0)= (x0 0)^ (y0 x0)=True

- данные

x4=x3=x2=x1=x0

y4=x3+y3= x2+y2= x1+y1-x1=y0

- функция

(x 0)^ (y x)→x,y:=x,y

Аналогично выводится программные функции для двух других путей.

Объединяя функции путей, получаем функцию программы:

[P]=(((x 0)^(y 0)→x,y:=x-y,x)|((x 0)^(y x)→x,y:=x,y)|((x 0)^(y 0)→x,y:=2y-x,y)| ((x 0)^ (y x)→x,y:=y-2x,y-x))

Пример 2

Дана функция f=(k n→x:=x∙k∙(k+1)∙…∙n=( k n→x:=x∙ )), где k и n – целые.

Для выполнения f составлена программа P

P=( while k n do x:=x∙k;

k:=k+1 od)

Доказываем правильность P

  1. Гипотеза о программной функции в данном случае задана

  2. Если начальное значение k: k>n, то P завершается сразу; k n, то в ходе итераций k:=k+1 и станет k>n, т.е. P завершится. Следовательно, fin(f,P) = истина.

  3. Используем лемму для записи P в рекурсивной форме:

P'=(if k n then x:=x∙k;

k:=k+1;

(k n→x:=x∙ ) fi)

Для рекурсивной формы программы P' выводим программную функцию. Строим трассировочную таблицу.

№

Операторы

Предикаты

Значение предикатов

Данные

X

K

1

k n

(k0 n)=true

x1=x0

k1=k0

2

x:=x∙k

x2=x1∙k1

k2=k1

3

k:=k+1

x3=x2

k3=k2+1

4

k n

(k3 n)=true

x4=x3

k4=k3

5

x:=x∙

x5:=x4∙

k5=k4

Вывод функции для выбранного пути:

-предикат

(k0 n)^(k3 n)= (k0 n)^(k2+1 n)=…= (k0 n)^(k0+1 n)= (k0 n-1)=True

-данные

x5=x4∙ = …=x2∙ = x1∙k1∙ = x0∙k0∙ =x0∙

-функция

(k n-1)→ x:=x∙

№

Операторы

Предикаты

Значение предикатов

Данные

X

K

1

k n

(k0 n)=true

x1=x0

k1=k0

2

x:=x∙k

x2=x1∙k1

k2=k1

3

k:=k+1

x3=x2

k3=k2+1

4

k n

(k3 n)=false

x4=x3

k4=k3

Вывод функции для выбранного пути:

-предикат

(k0 n)^(k3 n)= (k0 n)^(k2+1 n)=…= (k0 n)^(k0+1 n)= (k0=n)=True

-данные

x4=x3=x2=x1∙k1=x0∙k0=x0∙n

-функция

((k=n)→ x:=x∙n)= ((k=n)→ x:=x∙ )

№

Операторы

Предикаты

Значение предикатов

Данные

X

K

1

k n

(k0 n)=false

x1=x0

k1=k0

Вывод функции для выбранного пути:

-предикат

(k0 n)=True

-данные

x1=x0

-функция

(k>n)→ x:=x

Объединяем функции путей, получаем функцию программы

[P’]=((k n-1)→x:=x∙ ) ((k=n)→x:=x∙ ) ((k>n)→x:=x)=(k n)→ x:=x∙ =f

Отсюда следует, что составленная программа обладает полной правильностью.