Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3332 / 380 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Лекция 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 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева