Опубликован: 27.09.2006 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный индустриальный университет
Лекция 3:

Высказывания и предикаты

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Расширение понятия предиката

В реальных программах далеко не все переменные имеют логический тип, что означает невозможность их описания с помощью предикатов, введенных определением 3.9. Так, например, выражение i<3 для целочисленной переменной i предикатом в смысле упомянутого определения заведомо не является, что плохо. Эти и некоторые другие причины побуждают расширить множество предикатов, что и будет сейчас сделано в три этапа.

Определение 3.17. Будем называть предикатом с переменными любых типов выражение, которое может быть получено из предиката P (в смысле определения 3.9 ) заменой произвольного идентификатора id на любое заключенное в скобки выражение логического типа с переменными различных типов. Вычисление значения получившегося предиката в произвольном состоянии немедленно сводится к вычислению значения исходного предиката P.

Начиная с этого момента выражение ((i<3)\lor(j=0))предикат, так как для него можно указать следующую цепочку вывода: e \rightarrow (e\lor e)
\rightarrow (id_1 \lor e) \rightarrow (id_1 \lor id_2) \rightarrow
((i<3) \lor id_2) \rightarrow ((i<3) \lor (j=0)). Множеством состояний этого предиката является пространство \mathbb{Z}^2, так как каждая из двух входящих в него целых переменных может изменяться независимо от другой. Если i и j — программные переменные, то пространство \mathbb{Z}^2 следует заменить на \mathbb{Z}_M^2.

Примером предиката, который определен в состоянии, в котором одна из входящих в него переменных не является определенной, может служить выражение P = ((a=0)||(b/a>0)). В состоянии s=\{(a,0), (b,U)\} он истинен: P(s)=T. Подобные предикаты возникают при описании фрагментов программ типа

if (a==0 || b/a > 0) ...

Следующим шагом в направлении расширения понятия предиката будет использование кванторов существования \exists и всеобщности \forall.

Если P(x)предикат в смысле определения 3.17, зависящий от переменной x произвольного типа, а X — некоторое множество, то будем считать предикатами выражения (\exists x ( x \in X  \land P(x))) и (\forall x ( x \in X  \Rightarrow P(x))). Первое из них означает, что существует хотя бы одно x \in X для которого выполнено P(x), а второе — что для всех x \in X справедливо P(x).

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

((\exists x \in X) P(x)) = (\exists x (x \in X \land
P(x))),
((\forall x \in X) P(x)) = (\forall x (x \in X \Rightarrow
P(x))).

Когда используемое множество X понятно из контекста, его опускают, что приводит к выражениям (\exists x\ P(x)) и (\forall x\
P(x)).

Кроме кванторов существования и всеобщности иногда используют еще один квантор — квантор \exists! существования и единственности, который может быть определен с помощью двух основных кванторов следующим образом:

((\exists !x ) P(x)) = (\exists x (P(x) \land \forall y (P(y)
\Rightarrow
(y = x)))).

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

В предикате R = (\forall i (m\leqslant i<n \Rightarrow x*i>0)) идентификатор i является связанным (квантором \forall ), а идентификаторы m, n и x — свободными. Выражение (i>0 \land (\forall i (m
\leqslant i<n \Rightarrow x*i > 0))) предикатом мы считать не можем, ибо i в нем является одновременно и свободным идентификатором и связанным, что недопустимо. Его легко слегка изменить так, чтобы оно стало предикатом: (i>0 \land
(\forall k
( m \leqslant k<n \Rightarrow x*k > 0))) — уже предикат.

Третьим шагом в направлении расширения множества языка предикатов будет ослабление требования на наличие в предикате всех тех скобок, которые возникают в процессе его вывода. Напомним, что с точки зрения определения 3.9 выражение a\lor b, например, предикатом не является, что не слишком удобно с практической точки зрения.

Разрешим удалять из предиката все те пары скобок, которые можно опустить без потери его однозначного толкования. При этом семантика полученного предиката определяется приоритетом операций: сначала вычисляются выражения внутри скобок, затем — логические выражения, заменившие логические идентификаторы id в смысле определения 3.17, после этого — кванторы существования и всеобщности, а затем — логические операции !, \lands и \land, \lors и \lor, \Rightarrow и, наконец, =.

Таким образом, мы принимаем следующее определение.

Определение 3.18. Будем называть предикатом в расширенном смысле предикат с переменными любых типов (см. определение 3.17 ), который может содержать кванторы и не иметь скобок, не являющимися необходимыми для его однозначного толкования.

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

Рассмотрим, как решаются типичные задачи на вычисление значения предикатов в расширенном смысле в различных состояниях.

Задача 3.4. Вычислите значения предикатов P_1 = (x=0\  \land\  x/(y-2)=0) и P_2 = (x=0 \ \lands \ x/(y-2)=0) в состоянии s = \{(x, 7), (y, 2)\}.

Решение Если восстановить в этих предикатах все недостающие скобки, то мы получим предикаты P_3 = ((x=0) \land ((x/(y-2))=0)) и P_4 = ((x=0)
\lands
((x/(y-2))=0)) соответственно. В состоянии s выражение (x=0) является ложным, ибо (7=0) = F, а x/(y-2) имеет значение U (не определено). В соответствии с таблицами истинности для операций \land и \lands можно сделать вывод, что P_1(s) = U, а P_2(s) = F.

Задача 3.5. Вычислите значения предиката P = (\exists i \ 0 \leqslant i \leqslant 9 
\ (i^2 \leqslant 0)) \land (\forall j \ j^2 \geqslant k) в состоянии s = \{(k, 0)\}.

Решение Предикат P представляет из себя конъюнкцию двух предикатов, первый из которых — это \exists i\ 0 \leqslant i \leqslant 9\ i^2 \leqslant
0, а второй в состоянии s совпадает с \forall j\ j^2 \geqslant
0. Так как при i=0 выполнено i^2 \leqslant 0, то первый из них истинен, а истинность второго предиката не вызывает сомнений. Таким образом, предикат P(s), являющийся конъюнкцией двух истинных выражений, сам является истинным, — P(s) = T.

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

Определение 3.19. Подстановкой E^x_e называется выражение, получающееся одновременной подстановкой e вместо всех свободных вхождений x в E.

Вот несколько простых примеров: (x+y)^x_z  0= (z+y) ; для E = x<y \land (\forall i
\ i<n \ f(i)<y) имеем E^y_{x+y} = x<x+y \land (\forall i\ i<n 
\ f(i)<x+y)), но E^i_k = E, так как i не свободно в E.

Для предикатов с кванторами справедливы дополнительные законы эквивалентности, называемые также правилами построения отрицания.

Предложение 3.16. Законы построения отрицания:

!(\exists x P(x)) = \forall x (! P(x));
!(\forall x P(x)) = \exists x (! P(x)).
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева
Ирина Тютрина
Ирина Тютрина
Россия, Усолье-Сибирское
Глеб Бочкарёв
Глеб Бочкарёв
Россия