\documentclass[12pt,fleqn,a4paper]{book}
% 
% Packages used:
%
\usepackage[koi8-r]{inputenc}
\usepackage[russian,english]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsthm}
%
% Common customization:
%
\pagestyle{headings}
\newtheorem{theorem}{Теорема}[chapter]
\newtheorem{lemma}{Лемма}[chapter]
\newtheorem{corollary}{Следствие}[chapter]
\newtheorem{proposition}{Утверждение}[chapter]
\newtheorem{fact}{Факт}[chapter]
\theoremstyle{definition}
\newtheorem{problem}{Задача}[chapter]
\newtheorem{exercise}{Упражнение}[chapter]
\newtheorem{example}{Пример}[chapter]
\newtheorem{definition}{Определение}[chapter]
\newtheorem{remark}{Замечание}[chapter]
\newtheorem{algorithm}{Алгоритм}[chapter]
\def\gap{\medskip\centerline{\fbox{\Huge\bfseries{ПРОБЕЛ В КОНСПЕКТЕ.}}}\medskip}
\advance\headheight by 7pt
\def\headsep{15mm}
\newcommand{\lecture}[3]{%
\def\rightmark{\fbox{\parbox{125mm}{\lecturername: \coursetitle%
\hfil\phantom{.}}}}
\def\leftmark{\fbox{\parbox{125mm}{Лекция {#1}. {#2}%
\hfil\phantom{.}}}}
\renewcommand\chaptername{Лекция}\renewcommand\thechapter{#1}\chapter{{#2}\\{\small (Конспект: {#3})}}
\thispagestyle{headings}}
%
% Things to customize for the course are here:
%
\newcommand\lecturername{Э. А. Гирш}
\newcommand\coursetitle{``Информатика'' (отд. математики, 1 курс)}
%
\newcommand{\Retc}{и\;т.\;д.}
\newcommand{\poly}{\mathrm{poly}}
%
\newcommand{\ournote}[1]{\ref{?}\footnote{#1}}
\renewcommand{\le}{\leqslant}
\renewcommand{\ge}{\geqslant}
\newcommand{\step}{\mathop{\to}\limits}
%
% The document
%
\begin{document}
\selectlanguage{russian}
%
% Lecture title
%
\lecture{10}{Теория формальных языков (II)}{К. Ефремова}
%
\section{Конечные автоматы (продолжение)}

\begin{definition}
\emph{Детерминированный конечный автомат} ---
это недетерминированный конечный автомат,
у которого ${\delta}(q,{\epsilon})=\emptyset$ и $|{\delta}(q,a)|\le1$.
\emph{Полностью определенным} детерминированным конечным автоматом
называется автомат, у которого $|{\delta}(q,a)|=1$.
(Иначе говоря, можно считать, что у него ${\delta}:Q\times{\Sigma}\to Q$.)
\end{definition}

\begin{definition} Обозначение:
$q_1\step^a q_2$
означает
$q_2\in {\delta}(q_1,a)$.
\end{definition}

\begin{theorem}
Для любого недетерминированного конечного автомата
$\mathcal{A}=(Q,{\Sigma},q_s,F,{\delta})$
можно построить 
полностью определенный детерминированный конечный автомат
$\mathcal{A'}=(Q',{\Sigma},q'_s,F',{\delta}')$,
такой, что $L(\mathcal{A})=L(\mathcal{A'})$.
\end{theorem}
\begin{proof}
1.
Избавимся от ${\epsilon}$-переходов.
Найдем все пары состояний $(q_1, q_2)$, такие, что 
$q_2$ достижимо из $q_1$ по ${\epsilon}$-переходам:
$q_1\step^\epsilon q'\step^\epsilon\ldots\step^\epsilon q_2$.
Для каждого \emph{не}-$\epsilon$-перехода $q_2\step^a q_3$
добавим переход $q_1\step^a q_3$.
Кроме того, если $q_2\in F$, добавим и $q_1$ в $F$.

После этого удалим все ${\epsilon}$-переходы.
Заметим, что язык при этом не изменится.
Действительно, раньше мы шли по пути $q_1\to\ldots\to q_2\to q_3$,
считывая $a$, а теперь по другому пути,
но все равно считываем $a$; и наоборот.

2.
Пусть $Q'=2^Q$;
      $q'_s=\{q_s\}$;
      $F'=\{q'\in Q'\;|\;q'\cap F\neq\emptyset\}$.
Напишем новые переходы вида $q_1'\step^a q_2'$,
где $q_2'=\{q\in Q\;|\;\exists r\in q_1': r\step^a q\}$.
Построенный новый автомат, очевидно, детерминированный.

Докажем, что язык не меняется.

(a) Пусть старый автомат принимает строчку.
Покажем,что новый автомат тоже примет эту строчку.
Раньше мы совершали переход $q_s\step^{a_1}q_1$,
теперь --- переход $\{q_s\}\step^{a_1} \{q_1,\ldots\}$.
Последующие переходы $q_{i-1}\step^{a_i}q_i$
превращаются в $\{q_{i-1},\ldots\}\step^{a_i}\{q_i,\ldots\}$.
Последнее состояние будет принадлежать $F'$,
ибо оно содержит конечное состояние старого автомата.

(b) Пусть строчка принимается новым автоматом.
По определению, в состоянии, в котором он завершает работу,
содержится некоторое конечное состояние старого автомата.
Пусть последний переход нового автомата --- $q'\step^a \{p,\ldots\}$
(где $p\in F$). По определению новой функции перехода,
существует $q\in q'$, такое, что $q\step^a p$ в старом автомате.
Далее рассмотрим предыдущий переход $r'\step^b\{q,\ldots\}$
в новом автомате, {\Retc},
пока не дойдем до стартового состояния.
\end{proof}

\begin{theorem}\label{th:regular}
Множества языков, задаваемых
\begin{enumerate}
\item[(1)] конечными автоматами,
\item[(2)] регулярными выражениями,
\item[(3)] праволинейными грамматиками
\end{enumerate}
в одном и том же алфавите ${\Sigma}$, совпадают. 
\end{theorem}
\begin{proof}
(2)$\Rightarrow$(1).
Доказательство по индукции.\\
База:
\begin{enumerate}
\item Пустой язык. Автомат, принимающий пустой язык --- автомат с пустым $F$.
\item Язык $\{{\epsilon}\}$. В автомате, принимающем его,
      $F=\{q_s\}$, а переходов в нем нет.
\item Язык $\{a\}$. Единственный переход такого автомата: $q_s\step^a q$; $F=\{q\}$.
\end{enumerate}
Индукционный переход:
\begin{enumerate}
\item
Рассмотрим конкатенацию языков $L_1$ и $L_2$.
Пусть есть автомат, принимающий язык $L_1$;
и другой автомат, принимающий $L_2$.
Мы хотим построить автомат,принимающий $L_1\cdot L_2$.

Объединим эти два автомата в один, и слегка модифицируем его.
Новым стартовым состоянием будет стартовое состояние первого автомата.
Новым множеством конечных состояний будет множество конечных состояний
второго автомата.
Также добавим $\epsilon$-переходы из (бывших) конечных состояний первого
автомата в (бывшее) начальное состояние второго автомата.

\item $L_1\cup L_2$.
Снова объединим два автомата.
Добавим новое стартовое состояние,
а из него --- $\epsilon$-переходы в два старых стартовых состояния.
На сей раз конечными состояниями построенного автомата
будут конечные состояния обоих автоматов.

\item $L^*$.
Добавим $\epsilon$-переходы из конечных состояний --- в начальное,
а также добавим $\epsilon$-переход из стартового состояния
в \emph{новое} (дополнительное) конечное состояние.
\end{enumerate}


(1)$\Rightarrow$(3).
Нетерминалы грамматики --- состояния автомата.
Если $q\step^a p$, то добавим правило $q\to ap$.
Если еще и $p\in F$, то добавим еще правило $q\to a$.

(3)$\Rightarrow$(2).
Можно построить систему уравнений
\begin{eqnarray*}
 A_1&=&{\alpha}_{10}\cup({\alpha}_{11}A_1)\cup({\alpha}_{12}A_2)\ldots\cup({\alpha}_{1n}A_n)\\
 A_2&=&{\alpha}_{20}\cup({\alpha}_{21}A_1)\cup({\alpha}_{22}A_2)\ldots\cup({\alpha}_{2n}A_n)\\
&\ldots&\\
 A_n&=&{\alpha}_{n0}\cup({\alpha}_{n1}A_1)\cup({\alpha}_{n2}A_2)\ldots\cup({\alpha}_{nn}A_n),
\end{eqnarray*}
где $A_1,A_2,\ldots, A_n$ --- все нетерминалы,
они же неизвестные этой системы уравнений;
${\alpha}_{ij}$ --- регулярные выражения в алфавите ${\Sigma}$,
коэффициенты системы, строятся они следующим образом.
Посмотрим все правила для нетерминала $A_i$,
у которых в правой части $A_j$; пусть это
$A_i\to a_1 A_j$, \ldots, $A_i\to a_kA_j$.
Тогда ${\alpha}_{ij}:=\{a_1\}\cup\{a_2\}\cup\ldots\cup\{a_k\}$.
(Если $j=0$, рассматриваем правила, не содержащие нетерминала в правой части.)

Исключим $A_1$:
перепишем первое неравенство в виде $A_1=({\alpha}_{11}A_1)\cup\beta$;
теперь $A_1={\alpha}_{11}^*\beta$ (где $\beta\in(\Sigma\cup N)^*$)
подставляем везде в последующие уравнения системы.
Аналогично поступаем с $A_2,\ldots,A_n$,
находя $A_i$ из $i$-го уравнения.
Найдя, таким образом, регулярное выражение (уже в алфавите $\Sigma$,
а не $\Sigma{\cup}N$) для $A_n$, подставим его в предыдущие уравнения,
{\Retc}
В результате будет получено решение,
которое будет минимальным\footnote{См. задачу~\ref{prob:reg}.},
т.е. не будет содержать других решений;
значения для нетерминалов будут, очевидно, будет регулярными выражениями.
Значение для стартового нетерминала --- 
искомое\footnote{См. задачу~\ref{prob:reg}.} регулярное выражение.
\end{proof}
\begin{problem}\label{prob:reg}
Завершить доказательство теоремы~\ref{th:regular}:
доказать, что найденное так <<решение>> действительно будет минимальным решением,
а также, что минимальное решение (точнее, соответствующее выражение для
стартового нетерминала)
действительно является языком,
порождаемым данной грамматикой.\qed
\end{problem}

\begin{lemma}[лемма о разрастании для регулярных языков (pumping lemma)]
Пусть $L$ --- регулярный язык.
Тогда существует константа $c$,
такая, что любую строку $x\in L$ длины не менее $c$
можно разбить на три части $x=u\cdot v\cdot w$,
такие что 
$0<|v|\le c$ и
$\forall i\ge0\ u\cdot v^i\cdot w \in L$.
\end{lemma}
\begin{proof}
Рассмотрим детерминированный конечный
полностью определенный автомат для языка $L$.
Пусть $c=|Q|+1$.
Посмотрим, как он работает на цепочке $x$:
$q_s\to q_1\to \ldots \to q_k\in F$.
На каждом шаге считывается некоторый символ.
Поскольку $|x|\ge c$,
мы должны были побывать в каком-то состоянии дважды,
и в нашем пути есть циклы.
Выберем несамопересекающийся цикл;
пусть до первого прохождения по нему считывалась строка $u$,
при прохождении по нему считывалась строка $v$
(ее длина не превосходит $c$, поскольку цикл --- несамопересекающийся),
а после прохождения по нему (в том числе, если по нему пошли еще раз) --- 
строка $w$. Очевидно, наш автомат примет любую строку вида $uv^iw$.
\end{proof}

С помощью этой леммы можно доказывать, что какой-нибудь язык не является регулярным.
\begin{example}
$L=\{0^n1^n|n\in \mathbb{N}\cup{0}\}$ не является регулярным.\\
\emph{Доказательство.}
Пусть регулярный. Рассмотрим варианты подстроки $v$ из леммы.
\begin{enumerate}
\item
В строку попадают только нули $\Rightarrow$
в $uv^2w$ количество 0 увеличится,
а количество 1 останется неизменным $\Rightarrow$ 
строка не будет принадлежать $L$.
\item
В строку попадают только единицы --- аналогично.
\item
$v=0^i1^j$ $\Rightarrow$
в $uv^2w$ после 1 будет идти 0
$\Rightarrow$ строка опять не будет принадлежать языку.
\end{enumerate}
(Замечание: тем не менее,
этот язык может быть порожден \emph{бесконтекстной}
грамматикой $S\to 0S1$, $S\to\epsilon$.)\qed
\end{example}

Полезные свойства регулярных языков:
\begin{enumerate}
\item
Множество всех регулярных языков в данном алфавите
замкнуто относительно операций, которые их порождают: $\cup$, $\cdot$, ${}^*$.
\item
\begin{lemma}
Множество всех регулярных языков в данном алфавите
замкнуто относительно дополнения.
\end{lemma}
\begin{proof}
Рассмотрим детерминированный конечный полностью определенный автомат, 
задающий язык $L$.
Поменяем местами его конечные состояния с остальными: $F':=Q\setminus F$.
Полученный автомат задает язык $\overline{L}$.
\end{proof}
\item
\begin{corollary}
{\ldots}и замкнуто относительно пересечения.
\end{corollary}
\end{enumerate}

Разрешимые проблемы, связанные с регулярными языками:
\begin{enumerate}
\item Принадлежность. 
Рассмотрим детерминированный конечный
полностью определенный автомат, принимающий данный язык.
Чтобы узнать, принадлежит ли этому языку некоторая строка,
запустим наш автомат на этой строке $x$.
После $|x|$ переходов мы поймем, принадлежит ли она языку.
\item Пустота языка.
Чтобы решить эту проблему, достаточно
проверить, достижимо ли какое-нибудь конечное
состояние автомата из начального.
Эта задача, очевидно, алгоритмически разрешима.
\item Равенство языков.
Чтобы построить алгоритм для этой задачи, достаточно заметить, что
$$
 L_1=L_2 \Leftrightarrow 
 L_1 \mathrel{\cap} \overline{L_2}=\emptyset \mathrel{\land}
 L_2 \mathrel{\cap} \overline{L_1}=\emptyset
\mbox{ (или: $(L_1 \cap \overline{L_2})\cup(L_2 \cap \overline{L_1})=\emptyset$).}
$$
\item Включение языков.
Чтобы построить алгоритм для этой задачи, достаточно заметить, что
$$
L_1\subseteq L_2 \Leftrightarrow (L_1 \cap\overline{L_2}=\emptyset) 
\mbox{ (или: $(L_1 \cap L_2=L_1)$)}.
$$
\end{enumerate}

\end{document}

