Базисные схемы обработки информации
Функции на пространстве последовательностей
Еще одной ситуацией, в которой общая схема итерации значительно упрощается,
является задача вычисления индуктивных функций. Такие функции определены
на последовательностях
элементов из некоторого алфавита
.
Напомним важнейшие из определений
"Высказывания и предикаты"
.
Алфавит
— произвольное непустое множество.
Символом алфавита
называют любой его элемент, а цепочкой
над алфавитом — произвольную последовательность символов
.
Цепочки часто называют также словами, фразами и предложениями. Пустая цепочка
обозначается специальным символом
, а множество всех
цепочек над
алфавитом
принято обозначать
.
Длиной
цепочки
называется количество
входящих в нее символов. Множество всех цепочек длины не менее
обозначают через
. Справедлива следующая последовательность
включений: 
Операция
конкатенации (или сцепления ) двух цепочек определена следующем
образом.
Пусть
,
,
тогда
.
Теперь можно дать определение индуктивной функции.
Определение 7.4.
Функция
называется индуктивной,
если
можно вычислить, зная
и
, т.е. если
такое, что
.
Одним из простейших примеров индуктивной функции является
функция длина цепочки
.
Она индуктивна, так как для нее существует
функция
,
определенная
формулой
, удовлетворяющая предыдущему
определению.
Для вычисления значения
индуктивной функции
на цепочке
применяется следующая схема.
Схема вычисления индуктивной функции.
Рассматривается последовательность цепочек
,
,
,
,
. Сначала вычисляется значение
функции
на пустой цепочке
, а затем используется отображение
, позволяющее найти значение
функции
на удлиненной цепочке, что дает возможность последовательно определить все
требуемые величины вплоть до
.
На рис. 7.5 приведена графическая иллюстрация схемы вычисления индуктивной функции.
Схема вычисления индуктивной функции напоминает метод доказательства
по индукции.
Аналогом базы индукции является вычисление
, а
индуктивному
переходу соответствует вычисление функции
на
удлиненной
цепочке
с использованием вычисленного на
предыдущем шаге
значения
.
Схема вычисления индуктивной функции позволяет легко построить программу
вида "S0;while(e)S;", получающую на каждой следующей итерации цикла
очередной элемент
цепочки (последовательности)
, которая
находит значение
. Инвариантом данного цикла является
,
условием продолжения —
, S0 должно
вычислять
, а S — быть программной реализацией
функции
.
Простым и полезным примером, иллюстрирующим схему вычисления индуктивной функции, является задача нахождения значения многочлена, заданного последовательностью его коэффициентов.
Задача 7.6. Напишите программу, определяющую значение в целой точке
многочлена, заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Заметим, что

.
Поэтому функция
, определенная, как
, удовлетворяет соотношению
, что доказывает ее
индуктивность.
Отображение
действует по формуле
, а
, что приводит к
следующей программе.Текст программы
public class Pol {
public static void main(String[] args) throws Exception {
int t = Xterm.inputInt("t -> ");
int y = 0;
try {
while (true) {
int x = Xterm.inputInt("x -> ");
y = t*y + x;
}
} catch (Exception e) {
Xterm.println("\ny = " + y);
}
}
}Этот эффективный метод вычисления значения многочлена в точке носит имя схемы Горнера.
Методы доказательства правильности программ, построенных с помощью схемы вычисления индуктивных функций, и обобщение этой схемы, позволяющее применять аналогичный подход для функций, не являющихся индуктивными, будут рассмотрены ниже в "Индуктивные функции на пространстве последовательностей" .
