148 Глава 6. Подпрогра ммы, функциональное программирование
Определение 6.3. (Значение выражения) Итак,
σ (f (e
1
, . . . , e
n
)) = v, если
1. σ (e
1
), . . . , σ (e
n
) определены;
2. v = Res (f, σ (e
1
) , . . . , σ (e
n
)).
Замечание 6.1. Пусть δ = (f, σ (e
1
) , . . . , σ (e
n
)). Чтобы определить
σ (f (e)) нужно определить Π
f
(σ
δ
). Однако, для определения Π
f
(σ
δ
)
может снова потребоваться определить τ
f
d
и так далее. Ес-
ли подобная цепочка оказывается бесконечной, то мы считаем, что
σ (f (e)) не определено.
Пример 6.3. Расмотрим выражения из предыдущего примера на со-
стоянии σ = {(x, 1) , (y, 2)}.
1. A (0). Очевидно, что A вычисляет функцию Φ
A
(x) = x + 2. Сле-
довательно, σ (A (0)) = 2.
2. Max (x, succ (y)). Подпрограмма Max вычисляет функцию-
максимум из двух аргументов. Поэтому
σ (Max (x, succ (y))) = max {1, 3} = 3.
3. σ (Max (A (x) , succ (0))) = max {3, 1} = 3.
Пример 6.4. Рассмотрим подпрограмму, которая вычисляет частич-
ную функцию, не являющуюся всюду определенной.
Sub B;
arg x, y;
while x < y do
y = succ (y) ;
end;
B = x;
end;
Легко видеть, что Π
B
(τ) определено тогда
и только тогда, когда x ≥ y и в этом
случае Π
B
(τ) (B) = τx. Рассмотрим выра-
жение B (y, succ (a)) на том же состоянии
σ. Res (B, 1, 3) не определен, следовательно,
σ (B (y, succ (a))) тоже не определено.
Пример 6.5. Проиллюстрируем замечание 6.1.
Sub C;
arg x;
C = C (succ (x)) ;
end;
Чтобы определить σ (C (e)) нужно опре-
делить Res δ, где δ = (C, σ (e)). Что-
бы определить Res δ, нужно определить
Π
C
(σ
δ
), а для этого снова нужно определять
σ
δ
(C (succ (x))) и так далее. Следователь-
но, согласно замечанию, мы считаем, что
σ (C (e)) не определено ни для каких e и σ.