Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3345 / 390 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Лекция 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 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева