Skip to content

Commit a4ef9d3

Browse files
committed
Доработка раздела по регулярным языкам (#22).
1 parent 49337bb commit a4ef9d3

File tree

1 file changed

+63
-51
lines changed

1 file changed

+63
-51
lines changed

tex/RegularLanguages.tex

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ \section{Регулярные выражения}
9898
\section{Конечные автоматы}
9999

100100
\emph{Конечный автомат} (Finite State Machine, FSM)~--- вычислительная машина, которая имеет конечный набор состояний и может совершать переходы между ними, основываясь на прочитанных входных данных.
101-
Важно отметить, что никакой дополнительной памяти классический конечный автомат не имеет и дополнительных действий (кроме чтения входной ленты) не производит %
101+
Важно отметить, что никакой дополнительной памяти классический конечный автомат не имеет и дополнительных действий (кроме чтения входной ленты) не производит%
102102
\sidenote{Cуществуют автоматы с записью на отдельную (выходную) ленту (например, автоматы Мили~\cite{6771467}) и другие, основанные на конечных автоматах, вычислители, производящие дополнительные действия.
103103
Например, расширенные конечные автоматы (Extended Finite State Machine), которые умеют работать с памятью (переменными)~\cite{Alagar2011, foster.ea:efsm:2020}.}.
104104

@@ -445,10 +445,10 @@ \section{Построение конечного автомата по регу
445445
Стартовому состоянию соответствует выражение $a(a \mid (b \ b))^*$.
446446
Так как $\emph{IsNull}(a(a \mid (b \ b))^*) = \emph{false}$, это состояние не является финальным.
447447
Вычислим производные по всем символам из алфавита:
448-
\[
449-
\partial_a(a(a \mid (b \ b))^*) = (a \mid (b \ b))^*, \quad
450-
\partial_b(a(a \mid (b \ b))^*) = \varnothing.
451-
\]
448+
\begin{align*}
449+
\partial_a(a(a \mid (b \ b))^*) & = (a \mid (b \ b))^*, \\
450+
\partial_b(a(a \mid (b \ b))^*) & = \varnothing.
451+
\end{align*}
452452
В результате появляются два новых состояния: $(a \mid (b \ b))^*$ и $\varnothing$.
453453
Второе состояние соответствует пустому языку и является \emph{поглощающим} (или \emph{дьявольским}) состоянием, а первое~--- финальным, так как $\emph{IsNull}((a \mid (b \ b))^*) = \emph{true}$.
454454
На рисунке~\ref{fig:regexp_to_dfa_example_step_1} показан автомат после первого шага алгоритма.
@@ -470,10 +470,10 @@ \section{Построение конечного автомата по регу
470470
\end{marginfigure}
471471

472472
На следующем шаге вычислим производные для состояния $(a \mid (b \ b))^*$:
473-
\[
474-
\partial_a((a \mid (b \ b))^*) = (a \mid (b \ b))^*, \quad
475-
\partial_b((a \mid (b \ b))^*) = b(a \mid (b \ b))^*.
476-
\]
473+
\begin{align*}
474+
\partial_a((a \mid (b \ b))^*) & = (a \mid (b \ b))^*, \\
475+
\partial_b((a \mid (b \ b))^*) & = b(a \mid (b \ b))^*.
476+
\end{align*}
477477
Таким образом, появляется новое состояние $b(a \mid (b \ b))^*$, а автомат принимает вид, показанный на рисунке~\ref{fig:regexp_to_dfa_example_step_2}.
478478

479479
\begin{marginfigure}
@@ -498,10 +498,10 @@ \section{Построение конечного автомата по регу
498498
\end{marginfigure}
499499

500500
Осталось обработать состояние $b(a \mid (b \ b))^*$:
501-
\[
502-
\partial_a(b(a \mid (b \ b))^*) = \varnothing, \quad
503-
\partial_b(b(a \mid (b \ b))^*) = (a \mid (b \ b))^*.
504-
\]
501+
\begin{align*}
502+
\partial_a(b(a \mid (b \ b))^*) & = \varnothing, \\
503+
\partial_b(b(a \mid (b \ b))^*) & = (a \mid (b \ b))^*.
504+
\end{align*}
505505
В результате добавляются новые переходы, и автомат принимает окончательный вид (рисунок~\ref{fig:regexp_to_dfa_example_step_3}).
506506

507507
\begin{marginfigure}
@@ -534,7 +534,7 @@ \section{Построение конечного автомата по регу
534534

535535
\section{Построение регулярного выражения по конечному автомату}
536536

537-
Алгоритм Клини(?)
537+
Для построения регулярного выражения по конечному будем использовать вариацию классической конструкции, часто связываемой с теоремой Клини о эквивалентности языков, задаваемых регулярными выражениями и конечными автоматами, для доказательства которой нужно, в частности, построить регулярное выражение по конечному автомату.
538538
Регулярное выражение будем строить по недетерминированному автомату специального вида: потребуем, чтобы у него было ровно одно стартовое состояние и ровно одно финальное%
539539
\sidenote{Любой автомат можно привести к такому виду.
540540
Предположим, что в автомате два стартовых состояния $q_0^s$ и $q_1^s$.
@@ -770,7 +770,8 @@ \section{Лево(право)линейные грамматики}
770770
Q_1 \to b Q_2 \quad & \quad Q_2 \to b Q_1 \\
771771
\quad & \quad Q_1 \to \varepsilon.
772772
\end{align*}
773-
Таким образом, полученная грамматика порождает тот же язык, что и данный автомат.
773+
Таким образом, мы получили грамматику, которая порождает тот же язык, что и исходный автомат%
774+
\sidenote{В качестве упражнения можно взять несколько цепочек, принадлежащих языку, и проследить, как переходы в автомате в процессе раскознования цепочки соотносятся с применением правил грамматики при её выоде.}.
774775
\end{example}
775776

776777
\begin{marginfigure}
@@ -800,7 +801,17 @@ \section{Лево(право)линейные грамматики}
800801
\end{align*}
801802
Построим по ней конечный автомат.
802803

803-
Множество состояний автомата соответствует нетерминалам грамматики, а также добавим дополнительное состояние для цепочки из двух символов $b$:
804+
Первым шагом разобьём продукцию $N_1 \to b b N_1$ на две, введя дополнительный нетерминал.
805+
Новая грамматика будет иметь следующий вид.
806+
807+
\begin{align*}
808+
S \to a N_1, \quad
809+
N_1 \to a N_1 \mid b N_2 \mid \varepsilon , \quad
810+
N_2 \to b N_1.
811+
\end{align*}
812+
813+
Теперь можно заняться конструированием автомата.
814+
Множество состояний автомата соответствует нетерминалам грамматики:
804815
\begin{align*}
805816
Q = \{S, N_1, N_2\}.
806817
\end{align*}
@@ -911,7 +922,8 @@ \section{Замкнутость регулярных языков относит
911922
\[
912923
\delta^3\big((q^1, q^2), t\big) = \big(\delta^1(q^1, t),\; \delta^2(q^2, t)\big).
913924
\]
914-
Тогда
925+
Тогда%
926+
\sidenote{Аккуратно доказать это можно расписав переходы между конфигурациями соответствующих автоматов при обработке цепочки.}
915927
\[
916928
w \in L(M_3) \iff w \in L_1 \text{ и } w \in L_2,
917929
\]
@@ -933,40 +945,40 @@ \section{Замкнутость регулярных языков относит
933945
Регулярные языки замкнуты относительно обеих операций, следовательно, и относительно разности тоже замкнуты.
934946
\end{proof}
935947

936-
\begin{example}[Конструкция произведения]\label{ex:product-automaton}
937-
Пусть $M_1$ и $M_2$~--- детерминированные автоматы над алфавитом $\Sigma=\{a,b\}$.
938-
В автомате $M_1$ есть переходы
939-
$q^1 \xrightarrow{a} p^1$, $q^1 \xrightarrow{b} p^1$ и $p^1 \xrightarrow{b} p^1$,
940-
а в автомате $M_2$~--- переходы
941-
$q^2 \xrightarrow{a} q^2$ и $q^2 \xrightarrow{b} p^2$.
942-
Тогда в автомате произведения $M_1 \times M_2$ возникают переходы:
943-
\begin{align*}
944-
(q^1, q^2) \xrightarrow{a} (p^1, q^2), \quad
945-
(p^1, q^2) \xrightarrow{b} (p^1, p^2), \quad
946-
(q^1, q^2) \xrightarrow{b} (p^1, p^2),
947-
\end{align*}
948-
что проиллюстрировано на рис.~\ref{fig:product-automaton-example}.
949-
Принимающими являются пары из принимающих состояний обоих автоматов.
950-
\end{example}
951-
952-
953-
\begin{marginfigure}
954-
\centering
955-
\scalebox{0.64}{
956-
\begin{tikzpicture}
957-
\node[elliptic state,initial] (q0) {$(q^1, q^2)$};
958-
\node[elliptic state] (p0) [right=of q0] {$(p^1, q^2)$};
959-
\node[elliptic state,accepting] (p1) [below right=of p0] {$(p^1, p^2)$};
960-
961-
\path[->]
962-
(q0) edge[bend left, above] node {$a$} (p0)
963-
(p0) edge[bend left, right] node {$b$} (p1)
964-
(q0) edge[bend right, below left] node[swap] {$b$} (p1);
965-
\end{tikzpicture}}
966-
\caption{Пример переходов в произведении автоматов.}
967-
\label{fig:product-automaton-example}
968-
\end{marginfigure}
969-
948+
%\begin{example}[Конструкция произведения]\label{ex:product-automaton}
949+
% Пусть $M_1$ и $M_2$~--- детерминированные автоматы над алфавитом $\Sigma=\{a,b\}$.
950+
% В автомате $M_1$ есть переходы
951+
% $q^1 \xrightarrow{a} p^1$, $q^1 \xrightarrow{b} p^1$ и $p^1 \xrightarrow{b} p^1$,
952+
% а в автомате $M_2$~--- переходы
953+
% $q^2 \xrightarrow{a} q^2$ и $q^2 \xrightarrow{b} p^2$.
954+
% Тогда в автомате произведения $M_1 \times M_2$ возникают переходы:
955+
% \begin{align*}
956+
% (q^1, q^2) \xrightarrow{a} (p^1, q^2), \quad
957+
% (p^1, q^2) \xrightarrow{b} (p^1, p^2), \quad
958+
% (q^1, q^2) \xrightarrow{b} (p^1, p^2),
959+
% \end{align*}
960+
% что проиллюстрировано на рис.~\ref{fig:product-automaton-example}.
961+
% Принимающими являются пары из принимающих состояний обоих автоматов.
962+
%\end{example}
963+
%
964+
%
965+
%\begin{marginfigure}
966+
% \centering
967+
% \scalebox{0.64}{
968+
% \begin{tikzpicture}
969+
% \node[elliptic state,initial] (q0) {$(q^1, q^2)$};
970+
% \node[elliptic state] (p0) [right=of q0] {$(p^1, q^2)$};
971+
% \node[elliptic state,accepting] (p1) [below right=of p0] {$(p^1, p^2)$};
972+
%
973+
% \path[->]
974+
% (q0) edge[bend left, above] node {$a$} (p0)
975+
% (p0) edge[bend left, right] node {$b$} (p1)
976+
% (q0) edge[bend right, below left] node[swap] {$b$} (p1);
977+
% \end{tikzpicture}}
978+
% \caption{Пример переходов в произведении автоматов.}
979+
% \label{fig:product-automaton-example}
980+
%\end{marginfigure}
981+
%
970982

971983

972984
%\section{Вопросы и задачи}

0 commit comments

Comments
 (0)