08. Введение в исчисление программ.ppt
- Количество слайдов: 10
3. 1. Спецификации программ Состояние – набор значений переменных программы. Изменение состояния происходит в результате присваивания. Программа есть недерминированная функция начального состояния, выдающая в результате работы конечное состояние. Частный случай – детерминированная программа. sk = S(s 0), где s 0 и sk – начальное и конечное состояния, S – программа. 3. 1. 1. Простой язык программирования Есть только переменные целого типа, нет составных значений, поэтому нет описаний переменных и типов. Есть выражения, содержащие переменные, константы, арифметические и логические операции и предопределенные функции. Описания функций и процедур в данной главе не рассматриваются. Есть набор операторов: v v v пустой прерывания присваивания составной условный цикла Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. skip abort x = E; { S 1 S 2 } if (B) S 1 else S 2 while (B) S 1
Пример программы n = 10; f = 1; k = 2; while (k <= n) { f = f * k; k = k + 1; } Набор переменных программы: n, f, k. Начальное состояние может быть любым. Конечное состояние: n=10, f=3628800, k=11. Программа детерминированная. В качестве функции состояния она представляет собой постоянную функцию. Мы будем описывать «свойства» программ. Свойство этой программы состоит в том, что произвольное множество начальных состояний преобразуется в одноточечное множество, состоящее из единственного конечного состояния. P { progr } n=10 f=3628800 k=11 Множество состояний описывается с помощью логической функции от переменных программы – предиката. Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 2
3. 1. 2. Спецификации программ Выражение P { S } Q представляет собой спецификацию или свойство программы S. P – предусловие (начальный предикат); S – программа (оператор); Q – постусловие (конечный предикат); Данное выражение представляет собой логическое высказывание и может быть прочитано так: Программа S, начав свою работу в состоянии, удовлетворяющем предикату P, обязательно закончит свою работу в состоянии, удовлетворяющем предикату Q. Примеры спецификаций x > 0 x > 4 { x = x + 1; } x > 1 { x = x + 1; } x > 2 x = 5 { y = 2*x + 1; } y > 5 Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 3
3. 1. 3. Основная задача анализа программ Пусть P 1 и P 2 – предикаты, описывающие множества состояний S 1 и S 2. Тогда следующие утверждения выражают один и тот же факт: • • P 1 P 2 P 1 сильнее P 2 слабее P 1 S 1 S 2 Два способа установить свойство программы: 1. По заданому предусловию P и программе S найти постусловие Q, такое, что P { S } Q 2. По заданому постусловию Q и программе S найти предусловие P, такое, что P { S } Q Заметим, что если P { S } Q и Q Q 1, то P { S } Q 1, так что в первой задаче искать следует самое сильное постусловие, какое только возможно, это дает наибольшую информацию о программе. Аналогично, если P 1 P, то P 1 { S } Q, так что во второй задаче искать следует самое слабое предусловие, какое только возможно. Поиск слабейшего предусловия и является основной задачей формального анализа программы. Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 4
3. 1. 4. Основная задача программирования Задана цель, выраженная постусловием Q. Необходимо построить программу S и найти предусловие P такое, чтобы была справедлива спецификация P { S } Q Предположим, что предусловие P найдено, и это слабейшее из всех возможных предусловий, удовлетворяющих спецификации P { S } Q. Тогда: 1. Если P = T, то программа, начав работу в любом начальном состоянии закончится в состоянии, удовлетворяющем Q (идеальный случай!). 2. Если P = F, то не существует ни одного состояния, в котором программа, начав работу, могла бы закончится в состоянии, удовлетворяющем Q (программа неверна!). 3. Если P не является ни тавтологией, ни противоречием, то существует некоторое непустое множество начальных состояний, в которых программа, начав работу, может закончится в состоянии, удовлетворяющем Q (программа может дать верный результат, если правильно задать начальные значения переменных). Замечание: недостаточно лишь удовлетворить формальным условиям. Так, например, если постусловие есть z = max(x, y), то программа z = 0; x = 0; y = 0; приведет к «правильному» результату при любом начальном состоянии, то есть T { z = 0; x = 0; y = 0; } z = max(x, y), но нужна ли нам такая программа? Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 5
3. 1. 5. Формализация задачи нахождения слабейшего предусловия Исчисление программ: определить ряд аксиом и правил вывода, позволяющих выводить спецификации для заданых программ. Формулы этого исчисления имеют вид wp(S, Q) = P где P и Q – предикаты, S – программа, wp – функция преобразования предикатов Некоторые схемы аксиом: 1. wp(skip, Q) = Q 2. wp(abort, Q) = F 3. wp(x = E; , Q) = Q{x|E} D(E) 4. wp({ S 1 S 2 }, Q) = wp(S 1, wp(S 2, Q)) 5. wp(if (B) S 1 else S 2, Q) = (B wp(S 1, Q)) ( B wp(S 2, Q))` Если I wp(S, I), то I называется инвариантом оператора (программы) S. Например, предикат f=n! является инвариантом оператора { n = n+1; f = f*n; }, так как { f=n! f*(n+1)=(n+1)! } Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 6
Примеры формального анализа программ wp(x = E; , Q) = Q{x|E} D(E) ? { x = 5; } x = 5 wp (x = 5; , x = 5) = (5 = 5 D(5)) = T wp({ S 1 S 2 }, Q) = wp(S 1, wp(S 2, Q)) ? { x = x-1; y = 2*x; } y > x wp({ x = x-1; y = 2*x; }, y > x) = wp(x = x-1; , wp(y = 2*x; , y > x)) = wp(x = x-1; , 2*x > x) = wp(x = x-1; , x > 0) = x-1 > 0 = x > 1 wp(if (B) S 1 else S 2, Q) = (B wp(S 1, Q)) ( B wp(S 2, Q)) ? { if (x > y) z = x; else z = y; } z = max(x, y) wp(if (x > y) z = x; else z = y; , z=x x y z=y x y) = (x > y wp(z = x; , z=x x y z=y x y)) (x y wp(z = y; , z=x x y z=y x y)) = (x > y (x=x x y x=y x y)) (x y y=x x y y=y x y)) = (x>y x y) (x y x y) = T Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 7
Примеры неформального построения программы Имеем Q: x=B y=A, хотим построить программу так, чтобы было P: x=A y=B без использования дополнительных переменных. y-x=B-A y=B x=A { y = y-x; } x+y=B x=B-A y=A { x = y-x; } x=B-A y=B y-x=A { x = x+y; } x=B y=A x=A y=B { x = y-x; y = y-x; x = x+y; } x=B y=A Хотим построить программу для достижения постусловия Q: y=abs(x), причем значение переменной x не должно изменяться. { if (x > 0) S 1 else S 2 } (x>0 wp(S 1, y=abs(x))) (x 0 wp(S 2, y=abs(x))) (x 0 wp(S 1, y=abs(x))) (x>0 wp(S 2, y=abs(x))) y=abs(x) (x 0 wp(y = x; , y=abs(x))) (x>0 wp(y = -x; , y=abs(x))) (x 0 x=abs(x)) (x>0 -x=abs(x)) (x 0 x 0) (x>0 x 0) T T T T { if (x > 0) y = x; else y = -x; } Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. y=abs(x) 8
Еще некоторые схемы аксиом wp(S, Q 1 Q 2) = wp(S, Q 1) wp(S, Q 2) Покажем, что эта аксиома «разумна» wp(S, Q 1) - наибольшее множество состояний P 1, начав свою работу в которых программа S достигает состояния, удовлетворяющего Q 1. wp(S, Q 2) - наибольшее множество состояний P 2, начав свою работу в которых программа S достигает состояния, удовлетворяющего Q 2. Тогда очевидно, что наибольшее множество состояний, начав свою работу в которых программа S достигает состояния, удовлетворяющего Q 1 Q 2 есть P 1 P 2 wp(S, Q 1 Q 2) wp(S, Q 1) wp(S, Q 2) Равенства здесь нет! Использовать эту аксиому следует осторожно, так как, вообще говоря, мы не получаем слабейшего предусловия при ее использовании. wp(x = random(1); , x=0 x=1) = T wp(x = random(1); , x=0) wp(x = random(1); , x=1) = F F = F Впрочем, для детерминированных программ равенство имеет место, и это можно показать таким же образом, как и для операции конъюнкции. Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 9
3. 1. 6. Аксиома для оператора цикла wp(while (B) S, Q) = i(i 0 Pi) Содержательно Pi означает, что если оператор цикла начнет свою работу в состоянии, удовлетворяющем Pi, то работа цикла завершится в состоянии, удовлетворяющем Q, за не более, чем i шагов. P 0 = B Q Pi+1 = P 0 (B wp(S, Pi)) { while (n > 0) { f = f * n; n = n-1; } } f=N! n=0 P 0 = (n<=0 f=N! n=0) = (n=0 f=N!) P 1 = P 0 (n>0 n=1 f*n=N!) = (n=0 f=N!) (n=1 f=N!) P 2 = (n=0 f=N!) (n=1 f=N!) (n=2 f=N!/2) Pk = … i=0. . k (n=i f=N!/i!) … (n=N f=N!/N!=1) PN N 0 { n = N; f = 1; while (n > 0) { f = f * n; n = n-1; } } f=N! n=0 Кубенский А. А. Дискретная математика Глава 3. Доказательства правильности программ. 10
08. Введение в исчисление программ.ppt