Базисные схемы обработки информации
Функции на пространстве последовательностей
Еще одной ситуацией, в которой общая схема итерации значительно упрощается, является задача вычисления индуктивных функций. Такие функции определены на последовательностях элементов из некоторого алфавита . Напомним важнейшие из определений "Высказывания и предикаты" .
Алфавит — произвольное непустое множество.
Символом алфавита называют любой его элемент, а цепочкой над алфавитом — произвольную последовательность символов . Цепочки часто называют также словами, фразами и предложениями. Пустая цепочка обозначается специальным символом , а множество всех цепочек над алфавитом принято обозначать .
Длиной цепочки называется количество входящих в нее символов. Множество всех цепочек длины не менее обозначают через . Справедлива следующая последовательность включений:
Операция конкатенации (или сцепления ) двух цепочек определена следующем образом. Пусть , , тогда .
Теперь можно дать определение индуктивной функции.
Определение 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); } } }
Этот эффективный метод вычисления значения многочлена в точке носит имя схемы Горнера.
Методы доказательства правильности программ, построенных с помощью схемы вычисления индуктивных функций, и обобщение этой схемы, позволяющее применять аналогичный подход для функций, не являющихся индуктивными, будут рассмотрены ниже в "Индуктивные функции на пространстве последовательностей" .