
480
ГЛАВА 19. ДОКАЗАТЕЛЬСТВА И ПРОГРАММЫ
ствуют в ее тексте и при ее вычислении. Нужны также величины, лиш-
ние и даже порою вредные для вычислений, но необходимые, чтобы
обосновать их корректность.
Пример 19.3.1.
Если мы пишем цикл типа
while
P
do
S; (19.6)
то мы не заинтересованы (как правило) в том, чтобы он работал беско-
нечно. Но вычисление числа шагов цикла может быть не менее трудной
задачей, чем вычисление самого цикла, и, чтобы не делать двойную ра-
боту, нужно ввести значение-призрак
ω
2
, ограничивающий сверху чи-
сло шагов цикла, и
доказать
, что оно действительно обладает таким
свойством.
Этот пример показывает еще одну сторону значений-призраков.Если
мы можем построить
ω
как обычное натуральное число и достаточно
быстро вычислить его (хотя бы оно и было грубой верхней оценкой чи-
сла шагов), то в цикле можно поставить аварийный завершитель, если
число его повторений превзошло известную верхнюю границу
ω
. Таким
образом, призраки зачастую вновь обретают плоть, если мы интересу-
емся диагностикой ошибок.
Рассмотрим, когда призраки появляются в выводах.
Пусть мы применили предложение о том, что некий предикат явля-
ется композицией отношений, задаваемых двумя другими.
A(t, u) A(u, r) ∀x, y, z(A(x, y) & B(y, z) ⇒ C(x, z))
C(t, r)
Тогда все построения, проделанные для нахождения u, нужны для обо-
снования, но не для программы.
Итак, практически любая нетривиальная импликация порождает
призраки. Очевидные случаи, когда призраками становятся значения,
построенные в отброшенных альтернативах разбора случаев либо при
приведении к абсурду, добавляют еще призраков.
Имется двухпроходной алгоритм классификации выводов, который
позволяет выделять значения, необходимые для построения результата
вывода.
2
Мы специально здесь применили обозначение, вызывающее аналогии и с нестан-
дартными числами, и с ординалами. Действительно, данный призрак не обязан быть
натуральным числом, он может быть любым идеальным объектом, гарантирующим ко-
нечность реального процесса.