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
Copy file name to clipboardExpand all lines: tex/CYK_for_CFPQ.tex
+11-14Lines changed: 11 additions & 14 deletions
Original file line number
Diff line number
Diff line change
@@ -6,33 +6,31 @@ \chapter{CYK для вычисления КС запросов}\label{chpt:CFPQ_
6
6
7
7
\section{Алгоритм CYK}\label{sect:lin_CYK}
8
8
9
-
Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной граммтике~\cite{Hopcroft+Ullman/79/Introduction}.
9
+
Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной грамматике~\cite{Hopcroft+Ullman/79/Introduction}.
10
10
11
-
Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно,данный алгоритм применим для работы с произвольными контекстно-своболными языками.
11
+
Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно,данный алгоритм применим для работы с произвольными контекстно-своболными языками.
12
12
13
13
В основе алгоритма лежит принцип динамического программирования. Используются два соображения:
14
14
15
15
\begin{enumerate}
16
-
\item Для правила вида $A \to a$ очевидно, что из $A$ выводится $\omega$ (с применением этого правила) тогда и только тогда, когда $a = \omega$:
17
-
16
+
\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to a$ тогда и только тогда, когда $a= \omega$:
18
17
\[
19
18
A \derives\omega\iff\omega = a
20
19
\]
21
20
22
-
\item Для правила вида $A \to B C$ понятно, что из $A$ выводится $\omega$ (с применением этого правила) тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1\omega_2$:
23
-
21
+
\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to B C$ тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1\omega_2$:
24
22
\[
25
23
A \derives[] B C \derives\omega\iff\exists\omega_1, \omega_2 : \omega = \omega_1 \omega_2, B \derives\omega_1, C \derives\omega_2
26
24
\]
27
25
28
-
Или в терминах позиций в строке:
29
-
26
+
Переформулируем эти утверждения в терминах позиций в строке:
30
27
\[
31
28
A \derives[] B C \derives\omega\iff\exists k \in [1 \dots |\omega|] : B \derives\omega[1 \dots k], C \derives\omega[k+1 \dots |\omega|]
32
29
\]
33
30
\end{enumerate}
34
31
35
-
В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что $$M[i, j, A] = true \iff A \derives\omega[i \dots j]$$.
32
+
В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что
33
+
\[M[i, j, A] = true \iff A \derives\omega[i \dots j]\].
36
34
37
35
Первым шагом инициализируем матрицу, заполнив значения $M[i, i, A]$:
Далее используем динамику: на шаге $m > 1$ предполагаем, что ячейки матрицы $M[i', j', A]$ заполнены для всех нетерминалов $A$ и пар $i', j': j' - i' < m$.
45
43
Тогда можно заполнить ячейки матрицы $M[i, j, A] \text{, где } j - i = m$ следующим образом:
По итогу работы алгоритма значение в ячейке $M[0, |\omega|, S]$, где $S$ --- стартовый нетерминал грамматики, отвечает на вопрос о выводимости цепочки $\omega$ в грамматике.
@@ -239,7 +236,7 @@ \section{Алгоритм для графов на основе CYK}
239
236
\begin{itemize}
240
237
\item Как и раньше, с помощью продукций вида \[A \to a \text{, где } A \in N, a \in\Sigma\]
241
238
заменяем терминалы на ребрах входного графа на множества нетерминалов, из которых они выводятся.
242
-
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной граммтике есть правила вида $$A \to\varepsilon\text{, где } A \in N.$$
239
+
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной грамматике есть правила вида $$A \to\varepsilon\text{, где } A \in N.$$
243
240
\end{itemize}
244
241
245
242
Затем используем матрицу смежности получившегося графа (обозначим ее $M$) в качестве начального значения. Дальнейший ход алгоритма можно описать псевдокодом, представленным в листинге~\ref{alg:graphParseCYK}.
@@ -271,7 +268,7 @@ \section{Алгоритм для графов на основе CYK}
271
268
\end{algorithmic}
272
269
\end{algorithm}
273
270
274
-
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и граммтики.
271
+
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики.
275
272
276
273
\begin{example}
277
274
\label{CYK_algorithm_ex}
@@ -474,12 +471,12 @@ \section{Алгоритм для графов на основе CYK}
474
471
m = r = \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2)\}
475
472
$$
476
473
477
-
\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$возврпщает его голову, оставляя хвост.
474
+
\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$возвращает его голову, оставляя хвост.
478
475
Новые элементы добавляются в конец.
479
476
\begin{enumerate}
480
477
\item Обрабатываем $(A,0,1)$.
481
478
Ни один из вложенных циклов не найдёт новых путей, так как для рассматриваемого ребра есть только две возможности достроить путь: $2\xrightarrow{A} 0\xrightarrow{A} 1$ и $0\xrightarrow{A} 1\xrightarrow{A} 2$
482
-
и ни одна из соответствующих строк не выводтся в заданной граммтике.
479
+
и ни одна из соответствующих строк не выводтся в заданной грамматике.
0 commit comments