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

4.4. Семантика вызова предиката

Пусть имеется вызов предиката

A(zu) . (4.12)

Здесь A есть имя предиката или имя переменной предикатного типа; z  возможно пустой набор имен переменных; u  непустой набор имен переменных. Для случая, когда A  имя предиката, рассмотрим соответствующее определение предиката A:

A(x: y) º K(x: y) , (4.13)

где x и y  наборы переменных, причем все переменные различны; K(x: y)  оператор. Пусть вызов (4.12) находится в правой части определения предиката B. Допустим, что определение предиката B исполняется в секции q. Тогда переменные наборов z и u принадлежат секции q. Исполнение вызова A(zu) будем записывать на метаязыке в виде вызова процедуры runCall(q, A(zu)), тело которой представлено ниже:

s = newSect(A); (4.14)

s[x] := q[z];

runStat(s, K(x: y));

q[u] := s[y] .

В теле runCall сначала создается секция s для переменных определения A. Значения аргументов z вызова A(zu) копируются в аргументы x определения A. В рамках секции s исполняется оператор K(x: y), что на метаязыке представлено вызовом runStat(s, K(x: y)). Наконец, результаты y копируются в результаты вызова u. Если в вызове (4.12) A есть имя переменной предикатного типа, то в теле (4.14) вместо первого оператора исполняется s = newSect(q[A]).

Поскольку секции s и q различны, а исполнение runStat(s, K(x: y)) не меняет содержимое секции q, при завершении исполнения тела (4.14) будет истинным соотношение

x = z & u = y . , (4.15)

Если предикат A является базисным, то вызов A(zu) считается элементарным оператором абстрактного процессора, и для его исполнения не требуется исполнять тело (4.14). Тем не менее, и в этом случае исполнение вызова A(zu) будем обозначать через runCall(q, A(zu)). Исполнение вызова A(zu) для случая, когда A является переменной предикатного типа, а значением A  массив, определено в разд. 4.9.

Лемма 4.2. Пусть имеется определение (4.13) для предиката A. Тогда Cons(K) Þ Cons(A). Отметим, что здесь Cons(A) относится к произвольному вызову A(zu) для некоторых наборов z и u.

Доказательство. Пусть истинно Cons(K). Докажем истинность Cons(A). Зафиксируем значения наборов z и u. Пусть истинно A(zu). Тогда в соответствии с определением (4.13) истинна формула K(zu). Из этого следует, что существует исполнение K(zu) для набора z, которое завершается получением набора u. При завершении исполнения тела (4.14) в соответствии с (4.15) справедливы равенства x = z и u = y. Поэтому существует исполнение K(xy), завершающееся получением y. Тогда исполнение последовательности (4.14), а значит и исполнение A(zu), завершается получением значений набора u, что доказывает первую часть свойства Cons(A).

Пусть исполнение A(zu) для набора z завершается получением набора u. Тогда завершается исполнение тела (4.14), в частности исполнение K(xy) завершается получением y. Поскольку в соответствии с (4.15) реализуются равенства x = z и u = y, то исполнение K(zu) завершается вычислением набора u. Из Cons(K) следует, что K(zu) истинно. Тогда из определения (4.13) следует истинность A(zu), что доказывает вторую часть свойства Cons(A). □

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