6.2. Графы зависимости, списки и деревья вызовов 159
Пример 6.15. Рассмотрим две подпрограммы:
Sub f;
arg x, y;
if x < y then
f = 2;
else
f = g (x, y) ;
end;
end;
Sub g;
arg x, y;
if x < y then
g = f (x, y) ;
else
g = 2;
end;
end;
Очевидно, что обе подпрограммы рекурсивны (косвенная рекурсия). Од-
нако, рекурсивные вызовы ни для какой из них невозможны.
Задача 6.12. Докажите, что в предыдущем примере рекурсивные вы-
зовы невозможны.
Следующая лемма дает необходимые и достаточные условия конечно-
сти (бесконечности) дерева:
Лемма 6.2. (О конечных деревьях) Дерево конечно тогда и только
тогда, когда количество сыновей каждой вершины конечно и каждая
ветвь дерева конечна.
Докажем следующее свойство дерева вызовов:
Лемма 6.3. (О бесконечных деревьях вызовов) Если дерево Ft δ
бесконечно, то результат Res δ не определен.
Доказательство. Предположим, что δ = (f, v). Прежде всего нужно
доказать, для того чтобы Π (σ
δ
) было определено необходимо чтобы
1. список Fc (σ
δ
, Π
f
) был конечным;
2. для всех вызовов γ из списка Fc (σ, Π) было определено Res γ.
Предположим, что дерево Ft δ бесконечно, но Res δ определено (следо-
вательно, определено Π
f
(σ
δ
)). Индукцией по глубине вершин дерева Ft δ
легко доказывается, что условия (1) и (2) выполняются для всех вершин
дерева. Значит, каждая вершина имеет конечно много сыновей. По лемме
о конечных деревьях 6.2 в дереве Ft δ должна существовать бесконечная
ветвь. Так как подпрограмм конечно много, то вызовы некоторой под-
программы будут на этой ветви повторяться бесконечно часто. Согласно
замечанию 6.1 на стр. 148 мы должны считать, Res δ неопределен, что
противоречит предположению.