Опубликован: 27.09.2006 | Уровень: для всех | Доступ: свободно
Лекция 6:

Спецификация программ и преобразователь предикатов

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Аннотация: Предикаты и документирование программ. Спецификация программы и преобразователь предикатов wp. Определение простейших операторов языка Java. Оператор if и слабейшее предусловие. Циклы в терминах wp. Вычисление слабейшего предусловия.

Важнейший для дальнейшего изучения материал этого параграфа в более подробном изложении можно найти в книге [4]. Полезным будет также и знакомство с подходом учебного пособия [9].

Предикаты и документирование программ

Как уже отмечалось выше, предикаты нам нужны прежде всего для того, чтобы иметь возможность ясно и недвусмысленно формулировать определенные утверждения о программах и программных переменных. Сейчас мы рассмотрим ряд примеров подобного типа.

Задача 6.1. Запишите предикат, утверждающий, что если i<j, а m>n, то u=v.

Решение. В данном случае все очевидно: i<j \land m>n \Rightarrow (u=v).

Задача 6.2. Запишите предикат, утверждающий, что ни одно из следующих утверждений не является истинным: a<b, b<c и x=y.

Решение Это задание тоже не является сложным. Вот несколько эквивалентных между собой решений: P_1 = ((a<b) = F) \land ((b<c) = F) \land ((x=y) =
F), P_2 = !(a<b) \land !(b<c) \land !(x=y) и P_3 = a\geqslant b \land b\geqslant c \land x\ne y. Так как обычно нужно предъявить максимально простой предикат, то будем считать ответом последний из них — P_3.

В ряде последующих задач нам придется иметь дело с массивами, поэтому договоримся о следующих обозначениях: будем обозначать вырезку из массива b[0..m-1], в которой содержатся все элементы данного массива с индексами от j до k включительно, символом b[j..k]. В случаях, когда j>k, k<0 или j\geqslant m, вырезка представляет из себя пустое множество.

Задача 6.3.Запишите предикат, утверждающий, что для массива b[0..n-1] длины n>0 все элементы вырезки b[j..k] являются нулевыми.

Решение. Используем квантор всеобщности: \forall i\ j\leqslant i<k+1\ b[i]=0.

Задача 6.4.Запишите предикат, утверждающий, что для массива b[0..n-1] длины n>0 ни один из элементов вырезки b[j..k] не нулевой.

Решение. Переформулировав данное высказывание (все элементы вырезки не нулевые), запишем ответ в следующем виде: \forall i\ j\leqslant i<k+1\ b[i]\ne
0.

Задача перевода высказывания с естественного языка на язык предикатов не всегда является однозначной, но именно это и является одной из причин его использования. Вот пример.

Задача 6.5. Запишите предикат, утверждающий, что для массива b[0..n-1] длины n>0 некоторые из элементов вырезки b[j..k] нулевые.

Решение. Данное высказывание можно понимать двояко: оно может означать, что в вырезке существует хотя бы один нулевой элемент, а может значить и то, что в ней как минимум два нулевых элемента. Вот ответы для каждого из этих вариантов трактовки задачи: P_1 = \exists i\ j\leqslant i<k+1\ b[i]=0 и P_2 = \exists i\ j\leqslant i<k+1\ 
\exists m\ (j\leqslant m<k+1 \land m \ne i) (b[i]=0)\land (b[m]=0).

Вот аналогичные задачи из области математики.

Задача 6.6. Запишите предикат, который утверждает, что функция f\colon \{1, 2, 3, 4, 5\}
\rightarrow \{1, 2, 3, 4, 5\} является сюръективной и отрицание этого факта. Упростите получившиеся предикаты, если это возможно.

Решение. В соответствии с определением сюръективности имеем P=(\forall y\in \{1, 2, 3, 4, 5\}\ \exists x\in \{1, 2, 3, 4, 5\}\ y =
f(x)). Построим отрицание и упростим его в соответствии с законами эквивалентности. !P = (!(\forall y\in \{1, 2, 3, 4, 5\}\ \exists x\in \{1, 2, 3, 4, 5\}
\ y = f(x))) = (\exists y \in \{1, 2, 3, 4, 5\}\ !(\exists x\in
\{1, 2, 3, 4, 5\}\ y = f(x))) = (\exists y \in \{1, 2, 3, 4, 5\}\ \forall x
\in \{1, 2, 3, 4, 5\}\ !(y = f(x))) = (\exists y \in \{1, 2, 3, 4, 5\}
\ \forall x\in \{1, 2, 3, 4, 5\}\  y \ne f(x)).

Задача 6.7. Запишите предикат, который утверждает, что функция f\colon \{1, 2, 3, 4, 5\}
\rightarrow \{1, 2, 3, 4, 5\} все элементы, не превосходящие трех, не увеличивает, и отрицание этого факта. Упростите получившиеся предикаты, если это возможно.

Решение. P = (\forall x \in \{1, 2, 3 \}\ f(x) \leqslant x). Его отрицание можно упростить: !P = !(\forall x \in \{1, 2, 3 \}\ f(x) \leqslant x) =
(\exists x \in \{1, 2, 3 \}\ f(x) > x).

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

Часто, однако, полезно поручить проверку истинности предикатов в процессе выполнения программы непосредственно компьютеру. В различных языках программирования эта возможность реализована по-разному. Например, в программах на языке C можно использовать макрос assert(P), который в случае ложности его аргумента (предиката P ) немедленно прекращает выполнение программы, сообщая о причине этого.

Механизм работы с исключениями и оператор if позволяют легко реализовать аналогичную конструкцию в языке Java. Вот простейший пример.

Задача 6.8. Напишите программу, содержащую проверку истинности утверждения о положительности введенного с клавиатуры целого числа.

Текст программы

public class Assert {
    public static void main(String[] args) throws Exception {    
        int n = Xterm.inputInt("Введите n -> ");
        if (n <= 0) 
            throw new Exception("n <= 0");
        Xterm.println("n = " + n);
    }
}

При вводе неположительного числа программа прекращает свое выполнение и печатает следующий текст:

java.lang.Exception: n<=0
        at Assert.main(Assert.java:4)

Богатые возможности работы с исключениями, имеющиеся в языке, позволяют реализовать гораздо более изощренные способы проверки истинности предикатов, нежели использованный в программе простейший вариант возбуждения исключения типа Exception без попыток его последующей обработки. Эти возможности, однако, не будут рассматриваться в нашем курсе.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Анастасия Халудорова
Анастасия Халудорова
подавляющее большиство фукций на пространстве последовательостей?
екатерина яковлева
екатерина яковлева
как получить сертификат,что для этого нужно?
Павел Плахотник
Павел Плахотник
Украина, Днепропетровск
Елена Сергеева
Елена Сергеева
Россия, Таганрог, ТРТУ, 2003