Skip to content

Commit 6cd51f4

Browse files
committed
Merge branch 'LinAl' into dev
2 parents 4e977b8 + 401d817 commit 6cd51f4

17 files changed

+485
-457
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
## Скачать pdf
2222

23-
* Текущую версию можно найти в [артефактах сборки](https://github.com/JetBrains-Research/FormalLanguageConstrainedReachability-LectureNotes/actions/runs/1004758399).
23+
* Текущую версию можно найти в [артефактах сборки](https://github.com/JetBrains-Research/FormalLanguageConstrainedReachability-LectureNotes/actions).
2424
* Официальные "издания" можно найти в [релизах](https://github.com/JetBrains-Research/FormalLanguageConstrainedReachability-LectureNotes/releases).
2525

2626
## Собрать из исходников

tex/CYK_for_CFPQ.tex

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,31 @@ \chapter{CYK для вычисления КС запросов}\label{chpt:CFPQ_
66

77
\section{Алгоритм CYK}\label{sect:lin_CYK}
88

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}.
1010

11-
Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно,данный алгоритм применим для работы с произвольными контекстно-своболными языками.
11+
Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно, данный алгоритм применим для работы с произвольными контекстно-своболными языками.
1212

1313
В основе алгоритма лежит принцип динамического программирования. Используются два соображения:
1414

1515
\begin{enumerate}
16-
\item Для правила вида $A \to a$ очевидно, что из $A$ выводится $\omega$ (с применением этого правила) тогда и только тогда, когда $a = \omega$:
17-
16+
\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to a$ тогда и только тогда, когда $a= \omega$:
1817
\[
1918
A \derives \omega \iff \omega = a
2019
\]
2120

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$:
2422
\[
2523
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
2624
\]
2725

28-
Или в терминах позиций в строке:
29-
26+
Переформулируем эти утверждения в терминах позиций в строке:
3027
\[
3128
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|]
3229
\]
3330
\end{enumerate}
3431

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]\].
3634

3735
Первым шагом инициализируем матрицу, заполнив значения $M[i, i, A]$:
3836

@@ -43,7 +41,6 @@ \section{Алгоритм CYK}\label{sect:lin_CYK}
4341

4442
Далее используем динамику: на шаге $m > 1$ предполагаем, что ячейки матрицы $M[i', j', A]$ заполнены для всех нетерминалов $A$ и пар $i', j': j' - i' < m$.
4543
Тогда можно заполнить ячейки матрицы $M[i, j, A] \text{, где } j - i = m$ следующим образом:
46-
4744
\[ M[i, j, A] = \bigvee_{A \to B C}^{}{\bigvee_{k=i}^{j-1}{M[i, k, B] \wedge M[k, j, C]}} \]
4845

4946
По итогу работы алгоритма значение в ячейке $M[0, |\omega|, S]$, где $S$ --- стартовый нетерминал грамматики, отвечает на вопрос о выводимости цепочки $\omega$ в грамматике.
@@ -239,7 +236,7 @@ \section{Алгоритм для графов на основе CYK}
239236
\begin{itemize}
240237
\item Как и раньше, с помощью продукций вида \[A \to a \text{, где } A \in N, a \in \Sigma\]
241238
заменяем терминалы на ребрах входного графа на множества нетерминалов, из которых они выводятся.
242-
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной граммтике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$
239+
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной грамматике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$
243240
\end{itemize}
244241

245242
Затем используем матрицу смежности получившегося графа (обозначим ее $M$) в качестве начального значения. Дальнейший ход алгоритма можно описать псевдокодом, представленным в листинге~\ref{alg:graphParseCYK}.
@@ -271,7 +268,7 @@ \section{Алгоритм для графов на основе CYK}
271268
\end{algorithmic}
272269
\end{algorithm}
273270

274-
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и граммтики.
271+
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики.
275272

276273
\begin{example}
277274
\label{CYK_algorithm_ex}
@@ -474,12 +471,12 @@ \section{Алгоритм для графов на основе CYK}
474471
m = r = \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2)\}
475472
$$
476473

477-
\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возврпщает его голову, оставляя хвост.
474+
\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возвращает его голову, оставляя хвост.
478475
Новые элементы добавляются в конец.
479476
\begin{enumerate}
480477
\item Обрабатываем $(A,0,1)$.
481478
Ни один из вложенных циклов не найдёт новых путей, так как для рассматриваемого ребра есть только две возможности достроить путь: $2 \xrightarrow{A} 0 \xrightarrow{A} 1$ и $0 \xrightarrow{A} 1 \xrightarrow{A} 2$
482-
и ни одна из соответствующих строк не выводтся в заданной граммтике.
479+
и ни одна из соответствующих строк не выводтся в заданной грамматике.
483480
\item Перед началом итерации
484481
$$
485482
m = \{(A,1,2),(A,2,0),(B,2,3),(B,3,2)\},

0 commit comments

Comments
 (0)