Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pred_prog_tutor.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.03 Mб
Скачать

4.7. Условный оператор

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

A(b, x: y) º if (b) B(x: y) else C(x: y) . (4.20)

Здесь x и y  произвольные непересекающиеся наборы переменных, причем набор x может быть пустым, b  переменная логического типа, не встречающаяся в наборах x и y. Если B или C есть имя переменной предикатного типа, то оно входит в набор x. Логическая семантика условного оператора представлена следующим образом:

LS(if (b) B(x: y) else C(x: y))  (b Þ B(x, y)) & (Øb Þ C(x, y)) . (4.21)

Допустим, определение предиката A исполняется в рамках секции s. Секция s включает переменную b и переменные наборов x и y. Исполнение правой части определения (4.20) соответствует оператору runStat(s, K(x: y)) в (4.14) и определяется следующим образом:

if (s[b]) runCall(s, B(x: y)) else runCall(s, C(x: y)) . (4.22)

Таким образом, алгоритм исполнения условного оператора зависит от значения переменной b. Если значение b истинно, исполняется вызов предиката B. В противном случае исполняется вызов предиката C.

Лемма 4.5. Cons(B) & Cons(C) Þ Cons(H), где H(b, x: y)

обозначает if (b) B(x: y) else C(x: y).

Доказательство. Пусть истинно Cons(B) и Cons(C). Докажем истинность Cons(H). Зафиксируем значения b, x и y. Пусть истинна H(b, xy). Тогда в соответствии с (4.21) истинны формулы b Þ B(x: y) и Øb Þ C(x: y). Рассмотрим случай, когда значение b истинно. Тогда истинна формула B(x: y). Из Cons(B) следует, что исполнение вызова B(x: y) завершается получением набора y. Поэтому исполнение оператора (4.22), а значит и H(b, xy), завершается вычислением y. Это доказывает первую часть свойства Cons(H) для истинного значения b. Доказательство в случае ложного значения b проводится аналогично.

Допустим, исполнение H(b, xy) завершается вычислением y, т. е. исполнение оператора (4.22) завершается вычислением y. Докажем истинность H(b, xy). Пусть b истинно. Тогда исполнение вызова B(x: y) завершается получением набора y. Из Cons(B) следует истинность B(x: y). Тогда истинны формулы b Þ B(x: y) и Øb Þ C(x: y), поскольку b истинно. Следовательно, истинна правая часть (4.21) и H(b, xy). Доказательство истинности H(b, xy) в случае ложного значения b проводится аналогично. □

4.8. Конструктор предиката

Конструктор предиката является базисным предикатом ConsPred(x, B: A), где x  возможно пустой набор переменных; B  имя предиката; A  имя переменной предикатного типа. Значением переменной A является новый предикат, создаваемый при исполнении вызова предиката ConsPred. Ограничение: в качестве B нельзя использовать ConsPred или ConsArray. Логическая семантика предиката ConsPred дается определением

LS(ConsPred(x, B: A))  "y"z. (LS(A(y: z)) º LS(B(x, y: z))) . (4.23)

Здесь x, y и z  произвольные непересекающиеся наборы переменных, причем наборы x и y могут быть пустыми. Переменная A имеет предикатный тип PRED(Y: Z), см. (4.7), где Y и Z  наборы типов, соответствующие наборам переменных y и z.

Допустим, вызов предиката ConsPred(x, B: A) находится в правой части определения некоторого предиката, исполняемого в рамках секции s. Секция s включает набор x и переменную A. Исполнение вызова ConsPred(x, B: A) является частным случаем исполнения вызова runCall(s, ConsPred(x, B: A)) (см. разд. 4.4) и реализуется следующим оператором:

s[A] := newDef(s[x], B) . (4.24)

Функция newDef строит новое определение предиката:

Ax(yz)  =(x~: t); B(t, yz) . (4.25)

Здесь x~ = s[x] – значение набора x; Ax – новое имя предиката, отличное от имен других предикатов в программе. Имя Ax является результатом вызова newDef. Оператор =(x~: t) присваивает набор значений x~ набору локальных переменных t.

Мы не фиксируем, каким образом абстрактный процессор исполняет оператор =(x~: t). Например, процессор может создавать дополнительные определения, строящие изображения значений x~. Существует другой способ реализации вызова ConsPred(x, B: A), в котором переменной A присваивается кортеж (s[x], B).

Лемма 4.6. Cons(ConsPred).

Доказательство. Зафиксируем значения x = x0 и A = A0. Пусть истинно ConsPred(x, B: A). Докажем, что исполнение ConsPred(x, B: A) завершается значением A = Ax, тождественным A0, т. е. Ax  A0. Из истинности ConsPred(x, B: A) следует истинность правой части (4.23). Тогда истинна формула A0(y: z) º B(x0, y: z), однозначно определяющая предикат A0. Рассмотрим исполнение вызова ConsPred(x, B: A), т. е. оператора (4.24). Получаем A = Ax, где Ax определяется формулой (4.25). Поскольку x~ = s[x] = x0, то

Ax(yz)  =(x0: t); B(t, yz)  t = x0 & B(t, yz)  B(x0, y: z) . (4.26)

Таким образом, A = Ax º A0, что доказывает первую половину леммы.

Допустим, исполнение ConsPred(x, B: A) завершается вычислением A = A0 при x = x0. Докажем истинность ConsPred(x, B: A), т. е. истинность правой части (4.23). Из (4.24) следует A = Ax, и далее A0 = Ax. Из тождества (4.26) следует A0(y: z)  B(x0, y: z). Поскольку A = A0 и x = x0, получаем истинность правой части (4.23). □

Лемма 4.7. Пусть имеется вызов ConsPred(x, B: A), причем Cons(B) истинно. Тогда истинно Cons(A).

Доказательство. Значением переменной A является Ax с определением (4.25). Поскольку свойство Cons истинно для оператора =(x~t), то по лемме 4.3 оно реализуется также для правой части (4.25). Далее, по лемме 4.2 истинно Cons(Ax), а значит – и Cons(A). □

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]