Основы информатики и программирования

Индуктивные функции на пространстве последовательностей

Разбить на страницы
Показывать лекцию целиком

В первом параграфе данной главы мы уже познакомились с индуктивными функциями и даже рассмотрели простейшую программу, написанную с помощью применения схемы вычисления индуктивной функции — программу вычисления значения многочлена (см. решение задачи 7.6 лекция 7). К сожалению, подавляющее большинство функций на пространстве последовательностей индуктивными не являются, что требует дальнейшего развития теории.

Весьма подробное рассмотрение вопросов, связанных с индуктивными функциями, и большое число задач на их применение содержатся в книге [9].

Критерий индуктивности и стационарные значения

Напомним основное определение.

Функция $$f\colon X^* \rightarrow Y$$ называется индуктивной, если $$f(\omega\circ x)$$ можно вычислить, зная $$f(\omega)$$ и $$x$$, т.е. если $$\exists G\colon Y \times X\rightarrow Y$$ такое, что $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$.

Доказательство индуктивности функции обычно проводят конструктивно, предъявляя требуемую функцию $$G$$. Именно она позволяет написать программу, реализующую схему вычисления индуктивной функции. Для доказательства же того факта, что заданная функция не является индуктивной, применяют следующий критерий индуктивности (точнее его отрицание ).

Теорема 9.1. Критерий индуктивности. $$f\colon X^* \rightarrow Y$$ индуктивна $$\Longleftrightarrow \big(\forall a, b \in X^*\ \forall x \in X\ f(a) = f(b) \Rightarrow f(a\circ x) = f(b\circ x)\big)$$.

Теорема утверждает, что $$f$$ индуктивна тогда и только тогда, когда из равенства значений $$f$$ на последовательностях $$a$$ и $$b$$ следует равенство значений $$f$$ на любых одинаково удлиненных последовательностях $$a\circ x$$ и $$b\circ x$$.

Доказательство Необходимость сформулированного в критерии условия немедленно следует из определения индуктивности. Если $$f$$ — индуктивна, то $$\forall a, b \in X^*\ \forall x \in X f(a\circ x) = G(f(a),x) = G(f(b),x) = f(b\circ x)$$.

Для доказательства достаточности построим требуемое отображение $$G\colon Y \times X\rightarrow Y$$ такое, что $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$. Зададим это отображение формулой

$$G(y,x)=\begin{cases} f(\omega\circ x), \text{если существует $\omega\in X^*$ такая, что $f(\omega)=y$},\\ y, \text{иначе}. \end{cases}$$

Корректность этого определения вытекает из заданного в условии теоремы свойства функции $$f$$. В самом деле, пусть найдутся две различные цепочки $$a$$ и $$b$$ такие, что $$f(a) = f(b)$$. Тогда можно гарантировать, что $$f(a\circ x) = f(b\circ x)$$, что и доказывает корректность определения отображения $$G$$, ибо $$G(y,x)$$ действительно не зависит от выбора конкретного прообраза элемента $$y$$.

Так как $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$ для построенного отображения $$G$$, то теорема полностью доказана.

В качестве примера использования критерия индуктивности докажем, что функция $$f\colon \mathbb{Z}^*\rightarrow \mathbb{Z}$$ количество максимальных элементов последовательности целых чисел не является индуктивной. Возьмем $$a=1$$, $$b=2$$, $$x=2$$. Тогда $$f(a)=f(b)=1$$, но $$f(a\circ x) = 1 \ne 2 = f(b\circ x)$$.

Схема вычисления индуктивной функции, приведенная в лекции 7, может быть несколько упрощена при условии наличия у функции так называемых стационарных значений.

Определение 9.1. Значение $$y \in Y$$ индуктивной функции $$f\colon X^* \rightarrow Y$$ называется стационарным, если $$\forall \omega\in X^*\ \forall x \in X \ f(\omega) = y \Rightarrow f(\omega\circ x)=y$$.

Так, например, для функции $$f\colon \{0,1\}^*\rightarrow \{T,F\}$$ все элементы цепочки равны нулю значение $$F$$ является стационарным.

В том случае, если индуктивная функция определена только на $$X^*_k$$ для $$k>0$$, ее вычисление может начинаться не с пустой, a с одноэлементной или даже более длинной цепочки. Это, однако, приводит к более сложной программе, чего можно иногда избежать, доопределяя исходную функцию.

Индуктивную функцию $$f\colon \mathbb{Z}^*_1\rightarrow \mathbb{Z}$$ произведение элементов числовой последовательности можно доопределить с сохранением функции $$G$$ следующим образом: $$f(\varepsilon)=1$$.

Для того чтобы расширить сферу применимости схемы вычисления индуктивной функции вводится понятие индуктивного расширения.

Индуктивные расширения

Определение 9.2. Функция $$F\colon X^* \rightarrow \widetilde Y$$ называется индуктивным расширением функции $$f\colon X^* \rightarrow Y$$, если

1) $$F$$ индуктивна,

2) $$\exists \pi\colon \widetilde Y\rightarrow Y$$ такое, что $$\forall \omega \in X^* \ f(\omega) = \pi(F(\omega))$$.

Рассмотрим функцию $$f\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}$$ среднее арифметическое элементов последовательности, которая не является индуктивной. Тогда функция $$F\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}\times \mathbb{N}$$, определенная по формуле $$F(\omega)=((s(\omega), n(\omega)))$$, где $$\omega = a_1a_2\ldots a_n$$, $$\displaystyle s(\omega)=\sum_{i=1}^{n} a_i$$, а $$n=|\omega|$$, является индуктивным расширением исходной функции $$f$$, и $$\pi(s,n) = s/n$$.

Для вычисления значения $$f(\omega)$$ не являющейся индуктивной функции $$f$$ на цепочке $$\omega$$ применяется следующая обобщенная схема.

Обобщенная схема вычисления индуктивной функции. Строится индуктивное расширение $$F$$ исходной функции, которое позволяет ценой увеличения запоминаемой информации о цепочке $$\omega$$ $$F(\omega)$$ информации больше, чем в $$f(\omega)$$ ) применить схему вычисления индуктивной функции к $$F(\omega)$$ , а затем просто найти $$f(\omega)=\pi(F(\omega))$$.

Пусть $$F_1\colon X^* \rightarrow \widetilde Y_1$$ и $$F_2\colon X^* \rightarrow \widetilde Y_2$$ — два индуктивных расширения функции $$f\colon X^* \rightarrow Y$$. Будем говорить, что $$F_1 \geqslant F_2$$, если $$\exists \pi\colon \widetilde Y_1 \rightarrow \widetilde Y_2$$ такое, что $$\forall \omega \in X^*\ F_2(\omega) = \pi(F_1(\omega))$$.

Определение 9.3. Минимальным индуктивным расширением функции $$f\colon X^* \rightarrow Y$$ называется индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ такое, что

1) $$\widehat F(X^*) = \widehat Y \qquad (\widehat F$$ — сюръективно);

2) для любого индуктивного расширения $$F$$ функции $$f$$ выполнено

$$F \geqslant \widehat F$$.

Минимальные индуктивные расширения хороши тем, что уменьшают количество дополнительной информации, которая должна быть запомнена на каждом шаге для обеспечения возможности перевычисления функции на удлиненной цепочке.

Для любой функции на пространстве последовательностей существует и единственно (в определенном смысле), ее минимальное индуктивное расширение. Доказательство этого факта проведем в два этапа, сначала убедившись в единственности расширения.

Теорема 9.2. Минимальное индуктивное расширение любой функции $$f\colon X^* \rightarrow Y$$ единственно с точностью до изоморфизма.

Доказательство Пусть для функции $$f\colon X^* \rightarrow Y$$ существуют два минимальных индуктивных расширения $$F_1\colon X^* \rightarrow \widetilde Y_1$$ и $$F_2\colon X^* \rightarrow \widetilde Y_2$$. Тогда в силу их минимальности имеем $$F_1(X^*) = \widetilde Y_1$$ и $$F_2(X^*) = \widetilde Y_2$$.

Так как $$F_1 \geqslant F_2$$ (ибо $$F_2$$ — минимально), то $$\exists p_{12}\colon \widetilde Y_1 \rightarrow \widetilde Y_2$$ такое, что $$\forall \omega \in X^*\ F_2(\omega) = p_{12}(F_1(\omega))$$. С другой стороны, $$F_2 \geqslant F_1$$ и $$\exists p_{21}\colon \widetilde Y_2 \rightarrow \widetilde Y_1$$ такое, что $$\forall \omega \in X^*\ F_1(\omega) = p_{21}(F_2(\omega))$$. Для доказательства теоремы нужно показать, что отображения $$p_{12}$$ и $$p_{21}$$ биективны. Рассмотрим композиции этих отображений $$p_{12}\circ p_{21}$$ и $$p_{21}\circ p_{12}$$ и докажем, что они являются тождественными отображениями множеств $$\widetilde Y_2$$ и $$\widetilde Y_1$$ соответственно (из этого и следует биективность отображений $$p_{12}$$ и $$p_{21}$$ ).

Возьмем произвольный элемент $$y_1\in\widetilde Y_1$$. Из сюръективности $$F_1$$ следует, что найдется цепочка $$\omega \in X^*$$, такая что $$F_1(\omega)=y_1$$ и поэтому $$\forall y_1\ y_1=F_1(\omega)= p_{21}(F_2(\omega)) = p_{21}(p_{12}(F_1(\omega)))=p_{21}(p_{12}(y_1))=(p_{21}\circ p_{12})(y_1)$$. Полученное равенство показывает, что $$p_{21}\circ p_{12} = Id_{\widetilde Y_1}$$ — тождественное отображение. Рассматривая произвольный элемент $$y_2\in\widetilde Y_2$$, аналогично получаем, что $$p_{12}\circ p_{21} = Id_{\widetilde Y_2}$$, что и завершает доказательство теоремы.

Критерий минимальности

Перед тем, как сформулировать критерий минимальности, докажем существование минимального индуктивного расширения.

Теорема 9.3. Минимальное индуктивное расширение для любой функции $$f\colon X^* \rightarrow Y$$ существует.

Доказательство Для доказательства теоремы построим в три этапа каноническое минимальное индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ заданной функции $$f$$.

Первый этап. Рассмотрим на множестве цепочек $$X^*$$ бинарное отношение $$\approx$$, задаваемое формулой $$a\approx b \Longleftrightarrow (\forall \omega \in X^* \ f(a\circ \omega) = f(b\circ \omega))$$, и покажем, что

1) $$\approx$$ — отношение эквивалентности на $$X^*$$ ;

2) $$\forall a,b\in X^*\ \forall x\in X\ a\approx b \Rightarrow a\circ x\approx b\circ x$$ ;

3) $$\forall a,b\in X^*\ a\approx b \Rightarrow f(a)=f(b)$$.

Рефлексивность, симметричность и транзитивность отношения $$\approx$$ вытекают соответственно из рефлексивности, симметричности и транзитивности отношения равенства.

Так как $$a\circ x\approx b\circ x\Longleftrightarrow (\forall \omega_1 \in X^* \ f(a\circ x\circ \omega_1) = f(b\circ x\circ \omega_1))$$, то взяв в качестве цепочки $$\omega$$, фигурирующей в определении отношения $$\approx$$, $$\omega=x\circ \omega_1$$, убеждаемся в истинности второго свойства.

Свойство 3) немедленно следует из определения отношения $$\approx$$, если в качестве $$\omega$$ взять пустую цепочку $$\varepsilon$$.

Второй этап. Построим пространство $$\widehat Y$$ и отображение $$\widehat F\colon X^* \rightarrow \widehat Y$$. В качестве $$\widehat Y$$ возьмем фактормножество (множество классов эквивалентности) $$X^*/\approx$$, что можно сделать в силу свойства 1). Договоримся обозначать класс эквивалентности, содержащий цепочку $$\omega$$ через $$[\omega]$$ и определим отображение $$\widehat F\colon X^* \rightarrow \widehat Y$$ формулой $$\widehat F(\omega)= [\omega]$$.

Переписав свойство 2) в эквивалентном виде $$\forall a,b\in X^*\ \forall x\in X\ \widehat F(a)= \widehat F(b) \Rightarrow \widehat F(a\circ x) = \widehat F(b\circ x)$$, из критерия индуктивности заключаем, что отображение $$\widehat F$$ — индуктивно.

Покажем, что $$\widehat F$$ является индуктивным расширением исходной функции $$f\colon X^* \rightarrow Y$$. Определим проекцию $$\pi\colon \widehat Y \rightarrow Y$$ формулой $$\pi([\omega])=f(\omega)$$. Корректность этого определения следует из свойства 3) — если две цепочки $$\omega_1$$ и $$\omega_2$$ принадлежат одному классу эквивалентности, то значение функции $$f$$ на них совпадает. Так как $$f(\omega) = \pi(\widehat F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$, то $$\widehat F$$ действительно является индуктивным расширением отображения $$f$$.

Третий этап. Нам осталось показать, что построенное каноническое индуктивное расширение является минимальным.

Сюръективность $$\widehat F$$ следует непосредственно из его построения, ибо каждый класс эквивалентности $$[\omega]$$ не пуст.

Предположим далее, что существует $$\widetilde F\colon X^* \rightarrow \widetilde Y$$ — иное индуктивное расширение исходной функции $$f$$, тогда для завершения доказательства теоремы нам необходимо показать, что $$\widetilde F \geqslant \widehat F$$.

Определим проекцию $$p \colon \widetilde Y \rightarrow \widehat Y$$ формулой $$p(y) = [\omega]$$, где $$\omega$$ — один из прообразов элемента $$y$$ при отображении $$\widetilde F$$. Проверим корректность данного определения.

Пусть $$\widetilde F(\omega_1) = \widetilde F(\omega_2) = y$$. Тогда в силу индуктивности $$\widetilde F$$ для произвольной цепочки $$\omega$$ справедливо равенство $$\widetilde F(\omega_1\circ\omega) = \widetilde F(\omega_2\circ\omega)$$, а так как $$\widetilde F$$ — индуктивное расширение функции $$f$$, то и $$f(\omega_1\circ\omega) = f(\omega_2\circ\omega)$$. Полученное равенство может быть переписано в виде $$[\omega_1]=[\omega_2]$$, показывающем корректность определения проекции $$p$$.

Равенство $$\widehat F(\omega) = [\omega] = p(\widetilde F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$ показывает, что $$\widetilde F \geqslant \widehat F$$. Теорема полностью доказана.

Построенное в процессе доказательства этой теоремы каноническое индуктивное расширение позволяет убедиться в истинности следующего критерия минимальности.

Теорема 9.4. Критерий минимальности. Индуктивное расширение $$\widetilde F\colon X^* \rightarrow \widetilde Y \text{\ функции\ } f\colon X^* \rightarrow Y \text{ — минимально} \Longleftrightarrow ( (\widetilde F(X^*)=\widetilde Y) \land (\forall a,b\in X^*\ \widetilde F(a)\ne \widetilde F(b) \Rightarrow a\not\approx b) )$$.

Доказательство Необходимость первого условия критерия следует непосредственно из определения минимальности. Второе условие выполнено по построению для канонического минимального индуктивного расширения $$\widehat F\colon X^* \rightarrow \widehat Y$$, а так как по теореме единственности отображения $$\widehat F$$ и $$\widetilde F$$ изоморфны, то и для $$\widetilde F$$.

Для доказательства достаточности рассмотрим каноническое минимальное индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ и покажем, что оно изоморфно нашему $$\widetilde F \colon X^* \rightarrow \widetilde Y$$. В силу минимальности $$\widehat F$$ существует отображение $$p \colon \widetilde Y \rightarrow \widehat Y$$, такое что $$\widehat F(\omega) = p(\widetilde F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$. Критерий будет доказан, если мы покажем, что отображение $$p$$ — биекция.

Сюръективность $$p$$ вытекает из сюръективности $$\widehat F$$ и $$\widetilde F$$, а инъективность доказывается следующим рассуждением. Рассмотрим различные $$u$$ и $$v$$ из $$\widetilde Y$$ и, воспользовавшись сюръективностью $$\widetilde F$$, найдем цепочки $$a$$ и $$b$$ из $$X^*$$ такие, что $$\widetilde F(a) = u$$, а $$\widetilde F(b) = v$$. Так как $$\widetilde F(a)\ne \widetilde F(b)$$, то в силу данного нам условия $$a\not\approx b$$, что эквивалентно неравенству $$\widehat F(a)\ne \widehat F(b)$$.

Следовательно, отображение $$p$$ различные $$u$$ и $$v$$ преобразует в различные же $$p(u)=\widehat F(a)$$ и $$p(v)=\widehat F(b)$$, что и требовалось доказать.

Докажем, что функция $$F\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}\times \mathbb{N}$$, определенная по формуле $$\displaystyle F(\omega)=\left(\sum_{i=1}^{n} a_i, n\right)$$, где $$\omega = a_1a_2\ldots a_n$$, $$n=|\omega|$$ и $$\pi(s,n) = s/n$$, является минимальным индуктивным расширением для $$f\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}$$ среднее арифметическое элементов последовательности. Для доказательства сюръективности функции $$F$$ предъявим прообраз произвольного элемента $$(s,n) \in \mathbb{R}\times \mathbb{N}$$. Им будет цепочка из $$n$$ элементов, первый из которых равен $$s$$, а остальные — нулевые. Для того чтобы проверить второе условие критерия минимальности, необходимо убедиться в том, что $$\forall a,b\in X^*\ F(a)\ne F(b)\ \exists \omega \in X^*\ f(a\circ \omega) \ne f(b\circ \omega)$$. Пусть $$F(a)=(s_1,n_1)$$, $$F(b)=(s_2,n_2)$$ и либо $$s_1\ne s_2$$, либо $$n_1\ne n_2$$. Если для пустой цепочки $$\omega= \varepsilon$$ верно, что $$f(a\circ \omega) \ne f(b\circ \omega)$$, то все доказано. Иначе имеем $$s_1/n_1 = f(a) = f(b) = s_2/n_2$$. Возьмем теперь в качестве $$\omega$$ одноэлементную цепочку $$0$$. Предположив, что для нее $$f(a\circ \omega) = f(b\circ \omega)$$, из системы

$$\begin{cases} s_1/n_1 = s_2/n_2,\\ s_1/(n_1+1)=s_2/(n_2+1) \end{cases}$$

получим $$s_1=s_2$$, $$n_1=n_2$$, что противоречит предположению. Это завершает доказательство минимальности $$F$$.

Минимальные индуктивные расширения обладают тем достоинством, что позволяют свести к минимуму ту дополнительную информацию, которая необходима для индуктивного перевычисления исходной функции. Иначе это свойство может быть сформулировано следующим образом.

Теорема 9.5. Для произвольной функции $$f$$ на пространстве последовательностей существует единственный с точностью до изоморфизма однопроходный алгоритм с минимальной емкостной сложностью.

Применение теории индуктивных функций

В качестве первого примера рассмотрим уже встречавшуюся нам ранее задачу.

Задача 9.1. Напишите программу, вводящую последовательность целых чисел, и печатающую количество ее максимальных элементов.

Решение В данной задаче $$X=\mathbb{Z}_M$$, $$Y=\mathbb{Z}_M^+$$, $$f\colon X^* \rightarrow Y$$. Взяв $$a=1$$, $$b=2$$, $$x=2$$, находим $$f(a)=f(b)=1$$, но $$f(a\circ x) = 1 \ne 2 = f(b\circ x)$$. Из отрицания критерия индуктивности заключаем, что $$f$$ не является индуктивной.

Для построения ее индуктивного расширения $$F$$ применим стандартный прием. Попробуем выразить значение функции $$f(\omega\circ x)$$ на удлиненной цепочке через ее значение $$f(\omega)$$ на исходной и элемент $$x$$. Известно, что это невозможно сделать ( $$f$$ — не является индуктивной), но наша цель — понять какой именно информации не хватает и, добавив ее, образовать функцию $$f_1$$. Рассмотрим теперь функцию $$F_1=(f, f_1)$$. В том случае, если она индуктивна, требуемое расширение построено. Иначе повторим предыдущие действия и попытаемся выразить $$f(\omega\circ x)$$ и $$f_1(\omega\circ x)$$ через $$f(\omega)$$, $$f_1(\omega)$$ и $$x$$ с использованием дополнительной информации $$f_2(\omega)$$. Получаем следующего кандидата на роль индуктивного расширения — функцию $$F_2=(f, f_1, f_2)$$. При необходимости данный процесс может быть продолжен и далее, а его завершение гарантируется теоремой о существовании индуктивного расширения. В данном случае имеем $$f(\varepsilon) = 0$$,

$$f(\omega\circ x)=\begin{cases} f(\omega), \text{если $x<\max(\omega)$},\\ f(\omega)+1, \text{если $x=\max(\omega)$},\\ 1, \text{если $x>\max(\omega)$}. \end{cases}$$

Мы видим, что в качестве $$f_1$$ следует взять функцию $$\max$$, вычисляющую максимальное значение элементов цепочки. Тогда для $$F=(f,f_1)$$ получаем

$$F(\omega\circ x)=\begin{cases} (f(\omega),f_1(\omega)) \text{если $x<f_1(\omega)$},\\ (f(\omega)+1,f_1(\omega)) \text{если $x=f_1(\omega)$},\\ (1,x) \text{если $x>f_1(\omega)$}. \end{cases}$$

Эта функция, однако, не определена на пустой цепочке, поэтому $$F=(f,f_1)\colon (\mathbb{Z}_M)^*_1 \rightarrow \mathbb{Z}_M^+\times \mathbb{Z}_M$$ также определена только на $$(\mathbb{Z}_M)^*_1$$. Воспользовавшись тем, что диапазон представления целых чисел на ЭВМ ограничен, в данном случае можно доопределить $$F$$ с сохранением функции перевычисления следующим образом: $$f_1(\varepsilon)=$$ "Integer.MIN\_VALUE" ( $$-2147483648$$ для языка Java). Действительно, если принять, что максимальным элементом пустой цепочки является минимально представимое на ЭВМ целое число, то $$F(\varepsilon) = (0, "Integer.MIN\_VALUE")$$, а функция $$G\colon \mathbb{Z}_M^+\times \mathbb{Z}_M\times \mathbb{Z}_M\rightarrow \mathbb{Z}_M^+\times \mathbb{Z}_M$$ определяется формулой

$$G((y_1,y_2),x) = \begin{cases} (y_1,y_2) \text{если $x<y_2$},\\ (y_1+1,y_2) \text{если $x=y_2$},\\ (1,x) \text{если $x>y_2$}. \end{cases}$$

Отображение $$\pi\colon \mathbb{Z}_M^+\times \mathbb{Z}_M\rightarrow \mathbb{Z}_M^+$$ тривиально: $$\pi(y_1,y_2)=y_1$$.

Докажем, что построенное нами расширение $$F$$ не является минимальным. Для этого достаточно предъявить значение $$(y_1,y_2)\in \mathbb{Z}_M^+\times \mathbb{Z}_M$$, которое не принимается ни на одной цепочке. Таковым будет, например, $$(0,1)$$. Докажите самостоятельно, что если вместо пространства $$\mathbb{Z}_M^+\times \mathbb{Z}_M$$ рассмотреть $$((\mathbb{N}_M\times \mathbb{Z}_M)\cup\{0,"Integer.MIN\_VALUE"\})$$, то построенное нами расширение окажется минимальным.

Теперь можно написать программу, реализующую построенный алгоритм.

Текст программы

public class NumMaxSeq2 {
    public static void main(String[] args) {    
        int y1 = 0, y2 = Integer.MIN_VALUE;
        try {
            while (true) {
                int x = Xterm.inputInt("x -> ");
                if (x == y2) {
                    y1 += 1;
                } else if(x > y2) {
                    y1 = 1;
                    y2 = x;
                } 
            }
        } catch (Exception e) {
            Xterm.println("\nn = " + y1);
        }	    
    }
}

Любая ошибка при вводе рассматривается здесь, как завершение последовательности чисел. Имена переменных, имеющихся в программе, совпадают с использованными при построении алгоритма, вычисление $$F(\varepsilon)$$ выполняется с помощью команд "int y1=0, y2=Integer.MIN\_VALUE;", функция $$G$$ реализована при помощи оператора if-else, в котором опущен случай $$x<y_2$$ (так как тогда не нужно изменять ни $$y_1$$, ни $$y_2$$ ), а применение отображения $$\pi$$ сводится к печати только значения $$y_1$$ из вычисленных $$y_1$$ и $$y_2$$.

Следующая задача нам тоже уже знакома.

Задача 9.2. Напишите программу, определяющую номер $$f$$ первого элемента, равного $$x_0$$, в последовательности целых чисел. В том случае, если число $$x_0$$ в последовательности не встречается, положите $$f$$ равным нулю.

Решение Имеем $$f\colon X^* \rightarrow Y$$, где $$X=\mathbb{Z}_M$$, а $$Y=\mathbb{Z}_M^+$$. Если $$x_0=0$$, $$a=\varepsilon$$, $$b=1$$, то $$f(a)=f(b)=0$$, но $$f(a\circ x_0) = 1 \ne 2 = f(b\circ x_0)$$, следовательно $$f$$ не является индуктивной.

Построим ее индуктивное расширение $$F$$. Заметим, что $$f(\varepsilon) = 0$$,

$$f(\omega\circ x)=\begin{cases} f(\omega), \text{если $f(\omega)\ne 0 \lor x\ne x_0$},\\ |\omega|+1, \text{если $f(\omega)= 0 \land x= x_0$}. \end{cases}$$

Следовательно, в качестве $$F(\omega)$$ можно взять пару $$(f(\omega), |\omega|)$$, где функция $$F\colon (\mathbb{Z}_M)^*\rightarrow\mathbb{Z}_M^+\times \mathbb{Z}_M^+$$. Эта функция уже индуктивна, так как $$F(\varepsilon) = (0,0)$$, а преобразование $$G\colon\mathbb{Z}_M^+\times \mathbb{Z}_M^+\times\mathbb{Z}_M \rightarrow\mathbb{Z}_M^+\times \mathbb{Z}_M^+$$ имеет вид

$$G((y_1,y_2),x) = \begin{cases} (y_1, y_2+1), \text{если $y_1\ne 0 \lor x\ne x_0$},\\ (y_2+1, y_2+1), \text{если $y_1= 0 \land x= x_0$}. \end{cases}$$

Заметим, что все значения функции $$f$$, отличные от нуля, являются стационарными, в то время как функция $$F$$ не имеет стационарных значений. Ясно, что отображение $$\pi\colon \mathbb{Z}_M^+\times \mathbb{Z}_M^+\rightarrow \mathbb{Z}_M^+$$ имеет вид $$\pi(y_1,y_2)=y_1$$.

Построенное нами расширение не является минимальным, так как значение $$(1,0)$$ не может быть принято функцией $$F$$ ни на одной цепочке.

Вот программа, не использующая наличия стационарных значений.

Текст программы

public class First1{
    public static void main(String[] args) throws Exception {
        int x0 = Xterm.inputInt("x0 ->");
        int y1 = 0, y2 = 0;
        try {
            while (true) {
                int x = Xterm.inputInt("x -> ");
                y2 += 1;
                if ( (y1 == 0)  (x == x0) )
                    y1 = y2;
            }
        } catch (Exception e) {
            Xterm.println("\nn = " + y1);
        }	    
    }
}

Имена программных переменных совпадают с использованными при построении алгоритма, вычисление $$F(\varepsilon)$$ выполняется с помощью команд "int y1=0, y2=0;", реализация функции $$G$$ очевидна, а применение отображения $$\pi$$ сводится к печати только значения $$y_1$$.

Программа, использующая наличие у функции $$f$$ стационарных значений, может выдавать ответ сразу же, как только одно из таких значений будет достигнуто.

Текст программы

public class First2 {
    public static void main(String[] args) throws Exception {
        int x0 = Xterm.inputInt("x0 -> ");
        int y1 = 0, y2 = 0;
        try {
            while (y1 == 0) {
                int x = Xterm.inputInt("x -> ");
                y2 += 1;
                if (x == x0)
                    y1 = y2;
            }
        } catch(Exception e){
            System.exit(0);
        }	    
        Xterm.println("\nn = " + y1);
    }
}

По достижению конца вводимой последовательности эта программа не выполняет никаких специальных действий (оператор ";" в блоке "catch" ). В этой ситуации, как и в случае принятия функцией $$f$$ любого из стационарных значений ( $$y_1 \ne 0$$ ), управление просто передается на оператор печати.

Решим еще одну задачу.

Задача 9.3. Напишите программу, вводящую последовательность вещественных чисел, и печатающую среднее арифметическое ее элементов (для непустой последовательности).

Решение По условию задачи $$f\colon X^*_1 \rightarrow Y$$, где $$X=Y=\mathbb{R}_M$$. Если $$x=6$$, $$a=0$$, $$b=00$$ (цепочка из двух нулей), то $$f(a)=f(b)=0$$, но $$f(a\circ x) = 3 \ne 2 = f(b\circ x)$$, следовательно $$f$$ не является индуктивной.

Построим ее индуктивное расширение $$F$$. Обозначив через $$S(\omega)$$ сумму элементов последовательности $$\omega$$, получаем $$\displaystyle f(\omega\circ x)=\frac{S(\omega\circ x)}{|\omega\circ x|}= \frac{S(\omega) + x}{|\omega| +1}=\frac{f(\omega)|\omega| + x}{|\omega| +1}$$. Следовательно, в качестве $$F(\omega)$$ можно взять пару $$(f(\omega), |\omega|)$$. Для $$F\colon (\mathbb{R}_M)^*_1\rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$, где $$F(\omega) = (f(\omega), |\omega|)$$, преобразование $$G\colon \mathbb{R}_M\times\mathbb{Z}_M^+\times\mathbb{R}_M \rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$ задается формулой $$\displaystyle G((y_1,y_2),x) = \left(\frac{y_1y_2+x}{y_2+1},y_2+1\right)$$.

Проектируемая программа будет проще, если мы сможем продолжить $$F$$ на $$(\mathbb{R}_M)^*$$ с сохранением $$G$$. Попробуем подобрать подходящую пару $$(y_1, y_2)$$ такую, чтобы $$F(\varepsilon)=(y_1, y_2)$$ и $$\forall x \in \mathbb{R}_M\ F(\varepsilon\circ x)=F(x)=G((y_1,y_2),x)$$. Так как $$y_2=0$$, то из последнего равенства получаем $$F(x) = (x,1) = (x,1) = G((y_1,0),x)$$, что справедливо при всех $$y_1\in \mathbb{R}$$. Следовательно, можно положить, например, $$F(\varepsilon)=(0,0)$$. Теперь $$F\colon (\mathbb{R}_M)^*\rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$. Отображение $$\pi\colon \mathbb{R}_M\times \mathbb{Z}_M^+\rightarrow \mathbb{R}_M$$ тривиально: $$\pi(y_1,y_2)=y_1$$, а построенное нами расширение не является минимальным, так как значение $$(1,0)$$ функцией $$F$$ не принимается.

Текст программы

public class AverSeq{
    public static void main(String[] args) {    
        double y1 = 0., y2 = 0.;
        try {
            while (true) {
                double x = Xterm.inputDouble("x -> ");
                y1  = (y1*y2 + x) / (y2 + 1.);
                y2 += 1;
            }
        } catch(Exception e) {
            Xterm.println("\nf = " + y1);
        }	    
    }
}

Рассмотрим задачу несколько другого типа.

Задача 9.4. Напишите программу, определяющую количество вхождений образца $$abcd$$ в последовательность символов.

Решение Пусть $$X$$ — множество всех символов, тогда функция $$f\colon X^* \rightarrow \mathbb{Z}_M^+$$. Если $$x=d$$, $$\omega_1=abc$$, $$\omega_2=aaa$$, то $$f(\omega_1)=f(\omega_2)=0$$, но $$f(\omega_1\circ x) = 1 \ne 0 = f(\omega_2\circ x)$$, следовательно $$f$$ не является индуктивной.

Заметив, что $$f(\varepsilon)=0$$, будем строить ее индуктивное расширение.

$$f(\omega\circ x)=\begin{cases} f(\omega)+1, \text{если $x=d$ и $\omega$ кончается на $abc$},\\ f(\omega), \text{иначе}. \end{cases}$$

Введем дополнительную функцию $$f_1(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$abc$$, и рассмотрим функцию $$F_1=(f, f_1)$$. Для нее имеем $$F_1(\varepsilon)=(0,F)$$,

$$F_1(\omega\circ x)=\begin{cases} (f(\omega)+1,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T), \text{если $x=c$ и $\omega$ кончается на $ab$},\\ (f(\omega),F), \text{иначе}. \end{cases}$$

Необходимо ввести еще одну дополнительную функцию $$f_2(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$ab$$. Теперь можно рассмотреть $$F_2=(f, f_1, f_2)$$. Для нее имеем $$F_2(\varepsilon)=(0,F,F)$$,

$$F_2(\omega\circ x)=\begin{cases} (f(\omega)+1,F,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T,F), \text{если $x=c$ и $f_2(\omega)=T$},\\ (f(\omega),F,T), \text{если $x=b$ и $\omega$ кончается на $a$},\\ (f(\omega),F,F), \text{иначе}. \end{cases}$$

Так как нам опять не удалось выразить $$F_2(\omega\circ x)$$ только через $$F_2(\omega)$$ и $$x$$, придется рассмотреть еще одну функцию $$f_3(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$a$$. Для функции $$F_3=(f, f_1, f_2, f_3)$$, действующей в пространство $$\mathbb{Z}_M^+\times\left(\{T,F\}\right)^3$$ получаем $$F_3(\varepsilon)=(0,F,F,F)$$,

$$F_3(\omega\circ x)=\begin{cases} (f(\omega)+1,F,F,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T,F,F), \text{если $x=c$ и $f_2(\omega)=T$},\\ (f(\omega),F,T,F), \text{если $x=b$ и $f_3(\omega)=T$},\\ (f(\omega),F,F,T), \text{если $x=a$},\\ (f(\omega),F,F,F), \text{иначе}. \end{cases}$$

Полученное равенство показывает, что $$F_3$$ — индуктивное расширение $$f$$, однако оно достаточно сложно и заведомо не является минимальным, так как $$f_1$$, $$f_2$$ и $$f_3$$ не являются независимыми. У тройки величин $$(f_1, f_2, f_3)$$ имеется всего четыре допустимых состояния, которые можно представить одним числом:

$$n(\omega)=\begin{cases} 3, \text{если $\omega$ кончается на $abc$},\\ 2, \text{если $\omega$ кончается на $ab$},\\ 1, \text{если $\omega$ кончается на $a$},\\ 0, \text{иначе}. \end{cases}$$

Сейчас мы докажем, что функция $$F\colon X^* \rightarrow \mathbb{Z}_M^+\times\{0,1,2,3\}$$, определенная соотношением $$F(\omega) = (f(\omega), n(\omega))$$ является минимальным индуктивным расширением $$f$$.

Для доказательства индуктивности достаточно предъявить преобразование $$G\colon \mathbb{Z}_M^+\times\{0,1,2,3\}\times X\rightarrow \mathbb{Z}_M^+ \times\{0,1,2,3\}$$:

$$G((f,n),x)=\begin{cases} (f+1,0), \text{если $x=d$ и $n=3$},\\ (f,3), \text{если $x=c$ и $n=2$},\\ (f,2), \text{если $x=b$ и $n=1$},\\ (f,1), \text{если $x=a$},\\ (f,0), \text{иначе}. \end{cases}$$

Для доказательства сюръективности функции $$F$$ предъявим прообраз произвольного элемента $$(f,n) \in \mathbb{Z}_M^+\times\{0,1,2,3\}$$. Им может служить, например, цепочка, начинающаяся с $$f$$ вхождений образца $$abcd$$, за которым следует еще $$n$$ первых символов этого образца. Для того чтобы проверить второе условие критерия минимальности, необходимо убедиться в том, что $$\forall a,b\in X^*\ F(a)\ne F(b)\ \exists \omega \in X^*\ f(a\circ \omega) \ne f(b\circ \omega)$$.

Пусть $$F(a)=(f_1,n_1)$$, $$F(b)=(f_2,n_2)$$ и либо $$f_1\ne f_2$$, либо $$n_1\ne n_2$$. Если $$f_1\ne f_2$$, то в качестве $$\omega$$ можно взять пустую цепочку. В противном случае без ограничения общности можно считать, что $$n_1 < n_2$$. Цепочка $$b$$ заканчивается на $$n_2$$ первых символа образца $$abcd$$, поэтому если в качестве $$\omega$$ взять $$4-n_2$$ последних символа этого образца, то $$f(a\circ \omega) = f(a) = f_1 < f_2 + 1 = f(b)+1 = f(b\circ \omega)$$, что и завершает доказательство минимальности $$F$$.

Текст программы

import java.io.*;
public class ABCDSeq {
    public static void main(String[] args) {    
        DataInputStream in = new DataInputStream(System.in);
        int f = 0, n = 0;
        try {
            while (true) {
                char x = (char)in.readByte();
                if (x=='\n') continue;
                if (x=='d'  n==3) {
                    f += 1; 
                    n  = 0;
                } else if (x=='c'  n==2) {
                    n = 3;
                } else if (x=='b'  n==1) {
                    n = 2;
                } else if (x=='a') {
                    n = 1;
                } else{
                    n = 0;
                }
            }
        } catch(Exception e) {
            Xterm.println("f = " + f);
        }
    }
}

В данной программе используется метод "readByte", который позволяет вводить символы. При этом символ '\n' также оказывается введенным после того, как пользователь нажимает клавишу "Enter" на клавиатуре. Этот символ необходимо игнорировать, что и реализуется в программе оператором "if (x=='\n') continue".

Не использовавшиеся нами ранее операторы "import java.io.*" и "DataInputStream in = new DataInputStream(System.in)" необходимы для вызова метода "readByte". В остальном программа полностью соответствует проведенному перед ее построением исследованию.

Задачи для самостоятельного решения

При решении задач, приведенных ниже, необходимо выяснить, является ли индуктивной заданная функция $$f$$. В случае ее индуктивности следует предъявить отображение $$G$$, иначе нужно построить индуктивное расширение $$F$$ исходной функции и предъявить $$G$$ для него. В последнем случае нужно также указать отображение $$\pi$$ и исследовать построенное расширение на минимальность (минимальность не является обязательным условием). Завершить решение следует написанием программы, реализующей однопроходный алгоритм, с указанием соответствия между программными переменными и обозначениями, использованными в теоретической части решения. Необходимо объяснить, как в программе реализуется вычисление $$f$$ или $$F$$ на пустой (или ее заменяющей) цепочке, как именно реализовано перевычисление функции при удлинении цепочки и как находится $$\pi(F(\omega))$$ в случае использования индуктивного расширения.

Задача 9.5. Напишите программу, определяющую количество минимальных элементов в последовательности неположительных целых чисел.

Указание В данном случае для доопределения индуктивного расширения на пустой цепочке нет необходимости использовать величины Integer.MIN_VALUE или Integer.MAX_VALUE.

Задача 9.6. Напишите программу, определяющую значение в целой точке $$t$$ многочлена, заданного последовательностью его целых коэффициентов (в порядке возрастания степеней).

Задача 9.7. Напишите программу, определяющую значение в целой точке $$t$$ производной многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

Указание Продифференцировав по $$x$$ равенство $$P_n(x) = x \cdot P_{n-1}(x) + a_n$$ и подставив затем $$x=t$$, получите соотношения $$P'_0(t) = 0$$ и $$P'_n(t) = t \cdot P'_{n-1}(t) + P_{n-1}(t)$$, которые помогут построить индуктивное расширение исходной функции.

Задача 9.8. Напишите программу, определяющую правильность формулы над алфавитом из четырех символов $$X=\{(,),t,+\}$$. Формула считается правильной, если она может быть получена с помощью следующей НФБН: $$e \rightarrow t \mid (e + e)$$.

Указание Рассмотрите следующее индуктивное расширение $$F=(f_1, f_2, f_3)$$ функции $$f$$, где $$f_1\colon X^* \rightarrow \{T,F\}$$, $$f_2\colon X^* \rightarrow \mathbb{Z}_M$$, $$f_3\colon X^* \rightarrow X$$, определены следующим образом:

$$f_1(\omega) = \omega$$ может быть продолжена до правильной формулы,

$$$f_2(\omega)$$ = разность числа левых и правых скобок в $$\omega$$,

$$$f_3(\omega) =$$ последний элемент $$\omega$$.

Задача 9.9. Напишите программу, определяющую номер $$f$$ последнего элемента, равного $$x_0$$, в последовательности целых чисел. В том случае, если число $$x_0$$ в последовательности не встречается, положите $$f=0$$.

Страницы:

В первом параграфе данной главы мы уже познакомились с индуктивными функциями и даже рассмотрели простейшую программу, написанную с помощью применения схемы вычисления индуктивной функции — программу вычисления значения многочлена (см. решение задачи 7.6 лекция 7). К сожалению, подавляющее большинство функций на пространстве последовательностей индуктивными не являются, что требует дальнейшего развития теории.

Весьма подробное рассмотрение вопросов, связанных с индуктивными функциями, и большое число задач на их применение содержатся в книге [9].

Критерий индуктивности и стационарные значения

Напомним основное определение.

Функция $$f\colon X^* \rightarrow Y$$ называется индуктивной, если $$f(\omega\circ x)$$ можно вычислить, зная $$f(\omega)$$ и $$x$$, т.е. если $$\exists G\colon Y \times X\rightarrow Y$$ такое, что $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$.

Доказательство индуктивности функции обычно проводят конструктивно, предъявляя требуемую функцию $$G$$. Именно она позволяет написать программу, реализующую схему вычисления индуктивной функции. Для доказательства же того факта, что заданная функция не является индуктивной, применяют следующий критерий индуктивности (точнее его отрицание ).

Теорема 9.1. Критерий индуктивности. $$f\colon X^* \rightarrow Y$$ индуктивна $$\Longleftrightarrow \big(\forall a, b \in X^*\ \forall x \in X\ f(a) = f(b) \Rightarrow f(a\circ x) = f(b\circ x)\big)$$.

Теорема утверждает, что $$f$$ индуктивна тогда и только тогда, когда из равенства значений $$f$$ на последовательностях $$a$$ и $$b$$ следует равенство значений $$f$$ на любых одинаково удлиненных последовательностях $$a\circ x$$ и $$b\circ x$$.

Доказательство Необходимость сформулированного в критерии условия немедленно следует из определения индуктивности. Если $$f$$ — индуктивна, то $$\forall a, b \in X^*\ \forall x \in X f(a\circ x) = G(f(a),x) = G(f(b),x) = f(b\circ x)$$.

Для доказательства достаточности построим требуемое отображение $$G\colon Y \times X\rightarrow Y$$ такое, что $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$. Зададим это отображение формулой

$$G(y,x)=\begin{cases} f(\omega\circ x), \text{если существует $\omega\in X^*$ такая, что $f(\omega)=y$},\\ y, \text{иначе}. \end{cases}$$

Корректность этого определения вытекает из заданного в условии теоремы свойства функции $$f$$. В самом деле, пусть найдутся две различные цепочки $$a$$ и $$b$$ такие, что $$f(a) = f(b)$$. Тогда можно гарантировать, что $$f(a\circ x) = f(b\circ x)$$, что и доказывает корректность определения отображения $$G$$, ибо $$G(y,x)$$ действительно не зависит от выбора конкретного прообраза элемента $$y$$.

Так как $$\forall \omega\in X^* \ \forall x\in X\ f(\omega\circ x) = G(f(\omega),x)$$ для построенного отображения $$G$$, то теорема полностью доказана.

В качестве примера использования критерия индуктивности докажем, что функция $$f\colon \mathbb{Z}^*\rightarrow \mathbb{Z}$$ количество максимальных элементов последовательности целых чисел не является индуктивной. Возьмем $$a=1$$, $$b=2$$, $$x=2$$. Тогда $$f(a)=f(b)=1$$, но $$f(a\circ x) = 1 \ne 2 = f(b\circ x)$$.

Схема вычисления индуктивной функции, приведенная в лекции 7, может быть несколько упрощена при условии наличия у функции так называемых стационарных значений.

Определение 9.1. Значение $$y \in Y$$ индуктивной функции $$f\colon X^* \rightarrow Y$$ называется стационарным, если $$\forall \omega\in X^*\ \forall x \in X \ f(\omega) = y \Rightarrow f(\omega\circ x)=y$$.

Так, например, для функции $$f\colon \{0,1\}^*\rightarrow \{T,F\}$$ все элементы цепочки равны нулю значение $$F$$ является стационарным.

В том случае, если индуктивная функция определена только на $$X^*_k$$ для $$k>0$$, ее вычисление может начинаться не с пустой, a с одноэлементной или даже более длинной цепочки. Это, однако, приводит к более сложной программе, чего можно иногда избежать, доопределяя исходную функцию.

Индуктивную функцию $$f\colon \mathbb{Z}^*_1\rightarrow \mathbb{Z}$$ произведение элементов числовой последовательности можно доопределить с сохранением функции $$G$$ следующим образом: $$f(\varepsilon)=1$$.

Для того чтобы расширить сферу применимости схемы вычисления индуктивной функции вводится понятие индуктивного расширения.

Индуктивные расширения

Определение 9.2. Функция $$F\colon X^* \rightarrow \widetilde Y$$ называется индуктивным расширением функции $$f\colon X^* \rightarrow Y$$, если

1) $$F$$ индуктивна,

2) $$\exists \pi\colon \widetilde Y\rightarrow Y$$ такое, что $$\forall \omega \in X^* \ f(\omega) = \pi(F(\omega))$$.

Рассмотрим функцию $$f\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}$$ среднее арифметическое элементов последовательности, которая не является индуктивной. Тогда функция $$F\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}\times \mathbb{N}$$, определенная по формуле $$F(\omega)=((s(\omega), n(\omega)))$$, где $$\omega = a_1a_2\ldots a_n$$, $$\displaystyle s(\omega)=\sum_{i=1}^{n} a_i$$, а $$n=|\omega|$$, является индуктивным расширением исходной функции $$f$$, и $$\pi(s,n) = s/n$$.

Для вычисления значения $$f(\omega)$$ не являющейся индуктивной функции $$f$$ на цепочке $$\omega$$ применяется следующая обобщенная схема.

Обобщенная схема вычисления индуктивной функции. Строится индуктивное расширение $$F$$ исходной функции, которое позволяет ценой увеличения запоминаемой информации о цепочке $$\omega$$ $$F(\omega)$$ информации больше, чем в $$f(\omega)$$ ) применить схему вычисления индуктивной функции к $$F(\omega)$$ , а затем просто найти $$f(\omega)=\pi(F(\omega))$$.

Пусть $$F_1\colon X^* \rightarrow \widetilde Y_1$$ и $$F_2\colon X^* \rightarrow \widetilde Y_2$$ — два индуктивных расширения функции $$f\colon X^* \rightarrow Y$$. Будем говорить, что $$F_1 \geqslant F_2$$, если $$\exists \pi\colon \widetilde Y_1 \rightarrow \widetilde Y_2$$ такое, что $$\forall \omega \in X^*\ F_2(\omega) = \pi(F_1(\omega))$$.

Определение 9.3. Минимальным индуктивным расширением функции $$f\colon X^* \rightarrow Y$$ называется индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ такое, что

1) $$\widehat F(X^*) = \widehat Y \qquad (\widehat F$$ — сюръективно);

2) для любого индуктивного расширения $$F$$ функции $$f$$ выполнено

$$F \geqslant \widehat F$$.

Минимальные индуктивные расширения хороши тем, что уменьшают количество дополнительной информации, которая должна быть запомнена на каждом шаге для обеспечения возможности перевычисления функции на удлиненной цепочке.

Для любой функции на пространстве последовательностей существует и единственно (в определенном смысле), ее минимальное индуктивное расширение. Доказательство этого факта проведем в два этапа, сначала убедившись в единственности расширения.

Теорема 9.2. Минимальное индуктивное расширение любой функции $$f\colon X^* \rightarrow Y$$ единственно с точностью до изоморфизма.

Доказательство Пусть для функции $$f\colon X^* \rightarrow Y$$ существуют два минимальных индуктивных расширения $$F_1\colon X^* \rightarrow \widetilde Y_1$$ и $$F_2\colon X^* \rightarrow \widetilde Y_2$$. Тогда в силу их минимальности имеем $$F_1(X^*) = \widetilde Y_1$$ и $$F_2(X^*) = \widetilde Y_2$$.

Так как $$F_1 \geqslant F_2$$ (ибо $$F_2$$ — минимально), то $$\exists p_{12}\colon \widetilde Y_1 \rightarrow \widetilde Y_2$$ такое, что $$\forall \omega \in X^*\ F_2(\omega) = p_{12}(F_1(\omega))$$. С другой стороны, $$F_2 \geqslant F_1$$ и $$\exists p_{21}\colon \widetilde Y_2 \rightarrow \widetilde Y_1$$ такое, что $$\forall \omega \in X^*\ F_1(\omega) = p_{21}(F_2(\omega))$$. Для доказательства теоремы нужно показать, что отображения $$p_{12}$$ и $$p_{21}$$ биективны. Рассмотрим композиции этих отображений $$p_{12}\circ p_{21}$$ и $$p_{21}\circ p_{12}$$ и докажем, что они являются тождественными отображениями множеств $$\widetilde Y_2$$ и $$\widetilde Y_1$$ соответственно (из этого и следует биективность отображений $$p_{12}$$ и $$p_{21}$$ ).

Возьмем произвольный элемент $$y_1\in\widetilde Y_1$$. Из сюръективности $$F_1$$ следует, что найдется цепочка $$\omega \in X^*$$, такая что $$F_1(\omega)=y_1$$ и поэтому $$\forall y_1\ y_1=F_1(\omega)= p_{21}(F_2(\omega)) = p_{21}(p_{12}(F_1(\omega)))=p_{21}(p_{12}(y_1))=(p_{21}\circ p_{12})(y_1)$$. Полученное равенство показывает, что $$p_{21}\circ p_{12} = Id_{\widetilde Y_1}$$ — тождественное отображение. Рассматривая произвольный элемент $$y_2\in\widetilde Y_2$$, аналогично получаем, что $$p_{12}\circ p_{21} = Id_{\widetilde Y_2}$$, что и завершает доказательство теоремы.

Критерий минимальности

Перед тем, как сформулировать критерий минимальности, докажем существование минимального индуктивного расширения.

Теорема 9.3. Минимальное индуктивное расширение для любой функции $$f\colon X^* \rightarrow Y$$ существует.

Доказательство Для доказательства теоремы построим в три этапа каноническое минимальное индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ заданной функции $$f$$.

Первый этап. Рассмотрим на множестве цепочек $$X^*$$ бинарное отношение $$\approx$$, задаваемое формулой $$a\approx b \Longleftrightarrow (\forall \omega \in X^* \ f(a\circ \omega) = f(b\circ \omega))$$, и покажем, что

1) $$\approx$$ — отношение эквивалентности на $$X^*$$ ;

2) $$\forall a,b\in X^*\ \forall x\in X\ a\approx b \Rightarrow a\circ x\approx b\circ x$$ ;

3) $$\forall a,b\in X^*\ a\approx b \Rightarrow f(a)=f(b)$$.

Рефлексивность, симметричность и транзитивность отношения $$\approx$$ вытекают соответственно из рефлексивности, симметричности и транзитивности отношения равенства.

Так как $$a\circ x\approx b\circ x\Longleftrightarrow (\forall \omega_1 \in X^* \ f(a\circ x\circ \omega_1) = f(b\circ x\circ \omega_1))$$, то взяв в качестве цепочки $$\omega$$, фигурирующей в определении отношения $$\approx$$, $$\omega=x\circ \omega_1$$, убеждаемся в истинности второго свойства.

Свойство 3) немедленно следует из определения отношения $$\approx$$, если в качестве $$\omega$$ взять пустую цепочку $$\varepsilon$$.

Второй этап. Построим пространство $$\widehat Y$$ и отображение $$\widehat F\colon X^* \rightarrow \widehat Y$$. В качестве $$\widehat Y$$ возьмем фактормножество (множество классов эквивалентности) $$X^*/\approx$$, что можно сделать в силу свойства 1). Договоримся обозначать класс эквивалентности, содержащий цепочку $$\omega$$ через $$[\omega]$$ и определим отображение $$\widehat F\colon X^* \rightarrow \widehat Y$$ формулой $$\widehat F(\omega)= [\omega]$$.

Переписав свойство 2) в эквивалентном виде $$\forall a,b\in X^*\ \forall x\in X\ \widehat F(a)= \widehat F(b) \Rightarrow \widehat F(a\circ x) = \widehat F(b\circ x)$$, из критерия индуктивности заключаем, что отображение $$\widehat F$$ — индуктивно.

Покажем, что $$\widehat F$$ является индуктивным расширением исходной функции $$f\colon X^* \rightarrow Y$$. Определим проекцию $$\pi\colon \widehat Y \rightarrow Y$$ формулой $$\pi([\omega])=f(\omega)$$. Корректность этого определения следует из свойства 3) — если две цепочки $$\omega_1$$ и $$\omega_2$$ принадлежат одному классу эквивалентности, то значение функции $$f$$ на них совпадает. Так как $$f(\omega) = \pi(\widehat F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$, то $$\widehat F$$ действительно является индуктивным расширением отображения $$f$$.

Третий этап. Нам осталось показать, что построенное каноническое индуктивное расширение является минимальным.

Сюръективность $$\widehat F$$ следует непосредственно из его построения, ибо каждый класс эквивалентности $$[\omega]$$ не пуст.

Предположим далее, что существует $$\widetilde F\colon X^* \rightarrow \widetilde Y$$ — иное индуктивное расширение исходной функции $$f$$, тогда для завершения доказательства теоремы нам необходимо показать, что $$\widetilde F \geqslant \widehat F$$.

Определим проекцию $$p \colon \widetilde Y \rightarrow \widehat Y$$ формулой $$p(y) = [\omega]$$, где $$\omega$$ — один из прообразов элемента $$y$$ при отображении $$\widetilde F$$. Проверим корректность данного определения.

Пусть $$\widetilde F(\omega_1) = \widetilde F(\omega_2) = y$$. Тогда в силу индуктивности $$\widetilde F$$ для произвольной цепочки $$\omega$$ справедливо равенство $$\widetilde F(\omega_1\circ\omega) = \widetilde F(\omega_2\circ\omega)$$, а так как $$\widetilde F$$ — индуктивное расширение функции $$f$$, то и $$f(\omega_1\circ\omega) = f(\omega_2\circ\omega)$$. Полученное равенство может быть переписано в виде $$[\omega_1]=[\omega_2]$$, показывающем корректность определения проекции $$p$$.

Равенство $$\widehat F(\omega) = [\omega] = p(\widetilde F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$ показывает, что $$\widetilde F \geqslant \widehat F$$. Теорема полностью доказана.

Построенное в процессе доказательства этой теоремы каноническое индуктивное расширение позволяет убедиться в истинности следующего критерия минимальности.

Теорема 9.4. Критерий минимальности. Индуктивное расширение $$\widetilde F\colon X^* \rightarrow \widetilde Y \text{\ функции\ } f\colon X^* \rightarrow Y \text{ — минимально} \Longleftrightarrow ( (\widetilde F(X^*)=\widetilde Y) \land (\forall a,b\in X^*\ \widetilde F(a)\ne \widetilde F(b) \Rightarrow a\not\approx b) )$$.

Доказательство Необходимость первого условия критерия следует непосредственно из определения минимальности. Второе условие выполнено по построению для канонического минимального индуктивного расширения $$\widehat F\colon X^* \rightarrow \widehat Y$$, а так как по теореме единственности отображения $$\widehat F$$ и $$\widetilde F$$ изоморфны, то и для $$\widetilde F$$.

Для доказательства достаточности рассмотрим каноническое минимальное индуктивное расширение $$\widehat F\colon X^* \rightarrow \widehat Y$$ и покажем, что оно изоморфно нашему $$\widetilde F \colon X^* \rightarrow \widetilde Y$$. В силу минимальности $$\widehat F$$ существует отображение $$p \colon \widetilde Y \rightarrow \widehat Y$$, такое что $$\widehat F(\omega) = p(\widetilde F(\omega))$$ для произвольной цепочки $$\omega\in X^*$$. Критерий будет доказан, если мы покажем, что отображение $$p$$ — биекция.

Сюръективность $$p$$ вытекает из сюръективности $$\widehat F$$ и $$\widetilde F$$, а инъективность доказывается следующим рассуждением. Рассмотрим различные $$u$$ и $$v$$ из $$\widetilde Y$$ и, воспользовавшись сюръективностью $$\widetilde F$$, найдем цепочки $$a$$ и $$b$$ из $$X^*$$ такие, что $$\widetilde F(a) = u$$, а $$\widetilde F(b) = v$$. Так как $$\widetilde F(a)\ne \widetilde F(b)$$, то в силу данного нам условия $$a\not\approx b$$, что эквивалентно неравенству $$\widehat F(a)\ne \widehat F(b)$$.

Следовательно, отображение $$p$$ различные $$u$$ и $$v$$ преобразует в различные же $$p(u)=\widehat F(a)$$ и $$p(v)=\widehat F(b)$$, что и требовалось доказать.

Докажем, что функция $$F\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}\times \mathbb{N}$$, определенная по формуле $$\displaystyle F(\omega)=\left(\sum_{i=1}^{n} a_i, n\right)$$, где $$\omega = a_1a_2\ldots a_n$$, $$n=|\omega|$$ и $$\pi(s,n) = s/n$$, является минимальным индуктивным расширением для $$f\colon \mathbb{R}^*_1 \rightarrow \mathbb{R}$$ среднее арифметическое элементов последовательности. Для доказательства сюръективности функции $$F$$ предъявим прообраз произвольного элемента $$(s,n) \in \mathbb{R}\times \mathbb{N}$$. Им будет цепочка из $$n$$ элементов, первый из которых равен $$s$$, а остальные — нулевые. Для того чтобы проверить второе условие критерия минимальности, необходимо убедиться в том, что $$\forall a,b\in X^*\ F(a)\ne F(b)\ \exists \omega \in X^*\ f(a\circ \omega) \ne f(b\circ \omega)$$. Пусть $$F(a)=(s_1,n_1)$$, $$F(b)=(s_2,n_2)$$ и либо $$s_1\ne s_2$$, либо $$n_1\ne n_2$$. Если для пустой цепочки $$\omega= \varepsilon$$ верно, что $$f(a\circ \omega) \ne f(b\circ \omega)$$, то все доказано. Иначе имеем $$s_1/n_1 = f(a) = f(b) = s_2/n_2$$. Возьмем теперь в качестве $$\omega$$ одноэлементную цепочку $$0$$. Предположив, что для нее $$f(a\circ \omega) = f(b\circ \omega)$$, из системы

$$\begin{cases} s_1/n_1 = s_2/n_2,\\ s_1/(n_1+1)=s_2/(n_2+1) \end{cases}$$

получим $$s_1=s_2$$, $$n_1=n_2$$, что противоречит предположению. Это завершает доказательство минимальности $$F$$.

Минимальные индуктивные расширения обладают тем достоинством, что позволяют свести к минимуму ту дополнительную информацию, которая необходима для индуктивного перевычисления исходной функции. Иначе это свойство может быть сформулировано следующим образом.

Теорема 9.5. Для произвольной функции $$f$$ на пространстве последовательностей существует единственный с точностью до изоморфизма однопроходный алгоритм с минимальной емкостной сложностью.

Применение теории индуктивных функций

В качестве первого примера рассмотрим уже встречавшуюся нам ранее задачу.

Задача 9.1. Напишите программу, вводящую последовательность целых чисел, и печатающую количество ее максимальных элементов.

Решение В данной задаче $$X=\mathbb{Z}_M$$, $$Y=\mathbb{Z}_M^+$$, $$f\colon X^* \rightarrow Y$$. Взяв $$a=1$$, $$b=2$$, $$x=2$$, находим $$f(a)=f(b)=1$$, но $$f(a\circ x) = 1 \ne 2 = f(b\circ x)$$. Из отрицания критерия индуктивности заключаем, что $$f$$ не является индуктивной.

Для построения ее индуктивного расширения $$F$$ применим стандартный прием. Попробуем выразить значение функции $$f(\omega\circ x)$$ на удлиненной цепочке через ее значение $$f(\omega)$$ на исходной и элемент $$x$$. Известно, что это невозможно сделать ( $$f$$ — не является индуктивной), но наша цель — понять какой именно информации не хватает и, добавив ее, образовать функцию $$f_1$$. Рассмотрим теперь функцию $$F_1=(f, f_1)$$. В том случае, если она индуктивна, требуемое расширение построено. Иначе повторим предыдущие действия и попытаемся выразить $$f(\omega\circ x)$$ и $$f_1(\omega\circ x)$$ через $$f(\omega)$$, $$f_1(\omega)$$ и $$x$$ с использованием дополнительной информации $$f_2(\omega)$$. Получаем следующего кандидата на роль индуктивного расширения — функцию $$F_2=(f, f_1, f_2)$$. При необходимости данный процесс может быть продолжен и далее, а его завершение гарантируется теоремой о существовании индуктивного расширения. В данном случае имеем $$f(\varepsilon) = 0$$,

$$f(\omega\circ x)=\begin{cases} f(\omega), \text{если $x<\max(\omega)$},\\ f(\omega)+1, \text{если $x=\max(\omega)$},\\ 1, \text{если $x>\max(\omega)$}. \end{cases}$$

Мы видим, что в качестве $$f_1$$ следует взять функцию $$\max$$, вычисляющую максимальное значение элементов цепочки. Тогда для $$F=(f,f_1)$$ получаем

$$F(\omega\circ x)=\begin{cases} (f(\omega),f_1(\omega)) \text{если $x<f_1(\omega)$},\\ (f(\omega)+1,f_1(\omega)) \text{если $x=f_1(\omega)$},\\ (1,x) \text{если $x>f_1(\omega)$}. \end{cases}$$

Эта функция, однако, не определена на пустой цепочке, поэтому $$F=(f,f_1)\colon (\mathbb{Z}_M)^*_1 \rightarrow \mathbb{Z}_M^+\times \mathbb{Z}_M$$ также определена только на $$(\mathbb{Z}_M)^*_1$$. Воспользовавшись тем, что диапазон представления целых чисел на ЭВМ ограничен, в данном случае можно доопределить $$F$$ с сохранением функции перевычисления следующим образом: $$f_1(\varepsilon)=$$ "Integer.MIN\_VALUE" ( $$-2147483648$$ для языка Java). Действительно, если принять, что максимальным элементом пустой цепочки является минимально представимое на ЭВМ целое число, то $$F(\varepsilon) = (0, "Integer.MIN\_VALUE")$$, а функция $$G\colon \mathbb{Z}_M^+\times \mathbb{Z}_M\times \mathbb{Z}_M\rightarrow \mathbb{Z}_M^+\times \mathbb{Z}_M$$ определяется формулой

$$G((y_1,y_2),x) = \begin{cases} (y_1,y_2) \text{если $x<y_2$},\\ (y_1+1,y_2) \text{если $x=y_2$},\\ (1,x) \text{если $x>y_2$}. \end{cases}$$

Отображение $$\pi\colon \mathbb{Z}_M^+\times \mathbb{Z}_M\rightarrow \mathbb{Z}_M^+$$ тривиально: $$\pi(y_1,y_2)=y_1$$.

Докажем, что построенное нами расширение $$F$$ не является минимальным. Для этого достаточно предъявить значение $$(y_1,y_2)\in \mathbb{Z}_M^+\times \mathbb{Z}_M$$, которое не принимается ни на одной цепочке. Таковым будет, например, $$(0,1)$$. Докажите самостоятельно, что если вместо пространства $$\mathbb{Z}_M^+\times \mathbb{Z}_M$$ рассмотреть $$((\mathbb{N}_M\times \mathbb{Z}_M)\cup\{0,"Integer.MIN\_VALUE"\})$$, то построенное нами расширение окажется минимальным.

Теперь можно написать программу, реализующую построенный алгоритм.

Текст программы

public class NumMaxSeq2 {
    public static void main(String[] args) {    
        int y1 = 0, y2 = Integer.MIN_VALUE;
        try {
            while (true) {
                int x = Xterm.inputInt("x -> ");
                if (x == y2) {
                    y1 += 1;
                } else if(x > y2) {
                    y1 = 1;
                    y2 = x;
                } 
            }
        } catch (Exception e) {
            Xterm.println("\nn = " + y1);
        }	    
    }
}

Любая ошибка при вводе рассматривается здесь, как завершение последовательности чисел. Имена переменных, имеющихся в программе, совпадают с использованными при построении алгоритма, вычисление $$F(\varepsilon)$$ выполняется с помощью команд "int y1=0, y2=Integer.MIN\_VALUE;", функция $$G$$ реализована при помощи оператора if-else, в котором опущен случай $$x<y_2$$ (так как тогда не нужно изменять ни $$y_1$$, ни $$y_2$$ ), а применение отображения $$\pi$$ сводится к печати только значения $$y_1$$ из вычисленных $$y_1$$ и $$y_2$$.

Следующая задача нам тоже уже знакома.

Задача 9.2. Напишите программу, определяющую номер $$f$$ первого элемента, равного $$x_0$$, в последовательности целых чисел. В том случае, если число $$x_0$$ в последовательности не встречается, положите $$f$$ равным нулю.

Решение Имеем $$f\colon X^* \rightarrow Y$$, где $$X=\mathbb{Z}_M$$, а $$Y=\mathbb{Z}_M^+$$. Если $$x_0=0$$, $$a=\varepsilon$$, $$b=1$$, то $$f(a)=f(b)=0$$, но $$f(a\circ x_0) = 1 \ne 2 = f(b\circ x_0)$$, следовательно $$f$$ не является индуктивной.

Построим ее индуктивное расширение $$F$$. Заметим, что $$f(\varepsilon) = 0$$,

$$f(\omega\circ x)=\begin{cases} f(\omega), \text{если $f(\omega)\ne 0 \lor x\ne x_0$},\\ |\omega|+1, \text{если $f(\omega)= 0 \land x= x_0$}. \end{cases}$$

Следовательно, в качестве $$F(\omega)$$ можно взять пару $$(f(\omega), |\omega|)$$, где функция $$F\colon (\mathbb{Z}_M)^*\rightarrow\mathbb{Z}_M^+\times \mathbb{Z}_M^+$$. Эта функция уже индуктивна, так как $$F(\varepsilon) = (0,0)$$, а преобразование $$G\colon\mathbb{Z}_M^+\times \mathbb{Z}_M^+\times\mathbb{Z}_M \rightarrow\mathbb{Z}_M^+\times \mathbb{Z}_M^+$$ имеет вид

$$G((y_1,y_2),x) = \begin{cases} (y_1, y_2+1), \text{если $y_1\ne 0 \lor x\ne x_0$},\\ (y_2+1, y_2+1), \text{если $y_1= 0 \land x= x_0$}. \end{cases}$$

Заметим, что все значения функции $$f$$, отличные от нуля, являются стационарными, в то время как функция $$F$$ не имеет стационарных значений. Ясно, что отображение $$\pi\colon \mathbb{Z}_M^+\times \mathbb{Z}_M^+\rightarrow \mathbb{Z}_M^+$$ имеет вид $$\pi(y_1,y_2)=y_1$$.

Построенное нами расширение не является минимальным, так как значение $$(1,0)$$ не может быть принято функцией $$F$$ ни на одной цепочке.

Вот программа, не использующая наличия стационарных значений.

Текст программы

public class First1{
    public static void main(String[] args) throws Exception {
        int x0 = Xterm.inputInt("x0 ->");
        int y1 = 0, y2 = 0;
        try {
            while (true) {
                int x = Xterm.inputInt("x -> ");
                y2 += 1;
                if ( (y1 == 0)  (x == x0) )
                    y1 = y2;
            }
        } catch (Exception e) {
            Xterm.println("\nn = " + y1);
        }	    
    }
}

Имена программных переменных совпадают с использованными при построении алгоритма, вычисление $$F(\varepsilon)$$ выполняется с помощью команд "int y1=0, y2=0;", реализация функции $$G$$ очевидна, а применение отображения $$\pi$$ сводится к печати только значения $$y_1$$.

Программа, использующая наличие у функции $$f$$ стационарных значений, может выдавать ответ сразу же, как только одно из таких значений будет достигнуто.

Текст программы

public class First2 {
    public static void main(String[] args) throws Exception {
        int x0 = Xterm.inputInt("x0 -> ");
        int y1 = 0, y2 = 0;
        try {
            while (y1 == 0) {
                int x = Xterm.inputInt("x -> ");
                y2 += 1;
                if (x == x0)
                    y1 = y2;
            }
        } catch(Exception e){
            System.exit(0);
        }	    
        Xterm.println("\nn = " + y1);
    }
}

По достижению конца вводимой последовательности эта программа не выполняет никаких специальных действий (оператор ";" в блоке "catch" ). В этой ситуации, как и в случае принятия функцией $$f$$ любого из стационарных значений ( $$y_1 \ne 0$$ ), управление просто передается на оператор печати.

Решим еще одну задачу.

Задача 9.3. Напишите программу, вводящую последовательность вещественных чисел, и печатающую среднее арифметическое ее элементов (для непустой последовательности).

Решение По условию задачи $$f\colon X^*_1 \rightarrow Y$$, где $$X=Y=\mathbb{R}_M$$. Если $$x=6$$, $$a=0$$, $$b=00$$ (цепочка из двух нулей), то $$f(a)=f(b)=0$$, но $$f(a\circ x) = 3 \ne 2 = f(b\circ x)$$, следовательно $$f$$ не является индуктивной.

Построим ее индуктивное расширение $$F$$. Обозначив через $$S(\omega)$$ сумму элементов последовательности $$\omega$$, получаем $$\displaystyle f(\omega\circ x)=\frac{S(\omega\circ x)}{|\omega\circ x|}= \frac{S(\omega) + x}{|\omega| +1}=\frac{f(\omega)|\omega| + x}{|\omega| +1}$$. Следовательно, в качестве $$F(\omega)$$ можно взять пару $$(f(\omega), |\omega|)$$. Для $$F\colon (\mathbb{R}_M)^*_1\rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$, где $$F(\omega) = (f(\omega), |\omega|)$$, преобразование $$G\colon \mathbb{R}_M\times\mathbb{Z}_M^+\times\mathbb{R}_M \rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$ задается формулой $$\displaystyle G((y_1,y_2),x) = \left(\frac{y_1y_2+x}{y_2+1},y_2+1\right)$$.

Проектируемая программа будет проще, если мы сможем продолжить $$F$$ на $$(\mathbb{R}_M)^*$$ с сохранением $$G$$. Попробуем подобрать подходящую пару $$(y_1, y_2)$$ такую, чтобы $$F(\varepsilon)=(y_1, y_2)$$ и $$\forall x \in \mathbb{R}_M\ F(\varepsilon\circ x)=F(x)=G((y_1,y_2),x)$$. Так как $$y_2=0$$, то из последнего равенства получаем $$F(x) = (x,1) = (x,1) = G((y_1,0),x)$$, что справедливо при всех $$y_1\in \mathbb{R}$$. Следовательно, можно положить, например, $$F(\varepsilon)=(0,0)$$. Теперь $$F\colon (\mathbb{R}_M)^*\rightarrow\mathbb{R}_M\times\mathbb{Z}_M^+$$. Отображение $$\pi\colon \mathbb{R}_M\times \mathbb{Z}_M^+\rightarrow \mathbb{R}_M$$ тривиально: $$\pi(y_1,y_2)=y_1$$, а построенное нами расширение не является минимальным, так как значение $$(1,0)$$ функцией $$F$$ не принимается.

Текст программы

public class AverSeq{
    public static void main(String[] args) {    
        double y1 = 0., y2 = 0.;
        try {
            while (true) {
                double x = Xterm.inputDouble("x -> ");
                y1  = (y1*y2 + x) / (y2 + 1.);
                y2 += 1;
            }
        } catch(Exception e) {
            Xterm.println("\nf = " + y1);
        }	    
    }
}

Рассмотрим задачу несколько другого типа.

Задача 9.4. Напишите программу, определяющую количество вхождений образца $$abcd$$ в последовательность символов.

Решение Пусть $$X$$ — множество всех символов, тогда функция $$f\colon X^* \rightarrow \mathbb{Z}_M^+$$. Если $$x=d$$, $$\omega_1=abc$$, $$\omega_2=aaa$$, то $$f(\omega_1)=f(\omega_2)=0$$, но $$f(\omega_1\circ x) = 1 \ne 0 = f(\omega_2\circ x)$$, следовательно $$f$$ не является индуктивной.

Заметив, что $$f(\varepsilon)=0$$, будем строить ее индуктивное расширение.

$$f(\omega\circ x)=\begin{cases} f(\omega)+1, \text{если $x=d$ и $\omega$ кончается на $abc$},\\ f(\omega), \text{иначе}. \end{cases}$$

Введем дополнительную функцию $$f_1(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$abc$$, и рассмотрим функцию $$F_1=(f, f_1)$$. Для нее имеем $$F_1(\varepsilon)=(0,F)$$,

$$F_1(\omega\circ x)=\begin{cases} (f(\omega)+1,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T), \text{если $x=c$ и $\omega$ кончается на $ab$},\\ (f(\omega),F), \text{иначе}. \end{cases}$$

Необходимо ввести еще одну дополнительную функцию $$f_2(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$ab$$. Теперь можно рассмотреть $$F_2=(f, f_1, f_2)$$. Для нее имеем $$F_2(\varepsilon)=(0,F,F)$$,

$$F_2(\omega\circ x)=\begin{cases} (f(\omega)+1,F,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T,F), \text{если $x=c$ и $f_2(\omega)=T$},\\ (f(\omega),F,T), \text{если $x=b$ и $\omega$ кончается на $a$},\\ (f(\omega),F,F), \text{иначе}. \end{cases}$$

Так как нам опять не удалось выразить $$F_2(\omega\circ x)$$ только через $$F_2(\omega)$$ и $$x$$, придется рассмотреть еще одну функцию $$f_3(\omega)\colon X^*\rightarrow \{T,F\}$$, которая будет истинна только тогда, когда $$\omega$$ кончается на $$a$$. Для функции $$F_3=(f, f_1, f_2, f_3)$$, действующей в пространство $$\mathbb{Z}_M^+\times\left(\{T,F\}\right)^3$$ получаем $$F_3(\varepsilon)=(0,F,F,F)$$,

$$F_3(\omega\circ x)=\begin{cases} (f(\omega)+1,F,F,F), \text{если $x=d$ и $f_1(\omega)=T$},\\ (f(\omega),T,F,F), \text{если $x=c$ и $f_2(\omega)=T$},\\ (f(\omega),F,T,F), \text{если $x=b$ и $f_3(\omega)=T$},\\ (f(\omega),F,F,T), \text{если $x=a$},\\ (f(\omega),F,F,F), \text{иначе}. \end{cases}$$

Полученное равенство показывает, что $$F_3$$ — индуктивное расширение $$f$$, однако оно достаточно сложно и заведомо не является минимальным, так как $$f_1$$, $$f_2$$ и $$f_3$$ не являются независимыми. У тройки величин $$(f_1, f_2, f_3)$$ имеется всего четыре допустимых состояния, которые можно представить одним числом:

$$n(\omega)=\begin{cases} 3, \text{если $\omega$ кончается на $abc$},\\ 2, \text{если $\omega$ кончается на $ab$},\\ 1, \text{если $\omega$ кончается на $a$},\\ 0, \text{иначе}. \end{cases}$$

Сейчас мы докажем, что функция $$F\colon X^* \rightarrow \mathbb{Z}_M^+\times\{0,1,2,3\}$$, определенная соотношением $$F(\omega) = (f(\omega), n(\omega))$$ является минимальным индуктивным расширением $$f$$.

Для доказательства индуктивности достаточно предъявить преобразование $$G\colon \mathbb{Z}_M^+\times\{0,1,2,3\}\times X\rightarrow \mathbb{Z}_M^+ \times\{0,1,2,3\}$$:

$$G((f,n),x)=\begin{cases} (f+1,0), \text{если $x=d$ и $n=3$},\\ (f,3), \text{если $x=c$ и $n=2$},\\ (f,2), \text{если $x=b$ и $n=1$},\\ (f,1), \text{если $x=a$},\\ (f,0), \text{иначе}. \end{cases}$$

Для доказательства сюръективности функции $$F$$ предъявим прообраз произвольного элемента $$(f,n) \in \mathbb{Z}_M^+\times\{0,1,2,3\}$$. Им может служить, например, цепочка, начинающаяся с $$f$$ вхождений образца $$abcd$$, за которым следует еще $$n$$ первых символов этого образца. Для того чтобы проверить второе условие критерия минимальности, необходимо убедиться в том, что $$\forall a,b\in X^*\ F(a)\ne F(b)\ \exists \omega \in X^*\ f(a\circ \omega) \ne f(b\circ \omega)$$.

Пусть $$F(a)=(f_1,n_1)$$, $$F(b)=(f_2,n_2)$$ и либо $$f_1\ne f_2$$, либо $$n_1\ne n_2$$. Если $$f_1\ne f_2$$, то в качестве $$\omega$$ можно взять пустую цепочку. В противном случае без ограничения общности можно считать, что $$n_1 < n_2$$. Цепочка $$b$$ заканчивается на $$n_2$$ первых символа образца $$abcd$$, поэтому если в качестве $$\omega$$ взять $$4-n_2$$ последних символа этого образца, то $$f(a\circ \omega) = f(a) = f_1 < f_2 + 1 = f(b)+1 = f(b\circ \omega)$$, что и завершает доказательство минимальности $$F$$.

Текст программы

import java.io.*;
public class ABCDSeq {
    public static void main(String[] args) {    
        DataInputStream in = new DataInputStream(System.in);
        int f = 0, n = 0;
        try {
            while (true) {
                char x = (char)in.readByte();
                if (x=='\n') continue;
                if (x=='d'  n==3) {
                    f += 1; 
                    n  = 0;
                } else if (x=='c'  n==2) {
                    n = 3;
                } else if (x=='b'  n==1) {
                    n = 2;
                } else if (x=='a') {
                    n = 1;
                } else{
                    n = 0;
                }
            }
        } catch(Exception e) {
            Xterm.println("f = " + f);
        }
    }
}

В данной программе используется метод "readByte", который позволяет вводить символы. При этом символ '\n' также оказывается введенным после того, как пользователь нажимает клавишу "Enter" на клавиатуре. Этот символ необходимо игнорировать, что и реализуется в программе оператором "if (x=='\n') continue".

Не использовавшиеся нами ранее операторы "import java.io.*" и "DataInputStream in = new DataInputStream(System.in)" необходимы для вызова метода "readByte". В остальном программа полностью соответствует проведенному перед ее построением исследованию.

Задачи для самостоятельного решения

При решении задач, приведенных ниже, необходимо выяснить, является ли индуктивной заданная функция $$f$$. В случае ее индуктивности следует предъявить отображение $$G$$, иначе нужно построить индуктивное расширение $$F$$ исходной функции и предъявить $$G$$ для него. В последнем случае нужно также указать отображение $$\pi$$ и исследовать построенное расширение на минимальность (минимальность не является обязательным условием). Завершить решение следует написанием программы, реализующей однопроходный алгоритм, с указанием соответствия между программными переменными и обозначениями, использованными в теоретической части решения. Необходимо объяснить, как в программе реализуется вычисление $$f$$ или $$F$$ на пустой (или ее заменяющей) цепочке, как именно реализовано перевычисление функции при удлинении цепочки и как находится $$\pi(F(\omega))$$ в случае использования индуктивного расширения.

Задача 9.5. Напишите программу, определяющую количество минимальных элементов в последовательности неположительных целых чисел.

Указание В данном случае для доопределения индуктивного расширения на пустой цепочке нет необходимости использовать величины Integer.MIN_VALUE или Integer.MAX_VALUE.

Задача 9.6. Напишите программу, определяющую значение в целой точке $$t$$ многочлена, заданного последовательностью его целых коэффициентов (в порядке возрастания степеней).

Задача 9.7. Напишите программу, определяющую значение в целой точке $$t$$ производной многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

Указание Продифференцировав по $$x$$ равенство $$P_n(x) = x \cdot P_{n-1}(x) + a_n$$ и подставив затем $$x=t$$, получите соотношения $$P'_0(t) = 0$$ и $$P'_n(t) = t \cdot P'_{n-1}(t) + P_{n-1}(t)$$, которые помогут построить индуктивное расширение исходной функции.

Задача 9.8. Напишите программу, определяющую правильность формулы над алфавитом из четырех символов $$X=\{(,),t,+\}$$. Формула считается правильной, если она может быть получена с помощью следующей НФБН: $$e \rightarrow t \mid (e + e)$$.

Указание Рассмотрите следующее индуктивное расширение $$F=(f_1, f_2, f_3)$$ функции $$f$$, где $$f_1\colon X^* \rightarrow \{T,F\}$$, $$f_2\colon X^* \rightarrow \mathbb{Z}_M$$, $$f_3\colon X^* \rightarrow X$$, определены следующим образом:

$$f_1(\omega) = \omega$$ может быть продолжена до правильной формулы,

$$$f_2(\omega)$$ = разность числа левых и правых скобок в $$\omega$$,

$$$f_3(\omega) =$$ последний элемент $$\omega$$.

Задача 9.9. Напишите программу, определяющую номер $$f$$ последнего элемента, равного $$x_0$$, в последовательности целых чисел. В том случае, если число $$x_0$$ в последовательности не встречается, положите $$f=0$$.

Вернуться к учебному плану