Опубликован: 27.09.2006 | Уровень: для всех | Доступ: свободно
Лекция 9:

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

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

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

Задача 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". В остальном программа полностью соответствует проведенному перед ее построением исследованию.

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Анастасия Халудорова
Анастасия Халудорова
подавляющее большиство фукций на пространстве последовательостей?
екатерина яковлева
екатерина яковлева
как получить сертификат,что для этого нужно?
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Антон Никитин
Антон Никитин
Россия, Хабаровск