You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@article{OWENS_REPPY_TURON_2009, title={Regular-expression derivatives re-examined}, volume={19}, DOI={10.1017/S0956796808007090}, number={2}, journal={Journal of Functional Programming}, author={OWENS, SCOTT and REPPY, JOHN and TURON, AARON}, year={2009}, pages={173–190}} <div></div>
Регулярное выражение $a$ задаёт регулярное множество $\{a\}$ и, соответственно, язык из единственного слова $a$.
64
64
\end{example}
65
65
66
+
66
67
\begin{example}
67
68
Регулярное выражение $ab$ задаёт регулярное множество $\{ab\}$ и, соответственно, язык из единственного слова $ab$.
68
69
\end{example}
@@ -72,7 +73,6 @@ \section{Регулярные выражения}
72
73
Регулярное выражение $a^*$ задаёт регулярное множество $$R = \bigcup_{i=0}^{\infty}{a^i} = \{\varepsilon, a, aa, aaa, \ldots\}$$ и, соответственно, бесконечный язык, содержащий для любого неотрицательного целого $n$ цепочку из символов $a$ длины $n$.
73
74
\end{example}
74
75
75
-
76
76
\begin{example}
77
77
$a^*b$
78
78
\end{example}
@@ -117,18 +117,52 @@ \section{Конечные автоматы}
117
117
Будем говорить, что автомат $M = \langle Q, Q_S, Q_F, \delta, \Sigma\rangle$ может перейти из конфигурации $c_1 = (q_1, w_1)$ в конфигурацию $c_2 = (q_2, w_2)$, если
Таким образом, работу автомата можно описать как последовательность переходов между множествами конфигураций.
150
+
Работа начинается с множества стартовых конфигураций и завершается в следующих двух случаях.
151
+
\begin{enumerate}
152
+
\item Очередное множество конфигураций содержит финальную конфигурацию:
153
+
$$c_f \in C_S \text{ или } C_S \Rightarrow^* C_i, c_f \in C_i.$$ В этом случае говорят, что автомат \textit{принимает} входную строку.
154
+
\item Очередное множество конфигураций пусто:
155
+
$$C_0 = C_S \Rightarrow^* C_i \Rightarrow^* \varnothing, \text{ для любого } i: c_f \notin C_i.$$
156
+
В этом случае говорят, что автомат \textit{не принимает} или \textit{отвергает} входную строку.
157
+
\end{enumerate}
158
+
159
+
\begin{definition}
160
+
Язык задаваемый автоматом $$\{w \mid\}$$
161
+
\end{definition}
130
162
131
-
Ошибочная конфигурация.
163
+
Так как конфигурация полностью описывает состояние процесса вычислений, то не надо обрабатывать одну и ту же конфигурацию несколько раз.
164
+
Это поможет при написании реального интерпретатора.
165
+
Будем отслеживать уже посещённые (обработанные) конфигурации\footnote{Техника, аналогичная той, что применяется в обходах графов (обход в ширину, обход в глубину) для того, чтобы избежать повторного посещения вершин и, как следствие, зацикливания обхода. Более того, она типична для алгоритмов с рабочим множеством.}.
132
166
133
167
\begin{example}
134
168
Пример интерпретации конечного автомата.
@@ -141,12 +175,15 @@ \section{Конечные автоматы}
141
175
\item$Q$~--- конечное множество состояний;
142
176
\item$q_S \in Q$~--- стартовое состояние;
143
177
\item$Q_F \subseteq Q$~--- множество финальных состояний;
144
-
\item$\delta\subseteq Q \times\Sigma\times Q$~--- функция переходов;
178
+
\item$\delta\subseteq Q \times\Sigma\times Q$~--- функция переходов\footnote{Частично определённая.};
145
179
\item$\Sigma$~--- конечный алфавит.
146
180
\end{itemize}
147
181
\end{definition}
148
182
149
-
Заметим, что функцию переходов можно представить разными способами в зависимости от того, как именно представлена функция переходов: список троек, матрица, граф.
183
+
Отличие --- функция переходов. Нет переходов по $\varepsilon$ и из любого состояния не более одного перехода по символу.
184
+
Ещё стартовое состояние одно.
185
+
186
+
Заметим, что функцию переходов можно представить разными способами В зависимости от того, как именно представлена функция переходов: список троек, матрица, граф.
\item$\partial_t(R^*) = $\footnote{Интересное упражнение --- показать это, расписав по определению звезду Клини.}
223
+
\end{itemize}
224
+
225
+
Проверка пустоты регулярного языка\footnote{!!!!}
165
226
166
-
Алгоритмы: проверка пустоты ...
227
+
228
+
\section{Построение конечного автомата по регулярному выражению}
229
+
230
+
На производных.
167
231
168
232
Примеры.
169
233
234
+
\section{Построение регулярного выражения по конечному автомату}
235
+
236
+
Регулярное выражение будем строить по недетерминированному автомату специального вида: потребуем, чтобы у него было ровно одно стартовое состояние и ровно одно финальное\footnote{Любой автомат легко привести к такому виду: добавить состояния и $\varepsilon$-переходы}.
237
+
238
+
Будем в цикле выполнять последовательно две операции.
239
+
Первая: объединение параллельных рёбер.
240
+
Вторая: устранение вершины $v$. За один шаг можем устранить любую кроме стартовой или финальной.
241
+
Цикл повторяется до тех пор, пока в автомате не останется ровно два состояния: стартовое и финальное.
242
+
243
+
До объединения параллельных рёбер
244
+
\begin{tikzpicture}
245
+
246
+
\node[state] (q_0) {$q_i$};
247
+
\node[state] (q_1) [right of = q_0] {$q_j$};
248
+
\path[->]
249
+
(q_0) edge[bend left, above] node {$R_1$} (q_1)
250
+
(q_0) edge[bend right, below] node {$R_2$} (q_1)
251
+
;
252
+
\end{tikzpicture}
253
+
254
+
После объединения параллельных рёбер.
255
+
256
+
\begin{tikzpicture}
257
+
258
+
\node[state] (q_0) {$q_i$};
259
+
\node[state] (q_1) [right of = q_0] {$q_j$};
260
+
\path[->]
261
+
(q_0) edge[above] node {$R_1\mid R_2$} (q_1)
262
+
;
263
+
\end{tikzpicture}
264
+
265
+
266
+
\begin{tikzpicture}
267
+
268
+
\begin{scope}[node distance=10mm and 10mm]
269
+
\node[state] (p_0) {$p_0$};
270
+
\node[text width=0.3cm] (p_1) [below of = p_0] {$\vdots$};
271
+
\node[state] (p_2) [below of = p_1] {$p_i$};
272
+
\node[text width=0.3cm] (p_3) [below of = p_2] {$\vdots$};
273
+
\end{scope}
274
+
275
+
\node[state] (v_0) [right of = p_2] {$v$};
276
+
277
+
\begin{scope}[node distance=10mm and 10mm]
278
+
\node[state] (q_2) [right of = v_0] {$q_j$};
279
+
\node[text width=0.3cm] (q_1) [above of = q_2] {$\vdots$};
280
+
\node[state] (q_0) [above of = q_1] {$q_0$};
281
+
\node[text width=0.3cm] (q_3) [below of = q_2] {$\vdots$};
282
+
\end{scope}
283
+
284
+
\path[->]
285
+
(p_0) edge[above] node {$R_{p_0}$} (v_0)
286
+
(p_2) edge[below] node {$R_{p_i}$} (v_0)
287
+
(v_0) edge[right] node {$R_{q_0}$} (q_0)
288
+
(v_0) edge[above] node {$R_{q_j}$} (q_2)
289
+
(v_0) edge[loop above, above] node {$R_v$} (v_0);
290
+
\end{tikzpicture}
291
+
292
+
293
+
\begin{tikzpicture}
294
+
295
+
\begin{scope}[node distance=10mm and 10mm]
296
+
\node[state] (p_0) {$p_0$};
297
+
\node[text width=0.3cm] (p_1) [below of = p_0] {$\vdots$};
298
+
\node[state] (p_2) [below of = p_1] {$p_i$};
299
+
\node[text width=0.3cm] (p_3) [below of = p_2] {$\vdots$};
300
+
\end{scope}
301
+
302
+
\node[text width=0.3cm] (v_0) [right of = p_2] {};
303
+
304
+
\begin{scope}[node distance=10mm and 40mm]
305
+
\node[state] (q_2) [right of = v_0] {$q_j$};
306
+
\node[text width=0.3cm] (q_1) [above of = q_2] {$\vdots$};
307
+
\node[state] (q_0) [above of = q_1] {$q_0$};
308
+
\node[text width=0.3cm] (q_3) [below of = q_2] {$\vdots$};
0 commit comments