diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2b72339..6380da9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,69 +1,42 @@ -# This is a basic workflow to help you get started with Actions +name: Build latest PDF -name: CI - -# Controls when the workflow will run on: - # Triggers the workflow on push or pull request events but only for the main branch push: + branches: + # PRs can only use caches from their target branch. We therefore need to + # make sure we run on 'main' too. + - main pull_request: - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: -# A workflow run is made up of one or more jobs that can run sequentially or in parallel +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on + style: + name: Build latest PDF runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - name: Set up Git repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - # First run of pdflatex. - - name: First pdflatex FormalLanguageConstrainedReachabilityLectureNotes - uses: dante-ev/latex-action@latest + - name: Cache TikZ externalized pictures + uses: actions/cache@v4 with: - working_directory: tex - root_file: FormalLanguageConstrainedReachabilityLectureNotes.tex - compiler: pdflatex - args: -interaction=nonstopmode -shell-escape - - # Bibliography generation - - name: bibtex FormalLanguageConstrainedReachabilityLectureNotes - uses: dante-ev/latex-action@latest - with: - working_directory: tex - root_file: FormalLanguageConstrainedReachabilityLectureNotes.aux - compiler: bibtex - args: - - # Second compilation - - name: Second pdflatex FormalLanguageConstrainedReachabilityLectureNotes - uses: dante-ev/latex-action@latest + path: tex/figures/externalized + key: tikz-externalized + + - name: Compile LaTeX document + uses: xu-cheng/latex-action@v3 with: - working_directory: tex - root_file: FormalLanguageConstrainedReachabilityLectureNotes.tex - compiler: pdflatex - args: -interaction=nonstopmode -shell-escape - - # Final compilation - - name: Final pdflatex FormalLanguageConstrainedReachabilityLectureNotes - uses: dante-ev/latex-action@latest + root_file: tex/FormalLanguageConstrainedReachabilityLectureNotes.tex + work_in_root_file_dir: true + latexmk_use_lualatex: true + extra_system_packages: "font-liberation" + latexmk_shell_escape: true + + - name: Upload PDF file + uses: actions/upload-artifact@v4 with: - working_directory: tex - root_file: FormalLanguageConstrainedReachabilityLectureNotes.tex - compiler: pdflatex - args: -interaction=nonstopmode -shell-escape - - # Publish compiled pdf - - name: Upload - uses: actions/upload-artifact@v2 - with: name: FormalLanguageConstrainedReachabilityLectureNotes_latest path: tex/FormalLanguageConstrainedReachabilityLectureNotes.pdf - diff --git a/.gitignore b/.gitignore index 6d8abb8..3263f3f 100644 --- a/.gitignore +++ b/.gitignore @@ -276,3 +276,5 @@ TSWLatexianTemp* *.lpz tex/FormalLanguageConstrainedReachabilityLectureNotes.pdf +tex/figures/externalized/* +!tex/figures/externalized/.gitkeep diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..d9e6a8a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "james-yu.latex-workshop" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6ed6f7e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,44 @@ +{ + "latex-workshop.latex.recipes": [ + { + "name": "latexmk (lualatex)", + "tools": [ + "lualatexmk" + ] + }, + ], + "files.exclude": { + "**/**.aux": true, + "**/**.bbl": true, + "**/**.bcf": true, + "**/**.blg": true, + "**/**.fdb_latexmk": true, + "**/**.fls": true, + "**/**.log": true, + "**/**.out": true, + "**/**.run.xml": true, + "**/**.synctex.gz": true, + "**/**.synctex(busy)": true, + "**/**.toc": true + }, + "editor.formatOnSave": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "latex-workshop.latex.tools": [ + { + "name": "lualatexmk", + "command": "latexmk", + "args": [ + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-lualatex", + "-shell-escape", + "-outdir=%OUTDIR%", + "%DOC%" + ], + "env": {} + }, + ], +} diff --git a/tex/CYK_for_CFPQ.tex b/tex/CYK_for_CFPQ.tex index 5742ef6..a4da827 100644 --- a/tex/CYK_for_CFPQ.tex +++ b/tex/CYK_for_CFPQ.tex @@ -1,732 +1,732 @@ -\chapter{CYK для вычисления КС запросов}\label{chpt:CFPQ_CYK} - -В данной главе мы рассмотрим алгоритм CYK, позволяющий установить принадлежность слова грамматике и предоставить его вывод, если таковой имеется. - -Наш главный интерес заключается в возможности применения данного алгоритма для решения описанной в предыдущей главе задачи --- поиска путей с ограничениями в терминах формальных языков. Как уже было указано выше, будем рассматривать случай контекстно-свободных языков. - -\section{Алгоритм CYK}\label{sect:lin_CYK} - -Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной грамматике~\cite{Hopcroft+Ullman/79/Introduction}. - -Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно, данный алгоритм применим для работы с произвольными контекстно-своболными языками. - -В основе алгоритма лежит принцип динамического программирования. Используются два соображения: - -\begin{enumerate} -\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to a$ тогда и только тогда, когда $a= \omega$: -\[ - A \derives \omega \iff \omega = a -\] - -\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to B C$ тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1 \omega_2$: -\[ -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 -\] - -Переформулируем эти утверждения в терминах позиций в строке: -\[ -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|] -\] -\end{enumerate} - -В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что -\[M[i, j, A] = true \iff A \derives \omega[i \dots j]\]. - -Первым шагом инициализируем матрицу, заполнив значения $M[i, i, A]$: - -\begin{itemize} - \item $M[i, i, A] = true \text{, если в грамматике есть правило } A \to \omega[i]$. - \item $M[i, i, A] = false$, иначе. -\end{itemize} - -Далее используем динамику: на шаге $m > 1$ предполагаем, что ячейки матрицы $M[i', j', A]$ заполнены для всех нетерминалов $A$ и пар $i', j': j' - i' < m$. -Тогда можно заполнить ячейки матрицы $M[i, j, A] \text{, где } j - i = m$ следующим образом: -\[ M[i, j, A] = \bigvee_{A \to B C}^{}{\bigvee_{k=i}^{j-1}{M[i, k, B] \wedge M[k, j, C]}} \] - -По итогу работы алгоритма значение в ячейке $M[0, |\omega|, S]$, где $S$ --- стартовый нетерминал грамматики, отвечает на вопрос о выводимости цепочки $\omega$ в грамматике. - -\begin{example}\label{exampl:CYK} - Рассмотрим пример работы алгоритма CYK на грамматике правильных скобочных последовательностей в Нормальной Форме Хомского. - - -\begin{align*} -S &\to A S_2 \mid \varepsilon & S_2 &\to b \mid B S_1 \mid S_1 S_3 & A &\to a \\ -S_1 &\to A S_2 & S_3 &\to b \mid B S_1 & B &\to b\\ -\end{align*} - -Проверим выводимость цепочки $\omega = a a b b a b$. - -Так как трехмерные матрицы рисовать на двумерной бумаге не очень удобно, мы будем иллюстрировать работу алгоритма двумерными матрицами размера $n \times n$, где в ячейках указано множество нетерминалов, выводящих соответствующую подстроку. - -Шаг 1. Инициализируем матрицу элементами на главной диагонали: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - -Шаг 2. Заполняем диагональ, находящуюся над главной: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \{A\} & \cellcolor{lightgray}\{S_1\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \cellcolor{lightgray}\{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - -В двух ячейках появилисб нетерминалы $S_1$ благодяря присутствиб в грамматике правила $S_1 \to A S_2$. - -Шаг 3. Заполняем следующую диагональ: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \{A\} & \{S_1\} & \cellcolor{lightgray}\{S_2\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \cellcolor{lightgray}\{S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - -Шаг 4. И следующую за ней: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \cellcolor{lightgray}\{S_1, S\} & \varnothing & \varnothing \\ -\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - -Шаг 5 Заполняем предпоследнюю диагональ: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \varnothing \\ -\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \cellcolor{lightgray}\{S_2\} \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - -\bigbreak -Шаг 6. Завершаем выполнение алгоритма: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \cellcolor{lightgray}\{S_1, S\} \\ -\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \{S_2\} \\ -\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\end{pmatrix} -\] - - -Стартовый нетерминал находится в верхней правой ячейке, а значит цепочка $a a b b a b$ выводима в нашей грамматике. -\end{example} - -\begin{example} -Теперь выполним алгоритм на цепочке $\omega=abaa$. - -Шаг 1. Инициализируем таблицу: - -\[ -\begin{pmatrix} -\{A\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{A\} & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{A\} \\ -\end{pmatrix} -\] - -Шаг 2. Заполняем следующую диагональ: - -\[ -\begin{pmatrix} -\{A\} & \cellcolor{lightgray}\{S_1, S\} & \varnothing & \varnothing \\ -\varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{A\} & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{A\} \\ -\end{pmatrix} -\] - -Больше ни одну ячейку в таблице заполнить нельзя и при этом стартовый нетерминал отсутствует в правой верхней ячейке, а значит эта строка не выводится в грамматике правильных скобочных последовательностей. - -\end{example} - -\section{Алгоритм для графов на основе CYK} -\label{graph:CYK} -Первым шагом на пути к решению задачи достижимости с использованием CYK является модификация представления входа. Прежде мы сопоставляли каждому символу слова его позицию во входной цепочке, поэтому при инициализации заполняли главную диагональ матрицы. Теперь вместо этого обозначим числами позиции между символами. В результате слово можно представить в виде линейного графа следующим образом(в качестве примера рассмотрим слово $a a b b a b$ из предыдущей главы~\ref{sect:lin_CYK}): - -\begin{center} - \begin{tikzpicture}[shorten >=1pt,on grid,auto] - \node[state] (q_0) at (0,0) {$0$}; - \node[state] (q_1) at (2,0) {$1$}; - \node[state] (q_2) at (4,0) {$2$}; - \node[state] (q_3) at (6,0) {$3$}; - \node[state] (q_4) at (8,0) {$4$}; - \node[state] (q_5) at (10,0) {$5$}; - \node[state] (q_6) at (12,0) {$6$}; - \path[->] - (q_0) edge node {$a$} (q_1) - (q_1) edge node {$a$} (q_2) - (q_2) edge node {$b$} (q_3) - (q_3) edge node {$b$} (q_4) - (q_4) edge node {$a$} (q_5) - (q_5) edge node {$b$} (q_6); - \end{tikzpicture} -\end{center} - -Что нужно изменить в описании алгоритма, чтобы он продолжал работать при подобной нумерации? Каждая буква теперь идентифицируется не одним числом, а парой --- номера слева и справа от нее. При этом чисел стало на одно больше, чем при прежнем способе нумерации. - -Возьмем матрицу $(n + 1) \times (n + 1) \times |N|$ и при инициализации будем заполнять не главную диагональ, а диагональ прямо над ней. Таким образом, мы начинаем наш алгоритм с определения значений $M[i, j, A] \text{, где } j = i + 1$. При этом наши дальнейшие действия в рамках алгоритма не изменятся. - -Для примера~\ref{exampl:CYK} на шаге инициализации матрица выглядит следующим образом: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ - -\end{pmatrix} -\] - -А в результате работы алгоритма имеем: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \{S_1, S\} \\ -\varnothing & \varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \{S_2\} \\ -\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ -\varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ -\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ -\end{pmatrix} -\] - -Мы представили входную строку в виде линейного графа, а на шаге инициализации получили его матрицу смежности. Добавление нового нетерминала в язейку матрицы можно рассматривать как нахождение нового пути между соответствующими вершинами, выводимого из добавленного нетерминала. Таким образом, шаги алгоритма напоминают построение транзитивного замыкания графа. Различие заключается в том, что мы добавляем новые ребра только для тех пар нетерминалов, для которых существует соответстующее правило в грамматике. - -Алгоритм можно обобщить и на произвольные графы с метками, рассматриваемые в этом курсе. При этом можно ослабить ограничение на форму входной грамматики: она должна находиться в ослабленной Нормальной Форме Хомского~(\ref{defn:wCNF}). - -Шаг инициализации в алгоритме теперь состоит из двух пунктов. -\begin{itemize} -\item Как и раньше, с помощью продукций вида \[A \to a \text{, где } A \in N, a \in \Sigma\] -заменяем терминалы на ребрах входного графа на множества нетерминалов, из которых они выводятся. -\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной грамматике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$ -\end{itemize} - - Затем используем матрицу смежности получившегося графа (обозначим ее $M$) в качестве начального значения. Дальнейший ход алгоритма можно описать псевдокодом, представленным в листинге~\ref{alg:graphParseCYK}. - -\begin{algorithm}[H] - \begin{algorithmic}[1] - \caption{Алгоритм КС достижимости на основе CYK} - \label{alg:graphParseCYK} - \Function{contextFreePathQuerying}{G, $\mathcal{G}$} - - \State{$n \gets$ the number of nodes in $\mathcal{G}$} - \State{$M \gets$ the modified adjacency matrix of $\mathcal{G}$} - \State{$P \gets$ the set of production rules in $G$} - \While{$M$ is changing} - \For {$k \in 0..n$} - \For {$i \in 0..n$} - \For {$j \in 0..n$} - \ForAll {$N_1 \in M[i, k]$, $N_2 \in M[k, j]$} - \If {$N_3 \to N_1 N_2 \in P$ } - \State{$M[i, j] \mathrel{+}= \{N_3\}$} - \EndIf - \EndFor - \EndFor - \EndFor - \EndFor - \EndWhile - \State \Return $M$ - \EndFunction - \end{algorithmic} -\end{algorithm} - -После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики. - -\begin{example} -\label{CYK_algorithm_ex} -Рассмотрим работу алгоритма на графе - -\begin{center} - \input{figures/graph/graph0.tex} -\end{center} - -и грамматике: - -\begin{align*} -S & \to A B & A & \to a \\ -S & \to A S_1 & B & \to b\\ -S_1 & \to S B &&\\ -\end{align*} - -Данный пример является классическим и еще не раз будет использоваться в рамках данного курса. \\ - -\textbf{Инициализация.} -Заменяем терминалы на ребрах графа на нетерминалы, из которых они выводятся, и строим матрицу смежности получившегося графа: - -\begin{center} - \input{figures/cyk/graph1.tex} -\end{center} - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \{A\} & \varnothing \\ -\{A\} & \varnothing & \varnothing & \{B\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 1.} -Итерируемся по $k$, $i$ и $j$, пытаясь найти пары нетерминалов, для которых существуют правила вывода, их выводящие. Нам интересны следующие случаи: - -\begin{itemize} - \item $k = 2, i = 1, j = 3: A \in M[1, 2], B \in M[2, 3]$, так как в грамматике присутствует правило $S \to A B$, добавляем нетерминал $S$ в ячейку $M[1, 3]$. - \item $k = 3, i = 1, j = 2: S \in M[1, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[1, 2]$. -\end{itemize} - -В остальных случаях либо какая-то из клеток пуста, либо не существует продукции в грамматике, выводящей данные два нетерминала. - -Матрица после данной итерации: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \varnothing & \varnothing \\ -\varnothing & \varnothing & \cellcolor{lightgray}\{A, \boldsymbol{S_1}\} & \cellcolor{lightgray}\{S\} \\ -\{A\} & \varnothing & \varnothing & \{B\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 2.} -Снова итерируемся по $k$, $i$, $j$. Рассмотрим случаи: - -\begin{itemize} - \setlength\itemsep{1em} - \item $k = 1, i = 0, j = 2: A \in M[0, 1], S_1 \in M[1, 2]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[0, 2]$. - \item $k = 2, i = 0, j = 3: S \in M[0, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[0, 3]$. -\end{itemize} - -Матрица на данном шаге: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \cellcolor{lightgray}\{S\} & \cellcolor{lightgray}\{S_1\} \\ -\varnothing & \varnothing & \{A, S_1\} & \{S\} \\ -\{A\} & \varnothing & \varnothing & \{B\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 3.} -Рассматриваемые на данном шаге случаи: - -\begin{itemize} - \setlength\itemsep{1em} - \item $k = 0, i = 2, j = 3: A \in M[2, 0], S_1 \in M[0, 3]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[2, 3]$. - \item $k = 3, i = 2, j = 2: S \in M[2, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[2, 2]$. -\end{itemize} - -Матрица после этой итерации: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \{S\} & \{S_1\} \\ -\varnothing & \varnothing & \{A, S_1\} & \{S\} \\ -\{A\} & \varnothing & \cellcolor{lightgray}\{S_1\} & \cellcolor{lightgray}\{B, \boldsymbol{S}\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 4.} -Рассмариваемые случаи: - -\begin{itemize} - \setlength\itemsep{1em} - \item $k = 2, i = 1, j = 2: A \in M[1, 2], S_1 \in M[2, 2]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[1, 2]$. - \item $k = 2, i = 1, j = 3: S \in M[1, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[1, 3]$. -\end{itemize} - -Матрица: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \{S\} & \{S_1\} \\ -\varnothing & \varnothing & \cellcolor{lightgray}\{A, \boldsymbol{S}, S_1\} & \cellcolor{lightgray}\{S, \boldsymbol{S_1}\} \\ -\{A\} & \varnothing & \{S_1\} & \{B, S\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 5.} -Рассмотрим на это шаге: - -\begin{itemize} - \setlength\itemsep{1em} - \item $k = 1, i = 0, j = 3: A \in M[0, 1], S_1 \in M[1, 3]$, поскольку в грамматике есть правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[0, 3]$. - \item $k = 3, i = 0, j = 2: S \in M[0, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[0, 2]$. -\end{itemize} - -Матрица на этой итерации: -\[ -\begin{pmatrix} -\varnothing & \{A\} & \cellcolor{lightgray}\{S, \boldsymbol{S_1}\} & \cellcolor{lightgray}\{\boldsymbol{S}, S_1\} \\ -\varnothing & \varnothing & \{A, S, S_1\} & \{S, S_1\} \\ -\{A\} & \varnothing & \{S_1\} & \{B, S\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -\textbf{Итерация 6.} -Интересующие нас на этом шаге случаи: - -\begin{itemize} - \setlength\itemsep{1em} - \item $k = 0, i = 2, j = 2: A \in M[2, 0], S_1 \in M[0, 2]$, поскольку в грамматике есть правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[2, 2]$. - \item $k = 2, i = 2, j = 3: S \in M[2, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[2, 3]$. -\end{itemize} - -Матрица после данного шага: - -\[ -\begin{pmatrix} -\varnothing & \{A\} & \{S, S_1\} & \{S, S_1\} \\ -\varnothing & \varnothing & \{A, S, S_1\} & \{S, S_1\} \\ -\{A\} & \varnothing & \cellcolor{lightgray}\{\boldsymbol{S}, S_1\} & \cellcolor{lightgray}\{B, S, \boldsymbol{S_1}\} \\ -\varnothing & \varnothing & \{B\} & \varnothing \\ -\end{pmatrix} -\] - -На следующей итерации матрица не изменяется, поэтому заканчиваем работу алгоритма. В результате, если ячейка $M[i, j]$ содержит стартовый нетерминал $S$, то существует путь из $i$ в $j$, удовлетворяющий ограничениям, заданным грамматикой. -\end{example} - -Можно заметить, что мы делаем много лишних итераций. -Можно переписать алгоритм так, чтобы он не просматривал заведомо пустые ячейки. -Данную модификацию предложил Й.Хеллингс в работе~\cite{hellingsRelational}, также она реализована в работе~\cite{10.1007/978-3-319-46523-4_38}. - -Псевдокод алгоритма Хеллингса представлен в листинге~\ref{alg:graphParseHellings}. - -\begin{algorithm}[H] - \begin{algorithmic}[1] - \caption{Алгоритм Хеллингса} - \label{alg:graphParseHellings} - \Function{contextFreePathQuerying}{$G= \langle \Sigma, N, P, S \rangle$, $\mathcal{G} = \langle V,E,L \rangle$} - - \State{$r \gets \{(N_i,v,v) \mid v \in V \wedge N_i \to \varepsilon \in P \} \cup \{(N_i,v,u) \mid (v,t,u) \in E \wedge N_i \to t \in P \}$} - \State{$m \gets r$} - \While{$m \neq \varnothing$} - \State{$(N_i,v,u) \gets$ m.pick()} - \For {$(N_j,v',v) \in r$} - \For {$N_k \to N_j N_i \in P$ таких что $((N_k, v',u) \notin r)$} - \State{$m \gets m \cup \{(N_k, v',u)\}$} - \State{$r \gets r \cup \{(N_k, v',u)\}$} - \EndFor - \EndFor - \For {$(N_j,u,v') \in r$} - \For {$N_k \to N_i N_j \in P$ таких что $((N_k, v, v') \notin r)$} - \State{$m \gets m \cup \{(N_k, v, v')\}$} - \State{$r \gets r \cup \{(N_k, v, v')\}$} - \EndFor - \EndFor - - \EndWhile - \State \Return $r$ - \EndFunction - \end{algorithmic} -\end{algorithm} - - -\begin{example} - Запустим алгоритм Хеллингса на нашем примере. - - \textbf{Инициализация} - $$ - m = r = \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2)\} - $$ - - \textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возвращает его голову, оставляя хвост. - Новые элементы добавляются в конец. - \begin{enumerate} - \item Обрабатываем $(A,0,1)$. - Ни один из вложенных циклов не найдёт новых путей, так как для рассматриваемого ребра есть только две возможности достроить путь: $2 \xrightarrow{A} 0 \xrightarrow{A} 1$ и $0 \xrightarrow{A} 1 \xrightarrow{A} 2$ - и ни одна из соответствующих строк не выводтся в заданной грамматике. - \item Перед началом итерации - $$ - m = \{(A,1,2),(A,2,0),(B,2,3),(B,3,2)\}, - $$ $r$ не изменилось. - Обрабатываем $(A,1,2)$. - В данной ситуации второй цикл найдёт тройку $(B,2,3)$ и соответсвующее правило $S \to A \ B$. - Это значит, что и в $m$ и в $r$ добавится тройка $(S, 1, 3)$. - \item - Перед началом итерации - $$ - m = \{(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. - $$ - Обрабатываем $(A,2,0)$. - Внутринние циклы ничего не найдут, новых путей н появится. - \item - Перед началом итерации - $$ - m = \{(B,2,3),(B,3,2),(S,1,3)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. - $$ - Обрабатываем $(B,2,3)$. - Первый цикл мог бы найти $(A,1,2)$, однако при проверке во вложенном цикле выяснится, что $(S, 1, 3)$ уже найдена. - В итоге, на данной итерации новых путей н появится. - \item - Перед началом итерации - $$ - m = \{(B,3,2),(S,1,3)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. - $$ - Обрабатываем $(B,3,2)$. - Первый цикл найдёт $(S,1,3)$ и соответствующее правило $S_1 \to S \ B$. - Это значит, что и в $m$ и в $r$ добавится тройка $(S_1, 1, 2)$. - \item - Перед началом итерации - $$ - m = \{(S,1,3),(S_1, 1, 2)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2)\}. - $$ - Обрабатываем $(S,1,3)$. - Второй цикл мог бы найти $(B,3,2)$, однако при проверке во вложенном цикле выяснится, что $(S_1, 1, 2)$ уже найдена. - В итоге, на данной итерации новых путей н появится. - \item - Перед началом итерации - $$ - m = \{(S_1, 1, 2)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2)\}. - $$ - Обрабатываем $(S_1,1,2)$. - Первый цикл найдёт $(A,0,1)$ и соответствующее правило $S \to A \ S_1$. - Это значит, что и в $m$ и в $r$ добавится тройка $(S, 0, 2)$. - - \item - Перед началом итерации - $$ - m = \{(S, 0, 2)\}, - $$ - $$ - r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2)\}. - $$ - Обрабатываем $(S, 0, 2)$. - Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. - B $m$ и в $r$ добавится тройка $(S_1, 0, 3)$. - - \item - Перед началом итерации - $$ - m = \{(S_1, 0, 3)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3)\}. - \end{align*} - Обрабатываем $(S_1, 0, 3)$. - Найдено: $(A,2,0)$ и соответствующее правило $S \to A \ S_1$. - B $m$ и в $r$ добавится тройка $(S, 2, 3)$. - - \item - Перед началом итерации - $$ - m = \{(S, 2, 3)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3)\}. - \end{align*} - - Обрабатываем $(S, 2, 3)$. - Найдено: $(B,3,2)$ и соответствующее правило $S_1 \to S \ B$. - B $m$ и в $r$ добавится тройка $(S_1, 2, 2)$. - - \item - Перед началом итерации - $$ - m = \{(S_1, 2, 2)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2)\}. - \end{align*} - Обрабатываем $(S_1, 2, 2)$. - Найдено: $(A,1,2)$ и соответствующее правило $S \to A \ S_1$. - B $m$ и в $r$ добавится тройка $(S, 1, 2)$. - - \item - Перед началом итерации - $$ - m = \{(S, 1, 2)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2)\}. - \end{align*} - Обрабатываем $(S, 1, 2)$. - Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. - B $m$ и в $r$ добавится тройка $(S_1, 1, 3)$. - - \item - Перед началом итерации - $$ - m = \{(S_1, 1, 3)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3)\}. - \end{align*} - Обрабатываем $(S_1, 1, 3)$. - Найдено: $(A,0,1)$ и соответствующее правило $S \to A \ S_1$. - B $m$ и в $r$ добавится тройка $(S, 0, 3)$. - - \item - Перед началом итерации - $$ - m = \{(S, 0, 3)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3)\}. - \end{align*} - Обрабатываем $(S, 0, 3)$. - Найдено: $(B,3,2)$ и соответствующее правило $S_1 \to S \ B$. - B $m$ и в $r$ добавится тройка $(S_1, 0, 2)$. - - \item - Перед началом итерации - $$ - m = \{(S_1, 0, 2)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2)\}. - \end{align*} - Обрабатываем $(S_1, 0, 2)$. - Найдено: $(A,2,0)$ и соответствующее правило $S \to A \ S_1$. - B $m$ и в $r$ добавится тройка $(S, 2, 2)$. - - \item - Перед началом итерации - $$ - m = \{(S, 2, 2)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2),\\ - &(S, 2, 2)\}. - \end{align*} - Обрабатываем $(S, 2, 2)$. - Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. - B $m$ и в $r$ добавится тройка $(S_1, 2, 3)$. - - \item - Перед началом итерации - $$ - m = \{(S_1, 2, 3)\}, - $$ - \begin{align*} - r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ - &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2),\\ - &(S, 2, 2),(S_1, 2, 3)\}. - \end{align*} - Обрабатываем $(S_1, 2, 3)$. - Могло бы быть найдено: $(A,1,2)$ и соответствующее правило $S \to A \ S_1$, однако тройка $(S, 1, 3)$ уже есть в $r$. - А значит никаких новых троек найдено не будет и $m$ становится пустым. - Это была последняя итерация внешнего цикла, в $r$ на текущий момент уже содержится всё ршение. - - \end{enumerate} - -\end{example} - -Как можно заметить, количество итераций внешнего цикла также получилось достаточно большим. -Проверьте, зависит ли оно от порядка обработки элементов из $m$. -При этом внутренние циклы в нашем случае достаточно короткие, так как просматриваются только ``существенные'' элементы и избегается дублирование. - -%\section{Вопросы и задачи} -%\begin{enumerate} -% \item Проверить работу алгоритма CYK для цепочек на грамматике -% \begin{flushleft} -% $E \to E + E$ \\ -% $E \to E * E$ \\ -% $E \to (E)$ \\ -% $E \to n$ \\ -% \end{flushleft} -% и словах (алфавит $\Sigma = \{n, +, *, (, )\}$) -% \begin{flushleft} -% $ (n + n) * n$ \\ -% $ n + n * n$ \\ -% $n + n + n + n$ \\ -% $n + (n * n) + n$ \\ -% \end{flushleft} -% -% \item Изучить вычислительную сложность алгоритма CYK для матриц в зависимости от размера входного графа (размер грамматики считать фиксированным). -% -% \item Проверить работу алгоритма CYK для графов на графе -% -% \begin{center} -% \begin{tikzpicture}[node distance=3cm,shorten >=1pt,on grid,auto] -% \node[state] (q_0) {$0$}; -% \node[state] (q_1) [right=of q_0] {$1$}; -% \node[state] (q_2) [right=of q_1] {$2$}; -% \node[state] (q_3) [right=of q_2] {$3$}; -% \node[state] (q_4) [right=of q_3] {$4$}; -% \path[->] -% (q_0) edge node {$a$} (q_1) -% (q_1) edge node {$b$} (q_2) -% (q_2) edge node {$a$} (q_3) -% (q_3) edge node {$b$} (q_4) -% (q_1) edge[bend left, above] node {$b$} (q_3) -% (q_4) edge[bend left, below] node {$a$} (q_1); -% \end{tikzpicture} -% \end{center} -% -% И грамматике -% -% \begin{flushleft} -% $S \to S S$ \\ -% $S \to A B$ \\ -% $A \to a$ \\ -% $B \to b$ \\ -% \end{flushleft} -% -% \item Оцените временную сложность алгоритма Хеллингса и сравните её с оценкой для наивного обобщения CYK. -% -%\end{enumerate} +\chapter{CYK для вычисления КС запросов}\label{chpt:CFPQ_CYK} + +В данной главе мы рассмотрим алгоритм CYK, позволяющий установить принадлежность слова грамматике и предоставить его вывод, если таковой имеется. + +Наш главный интерес заключается в возможности применения данного алгоритма для решения описанной в предыдущей главе задачи --- поиска путей с ограничениями в терминах формальных языков. Как уже было указано выше, будем рассматривать случай контекстно-свободных языков. + +\section{Алгоритм CYK}\label{sect:lin_CYK} + +Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной грамматике~\cite{Hopcroft+Ullman/79/Introduction}. + +Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно, данный алгоритм применим для работы с произвольными контекстно-своболными языками. + +В основе алгоритма лежит принцип динамического программирования. Используются два соображения: + +\begin{enumerate} +\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to a$ тогда и только тогда, когда $a= \omega$: +\[ + A \derives \omega \iff \omega = a +\] + +\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to B C$ тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1 \omega_2$: +\[ +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 +\] + +Переформулируем эти утверждения в терминах позиций в строке: +\[ +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|] +\] +\end{enumerate} + +В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что +\[M[i, j, A] = true \iff A \derives \omega[i \dots j]\]. + +Первым шагом инициализируем матрицу, заполнив значения $M[i, i, A]$: + +\begin{itemize} + \item $M[i, i, A] = true \text{, если в грамматике есть правило } A \to \omega[i]$. + \item $M[i, i, A] = false$, иначе. +\end{itemize} + +Далее используем динамику: на шаге $m > 1$ предполагаем, что ячейки матрицы $M[i', j', A]$ заполнены для всех нетерминалов $A$ и пар $i', j': j' - i' < m$. +Тогда можно заполнить ячейки матрицы $M[i, j, A] \text{, где } j - i = m$ следующим образом: +\[ M[i, j, A] = \bigvee_{A \to B C}^{}{\bigvee_{k=i}^{j-1}{M[i, k, B] \wedge M[k, j, C]}} \] + +По итогу работы алгоритма значение в ячейке $M[0, |\omega|, S]$, где $S$ --- стартовый нетерминал грамматики, отвечает на вопрос о выводимости цепочки $\omega$ в грамматике. + +\begin{example}\label{exampl:CYK} + Рассмотрим пример работы алгоритма CYK на грамматике правильных скобочных последовательностей в Нормальной Форме Хомского. + + +\begin{align*} +S &\to A S_2 \mid \varepsilon & S_2 &\to b \mid B S_1 \mid S_1 S_3 & A &\to a \\ +S_1 &\to A S_2 & S_3 &\to b \mid B S_1 & B &\to b\\ +\end{align*} + +Проверим выводимость цепочки $\omega = a a b b a b$. + +Так как трехмерные матрицы рисовать на двумерной бумаге не очень удобно, мы будем иллюстрировать работу алгоритма двумерными матрицами размера $n \times n$, где в ячейках указано множество нетерминалов, выводящих соответствующую подстроку. + +Шаг 1. Инициализируем матрицу элементами на главной диагонали: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + +Шаг 2. Заполняем диагональ, находящуюся над главной: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \{A\} & \cellcolor{lightgray}\{S_1\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \cellcolor{lightgray}\{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + +В двух ячейках появилисб нетерминалы $S_1$ благодяря присутствиб в грамматике правила $S_1 \to A S_2$. + +Шаг 3. Заполняем следующую диагональ: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \{A\} & \{S_1\} & \cellcolor{lightgray}\{S_2\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \cellcolor{lightgray}\{S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + +Шаг 4. И следующую за ней: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \cellcolor{lightgray}\{S_1, S\} & \varnothing & \varnothing \\ +\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + +Шаг 5 Заполняем предпоследнюю диагональ: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \varnothing \\ +\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \cellcolor{lightgray}\{S_2\} \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + +\bigbreak +Шаг 6. Завершаем выполнение алгоритма: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \cellcolor{lightgray}\{S_1, S\} \\ +\varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \{S_2\} \\ +\varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\end{pmatrix} +\] + + +Стартовый нетерминал находится в верхней правой ячейке, а значит цепочка $a a b b a b$ выводима в нашей грамматике. +\end{example} + +\begin{example} +Теперь выполним алгоритм на цепочке $\omega=abaa$. + +Шаг 1. Инициализируем таблицу: + +\[ +\begin{pmatrix} +\{A\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{A\} & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{A\} \\ +\end{pmatrix} +\] + +Шаг 2. Заполняем следующую диагональ: + +\[ +\begin{pmatrix} +\{A\} & \cellcolor{lightgray}\{S_1, S\} & \varnothing & \varnothing \\ +\varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{A\} & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{A\} \\ +\end{pmatrix} +\] + +Больше ни одну ячейку в таблице заполнить нельзя и при этом стартовый нетерминал отсутствует в правой верхней ячейке, а значит эта строка не выводится в грамматике правильных скобочных последовательностей. + +\end{example} + +\section{Алгоритм для графов на основе CYK} +\label{graph:CYK} +Первым шагом на пути к решению задачи достижимости с использованием CYK является модификация представления входа. Прежде мы сопоставляли каждому символу слова его позицию во входной цепочке, поэтому при инициализации заполняли главную диагональ матрицы. Теперь вместо этого обозначим числами позиции между символами. В результате слово можно представить в виде линейного графа следующим образом(в качестве примера рассмотрим слово $a a b b a b$ из предыдущей главы~\ref{sect:lin_CYK}): + +\begin{center} + \begin{tikzpicture}[shorten >=1pt,on grid,auto] + \node[state] (q_0) at (0,0) {$0$}; + \node[state] (q_1) at (2,0) {$1$}; + \node[state] (q_2) at (4,0) {$2$}; + \node[state] (q_3) at (6,0) {$3$}; + \node[state] (q_4) at (8,0) {$4$}; + \node[state] (q_5) at (10,0) {$5$}; + \node[state] (q_6) at (12,0) {$6$}; + \path[->] + (q_0) edge node {$a$} (q_1) + (q_1) edge node {$a$} (q_2) + (q_2) edge node {$b$} (q_3) + (q_3) edge node {$b$} (q_4) + (q_4) edge node {$a$} (q_5) + (q_5) edge node {$b$} (q_6); + \end{tikzpicture} +\end{center} + +Что нужно изменить в описании алгоритма, чтобы он продолжал работать при подобной нумерации? Каждая буква теперь идентифицируется не одним числом, а парой --- номера слева и справа от нее. При этом чисел стало на одно больше, чем при прежнем способе нумерации. + +Возьмем матрицу $(n + 1) \times (n + 1) \times |N|$ и при инициализации будем заполнять не главную диагональ, а диагональ прямо над ней. Таким образом, мы начинаем наш алгоритм с определения значений $M[i, j, A] \text{, где } j = i + 1$. При этом наши дальнейшие действия в рамках алгоритма не изменятся. + +Для примера~\ref{exampl:CYK} на шаге инициализации матрица выглядит следующим образом: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{A\} & \varnothing & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ + +\end{pmatrix} +\] + +А в результате работы алгоритма имеем: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \varnothing & \varnothing & \{S_1, S\} & \varnothing & \{S_1, S\} \\ +\varnothing & \varnothing & \{A\} & \{S_1\} & \{S_2\} & \varnothing & \{S_2\} \\ +\varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \varnothing & \varnothing \\ +\varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} & \varnothing & \{S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{A\} & \{S_1\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \{B, S_2, S_3\} \\ +\varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing & \varnothing \\ +\end{pmatrix} +\] + +Мы представили входную строку в виде линейного графа, а на шаге инициализации получили его матрицу смежности. Добавление нового нетерминала в язейку матрицы можно рассматривать как нахождение нового пути между соответствующими вершинами, выводимого из добавленного нетерминала. Таким образом, шаги алгоритма напоминают построение транзитивного замыкания графа. Различие заключается в том, что мы добавляем новые ребра только для тех пар нетерминалов, для которых существует соответстующее правило в грамматике. + +Алгоритм можно обобщить и на произвольные графы с метками, рассматриваемые в этом курсе. При этом можно ослабить ограничение на форму входной грамматики: она должна находиться в ослабленной Нормальной Форме Хомского~(\ref{defn:wCNF}). + +Шаг инициализации в алгоритме теперь состоит из двух пунктов. +\begin{itemize} +\item Как и раньше, с помощью продукций вида \[A \to a \text{, где } A \in N, a \in \Sigma\] +заменяем терминалы на ребрах входного графа на множества нетерминалов, из которых они выводятся. +\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной грамматике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$ +\end{itemize} + + Затем используем матрицу смежности получившегося графа (обозначим ее $M$) в качестве начального значения. Дальнейший ход алгоритма можно описать псевдокодом, представленным в листинге~\ref{alg:graphParseCYK}. + +\begin{algorithm}[H] + \begin{algorithmic}[1] + \caption{Алгоритм КС достижимости на основе CYK} + \label{alg:graphParseCYK} + \Function{contextFreePathQuerying}{G, $\mathcal{G}$} + + \State{$n \gets$ the number of nodes in $\mathcal{G}$} + \State{$M \gets$ the modified adjacency matrix of $\mathcal{G}$} + \State{$P \gets$ the set of production rules in $G$} + \While{$M$ is changing} + \For {$k \in 0..n$} + \For {$i \in 0..n$} + \For {$j \in 0..n$} + \ForAll {$N_1 \in M[i, k]$, $N_2 \in M[k, j]$} + \If {$N_3 \to N_1 N_2 \in P$ } + \State{$M[i, j] \mathrel{+}= \{N_3\}$} + \EndIf + \EndFor + \EndFor + \EndFor + \EndFor + \EndWhile + \State \Return $M$ + \EndFunction + \end{algorithmic} +\end{algorithm} + +После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики. + +\begin{example} +\label{CYK_algorithm_ex} +Рассмотрим работу алгоритма на графе + +\begin{center} + \input{figures/graph/graph0.tex} +\end{center} + +и грамматике: + +\begin{align*} +S & \to A B & A & \to a \\ +S & \to A S_1 & B & \to b\\ +S_1 & \to S B &&\\ +\end{align*} + +Данный пример является классическим и еще не раз будет использоваться в рамках данного курса. \\ + +\textbf{Инициализация.} +Заменяем терминалы на ребрах графа на нетерминалы, из которых они выводятся, и строим матрицу смежности получившегося графа: + +\begin{center} + \input{figures/cyk/graph1.tex} +\end{center} + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \{A\} & \varnothing \\ +\{A\} & \varnothing & \varnothing & \{B\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 1.} +Итерируемся по $k$, $i$ и $j$, пытаясь найти пары нетерминалов, для которых существуют правила вывода, их выводящие. Нам интересны следующие случаи: + +\begin{itemize} + \item $k = 2, i = 1, j = 3: A \in M[1, 2], B \in M[2, 3]$, так как в грамматике присутствует правило $S \to A B$, добавляем нетерминал $S$ в ячейку $M[1, 3]$. + \item $k = 3, i = 1, j = 2: S \in M[1, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[1, 2]$. +\end{itemize} + +В остальных случаях либо какая-то из клеток пуста, либо не существует продукции в грамматике, выводящей данные два нетерминала. + +Матрица после данной итерации: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \varnothing & \varnothing \\ +\varnothing & \varnothing & \cellcolor{lightgray}\{A, \boldsymbol{S_1}\} & \cellcolor{lightgray}\{S\} \\ +\{A\} & \varnothing & \varnothing & \{B\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 2.} +Снова итерируемся по $k$, $i$, $j$. Рассмотрим случаи: + +\begin{itemize} + \setlength\itemsep{1em} + \item $k = 1, i = 0, j = 2: A \in M[0, 1], S_1 \in M[1, 2]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[0, 2]$. + \item $k = 2, i = 0, j = 3: S \in M[0, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[0, 3]$. +\end{itemize} + +Матрица на данном шаге: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \cellcolor{lightgray}\{S\} & \cellcolor{lightgray}\{S_1\} \\ +\varnothing & \varnothing & \{A, S_1\} & \{S\} \\ +\{A\} & \varnothing & \varnothing & \{B\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 3.} +Рассматриваемые на данном шаге случаи: + +\begin{itemize} + \setlength\itemsep{1em} + \item $k = 0, i = 2, j = 3: A \in M[2, 0], S_1 \in M[0, 3]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[2, 3]$. + \item $k = 3, i = 2, j = 2: S \in M[2, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[2, 2]$. +\end{itemize} + +Матрица после этой итерации: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \{S\} & \{S_1\} \\ +\varnothing & \varnothing & \{A, S_1\} & \{S\} \\ +\{A\} & \varnothing & \cellcolor{lightgray}\{S_1\} & \cellcolor{lightgray}\{B, \boldsymbol{S}\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 4.} +Рассмариваемые случаи: + +\begin{itemize} + \setlength\itemsep{1em} + \item $k = 2, i = 1, j = 2: A \in M[1, 2], S_1 \in M[2, 2]$, так как в грамматике присутствует правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[1, 2]$. + \item $k = 2, i = 1, j = 3: S \in M[1, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[1, 3]$. +\end{itemize} + +Матрица: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \{S\} & \{S_1\} \\ +\varnothing & \varnothing & \cellcolor{lightgray}\{A, \boldsymbol{S}, S_1\} & \cellcolor{lightgray}\{S, \boldsymbol{S_1}\} \\ +\{A\} & \varnothing & \{S_1\} & \{B, S\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 5.} +Рассмотрим на это шаге: + +\begin{itemize} + \setlength\itemsep{1em} + \item $k = 1, i = 0, j = 3: A \in M[0, 1], S_1 \in M[1, 3]$, поскольку в грамматике есть правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[0, 3]$. + \item $k = 3, i = 0, j = 2: S \in M[0, 3], B \in M[3, 2]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[0, 2]$. +\end{itemize} + +Матрица на этой итерации: +\[ +\begin{pmatrix} +\varnothing & \{A\} & \cellcolor{lightgray}\{S, \boldsymbol{S_1}\} & \cellcolor{lightgray}\{\boldsymbol{S}, S_1\} \\ +\varnothing & \varnothing & \{A, S, S_1\} & \{S, S_1\} \\ +\{A\} & \varnothing & \{S_1\} & \{B, S\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +\textbf{Итерация 6.} +Интересующие нас на этом шаге случаи: + +\begin{itemize} + \setlength\itemsep{1em} + \item $k = 0, i = 2, j = 2: A \in M[2, 0], S_1 \in M[0, 2]$, поскольку в грамматике есть правило $S \to A S_1$, добавляем нетерминал $S$ в ячейку $M[2, 2]$. + \item $k = 2, i = 2, j = 3: S \in M[2, 2], B \in M[2, 3]$, поскольку в грамматике есть правило $S_1 \to S B$, добавляем нетерминал $S_1$ в ячейку $M[2, 3]$. +\end{itemize} + +Матрица после данного шага: + +\[ +\begin{pmatrix} +\varnothing & \{A\} & \{S, S_1\} & \{S, S_1\} \\ +\varnothing & \varnothing & \{A, S, S_1\} & \{S, S_1\} \\ +\{A\} & \varnothing & \cellcolor{lightgray}\{\boldsymbol{S}, S_1\} & \cellcolor{lightgray}\{B, S, \boldsymbol{S_1}\} \\ +\varnothing & \varnothing & \{B\} & \varnothing \\ +\end{pmatrix} +\] + +На следующей итерации матрица не изменяется, поэтому заканчиваем работу алгоритма. В результате, если ячейка $M[i, j]$ содержит стартовый нетерминал $S$, то существует путь из $i$ в $j$, удовлетворяющий ограничениям, заданным грамматикой. +\end{example} + +Можно заметить, что мы делаем много лишних итераций. +Можно переписать алгоритм так, чтобы он не просматривал заведомо пустые ячейки. +Данную модификацию предложил Й.Хеллингс в работе~\cite{hellingsRelational}, также она реализована в работе~\cite{10.1007/978-3-319-46523-4_38}. + +Псевдокод алгоритма Хеллингса представлен в листинге~\ref{alg:graphParseHellings}. + +\begin{algorithm}[H] + \begin{algorithmic}[1] + \caption{Алгоритм Хеллингса} + \label{alg:graphParseHellings} + \Function{contextFreePathQuerying}{$G= \langle \Sigma, N, P, S \rangle$, $\mathcal{G} = \langle V,E,L \rangle$} + + \State{$r \gets \{(N_i,v,v) \mid v \in V \wedge N_i \to \varepsilon \in P \} \cup \{(N_i,v,u) \mid (v,t,u) \in E \wedge N_i \to t \in P \}$} + \State{$m \gets r$} + \While{$m \neq \varnothing$} + \State{$(N_i,v,u) \gets$ m.pick()} + \For {$(N_j,v',v) \in r$} + \For {$N_k \to N_j N_i \in P$ таких что $((N_k, v',u) \notin r)$} + \State{$m \gets m \cup \{(N_k, v',u)\}$} + \State{$r \gets r \cup \{(N_k, v',u)\}$} + \EndFor + \EndFor + \For {$(N_j,u,v') \in r$} + \For {$N_k \to N_i N_j \in P$ таких что $((N_k, v, v') \notin r)$} + \State{$m \gets m \cup \{(N_k, v, v')\}$} + \State{$r \gets r \cup \{(N_k, v, v')\}$} + \EndFor + \EndFor + + \EndWhile + \State \Return $r$ + \EndFunction + \end{algorithmic} +\end{algorithm} + + +\begin{example} + Запустим алгоритм Хеллингса на нашем примере. + + \textbf{Инициализация} + $$ + m = r = \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2)\} + $$ + + \textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возвращает его голову, оставляя хвост. + Новые элементы добавляются в конец. + \begin{enumerate} + \item Обрабатываем $(A,0,1)$. + Ни один из вложенных циклов не найдёт новых путей, так как для рассматриваемого ребра есть только две возможности достроить путь: $2 \xrightarrow{A} 0 \xrightarrow{A} 1$ и $0 \xrightarrow{A} 1 \xrightarrow{A} 2$ + и ни одна из соответствующих строк не выводтся в заданной грамматике. + \item Перед началом итерации + $$ + m = \{(A,1,2),(A,2,0),(B,2,3),(B,3,2)\}, + $$ $r$ не изменилось. + Обрабатываем $(A,1,2)$. + В данной ситуации второй цикл найдёт тройку $(B,2,3)$ и соответсвующее правило $S \to A \ B$. + Это значит, что и в $m$ и в $r$ добавится тройка $(S, 1, 3)$. + \item + Перед началом итерации + $$ + m = \{(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. + $$ + Обрабатываем $(A,2,0)$. + Внутринние циклы ничего не найдут, новых путей н появится. + \item + Перед началом итерации + $$ + m = \{(B,2,3),(B,3,2),(S,1,3)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. + $$ + Обрабатываем $(B,2,3)$. + Первый цикл мог бы найти $(A,1,2)$, однако при проверке во вложенном цикле выяснится, что $(S, 1, 3)$ уже найдена. + В итоге, на данной итерации новых путей н появится. + \item + Перед началом итерации + $$ + m = \{(B,3,2),(S,1,3)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3)\}. + $$ + Обрабатываем $(B,3,2)$. + Первый цикл найдёт $(S,1,3)$ и соответствующее правило $S_1 \to S \ B$. + Это значит, что и в $m$ и в $r$ добавится тройка $(S_1, 1, 2)$. + \item + Перед началом итерации + $$ + m = \{(S,1,3),(S_1, 1, 2)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2)\}. + $$ + Обрабатываем $(S,1,3)$. + Второй цикл мог бы найти $(B,3,2)$, однако при проверке во вложенном цикле выяснится, что $(S_1, 1, 2)$ уже найдена. + В итоге, на данной итерации новых путей н появится. + \item + Перед началом итерации + $$ + m = \{(S_1, 1, 2)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2)\}. + $$ + Обрабатываем $(S_1,1,2)$. + Первый цикл найдёт $(A,0,1)$ и соответствующее правило $S \to A \ S_1$. + Это значит, что и в $m$ и в $r$ добавится тройка $(S, 0, 2)$. + + \item + Перед началом итерации + $$ + m = \{(S, 0, 2)\}, + $$ + $$ + r= \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2)\}. + $$ + Обрабатываем $(S, 0, 2)$. + Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. + B $m$ и в $r$ добавится тройка $(S_1, 0, 3)$. + + \item + Перед началом итерации + $$ + m = \{(S_1, 0, 3)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3)\}. + \end{align*} + Обрабатываем $(S_1, 0, 3)$. + Найдено: $(A,2,0)$ и соответствующее правило $S \to A \ S_1$. + B $m$ и в $r$ добавится тройка $(S, 2, 3)$. + + \item + Перед началом итерации + $$ + m = \{(S, 2, 3)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3)\}. + \end{align*} + + Обрабатываем $(S, 2, 3)$. + Найдено: $(B,3,2)$ и соответствующее правило $S_1 \to S \ B$. + B $m$ и в $r$ добавится тройка $(S_1, 2, 2)$. + + \item + Перед началом итерации + $$ + m = \{(S_1, 2, 2)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2)\}. + \end{align*} + Обрабатываем $(S_1, 2, 2)$. + Найдено: $(A,1,2)$ и соответствующее правило $S \to A \ S_1$. + B $m$ и в $r$ добавится тройка $(S, 1, 2)$. + + \item + Перед началом итерации + $$ + m = \{(S, 1, 2)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2)\}. + \end{align*} + Обрабатываем $(S, 1, 2)$. + Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. + B $m$ и в $r$ добавится тройка $(S_1, 1, 3)$. + + \item + Перед началом итерации + $$ + m = \{(S_1, 1, 3)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3)\}. + \end{align*} + Обрабатываем $(S_1, 1, 3)$. + Найдено: $(A,0,1)$ и соответствующее правило $S \to A \ S_1$. + B $m$ и в $r$ добавится тройка $(S, 0, 3)$. + + \item + Перед началом итерации + $$ + m = \{(S, 0, 3)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3)\}. + \end{align*} + Обрабатываем $(S, 0, 3)$. + Найдено: $(B,3,2)$ и соответствующее правило $S_1 \to S \ B$. + B $m$ и в $r$ добавится тройка $(S_1, 0, 2)$. + + \item + Перед началом итерации + $$ + m = \{(S_1, 0, 2)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2)\}. + \end{align*} + Обрабатываем $(S_1, 0, 2)$. + Найдено: $(A,2,0)$ и соответствующее правило $S \to A \ S_1$. + B $m$ и в $r$ добавится тройка $(S, 2, 2)$. + + \item + Перед началом итерации + $$ + m = \{(S, 2, 2)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2),\\ + &(S, 2, 2)\}. + \end{align*} + Обрабатываем $(S, 2, 2)$. + Найдено: $(B,2,3)$ и соответствующее правило $S_1 \to S \ B$. + B $m$ и в $r$ добавится тройка $(S_1, 2, 3)$. + + \item + Перед началом итерации + $$ + m = \{(S_1, 2, 3)\}, + $$ + \begin{align*} + r= \{&(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2),(S,1,3),(S_1, 1, 2),(S, 0, 2),\\ + &(S_1, 0, 3),(S, 2, 3),(S_1, 2, 2),(S, 1, 2),(S_1, 1, 3),(S, 0, 3),(S_1, 0, 2),\\ + &(S, 2, 2),(S_1, 2, 3)\}. + \end{align*} + Обрабатываем $(S_1, 2, 3)$. + Могло бы быть найдено: $(A,1,2)$ и соответствующее правило $S \to A \ S_1$, однако тройка $(S, 1, 3)$ уже есть в $r$. + А значит никаких новых троек найдено не будет и $m$ становится пустым. + Это была последняя итерация внешнего цикла, в $r$ на текущий момент уже содержится всё ршение. + + \end{enumerate} + +\end{example} + +Как можно заметить, количество итераций внешнего цикла также получилось достаточно большим. +Проверьте, зависит ли оно от порядка обработки элементов из $m$. +При этом внутренние циклы в нашем случае достаточно короткие, так как просматриваются только ``существенные'' элементы и избегается дублирование. + +%\section{Вопросы и задачи} +%\begin{enumerate} +% \item Проверить работу алгоритма CYK для цепочек на грамматике +% \begin{flushleft} +% $E \to E + E$ \\ +% $E \to E * E$ \\ +% $E \to (E)$ \\ +% $E \to n$ \\ +% \end{flushleft} +% и словах (алфавит $\Sigma = \{n, +, *, (, )\}$) +% \begin{flushleft} +% $ (n + n) * n$ \\ +% $ n + n * n$ \\ +% $n + n + n + n$ \\ +% $n + (n * n) + n$ \\ +% \end{flushleft} +% +% \item Изучить вычислительную сложность алгоритма CYK для матриц в зависимости от размера входного графа (размер грамматики считать фиксированным). +% +% \item Проверить работу алгоритма CYK для графов на графе +% +% \begin{center} +% \begin{tikzpicture}[node distance=3cm,shorten >=1pt,on grid,auto] +% \node[state] (q_0) {$0$}; +% \node[state] (q_1) [right=of q_0] {$1$}; +% \node[state] (q_2) [right=of q_1] {$2$}; +% \node[state] (q_3) [right=of q_2] {$3$}; +% \node[state] (q_4) [right=of q_3] {$4$}; +% \path[->] +% (q_0) edge node {$a$} (q_1) +% (q_1) edge node {$b$} (q_2) +% (q_2) edge node {$a$} (q_3) +% (q_3) edge node {$b$} (q_4) +% (q_1) edge[bend left, above] node {$b$} (q_3) +% (q_4) edge[bend left, below] node {$a$} (q_1); +% \end{tikzpicture} +% \end{center} +% +% И грамматике +% +% \begin{flushleft} +% $S \to S S$ \\ +% $S \to A B$ \\ +% $A \to a$ \\ +% $B \to b$ \\ +% \end{flushleft} +% +% \item Оцените временную сложность алгоритма Хеллингса и сравните её с оценкой для наивного обобщения CYK. +% +%\end{enumerate} diff --git a/tex/Conclusion.tex b/tex/Conclusion.tex index 1a7eb25..cf3a14d 100644 --- a/tex/Conclusion.tex +++ b/tex/Conclusion.tex @@ -1,7 +1,7 @@ -\chapter{Заключение} - -Общие заключительные слова - -Про работы и частные случаи в статическом анализе, теоретическая сложность~\cite{10.1145/3571252, istomina2023finegrained}, свежие результаты и обзоры~\cite{10.1145/3583660.3583664}. - -Про то, что ещё интересного происходит в этой области, куда можно двигаться, ссылки на ключевые работы. +\chapter{Заключение} + +Общие заключительные слова + +Про работы и частные случаи в статическом анализе, теоретическая сложность~\cite{10.1145/3571252, istomina2023finegrained}, свежие результаты и обзоры~\cite{10.1145/3583660.3583664}. + +Про то, что ещё интересного происходит в этой области, куда можно двигаться, ссылки на ключевые работы. diff --git a/tex/Context-Free_Languages.tex b/tex/Context-Free_Languages.tex index de7551a..c629fd4 100644 --- a/tex/Context-Free_Languages.tex +++ b/tex/Context-Free_Languages.tex @@ -1,546 +1,534 @@ -\chapter{Контекстно-свободные языки и грамматики}\label{CFG} +\setchapterpreamble[u]{\margintoc} +\chapter{Контекстно-свободные языки и грамматики} +\label{CFG} +\tikzsetfigurename{CFG_} Из всего многообразия нас будут интересовать прежде всего контекстно-свободные грамматики. -\begin{definition} -\textit{Контекстно-свободная грамматика} --- это четвёрка вида $\langle \Sigma, N, P, S \rangle$, где -\begin{itemize} - \item $\Sigma$ --- это терминальный алфавит; - \item $N$ --- это нетерминальный алфавит; - \item $P$ --- это множество правил (продукций), таких что каждая продукция имеет вид $N_i \to \alpha$, где $N_i \in N$ и $\alpha \in \{\Sigma \cup N\}^* \cup {\varepsilon}$; - \item $S$ --- стартовый нетерминал. - Отметим, что $\Sigma \cap N = \varnothing$. -\end{itemize} +\begin{definition}[Контекстно-свободная грамматика] + \emph{Контекстно-свободная грамматика}~--- это четвёрка вида $\langle \Sigma, N, P, S \rangle$, где + \begin{itemize} + \item $\Sigma$~--- это терминальный алфавит; + \item $N$~--- это нетерминальный алфавит; + \item $P$~--- это множество правил (продукций), таких что каждая продукция имеет вид $N_i \to \alpha$, где $N_i \in N$ и $\alpha \in \{\Sigma \cup N\}^* \cup {\varepsilon}$; + \item $S$~--- стартовый нетерминал. + Отметим, что $\Sigma \cap N = \varnothing$. + \end{itemize} \end{definition} \begin{example} -Грамматика, задающая язык целых чисел в двоичной записи без лидирующих нулей: $G = \langle \{0, 1, -\}, \{S, N, A\}, P, S \rangle$, где $P$ определено следующим образом: -\begin{align*} - S & \rightarrow 0 \mid N \mid - N \\ - N & \rightarrow 1 A \\ - A & \rightarrow 0 A \mid 1 A \mid \varepsilon\\ -\end{align*} + \label{ex:binary_cfg} + Грамматика, задающая язык целых чисел в двоичной записи без лидирующих нулей: $G = \langle \{0, 1, -\}, \{S, N, A\}, P, S \rangle$, где $P$ определено следующим образом: + \begin{align*} + S & \rightarrow 0 \mid N \mid - N \\ + N & \rightarrow 1 A \\ + A & \rightarrow 0 A \mid 1 A \mid \varepsilon + \end{align*} \end{example} -При спецификации грамматики часто опускают множество терминалов и нетерминалов, оставляя только множество правил. При этом нетерминалы часто обозначаются прописными латинскими буквами, терминалы --- строчными, а стартовый нетерминал обозначается буквой~$S$. Мы будем следовать этим обозначениям, если не указано иное. - -\begin{definition}\label{def derivability in CFG} - \textit{Отношение непосредственной выводимости}. Мы говорим, что последовательность терминалов и нетерминалов $\gamma \beta \delta$ \textit{непосредственно выводится из} $\gamma \alpha \delta$ \textit{при помощи правила} $\alpha \rightarrow \beta$ ($\gamma \alpha \delta \Rightarrow \gamma \beta \delta$), если - \begin{itemize} - \item $\alpha \rightarrow \beta \in P$ - \item $\gamma, \delta \in \{\Sigma \cup N\}^* \cup {\varepsilon}$ - \end{itemize} +При спецификации грамматики часто опускают множество терминалов и нетерминалов, оставляя только множество правил. +При этом нетерминалы часто обозначаются прописными латинскими буквами, терминалы~--- строчными, а стартовый нетерминал обозначается буквой $S$. +Мы будем следовать этим обозначениям, если не указано иное. + +\begin{definition}[Отношение непосредственной выводимости] + \label{def derivability in CFG} + \emph{Отношение непосредственной выводимости}. Мы говорим, что последовательность терминалов и нетерминалов $\gamma \beta \delta$ \emph{непосредственно выводится из} $\gamma \alpha \delta$ \emph{при помощи правила} $\alpha \rightarrow \beta$ ($\gamma \alpha \delta \derives[] \gamma \beta \delta$), если + \begin{itemize} + \item $\alpha \rightarrow \beta \in P$, + \item $\gamma, \delta \in \{\Sigma \cup N\}^* \cup {\varepsilon}$. + \end{itemize} \end{definition} -\begin{definition} - \textit{Рефлексивно-транзитивное замыкание отношения} --- это наименьшее рефлексивное и транзитивное отношение, содержащее исходное. +\begin{definition}[Рефлексивно-транзитивное замыкание отношения] + \emph{Рефлексивно-транзитивное замыкание отношения}~--- это наименьшее рефлексивное и транзитивное отношение, содержащее исходное. \end{definition} -\begin{definition} -\textit{Отношение выводимости} является рефлексивно-транзитивным замыканием отношения непосредственной выводимости; обозначается $\derives$. -\begin{itemize} - \item $\alpha \derives \beta$ означает $\exists \gamma_0, \dots \gamma_k \in \{\Sigma \cup N\}^* \cup {\varepsilon}: \ \alpha \derives[] \gamma_0 \derives[] \gamma_1 \derives[] \dots \derives[] \gamma_{k-1} \derives[] \gamma_{k} \derives[] \beta$ - \item Транзитивность: $\forall \alpha, \beta, \gamma \in \{\Sigma \cup N\}^* \cup {\varepsilon}: \ \alpha \derives \beta, \beta \derives \gamma \Rightarrow \alpha \derives \gamma$ - \item Рефлексивность: $\forall \alpha \in \{\Sigma \cup N\}^* \cup {\varepsilon}: \ \alpha \derives \alpha$ - \item $\alpha \derives \beta$ --- $\alpha$ выводится из $\beta$ - \item $\alpha \derives[k] \beta$ --- $\alpha$ выводится из $\beta$ за $k$ шагов - \item $\alpha \derives[+] \beta$ --- при выводе использовалось хотя бы одно правило грамматики -\end{itemize} +\begin{definition}[Отношение выводимости] + \emph{Отношение выводимости} является рефлексивно-транзитивным замыканием отношения непосредственной выводимости; обозначается $\derives$. + \begin{itemize} + \item $\alpha \derives \beta$ означает $\exists \gamma_0, \dots, \gamma_k \in \{\Sigma \cup N\}^* \cup {\varepsilon}$: + \[ \alpha \derives[] \gamma_0 \derives[] \gamma_1 \derives[] \dots \derives[] \gamma_{k-1} \derives[] \gamma_{k} \derives[] \beta;\] + \item Транзитивность: $\forall \alpha, \beta, \gamma \in \{\Sigma \cup N\}^* \cup {\varepsilon}$: $\alpha \derives \beta$, $\beta \derives \gamma \derives[] \alpha \derives \gamma$; + \item Рефлексивность: $\forall \alpha \in \{\Sigma \cup N\}^* \cup {\varepsilon}$: $\alpha \derives \alpha$; + \item $\alpha \derives \beta$~--- $\alpha$ выводится из $\beta$; + \item $\alpha \derives[k] \beta$~--- $\alpha$ выводится из $\beta$ за $k$ шагов; + \item $\alpha \derives[+] \beta$~--- при выводе использовалось хотя бы одно правило грамматики. + \end{itemize} \end{definition} - \begin{example} -Пример вывода цепочки $-1101$ в грамматике: -\begin{align*} - S &\rightarrow 0 \mid N \mid - N \\ - N &\rightarrow 1 A \\ - A &\rightarrow 0 A \mid 1 A \mid \varepsilon\\ -\end{align*} -\[ - S \Rightarrow - N \Rightarrow - 1 A \Rightarrow - 1 1 A \derives - 1 1 0 1 A \Rightarrow - 1 1 0 1 -\] + Пример вывода цепочки $-1101$ в грамматике из примера~\ref{ex:binary_cfg}: + \[ + S \derives[] - N \derives[] - 1 A \derives[] - 1 1 A \derives - 1 1 0 1 A \derives[] - 1 1 0 1 + \] \end{example} - \begin{definition}[Вывод слова в грамматике] -Слово $\omega \in \Sigma^*$ \textit{выводимо в грамматике} $\langle \Sigma, N, P, S \rangle$, если существует некоторый вывод этого слова из начального нетерминала $S \derives \omega$. + Слово $\omega \in \Sigma^*$ \emph{выводимо в грамматике} $\langle \Sigma, N, P, S \rangle$, если существует некоторый вывод этого слова из начального нетерминала $S \derives \omega$. \end{definition} -\begin{definition} -\textit{Левосторонний вывод}. На каждом шаге вывода заменяется самый левый нетерминал. +\begin{definition}[Левосторонний вывод] + \emph{Левосторонний вывод}. На каждом шаге вывода заменяется самый левый нетерминал. \end{definition} -\begin{definition} - \textit{Правосторонний вывод}. На каждом шаге вывода заменяется самый правый нетерминал. +\begin{definition}[Правосторонний вывод] + \emph{Правосторонний вывод}. На каждом шаге вывода заменяется самый правый нетерминал. \end{definition} - \begin{example} -Приведем пример левостороннего вывода цепочки $cbaa$ в грамматике: -\begin{align*} - S &\rightarrow A A \mid s \\ - A &\rightarrow A A \mid B b \mid a \\ - B &\rightarrow c \mid d -\end{align*} - Жирным выделен нетерминал, заменяемый на каждом шагу вывода. - \[ \boldsymbol{S} \derives[] \boldsymbol{A} A \derives[] \boldsymbol{B} b A \derives[] c b \boldsymbol{A} \derives[] c b \boldsymbol{A} A \derives[] c b a \boldsymbol{A} \derives[] c b a a \] + Приведем пример левостороннего вывода цепочки $cbaa$ в грамматике: + \begin{align*} + S & \rightarrow A A \mid s \\ + A & \rightarrow A A \mid B b \mid a \\ + B & \rightarrow c \mid d + \end{align*} + Жирным выделен нетерминал, заменяемый на каждом шагу вывода. + \[ \mathbf{S} \derives[] \mathbf{A} A \derives[] \mathbf{B} b A \derives[] c b \mathbf{A} \derives[] c b \mathbf{A} A \derives[] c b a \mathbf{A} \derives[] c b a a \] \end{example} Аналогично левостороннему можно определить правосторонний вывод. -\begin{definition} -\textit{Язык, задаваемый грамматикой} --- множество строк, выводимых в грамматике $L(G) = \{ \omega \in \Sigma^* \mid S \derives \omega \}$. +\begin{definition}[Язык] + \emph{Язык, задаваемый грамматикой}~--- множество строк, выводимых в грамматике $L(G) = \{ \omega \in \Sigma^* \mid S \derives \omega \}$. \end{definition} -\begin{definition} - Грамматики $G_1$ и $G_2$ называются \textit{эквивалентными}, если они задают один и тот же язык: $L(G_1) = L(G_2)$ +\begin{definition}[Эквивалентные грамматики] + Грамматики $G_1$ и $G_2$ называются \emph{эквивалентными}, если они задают один и тот же язык: $L(G_1) = L(G_2)$ \end{definition} - \begin{example} Пример эквивалентных грамматик для языка целых чисел в двоичной системе счисления. - \begin{tabular}{p{0.4\textwidth} | p{0.5\textwidth}} - \[ - \begin{aligned} - \Sigma & = \{ 0, 1, - \} \\ - N & = \{ S, N, A \} \\~\\ - S & \rightarrow 0 \mid N \mid - N \\ - N & \rightarrow 1 A \\ - A & \rightarrow 0 A \mid 1 A \mid \varepsilon\\ - \end{aligned} - \] - & - \[ - \begin{aligned} - \Sigma & = \{ 0, 1, - \} \\ - N & = \{ S, A \} \\~\\ - S & \rightarrow 0 \mid 1 A \mid - 1 A \\ - A & \rightarrow 0 A \mid 1 A \mid \varepsilon\\ - \end{aligned} - \] - \end{tabular} + \begin{tabular}{p{0.4\textwidth} | p{0.5\textwidth}} + \[ + \begin{aligned} + \Sigma & = \{ 0, 1, - \} \\ + N & = \{ S, N, A \} \\~\\ + S & \rightarrow 0 \mid N \mid - N \\ + N & \rightarrow 1 A \\ + A & \rightarrow 0 A \mid 1 A \mid \varepsilon \\ + \end{aligned} + \] + & + \[ + \begin{aligned} + \Sigma & = \{ 0, 1, - \} \\ + N & = \{ S, A \} \\~\\ + S & \rightarrow 0 \mid 1 A \mid - 1 A \\ + A & \rightarrow 0 A \mid 1 A \mid \varepsilon \\ + \end{aligned} + \] + \end{tabular} \end{example} -\begin{definition} - \textit{Неоднозначная грамматика} --- грамматика, в которой существует 2 и более левосторонних (правосторонних) выводов для одного слова. +\begin{definition}[Неоднозначная грамматика] + \emph{Неоднозначная грамматика}~--- грамматика, в которой существует 2 и более левосторонних (правосторонних) выводов для одного слова. \end{definition} \begin{example} - Неоднозначная грамматика для правильных скобочных последовательностей: -\[ - S \to (S) \mid S S \mid \varepsilon -\] -Два различных левосторонних вывода строки $()()()$: -\[S \derives[] S S \derives [] (S) S \derives[] () S \derives[] () S S \derives[] () (S) S \derives[] () () S \derives[] () () (S) \derives[] () () ()\] -\[S \derives[] S S \derives[] S S S \derives[] (S) S S \derives[] () S S \derives[] () (S) S \derives[] () () S \derives[] () () (S) \derives[] () () ()\] + Неоднозначная грамматика для правильных скобочных последовательностей: + \[ + S \to (S) \mid S S \mid \varepsilon + \] + Два различных левосторонних вывода строки $()()()$: + \begin{gather*} + S \derives[] S S \derives [] (S) S \derives[] () S \derives[] () S S \derives[] () (S) S \derives[] () () S \derives[] () () (S) \derives[] () () ()\\ + S \derives[] S S \derives[] S S S \derives[] (S) S S \derives[] () S S \derives[] () (S) S \derives[] () () S \derives[] () () (S) \derives[] () () () + \end{gather*} \end{example} -\begin{definition} - \textit{Однозначная грамматика} --- грамматика, в которой существует не более одного левостороннего (правостороннего) вывода для каждого слова. +\begin{definition}[Однозначная грамматика] + \emph{Однозначная грамматика}~--- грамматика, в которой существует не более одного левостороннего (правостороннего) вывода для каждого слова. \end{definition} \begin{example} - Однозначная грамматика для правильных скобочных последовательностей -\[ - S \to (S)S \mid \varepsilon -\] + Однозначная грамматика для правильных скобочных последовательностей + \[ + S \to (S)S \mid \varepsilon + \] \end{example} -\begin{definition} - \textit{Существенно неоднозначные языки} --- языки, для которых невозможно построить однозначную грамматику. +\begin{definition}[Существенно неоднозначный язык] + \emph{Существенно неоднозначные языки}~--- языки, для которых невозможно построить однозначную грамматику. \end{definition} \begin{example} - Пример существенно неоднозначного языка -\[\{a^n b^n c^m \mid n, m \in \mathds{Z}\} \cup \{a^n b^m c^m \mid n,m \in \mathds{Z}\}\] + Пример существенно неоднозначного языка + \[\{a^n b^n c^m \mid n, m \in \BbbZ\} \cup \{a^n b^m c^m \mid n,m \in \BbbZ\}\] \end{example} -\section{Дерево вывода}\label{sect:DerivTree} +\section{Дерево вывода} +\label{sect:DerivTree} + В некоторых случаях не достаточно знать порядок применения правил. Необходимо структурное представление вывода цепочки в грамматике. -Таким представлением является \textit{дерево вывода}. -\begin{definition} -Деревом вывода цепочки $\omega$ в грамматике $G=\langle \Sigma, N, S, P \rangle$ называется дерево, удовлетворяющее следующим свойствам. - -\begin{enumerate} - \item Помеченное: метка каждого внутреннего узла --- нетерминал, метка каждого листа --- терминал или $\varepsilon$. - \item Корневое: корень помечен стартовым нетерминалом. - \item Упорядоченное. - \item В дереве может существовать узел с меткой $N_i$ и сыновьями $M_j \dots M_k$ только тогда, когда в грамматике есть правило вида $N_i \to M_j \dots M_k$. - \item Крона образует исходную цепочку $\omega$. -\end{enumerate} +Таким представлением является \emph{дерево вывода}. + +\begin{definition}[Дерево вывода] + Деревом вывода цепочки $\omega$ в грамматике $G = \langle \Sigma, N, S, P \rangle$ называется дерево, удовлетворяющее следующим свойствам. + \begin{enumerate} + \item Помеченное: метка каждого внутреннего узла~--- нетерминал, метка каждого листа~--- терминал или $\varepsilon$. + \item Корневое: корень помечен стартовым нетерминалом. + \item Упорядоченное. + \item В дереве может существовать узел с меткой $N_i$ и сыновьями $M_j \dots M_k$ только тогда, когда в грамматике есть правило вида $N_i \to M_j \dots M_k$. + \item Крона образует исходную цепочку $\omega$. + \end{enumerate} \end{definition} \begin{example} - Построим дерево вывода цепочки $ababab$ в грамматике - - \[ G = \langle \{a,b\}, \{S\}, S, \{S \to a \ S \ b \ S, S \to \varepsilon\} \rangle \] - -\begin{center} - \input{figures/cfl/tree0.tex} -\end{center} - + Построим дерево вывода цепочки $ababab$ в грамматике + \[ G = \langle \{a,b\}, \{S\}, S, \{S \to a \ S \ b \ S, S \to \varepsilon\} \rangle.\] + \begin{center} + \input{figures/cfl/tree0.tex} + \end{center} \end{example} \begin{theorem} - Пусть $G = \langle \Sigma, N, P, S \rangle$ --- КС-грамматика. - Вывод $S \derives \alpha$, где $\alpha \in (N \cup \Sigma)^*, \alpha \neq \varepsilon$ существует $\Leftrightarrow$ существует дерево вывода в грамматике $G$ с кроной $\alpha$. + Пусть $G = \langle \Sigma, N, P, S \rangle$~--- КС-грамматика. + Вывод $S \derives \alpha$, где $\alpha \in (N \cup \Sigma)^*, \alpha \neq \varepsilon$ существует $\Leftrightarrow$ существует дерево вывода в грамматике $G$ с кроной $\alpha$. \end{theorem} \section{Пустота КС-языка} \begin{theorem} - Существует алгоритм, определяющий, является ли язык, порождаемый КС грамматикой, пустым. + Существует алгоритм, определяющий, является ли язык, порождаемый КС грамматикой, пустым. \end{theorem} \begin{proof} - Следующая лемма утверждает, что если в КС языке есть выводимое слово, то существует другое выводимое слово с деревом вывода не глубже количества нетерминалов грамматики. - Для доказательства теоремы достаточно привести алгоритм, последовательно строящий все деревья глубины не больше количества нетерминалов грамматики, и проверяющий, являются ли такие деревья деревьями вывода. - Если в результате работы алгоритма не удалось построить ни одного дерева, то грамматика порождает пустой язык. + Следующая лемма утверждает, что если в КС языке есть выводимое слово, то существует другое выводимое слово с деревом вывода не глубже количества нетерминалов грамматики. + Для доказательства теоремы достаточно привести алгоритм, последовательно строящий все деревья глубины не больше количества нетерминалов грамматики, и проверяющий, являются ли такие деревья деревьями вывода. + Если в результате работы алгоритма не удалось построить ни одного дерева, то грамматика порождает пустой язык. \end{proof} \begin{lemma} - Если в данной грамматике выводится некоторая цепочка, то существует цепочка, дерево вывода которой не содержит ветвей длиннее $m$, где $m$ --- количество нетерминалов грамматики. + Если в данной грамматике выводится некоторая цепочка, то существует цепочка, дерево вывода которой не содержит ветвей длиннее $m$, где $m$~--- количество нетерминалов грамматики. \end{lemma} \begin{proof} - Рассмотрим дерево вывода цепочки $\omega$. Если в нем есть 2 узла, соответствующих одному нетерминалу A, обозначим их $n_1$ и $n_2$. + Рассмотрим дерево вывода цепочки $\omega$. Если в нем есть 2 узла, соответствующих одному нетерминалу A, обозначим их $n_1$ и $n_2$. - Предположим, $n_1$ расположен ближе к корню дерева, чем $n_2$. + Предположим, $n_1$ расположен ближе к корню дерева, чем $n_2$. - Вывод цепочки $\omega$ имеет следующий вид: - \[S \derives \alpha A_{n_1} \beta \derives \alpha \omega_1 \beta; S \derives \alpha \gamma A_{n_2} \delta \beta \derives \alpha \gamma \omega_2 \delta \beta \derives \omega,\] - при этом $\omega_2$ является подцепочкой $\omega_1$. + Вывод цепочки $\omega$ имеет следующий вид: + \[S \derives \alpha A_{n_1} \beta \derives \alpha \omega_1 \beta; S \derives \alpha \gamma A_{n_2} \delta \beta \derives \alpha \gamma \omega_2 \delta \beta \derives \omega,\] + при этом $\omega_2$ является подцепочкой $\omega_1$. - Заменим в изначальном дереве узел $n_1$ на $n_2$. Полученное дерево является деревом вывода цепочки $\alpha \omega_2 \delta$. + Заменим в изначальном дереве узел $n_1$ на $n_2$. Полученное дерево является деревом вывода цепочки $\alpha \omega_2 \delta$. - Повторяем процесс замены одинаковых нетерминалов до тех пор, пока в дереве не останутся только уникальные нетерминалы. + Повторяем процесс замены одинаковых нетерминалов до тех пор, пока в дереве не останутся только уникальные нетерминалы. - В полученном дереве не может быть ветвей длины большей, чем $m$. + В полученном дереве не может быть ветвей длины большей, чем $m$. - По построению оно является деревом вывода. + По построению оно является деревом вывода. \end{proof} \section{Нормальная форма Хомского} \label{section:CNF} -\begin{definition} -Контекстно-свободная грамматика $\langle \Sigma, N, P, S\rangle$ находится в \textit{Нормальной Форме Хомского}, если она содержит только правила следующего вида: - -\begin{itemize} - \item $A \to B C \text{, где } A, B, C \in N$, а стартовый нетерминал $S$ не содержится в правой части правила. - \item $A \to a \text{, где } A \in N, a \in \Sigma$ - \item $S \to \varepsilon$: только из стартового нетерминала выводима пустая строка. -\end{itemize} +\begin{definition}[Нормальная форма Хомского] + Контекстно-свободная грамматика $\langle \Sigma, N, P, S\rangle$ находится в \emph{Нормальной Форме Хомского}, если она содержит только правила следующего вида: + \begin{itemize} + \item $A \to B C$, где $A, B, C \in N$, а стартовый нетерминал $S$ не содержится в правой части правила. + \item $A \to a$, где $A \in N$, $a \in \Sigma$. + \item $S \to \varepsilon$: только из стартового нетерминала выводима пустая строка. + \end{itemize} \end{definition} \begin{theorem} -Любую КС грамматику можно преобразовать в НФХ. + Любую КС грамматику можно преобразовать в НФХ. \end{theorem} \begin{proof} - Алгоритм преобразования в НФХ состоит из следующих шагов: - - \begin{itemize} - \item Замена неодиночных терминалов - \item Удаление длинных правил - \item Удаление $\varepsilon$-правил - \item Удаление цепных правил - \item Удаление бесполезных нетерминалов - \end{itemize} - - То, что каждый из этих шагов преобразует грамматику к эквивалентной, при этом является алгоритмом, доказано в следующих леммах. + Алгоритм преобразования в НФХ состоит из следующих шагов: + \begin{itemize} + \item Замена неодиночных терминалов + \item Удаление длинных правил + \item Удаление $\varepsilon$-правил + \item Удаление цепных правил + \item Удаление бесполезных нетерминалов + \end{itemize} + То, что каждый из этих шагов преобразует грамматику к эквивалентной, при этом является алгоритмом, доказано в следующих леммах. \end{proof} \begin{lemma} - Для любой КС-грамматики можно построить эквивалентную, которая не содержит правила с неодиночными терминалами. + Для любой КС-грамматики можно построить эквивалентную, которая не содержит правила с неодиночными терминалами. \end{lemma} \begin{proof} - Каждое правило $A \to B_0 B_1 \dots B_k, k \geq 1$ заменить на множество правил, где $C_i$ --- новый нетерминал: -\begin{align*} - A & \to C_0 C_1 \dots C_k \\ - C_0 & \to B_0 \\ - C_1 & \to B_1 \\ - & \dots \\ - C_k & \to B_k -\end{align*} + Каждое правило $A \to B_0 B_1 \dots B_k$, $k \geq 1$ заменить на множество правил, где $C_i$~--- новый нетерминал: + \begin{align*} + A & \to C_0 C_1 \dots C_k \\ + C_0 & \to B_0 \\ + C_1 & \to B_1 \\ + & \dots \\ + C_k & \to B_k + \end{align*} \end{proof} \begin{lemma} - Для любой КС-грамматики можно построить эквивалентную, которая не содержит правил длины больше 2. + Для любой КС-грамматики можно построить эквивалентную, которая не содержит правил длины больше 2. \end{lemma} \begin{proof} - Каждое правило $A \to B_0 B_1 \dots B_k, k \geq 2$ заменить на множество правил: - \begin{align*} - A & \to B_0 C_0 \\ - C_0 & \to B_1 C_1 \\ - & \dots \\ - C_{k-3} & \to B_{k-2} C_{k-2} \\ - C_{k-2} & \to B_{k-1} B_k - \end{align*} + Каждое правило $A \to B_0 B_1 \dots B_k$, $k \geq 2$ заменить на множество правил: + \begin{align*} + A & \to B_0 C_0 \\ + C_0 & \to B_1 C_1 \\ + & \dots \\ + C_{k-3} & \to B_{k-2} C_{k-2} \\ + C_{k-2} & \to B_{k-1} B_k + \end{align*} \end{proof} \begin{lemma} - Для любой КС-грамматики можно построить эквивалентную, не содержащую $\varepsilon$-правил. + Для любой КС-грамматики можно построить эквивалентную, не содержащую $\varepsilon$-правил. \end{lemma} \begin{proof} - Рекурсивно определим $\varepsilon$-правила: - \begin{itemize} - \item $A \to \varepsilon$ --- $\varepsilon$-правило - \item $A \to B_0 \dots B_k$ --- $\varepsilon$-правило, если $\forall i: \ B_i$ --- $\varepsilon$-правило. - \end{itemize} - - Каждое правило $A \to B_0 B_1 \dots B_k$ заменяем на множество правил, где каждое $\varepsilon$-правило удалено во всех возможных комбинациях. + Рекурсивно определим $\varepsilon$-правила: + \begin{itemize} + \item $A \to \varepsilon$~--- $\varepsilon$-правило + \item $A \to B_0 \dots B_k$~--- $\varepsilon$-правило, если $\forall i$: $B_i$~--- $\varepsilon$-правило. + \end{itemize} + Каждое правило $A \to B_0 B_1 \dots B_k$ заменяем на множество правил, где каждое $\varepsilon$-правило удалено во всех возможных комбинациях. \end{proof} \begin{lemma} - Для любой КС-грамматики можно построить эквивалентную, не содержащую цепные правила. + Для любой КС-грамматики можно построить эквивалентную, не содержащую цепные правила. \end{lemma} \begin{proof} - \textit{Цепное правило} --- правило вида $A \to B\text{, где } A, B \in N$. - \textit{Цепная пара} --- упорядоченная пара $(A,B)$, в которой $A\derives B$, используя только цепные правила. - - Алгоритм: - \begin{enumerate} - \item Найти все цепные пары в грамматике $G$. - Найти все цепные пары можно по индукции: - Базис: $(A,A)$ --- цепная пара для любого нетерминала, так как $A\derives A$ за ноль шагов. - Индукция: Если пара $(A,B_0)$ --- цепная, и есть правило $B_0 \to B_1$, то $(A,B_1)$ --- цепная пара. - \item Для каждой цепной пары $(A,B)$ добавить в грамматику $G'$ все правила вида $A \to a$, где $B \to a$ --- нецепное правило из $G$. - \item Удалить все цепные правила -\end{enumerate} -Пусть $G$ --- контекстно-свободная грамматика. $G'$ --- грамматика, полученная в результате применения алгоритма к $G$. Тогда $L(G)=L(G')$. + \emph{Цепное правило}~--- правило вида $A \to B\text{, где } A, B \in N$. + \emph{Цепная пара}~--- упорядоченная пара $(A,B)$, в которой $A\derives B$, используя только цепные правила. + + Алгоритм: + \begin{enumerate} + \item Найти все цепные пары в грамматике $G$. + Найти все цепные пары можно по индукции: + Базис: $(A,A)$~--- цепная пара для любого нетерминала, так как $A\derives A$ за ноль шагов. + Индукция: Если пара $(A,B_0)$~--- цепная, и есть правило $B_0 \to B_1$, то $(A,B_1)$~--- цепная пара. + \item Для каждой цепной пары $(A,B)$ добавить в грамматику $G'$ все правила вида $A \to a$, где $B \to a$~--- нецепное правило из $G$. + \item Удалить все цепные правила + \end{enumerate} + Пусть $G$~--- контекстно-свободная грамматика. $G'$~--- грамматика, полученная в результате применения алгоритма к $G$. Тогда $L(G)=L(G')$. \end{proof} -\begin{definition} -Нетерминал $A$ называется \textit{порождающим}, если из него может быть выведена конечная терминальная цепочка. Иначе он называется \textit{непорождающим}. +\begin{definition}[Порождающий и непорождающий нетерминалы] + Нетерминал $A$ называется \emph{порождающим}, если из него может быть выведена конечная терминальная цепочка. + Иначе он называется \emph{непорождающим}. \end{definition} \begin{lemma} - Можно удалить все бесполезные (непорождающие) нетерминалы + Можно удалить все бесполезные (непорождающие) нетерминалы. \end{lemma} \begin{proof} - После удаления из грамматики правил, содержащих непорождающие нетерминалы, язык не изменится, так как непорождающие нетерминалы по определению не могли участвовать в выводе какого-либо слова. - - Алгоритм нахождения порождающих нетерминалов: - \begin{enumerate} - \item Множество порождающих нетерминалов пустое. - \item Найти правила, не содержащие нетерминалов в правых частях и добавить нетерминалы, встречающихся в левых частях таких правил, в множество. - \item Если найдено такое правило, что все нетерминалы, стоящие в его правой части, уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части. - \item Повторить предыдущий шаг, если множество порождающих нетерминалов изменилось. -\end{enumerate} -В результате получаем множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. Их можно удалить. + После удаления из грамматики правил, содержащих непорождающие нетерминалы, язык не изменится, так как непорождающие нетерминалы по определению не могли участвовать в выводе какого-либо слова. + + Алгоритм нахождения порождающих нетерминалов: + \begin{enumerate} + \item Множество порождающих нетерминалов пустое. + \item Найти правила, не содержащие нетерминалов в правых частях и добавить нетерминалы, встречающихся в левых частях таких правил, в множество. + \item Если найдено такое правило, что все нетерминалы, стоящие в его правой части, уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части. + \item Повторить предыдущий шаг, если множество порождающих нетерминалов изменилось. + \end{enumerate} + В результате получаем множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. + Их можно удалить. \end{proof} \begin{example} - Приведем в Нормальную Форму Хомского однозначную грамматику правильных скобочных последовательностей: $S \to a S b S \mid \varepsilon$ - - Первым шагом добавим новый нетерминал и сделаем его стартовым: - \begin{align*} - S_0 &\to S \\ - S &\to a S b S \mid \varepsilon - \end{align*} - Заменим все терминалы на новые нетерминалы: - \begin{align*} - S_0 &\to S \\ - S &\to L S R S \mid \varepsilon \\ - L &\to a \\ - R &\to b - \end{align*} - Избавимся от длинных правил: - \begin{align*} - S_0 &\to S \\ - S &\to L S' \mid \varepsilon \\ - S' &\to S S'' \\ - S'' &\to R S \\ - L &\to a \\ - R &\to b - \end{align*} - Избавимся от $\varepsilon$-продукций: - \begin{align*} - S_0 &\to S \mid \varepsilon \\ - S &\to L S' \\ - S' &\to S'' \mid S S'' \\ - S'' &\to R \mid R S \\ - L &\to a \\ - R &\to b - \end{align*} - Избавимся от цепных правил: - \begin{align*} - S_0 &\to L S' \mid \varepsilon \\ - S &\to L S' \\ - S' &\to b \mid R S \mid S S'' \\ - S'' &\to b \mid R S \\ - L &\to a \\ - R &\to b - \end{align*} + Приведем в Нормальную Форму Хомского однозначную грамматику правильных скобочных последовательностей: $S \to a S b S \mid \varepsilon$ + + Первым шагом добавим новый нетерминал и сделаем его стартовым: + \begin{align*} + S_0 & \to S \\ + S & \to a S b S \mid \varepsilon + \end{align*} + Заменим все терминалы на новые нетерминалы: + \begin{align*} + S_0 & \to S \\ + S & \to L S R S \mid \varepsilon \\ + L & \to a \\ + R & \to b + \end{align*} + Избавимся от длинных правил: + \begin{align*} + S_0 & \to S \\ + S & \to L S' \mid \varepsilon \\ + S' & \to S S'' \\ + S'' & \to R S \\ + L & \to a \\ + R & \to b + \end{align*} + Избавимся от $\varepsilon$-продукций: + \begin{align*} + S_0 & \to S \mid \varepsilon \\ + S & \to L S' \\ + S' & \to S'' \mid S S'' \\ + S'' & \to R \mid R S \\ + L & \to a \\ + R & \to b + \end{align*} + Избавимся от цепных правил: + \begin{align*} + S_0 & \to L S' \mid \varepsilon \\ + S & \to L S' \\ + S' & \to b \mid R S \mid S S'' \\ + S'' & \to b \mid R S \\ + L & \to a \\ + R & \to b + \end{align*} \end{example} -\begin{definition}\label{defn:wCNF} -Контекстно-свободная грамматика $\langle \Sigma, N, P, S\rangle$ находится в \textit{ослабленной Нормальной Форме Хомского}, если она содержит только правила следующего вида: - -\begin{itemize} - \item $A \to B C \text{, где } A, B, C \in N$ - \item $A \to a \text{, где } A \in N, a \in \Sigma$ - \item $A \to \varepsilon \text{, где } A \in N$ -\end{itemize} - -То есть ослабленная НФХ отличается от НФХ тем, что: -\begin{enumerate} - \item $\varepsilon$ может выводиться из любого нетерминала - \item $S$ может появляться в правых частях правил -\end{enumerate} +\begin{definition}[Ослабленная нормальная форма Хомского] + \label{defn:wCNF} + Контекстно-свободная грамматика $\langle \Sigma, N, P, S\rangle$ находится в \emph{ослабленной Нормальной Форме Хомского}, если она содержит только правила следующего вида: + \begin{itemize} + \item $A \to B C$, где $A, B, C \in N$; + \item $A \to a$, где $A \in N$, $a \in \Sigma$; + \item $A \to \varepsilon$, где $A \in N$. + \end{itemize} + + То есть ослабленная НФХ отличается от НФХ тем, что: + \begin{enumerate} + \item $\varepsilon$ может выводиться из любого нетерминала; + \item $S$ может появляться в правых частях правил. + \end{enumerate} \end{definition} \section{Лемма о накачке} \begin{lemma} -Пусть $L$ --- контекстно-свободный язык над алфавитом $\Sigma$, тогда существует такое $n$, что для любого слова $\omega \in L$, $|\omega| \geq n$ найдутся слова $u,v,x,y,z\in \Sigma^*$, для которых верно: $uvxyz = \omega, vy\neq \varepsilon,|vxy|\leq n$ и для любого $k \geq 0$ $uv^kxy^kz \in L$. + Пусть $L$~--- контекстно-свободный язык над алфавитом $\Sigma$, тогда существует такое $n$, что для любого слова $\omega \in L$, $|\omega| \geq n$ найдутся слова $u,v,x,y,z\in \Sigma^*$, для которых верно: $uvxyz = \omega, vy\neq \varepsilon,|vxy|\leq n$ и для любого $k \geq 0$ $uv^kxy^kz \in L$. \end{lemma} -Идея доказательства леммы о накачке. - -\begin{enumerate} - \item Для любого КС языка можно найти грамматику в нормальной форме Хомского. - \item Очевидно, что если брать достаточно длинные цепочки, то в дереве вывода этих цепочек, на пути от корня к какому-то листу обязательно будет нетерминал, встречающийся минимум два раза. Если $m$ --- количество нетерминалов в НФХ, то длины $2^{m+1}$ должно хватить. Это и будет $n$ из леммы. - \item Возьмём путь, на котором есть хотя бы дважды повторяется некоторый нетерминал. Скажем, это нетерминал $N_1$. Пойдём от листа по этому пути. Найдём первое появление $N_1$. Цепочка, задаваемая поддеревом для этого узла --- это $x$ из леммы. - \item Пойдём дальше и найдём второе появление $N_1$. Цепочка, задаваемая поддеревом для этого узла --- это $vxy$ из леммы. - \item Теперь мы можем копировать кусок дерева между этими повторениями $N_1$ и таким образом накачивать исходную цепочку. -\end{enumerate} - -Надо только проверить выполнение ограничений на длины. - -Нахождение разбиения и пример накачки продемонстрированы на рисунках~\ref{fig:pumping1} и~\ref{fig:pumping2}. +\begin{proofSketch} + \begin{enumerate} + \item Для любого КС языка можно найти грамматику в нормальной форме Хомского. + \item Очевидно, что если брать достаточно длинные цепочки, то в дереве вывода этих цепочек, на пути от корня к какому-то листу обязательно будет нетерминал, встречающийся минимум два раза. Если $m$~--- количество нетерминалов в НФХ, то длины $2^{m+1}$ должно хватить. Это и будет $n$ из леммы. + \item Возьмём путь, на котором есть хотя бы дважды повторяется некоторый нетерминал. Скажем, это нетерминал $N_1$. Пойдём от листа по этому пути. Найдём первое появление $N_1$. Цепочка, задаваемая поддеревом для этого узла~--- это $x$ из леммы. + \item Пойдём дальше и найдём второе появление $N_1$. Цепочка, задаваемая поддеревом для этого узла~--- это $vxy$ из леммы. + \item Теперь мы можем копировать кусок дерева между этими повторениями $N_1$ и таким образом накачивать исходную цепочку. + \end{enumerate} + Надо только проверить выполнение ограничений на длины. + Нахождение разбиения и пример накачки продемонстрированы на рисунках~\ref{fig:pumping1} и~\ref{fig:pumping2}. +\end{proofSketch} \begin{figure} -\centering -\input{figures/cfl/pumping1.tex} -\caption{Разбиение цепочки для леммы о накачке} -\label{fig:pumping1} + \centering + \input{figures/cfl/pumping1.tex} + \caption{Разбиение цепочки для леммы о накачке} + \label{fig:pumping1} \end{figure} \begin{figure} -\centering - \begin{subfigure}[b]{0.4\textwidth} - \centering - \input{figures/cfl/pumping0.tex} - \caption{$k = 0$.} - % \label{fig:f1} - \end{subfigure} -\hfill - \begin{subfigure}[b]{0.4\textwidth} \centering - \input{figures/cfl/pumping2.tex} - \caption{$k = 2$.} - % \label{fig:f2} - \end{subfigure} -\caption{Пример накачки цепочки с рисунка~\ref{fig:pumping1}} -\label{fig:pumping2} + \begin{subfigure}[b]{0.4\textwidth} + \centering + \input{figures/cfl/pumping0.tex} + \caption{$k = 0$.} + % \label{fig:f1} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.4\textwidth} + \centering + \input{figures/cfl/pumping2.tex} + \caption{$k = 2$.} + % \label{fig:f2} + \end{subfigure} + \caption{Пример накачки цепочки с рисунка~\ref{fig:pumping1}} + \label{fig:pumping2} \end{figure} - Для примера предлагается проверить неконтекстно-свободность языка $L=\{a^nb^nc^n \mid n>0\}$. - \section{Замкнутость КС языков относительно операций} - \begin{theorem} -Контекстно-свободные языки замкнуты относительно следующих операций: -\begin{enumerate} - \item Объединение: если $L_1$ и $L_2$ --- контекстно-свободные языки, то и $L_3 = L_1 \cup L_2$ --- контекстно-свободный. - \item Конкатенация: если $L_1$ и $L_2$ --- контекстно-свободные языки, то и $L_3 = L_1 \cdot L_2$ --- контекстно-свободный. - \item Замыкание Клини: если $L_1$ --- контекстно-свободный, то и $L_2 = \bigcup\limits_{i=0}^{\infty} L_1^i $ --- контекстно-свободный. - \item Разворот: если $L_1$ --- контекстно-свободный, то и $L_2 = {L_1}^r = \{ l^r \mid l \in L_1\}$ является контекстно-свободным. - \item Пересечение с регулярными языками: если $L_1$ --- контекстно-свободный, а $L_2$ --- регулярный, то $L_3 = L_1 \cap L_2$ --- контекстно-свободный. - \item Разность с регулярными языками: если $L_1$ --- контекстно-свободный, а $L_2$ --- регулярный, то $L_3 = L_1 \setminus L_2$ --- контекстно-свободный. -\end{enumerate} + Контекстно-свободные языки замкнуты относительно следующих операций: + \begin{enumerate} + \item Объединение: если $L_1$ и $L_2$~--- контекстно-свободные языки, то и $L_3 = L_1 \cup L_2$~--- контекстно-свободный. + \item Конкатенация: если $L_1$ и $L_2$~--- контекстно-свободные языки, то и $L_3 = L_1 \cdot L_2$~--- контекстно-свободный. + \item Замыкание Клини: если $L_1$~--- контекстно-свободный, то и $L_2 = \bigcup\limits_{i=0}^{\infty} L_1^i $~--- контекстно-свободный. + \item Разворот: если $L_1$~--- контекстно-свободный, то и $L_2 = {L_1}^r = \{ l^r \mid l \in L_1\}$ является контекстно-свободным. + \item Пересечение с регулярными языками: если $L_1$~--- контекстно-свободный, а $L_2$~--- регулярный, то $L_3 = L_1 \cap L_2$~--- контекстно-свободный. + \item Разность с регулярными языками: если $L_1$~--- контекстно-свободный, а $L_2$~--- регулярный, то $L_3 = L_1 \setminus L_2$~--- контекстно-свободный. + \end{enumerate} \end{theorem} -Для доказательства пунктов 1--4 можно построить КС грамматику нового языка имея грамматики для исходных. -Будем предполагать, что множества нетерминальных символов различных грамматик для исходных языков не пересекаются. -\begin{enumerate} -\item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$ --- грамматика для $L_1$, $G_1=\langle\Sigma_2,N_2,P_2,S_2\rangle$ --- грамматика для $L_2$, тогда $G_3=\langle\Sigma_1 \cup \Sigma_2, N_1 \cup N_2 \cup \{S_3\}, P_1 \cup P_2 \cup \{S_3 \to S_1 \mid S_2\} ,S_3\rangle$ --- грамматика для $L_3$. - -\item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$ --- грамматика для $L_1$, $G_1=\langle\Sigma_2,N_2,P_2,S_2\rangle$ --- грамматика для $L_2$, тогда $G_3=\langle\Sigma_1 \cup \Sigma_2, N_1 \cup N_2 \cup \{S_3\}, P_1 \cup P_2 \cup \{S_3 \to S_1 S_2\} ,S_3\rangle$ --- грамматика для $L_3$. - -\item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$ --- грамматика для $L_1$, тогда $G_2=\langle\Sigma_1, N_1 \cup \{S_2\}, P_1 \cup \{S_2 \to S_1 S_2\ \mid \varepsilon\}, S_2\rangle$ --- грамматика для $L_2$. - -\item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$ --- грамматика для $L_1$, тогда $G_2=\langle\Sigma_1, N_1, \{N^i \to \omega^R \mid N^i \to \omega \in P_1 \}, S_1\rangle$ --- грамматика для $L_2$. -\end{enumerate} - -Чтобы доказать замкнутость относительно пересечения с регулярными языками, построим по КС грамматике рекурсивный автомат $R_1$, по регулярному выражению --- детерминированный конечный автомат $R_2$, и построим их прямое произведение $R_3$. -Переходы по терминальным символам в новом автомате возможны тогда и только тогда, когда они возможны одновременно и в исходном рекурсивном автомате и в исходном конечном. -За рекурсивные вызовы отвечает исходный рекурсивный автомат. -Значит цепочка принимается $R_3$ тогда и только тогда, когда она принимается одновременно $R_1$ и $R_2$: так как состояния $R_3$ --- это пары из состояния $R_1$ и $R_2$, то по трассе вычислений $R_3$ мы всегда можем построить трассу для $R_1$ и $R_2$ и наоборот. - -Чтобы доказать замкнутость относительно разности с регулярным языком, достаточно вспомнить, что регулярные языки замкнуты относительно дополнения, и выразить разность через пересечение с дополнением: -\[ - L_1 \setminus L_2 = L_1 \cap \overline{L_2} -\] -\qed +\begin{proof} + Для доказательства пунктов 1--4 можно построить КС грамматику нового языка имея грамматики для исходных. + Будем предполагать, что множества нетерминальных символов различных грамматик для исходных языков не пересекаются. + \begin{enumerate} + \item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$~--- грамматика для $L_1$, $G_1=\langle\Sigma_2,N_2,P_2,S_2\rangle$~--- грамматика для $L_2$, тогда $G_3=\langle\Sigma_1 \cup \Sigma_2, N_1 \cup N_2 \cup \{S_3\}, P_1 \cup P_2 \cup \{S_3 \to S_1 \mid S_2\} ,S_3\rangle$~--- грамматика для $L_3$. + \item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$~--- грамматика для $L_1$, $G_1=\langle\Sigma_2,N_2,P_2,S_2\rangle$~--- грамматика для $L_2$, тогда $G_3=\langle\Sigma_1 \cup \Sigma_2, N_1 \cup N_2 \cup \{S_3\}, P_1 \cup P_2 \cup \{S_3 \to S_1 S_2\} ,S_3\rangle$~--- грамматика для $L_3$. + \item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$~--- грамматика для $L_1$, тогда $G_2=\langle\Sigma_1, N_1 \cup \{S_2\}, P_1 \cup \{S_2 \to S_1 S_2\ \mid \varepsilon\}, S_2\rangle$~--- грамматика для $L_2$. + \item $G_1=\langle\Sigma_1,N_1,P_1,S_1\rangle$~--- грамматика для $L_1$, тогда $G_2=\langle\Sigma_1, N_1, \{N^i \to \omega^R \mid N^i \to \omega \in P_1 \}, S_1\rangle$~--- грамматика для $L_2$. + \end{enumerate} + + Чтобы доказать замкнутость относительно пересечения с регулярными языками, построим по КС грамматике рекурсивный автомат $R_1$, по регулярному выражению~--- детерминированный конечный автомат $R_2$, и построим их прямое произведение $R_3$. + Переходы по терминальным символам в новом автомате возможны тогда и только тогда, когда они возможны одновременно и в исходном рекурсивном автомате и в исходном конечном. + За рекурсивные вызовы отвечает исходный рекурсивный автомат. + \marginnote{TODO: Вот тут RSM очень внезапно вылез} + Значит цепочка принимается $R_3$ тогда и только тогда, когда она принимается одновременно $R_1$ и $R_2$: так как состояния $R_3$~--- это пары из состояния $R_1$ и $R_2$, то по трассе вычислений $R_3$ мы всегда можем построить трассу для $R_1$ и $R_2$ и наоборот. + + Чтобы доказать замкнутость относительно разности с регулярным языком, достаточно вспомнить, что регулярные языки замкнуты относительно дополнения, и выразить разность через пересечение с дополнением: + \[L_1 \setminus L_2 = L_1 \cap \overline{L_2} \qedhere\] +\end{proof} \begin{theorem} -Контекстно-свободные языки не замкнуты относительно следующих операций: -\begin{enumerate} - \item Пересечение: если $L_1$ и $L_2$ --- контекстно-свободные языки, то и $L_3 = L_1 \cap L_2$ --- не контекстно-свободный. - \item Разность: если $L_1$ и $L_2$ --- контекстно-свободные языки, то и $L_3 = L_1 \setminus L_2$ --- не контекстно-свободный. -\end{enumerate} + Контекстно-свободные языки не замкнуты относительно следующих операций: + \begin{enumerate} + \item Пересечение: если $L_1$ и $L_2$~--- контекстно-свободные языки, то и $L_3 = L_1 \cap L_2$~--- не контекстно-свободный. + \item Разность: если $L_1$ и $L_2$~--- контекстно-свободные языки, то и $L_3 = L_1 \setminus L_2$~--- не контекстно-свободный. + \end{enumerate} \end{theorem} -Чтобы доказать незамкнутость относительно пресечения, рассмотрим языки $L_1 = \{a^n b^n c^k \mid n \geq 0, k \geq 0\}$ и $L_2 = \{a^k b^n c^n \mid n \geq 0, k \geq 0\}$. -Очевидно, что $L_1$ и $L_2$ --- контекстно-свободные языки. -Рассмотрим $L_3 = L_1 \cap L_2 = \{a^n b^n c^n \mid n \geq 0\}$. -$L_3$ не является контекстно-свободным по лемме о накачке для контекстно-свободных языков. - -Чтобы доказать незамкнутость относительно разности проделаем следующее. -\begin{enumerate} -\item Рассмотрим языки $L_4 = \{a^m b^n c^k \mid m \neq n, k \geq 0\}$ и $L_5 = \{a^m b^n c^k \mid n \neq k, m \geq 0\}$. -Эти языки являются контекстно-свободными. -Это легко заметить, если знать, что язык $L'_4 = \{a^m b^n c^k \mid 0 \leq m < n, k \geq 0\}$ задаётся следующей грамматикой: -\begin{align*} -S \to & S c & T \to & a T b \\ -S \to & T & T \to & T b \\ - & & T \to & b. -\end{align*} - -\item Рассмотрим язык $L_6 = \overline{L'_6} = \overline{\{a^n b^m c^k \mid n \geq 0, m \geq 0, k \geq 0\}}$. Данный язык является регулярным. - -\item Рассмотрим язык $L_7 = L_4 \cup L_5 \cup L_6$ --- контекстно-свободный, так как является объединением контекстно-свободных. - -\item Рассмотрим $\overline{L_7} = \{a^n b^n c^n \mid n \geq 0\} = L_3$: $L_4$ и $L_5$ задают языки с правильным порядком символов, но неравным их количеством, $L_6$ задаёт язык с неправильным порядком символов. -Из предыдущего пункта мы знаем, что $L_3$ не является контекстно-свободным. - -\end{enumerate} - -\qed +\begin{proof} + Чтобы доказать незамкнутость относительно пресечения, рассмотрим языки $L_1 = \{a^n b^n c^k \mid n \geq 0, k \geq 0\}$ и $L_2 = \{a^k b^n c^n \mid n \geq 0, k \geq 0\}$. + Очевидно, что $L_1$ и $L_2$~--- контекстно-свободные языки. + Рассмотрим $L_3 = L_1 \cap L_2 = \{a^n b^n c^n \mid n \geq 0\}$. + $L_3$ не является контекстно-свободным по лемме о накачке для контекстно-свободных языков. + + Чтобы доказать незамкнутость относительно разности проделаем следующее. + \begin{enumerate} + \item Рассмотрим языки $L_4 = \{a^m b^n c^k \mid m \neq n, k \geq 0\}$ и $L_5 = \{a^m b^n c^k \mid n \neq k, m \geq 0\}$. + Эти языки являются контекстно-свободными. + Это легко заметить, если знать, что язык $L'_4 = \{a^m b^n c^k \mid 0 \leq m < n, k \geq 0\}$ задаётся следующей грамматикой: + \begin{align*} + S & \to S c & T & \to a T b \\ + S & \to T & T & \to T b \\ + & & T & \to b. + \end{align*} + \item Рассмотрим язык $L_6 = \overline{L'_6} = \overline{\{a^n b^m c^k \mid n \geq 0, m \geq 0, k \geq 0\}}$. + Данный язык является регулярным. + \item Рассмотрим язык $L_7 = L_4 \cup L_5 \cup L_6$~--- контекстно-свободный, так как является объединением контекстно-свободных. + \item Рассмотрим $\overline{L_7} = \{a^n b^n c^n \mid n \geq 0\} = L_3$: $L_4$ и $L_5$ задают языки с правильным порядком символов, но неравным их количеством, $L_6$ задаёт язык с неправильным порядком символов. + Из предыдущего пункта мы знаем, что $L_3$ не является контекстно-свободным. + \qedhere + \end{enumerate} +\end{proof} \section{Рекурсивные автоматы и сети} -Рекурсивный автомат или сеть --- это представление контекстно-свободных грамматик, обобщающее конечные автоматы. -В нашей работе мы будем придерживаться термина \textbf{рекурсивный автомат}. +Рекурсивный автомат или сеть~--- это представление контекстно-свободных грамматик, обобщающее конечные автоматы. +В нашей работе мы будем придерживаться термина \emph{рекурсивный автомат}. Классическое определение рекурсивного автомата выглядит следующим образом. \begin{definition} -Рекурсивный автомат --- это кортеж вида $\langle N, \Sigma, S, D \rangle$, где -\begin{itemize} -\item $N$ --- нетерминальный алфавит; -\item $\Sigma$ --- терминальный алфавит; -\item $S$ --- стартовый нетерминал; -\item $D$ --- конечный автомат над $N \cup \Sigma$ в котором стартовые и финальные состояния помечены подмножествами $N$. -\end{itemize} + Рекурсивный автомат~--- это кортеж вида $\langle N, \Sigma, S, D \rangle$, где + \begin{itemize} + \item $N$~--- нетерминальный алфавит; + \item $\Sigma$~--- терминальный алфавит; + \item $S$~--- стартовый нетерминал; + \item $D$~--- конечный автомат над $N \cup \Sigma$ в котором стартовые и финальные состояния помечены подмножествами $N$. + \end{itemize} \end{definition} -Построение РКА по грамматике. +Построение РКА по грамматике. Допущение о том, что все состояния занумерованы подряд и уникальны. @@ -548,25 +536,26 @@ \section{Рекурсивные автоматы и сети} Построим рекурсивный автомат для грамматики $G$: \begin{align*} -S &\to a S b \\ -S &\to a b \\ + S & \to a S b \\ + S & \to a b \end{align*} - -\begin{align} -\label{input1} +\begin{figure} + \caption{Пример рекурсивного автомата для грамматики $G$.} + \label{input1} \begin{tikzpicture}[node distance=2.5cm,shorten >=1pt,on grid,auto] - \node[state, initial] (q_0) {$0 \{S\}$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state, accepting] (q_3) [right=of q_2] {$3\{S\}$}; + \node[state, initial] (q_0) {$0 \{S\}$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state, accepting] (q_3) [right=of q_2] {$3\{S\}$}; \path[->] (q_0) edge node {a} (q_1) (q_1) edge node {S} (q_2) (q_2) edge node {b} (q_3) (q_1) edge[bend left, above] node {b} (q_3); \end{tikzpicture} -\end{align} +\end{figure} + Используем стандартные обозначения для стартовых и финальных состояний. Дополнительно в стартовых и финальных состояниях укажем нетерминалы, для которых эти состояния стартовые/финальные. diff --git a/tex/FLPQ.tex b/tex/FLPQ.tex index 22dfdda..01dfb8f 100644 --- a/tex/FLPQ.tex +++ b/tex/FLPQ.tex @@ -1,62 +1,64 @@ -\chapter[Пути с ограничениями в терминах формальных языков]{Задача о поиске путей с ограничениями в терминах формальных языков}\label{chpt:FLPQ} - - +\setchapterpreamble[u]{\margintoc} +\chapter[Пути с ограничениями в терминах формальных языков]{Задача о поиске путей с ограничениями в терминах формальных языков} +\label{chpt:FLPQ} +\tikzsetfigurename{FLPQ_} В данной главе сформулируем постановку задачи о поиске путей в графе с ограничениями. Также мы приведём несколько примеров областей, в которых применяются алгоритмы решения этой задачи. -\section{Постановка задачи } +\section{Постановка задачи} - -Пусть нам дан конечный ориентированный помеченный граф $\mathcal{G}=\langle V,E,L \rangle$. -Функция $\omega(\pi) = \omega((v_0, l_0, v_1),(v_1,l_1,v_2),\dots,(v_{n-1},l_{n-1},v_n)) = l_0 \cdot l_1 \cdot \ldots \cdot l_{n-1} $ строит слово по пути посредством конкатенации меток рёбер вдоль этого пути. -Очевидно, для пустого пути данная функция будет возвращать пустое слово, а для пути длины $n > 0$ --- непустое слово длины $n$. +Пусть нам дан конечный ориентированный помеченный граф $\mscrG = \langle V, E, L \rangle$. +Функция $\omega(\pi) = \omega((v_0, l_0, v_1), (v_1, l_1, v_2), \dots, (v_{n-1}, l_{n-1}, v_n)) = l_0 \cdot l_1 \cdot \dots \cdot l_{n-1}$ строит слово по пути посредством конкатенации меток рёбер вдоль этого пути. +Очевидно, для пустого пути данная функция будет возвращать пустое слово, а для пути длины $n > 0$~--- непустое слово длины $n$. Если теперь рассматривать задачу поиска путей, то окажется, что то множество путей, которое мы хотим найти, задаёт множество слов, то есть язык. А значит, критерий поиска мы можем сформулировать следующим образом: нас интересуют такие пути, что слова, составленные из меток вдоль них, принадлежат заданному языку. -\begin{definition} \label{def1} - \textit{Задача поиска путей с ограничениями в терминах формальных языков} заключается в поиске множества путей $\Pi = \{\pi \mid \omega(\pi) \in \mathcal{L}\}$. +\begin{definition}[Задача поиска путей с ограничениями в терминах формальных языков] + \label{def1} + \emph{Задача поиска путей с ограничениями в терминах формальных языков} заключается в поиске множества путей $\Pi = \{\pi \mid \omega(\pi) \in \mscrL\}$. \end{definition} -В задаче поиска путей мы можем накладывать дополнительные ограничения на путь (например, чтобы он был простым, кратчайшим или Эйлеровым~\cite{kupferman2016eulerian}), но это уже другая история. +В задаче поиска путей мы можем накладывать дополнительные ограничения на путь (например, чтобы он был простым, кратчайшим или Эйлеровым~\sidecite{kupferman2016eulerian}), но это уже другая история. Другим вариантом постановки задачи является задача достижимости. -\begin{definition} \label{def2} - \textit{Задача достижимости} заключается в поиске множества пар вершин, для которых найдется путь с началом и концом в этих вершинах, что слово, составленное из меток рёбер пути, будет принадлежать заданному языку. - $\Pi' = \{(v_{i}, v_{j}) \mid \exists v_{i} \pi v_{j}, \omega(\pi) \in \mathcal{L}\}$. - +\begin{definition}[Задача достижимости] + \label{def2} + \emph{Задача достижимости} заключается в поиске множества пар вершин, для которых найдется путь с началом и концом в этих вершинах, что слово, составленное из меток рёбер пути, будет принадлежать заданному языку + \[\Pi' = \{(v_{i}, v_{j}) \mid \exists v_{i} \pi v_{j}, \omega(\pi) \in \mscrL\}.\] \end{definition} -При этом, множество $\Pi$ может являться бесконечным, тогда как $\Pi'$ конечно, по причине конечности графа $\mathcal{G}$. +При этом, множество $\Pi$ может являться бесконечным, тогда как $\Pi'$ конечно, по причине конечности графа $\mscrG$. -Язык $\mathcal{L}$ может принадлежать разным классам и быть задан разными способами. Например, он может быть регулярным, контекстно-свободным, или многокомпонентным контекстно-свободным. +Язык $\mscrL$ может принадлежать разным классам и быть задан разными способами. +Например, он может быть регулярным, контекстно-свободным, или многокомпонентным контекстно-свободным. -Если $\mathcal{L}$ --- регулярный, $\mathcal{G}$ можно рассматривать как недетерминированный конечный автомат (НКА), в котором все вершины являются одновременно и стартовыми, и конечными. -Тогда задача поиска путей, в которой $\mathcal{L}$ --- регулярный, сводится к пересечению двух регулярных языков. +Если $\mscrL$~--- регулярный, $\mscrG$ можно рассматривать как недетерминированный конечный автомат (НКА), в котором все вершины являются одновременно и стартовыми, и конечными. +Тогда задача поиска путей, в которой $\mscrL$~--- регулярный, сводится к пересечению двух регулярных языков. -Более подробно мы рассмотрим случай, когда $\mathcal{L}$ --- контекстно-свободный язык. +Более подробно мы рассмотрим случай, когда $\mscrL$~--- контекстно-свободный язык. -Путь $G = \langle \Sigma, N, P \rangle$ --- контекстно-свободная грамматика. +Путь $G = \langle \Sigma, N, P \rangle$~--- контекстно-свободная грамматика. Будем считать, что $L \subseteq \Sigma$. Мы не фиксируем стартовый нетерминал в определении грамматики, поэтому, чтобы описать язык, задаваемый ей, нам необходимо отдельно зафиксировать стартовый нетерминал. -Таким образом, будем говорить, что $L(G,N_i) = \{ w \mid N_i \xRightarrow[G]{*} w \}$ --- это язык задаваемый грамматикой $G$ со стартовым нетерминалом $N_i$. +Таким образом, будем говорить, что $L(G,N_i) = \{ w \mid N_i \xRightarrow[G]{*} w \}$~--- это язык задаваемый грамматикой $G$ со стартовым нетерминалом $N_i$. \begin{example} Пример задачи поиска путей. - Дана грамматика $G$, задающая язык $\mathcal{L} = a^n b^n$: + Дана грамматика $G$, задающая язык $\mscrL = a^n b^n$: \begin{align*} - S &\to a b \\ - S &\to a S b + S & \to a b \\ + S & \to a S b \end{align*} - И дан граф $\mathcal{G}:$ + И дан граф $\mscrG$: \begin{center} - \input{figures/graph/graph0.tex} + \input{figures/graph/graph0.tex} \end{center} - Кратчайшими путями, принадлежащими множеству $\Pi = \{\pi \mid \omega(\pi) \in \mathcal{L}\}$, являются: + Кратчайшими путями, принадлежащими множеству $\Pi = \{\pi \mid \omega(\pi) \in \mscrL\}$, являются: \begin{center} \input{figures/flpq/path1.tex} @@ -71,40 +73,31 @@ \section{Постановка задачи } \section{О разрешимости задачи} -Задачи из определения \ref{def1} и \ref{def2} сводятся к построению пересечения языка $\mathcal{L}$ и языка, задаваемого путями графа, $R$. +Задачи из определения \ref{def1} и \ref{def2} сводятся к построению пересечения языка $\mscrL$ и языка, задаваемого путями графа, $R$. А мы для обсуждения разрешимости задачи рассмотрим более слабую постановку задачи: -\begin{definition} - Необходимо проверить, что существует хотя бы один такой путь $\pi$ для данного графа, для данного языка $\mathcal{L}$, что $\omega(\pi) \in \mathcal{L}$. - +\begin{definition}[TODO: Что ты?] + Необходимо проверить, что существует хотя бы один такой путь $\pi$ для данного графа, для данного языка $\mscrL$, что $\omega(\pi) \in \mscrL$. \end{definition} -Эта задача сводится к проверке пустоты пересечения языка $\mathcal{L}$ c $R$ --- регулярным языком, задаваемым графом. От класса языка $\mathcal{L}$ зависит её разрешимость: - +Эта задача сводится к проверке пустоты пересечения языка $\mscrL$ c $R$~--- регулярным языком, задаваемым графом. +От класса языка $\mscrL$ зависит её разрешимость: \begin{itemize} - \item Если $\mathcal{L}$ регулярный, то получаем задачу пересечения двух регулярных языков: - - $\mathcal{L} \cap R = R'$. - $R'$ --- также регулярный язык. - Проверка регулярного языка на пустоту --- разрешимая проблема. - - \item Если $\mathcal{L}$ контекстно-свободный, то получаем задачу - - $\mathcal{L} \cap R = CF$ --- контекстно-свободный. - Проверка контекстно-свободного языка на пустоту --- разрешимая проблема. - + \item Если $\mscrL$ регулярный, то получаем задачу пересечения двух регулярных языков: $\mscrL \cap R = R'$. + $R'$~--- также регулярный язык. + Проверка регулярного языка на пустоту~--- разрешимая проблема. + \item Если $\mscrL$ контекстно-свободный, то получаем задачу: $\mscrL \cap R = CF$~--- контекстно-свободный. + Проверка контекстно-свободного языка на пустоту~--- разрешимая проблема. \item Помимо иерархии Хомского существуют и другие классификации языков. - Так например, класс конъюнктивных (Conj) - языков~\cite{DBLP:journals/jalc/Okhotin01} - является строгим расширением контекстно-свободных языков и все так же позволяет полиномиальный синтаксический анализ. - - Пусть $\mathcal{L}$ --- конъюнктивный. При пересечении конъюнктивного и регулярного языков получается конъюнктивный ($\mathcal{L} \cap R = Conj$), а проблема проверки Conj на пустоту не разрешима~\cite{DBLP:journals/tcs/Okhotin03a}. + Так например, класс конъюнктивных (Conj) языков~\sidecite{DBLP:journals/jalc/Okhotin01}является строгим расширением контекстно-свободных языков и все так же позволяет полиномиальный синтаксический анализ. - \item Ещё один класс языков из альтернативной иерархии, не сравнимой с Иерархией Хомского, --- MCFG (multiple context-free grammars)~\cite{SEKI1991191}. - Как его частный случай --- TAG (tree adjoining grammar)~\cite{Joshi1997}. - - Если $\mathcal{L}$ принадлежит классу MCFG, то $\mathcal{L} \cap R$ также принадлежит MCFG. Проблема проверки пустоты MCFG разрешима~\cite{SEKI1991191}. + Пусть $\mscrL$~--- конъюнктивный. + При пересечении конъюнктивного и регулярного языков получается конъюнктивный ($\mscrL \cap R = Conj$), а проблема проверки Conj на пустоту не разрешима~\sidecite{DBLP:journals/tcs/Okhotin03a}. + \item Ещё один класс языков из альтернативной иерархии, не сравнимой с Иерархией Хомского,~--- MCFG (multiple context-free grammars)~\sidecite{SEKI1991191}. + Как его частный случай~--- TAG (tree adjoining grammar)~\sidecite{Joshi1997}. + Если $\mscrL$ принадлежит классу MCFG, то $\mscrL \cap R$ также принадлежит MCFG. + Проблема проверки пустоты MCFG разрешима~\sidecite{SEKI1991191}. \end{itemize} Существует ещё много других классификаций языков, но поиск универсальной иерархии до сих пор продолжается. @@ -113,18 +106,20 @@ \section{О разрешимости задачи} \section{Области применения} -Поиск путей с ограничениями в виде формальных языков широко применяется в различных областях. Ниже даны ключевые работы по применению поиска путей с контекстно-свободными ограничениями и ссылки на них для более детального ознакомления. - +Поиск путей с ограничениями в виде формальных языков широко применяется в различных областях. +Ниже даны ключевые работы по применению поиска путей с контекстно-свободными ограничениями и ссылки на них для более детального ознакомления. \begin{itemize} \item Межпроцедурный Статанализ кода. - Идея начала активно разрабатываться Томасом Репсом~\cite{Reps}. Далее последовал ряд, в том числе инженерных работ, применяющих достижимость с контекстно-свободными ограничениями для анализа указателей, анализа алиасов и других прикладных задач~\cite{LabelFlowCFLReachability,specificationCFLReachability,Zheng}. - \item Графовые БД. Впервые задача сформулирована Михалисом Яннакакисом~\cite{Yannakakis}. Запросы с контекстно-свободными ограничениями нашли своё применение различных областях. - \begin{itemize} - \item Социальные сети~\cite{Hellings2015PathRF}. - \item RDF обработка~\cite{10.1007/978-3-319-46523-4_38}. - \item Биоинформатика~\cite{cfpqBio}. - \end{itemize} - + Идея начала активно разрабатываться Томасом Репсом~\sidecite{Reps}. + Далее последовал ряд, в том числе инженерных работ, применяющих достижимость с контекстно-свободными ограничениями для анализа указателей, анализа алиасов и других прикладных задач~\sidecite{LabelFlowCFLReachability,specificationCFLReachability,Zheng}. + \item Графовые БД. + Впервые задача сформулирована Михалисом Яннакакисом~\sidecite{Yannakakis}. + Запросы с контекстно-свободными ограничениями нашли своё применение различных областях. + \begin{itemize} + \item Социальные сети~\sidecite{Hellings2015PathRF}. + \item RDF обработка~\sidecite{10.1007/978-3-319-46523-4_38}. + \item Биоинформатика~\sidecite{cfpqBio}. + \end{itemize} \end{itemize} %\begin{itemize} diff --git a/tex/FormalLanguageConstrainedReachabilityLectureNotes.bib b/tex/FormalLanguageConstrainedReachabilityLectureNotes.bib index 2738d4b..6adf3ab 100644 --- a/tex/FormalLanguageConstrainedReachabilityLectureNotes.bib +++ b/tex/FormalLanguageConstrainedReachabilityLectureNotes.bib @@ -1,853 +1,854 @@ @article{cohen2016parsing, - title={Parsing linear context-free rewriting systems with fast matrix multiplication}, - author={Cohen, Shay B and Gildea, Daniel}, - journal={Computational Linguistics}, - volume={42}, - number={3}, - pages={421--455}, - year={2016}, - publisher={MIT Press One Rogers Street, Cambridge, MA 02142-1209, USA journals-info~…} + title = {Parsing linear context-free rewriting systems with fast matrix multiplication}, + author = {Cohen, Shay B and Gildea, Daniel}, + journal = {Computational Linguistics}, + volume = {42}, + number = {3}, + pages = {421--455}, + year = {2016}, + publisher = {MIT Press One Rogers Street, Cambridge, MA 02142-1209, USA journals-info~…} } @inproceedings{nakanishi1997efficient, - title={An efficient recognition algorithm for multiple context-free languages}, - author={Nakanishi, Ryuichi and Takada, Keita and Seki, Hiroyuki}, - booktitle={In Proceedings of the Fifth Meeting on Mathematics of Language, MOL5}, - year={1997}, - organization={Citeseer} + title = {An efficient recognition algorithm for multiple context-free languages}, + author = {Nakanishi, Ryuichi and Takada, Keita and Seki, Hiroyuki}, + booktitle = {In Proceedings of the Fifth Meeting on Mathematics of Language, MOL5}, + year = {1997}, + organization = {Citeseer} } @inproceedings{zhang2013fast, - title={Fast algorithms for Dyck-CFL-reachability with applications to alias analysis}, - author={Zhang, Qirun and Lyu, Michael R and Yuan, Hao and Su, Zhendong}, - booktitle={Proceedings of the 34th ACM SIGPLAN Conference on Programming Language Design and Implementation}, - pages={435--446}, - year={2013} + title = {Fast algorithms for Dyck-CFL-reachability with applications to alias analysis}, + author = {Zhang, Qirun and Lyu, Michael R and Yuan, Hao and Su, Zhendong}, + booktitle = {Proceedings of the 34th ACM SIGPLAN Conference on Programming Language Design and Implementation}, + pages = {435--446}, + year = {2013} } @article{kodumal2004set, - title={The set constraint/CFL reachability connection in practice}, - author={Kodumal, John and Aiken, Alex}, - journal={ACM Sigplan Notices}, - volume={39}, - number={6}, - pages={207--218}, - year={2004}, - publisher={ACM New York, NY, USA} + title = {The set constraint/CFL reachability connection in practice}, + author = {Kodumal, John and Aiken, Alex}, + journal = {ACM Sigplan Notices}, + volume = {39}, + number = {6}, + pages = {207--218}, + year = {2004}, + publisher = {ACM New York, NY, USA} } @article{reps2000undecidability, - title={Undecidability of context-sensitive data-dependence analysis}, - author={Reps, Thomas}, - journal={ACM Transactions on Programming Languages and Systems (TOPLAS)}, - volume={22}, - number={1}, - pages={162--186}, - year={2000}, - publisher={ACM New York, NY, USA} + title = {Undecidability of context-sensitive data-dependence analysis}, + author = {Reps, Thomas}, + journal = {ACM Transactions on Programming Languages and Systems (TOPLAS)}, + volume = {22}, + number = {1}, + pages = {162--186}, + year = {2000}, + publisher = {ACM New York, NY, USA} } @inproceedings{yan2011demand, - title={Demand-driven context-sensitive alias analysis for Java}, - author={Yan, Dacong and Xu, Guoqing and Rountev, Atanas}, - booktitle={Proceedings of the 2011 International Symposium on Software Testing and Analysis}, - pages={155--165}, - year={2011} + title = {Demand-driven context-sensitive alias analysis for Java}, + author = {Yan, Dacong and Xu, Guoqing and Rountev, Atanas}, + booktitle = {Proceedings of the 2011 International Symposium on Software Testing and Analysis}, + pages = {155--165}, + year = {2011} } @inproceedings{bastani2015specification, - title={Specification inference using context-free language reachability}, - author={Bastani, Osbert and Anand, Saswat and Aiken, Alex}, - booktitle={Proceedings of the 42nd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages}, - pages={553--566}, - year={2015} + title = {Specification inference using context-free language reachability}, + author = {Bastani, Osbert and Anand, Saswat and Aiken, Alex}, + booktitle = {Proceedings of the 42nd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages}, + pages = {553--566}, + year = {2015} } @inproceedings{zheng2008demand, - title={Demand-driven alias analysis for C}, - author={Zheng, Xin and Rugina, Radu}, - booktitle={Proceedings of the 35th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages}, - pages={197--208}, - year={2008} + title = {Demand-driven alias analysis for C}, + author = {Zheng, Xin and Rugina, Radu}, + booktitle = {Proceedings of the 35th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages}, + pages = {197--208}, + year = {2008} } @inproceedings{huang2015scalable, - title={Scalable and precise taint analysis for android}, - author={Huang, Wei and Dong, Yao and Milanova, Ana and Dolby, Julian}, - booktitle={Proceedings of the 2015 International Symposium on Software Testing and Analysis}, - pages={106--117}, - year={2015} + title = {Scalable and precise taint analysis for android}, + author = {Huang, Wei and Dong, Yao and Milanova, Ana and Dolby, Julian}, + booktitle = {Proceedings of the 2015 International Symposium on Software Testing and Analysis}, + pages = {106--117}, + year = {2015} } @article{sridharan2006refinement, - title={Refinement-based context-sensitive points-to analysis for Java}, - author={Sridharan, Manu and Bod{\'\i}k, Rastislav}, - journal={ACM SIGPLAN Notices}, - volume={41}, - number={6}, - pages={387--400}, - year={2006}, - publisher={ACM New York, NY, USA} + title = {Refinement-based context-sensitive points-to analysis for Java}, + author = {Sridharan, Manu and Bod{\'\i}k, Rastislav}, + journal = {ACM SIGPLAN Notices}, + volume = {41}, + number = {6}, + pages = {387--400}, + year = {2006}, + publisher = {ACM New York, NY, USA} } @inproceedings{zhang2017context, - title={Context-sensitive data-dependence analysis via linear conjunctive language reachability}, - author={Zhang, Qirun and Su, Zhendong}, - booktitle={Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages}, - pages={344--358}, - year={2017} + title = {Context-sensitive data-dependence analysis via linear conjunctive language reachability}, + author = {Zhang, Qirun and Su, Zhendong}, + booktitle = {Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages}, + pages = {344--358}, + year = {2017} } @article{seki1991multiple, - title={On multiple context-free grammars}, - author={Seki, Hiroyuki and Matsumura, Takashi and Fujii, Mamoru and Kasami, Tadao}, - journal={Theoretical Computer Science}, - volume={88}, - number={2}, - pages={191--229}, - year={1991}, - publisher={Elsevier} + title = {On multiple context-free grammars}, + author = {Seki, Hiroyuki and Matsumura, Takashi and Fujii, Mamoru and Kasami, Tadao}, + journal = {Theoretical Computer Science}, + volume = {88}, + number = {2}, + pages = {191--229}, + year = {1991}, + publisher = {Elsevier} } @book{Hopcroft+Ullman/79/Introduction, - added-at = {2009-05-20T01:29:36.000+0200}, - author = {Hopcroft, John E. and Ullman, Jeff D.}, - biburl = {https://www.bibsonomy.org/bibtex/26f42b10773b0f97be73d4e0d6b8db3bf/sriram0339}, - description = {First cut database}, - interhash = {0fb20598f4921085d9c5058fc8d95f00}, - intrahash = {6f42b10773b0f97be73d4e0d6b8db3bf}, - keywords = {imported}, - publisher = {Addison-Wesley Publishing Company}, - timestamp = {2009-05-20T01:29:37.000+0200}, - title = {Introduction to Automata Theory, Languages, and Computation}, - year = 1979 + added-at = {2009-05-20T01:29:36.000+0200}, + author = {Hopcroft, John E. and Ullman, Jeff D.}, + biburl = {https://www.bibsonomy.org/bibtex/26f42b10773b0f97be73d4e0d6b8db3bf/sriram0339}, + description = {First cut database}, + interhash = {0fb20598f4921085d9c5058fc8d95f00}, + intrahash = {6f42b10773b0f97be73d4e0d6b8db3bf}, + keywords = {imported}, + publisher = {Addison-Wesley Publishing Company}, + timestamp = {2009-05-20T01:29:37.000+0200}, + title = {Introduction to Automata Theory, Languages, and Computation}, + year = 1979 } @inproceedings{Verbitskaia:2018:PCC:3241653.3241655, - author = {Verbitskaia, Ekaterina and Kirillov, Ilya and Nozkin, Ilya and Grigorev, Semyon}, - title = {Parser Combinators for Context-free Path Querying}, - booktitle = {Proceedings of the 9th ACM SIGPLAN International Symposium on Scala}, - series = {Scala 2018}, - year = {2018}, - isbn = {978-1-4503-5836-1}, - location = {St. Louis, MO, USA}, - pages = {13--23}, - numpages = {11}, - url = {http://doi.acm.org/10.1145/3241653.3241655}, - doi = {10.1145/3241653.3241655}, - acmid = {3241655}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {Context-Free Language Reachability, Context-Free Path Querying, GLL, Generalized LL, Graph Databases, Language-Constrained Path Problem, Neo4j, Parser Combinators, Scala}, + author = {Verbitskaia, Ekaterina and Kirillov, Ilya and Nozkin, Ilya and Grigorev, Semyon}, + title = {Parser Combinators for Context-free Path Querying}, + booktitle = {Proceedings of the 9th ACM SIGPLAN International Symposium on Scala}, + series = {Scala 2018}, + year = {2018}, + isbn = {978-1-4503-5836-1}, + location = {St. Louis, MO, USA}, + pages = {13--23}, + numpages = {11}, + url = {http://doi.acm.org/10.1145/3241653.3241655}, + doi = {10.1145/3241653.3241655}, + acmid = {3241655}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {Context-Free Language Reachability, Context-Free Path Querying, GLL, Generalized LL, Graph Databases, Language-Constrained Path Problem, Neo4j, Parser Combinators, Scala} } @inproceedings{Mishin:2019:ECP:3327964.3328503, - author = {Mishin, Nikita and Sokolov, Iaroslav and Spirin, Egor and Kutuev, Vladimir and Nemchinov, Egor and Gorbatyuk, Sergey and Grigorev, Semyon}, - title = {Evaluation of the Context-Free Path Querying Algorithm Based on Matrix Multiplication}, - booktitle = {Proceedings of the 2Nd Joint International Workshop on Graph Data Management Experiences \& Systems (GRADES) and Network Data Analytics (NDA)}, - series = {GRADES-NDA'19}, - year = {2019}, - isbn = {978-1-4503-6789-9}, - location = {Amsterdam, Netherlands}, - pages = {12:1--12:5}, - articleno = {12}, - numpages = {5}, - url = {http://doi.acm.org/10.1145/3327964.3328503}, - doi = {10.1145/3327964.3328503}, - acmid = {3328503}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {CUDA, Context-free path querying, GPGPU, boolean matrix, context-free grammar, graph databases, matrix multiplication, transitive closure}, + author = {Mishin, Nikita and Sokolov, Iaroslav and Spirin, Egor and Kutuev, Vladimir and Nemchinov, Egor and Gorbatyuk, Sergey and Grigorev, Semyon}, + title = {Evaluation of the Context-Free Path Querying Algorithm Based on Matrix Multiplication}, + booktitle = {Proceedings of the 2Nd Joint International Workshop on Graph Data Management Experiences \& Systems (GRADES) and Network Data Analytics (NDA)}, + series = {GRADES-NDA'19}, + year = {2019}, + isbn = {978-1-4503-6789-9}, + location = {Amsterdam, Netherlands}, + pages = {12:1--12:5}, + articleno = {12}, + numpages = {5}, + url = {http://doi.acm.org/10.1145/3327964.3328503}, + doi = {10.1145/3327964.3328503}, + acmid = {3328503}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {CUDA, Context-free path querying, GPGPU, boolean matrix, context-free grammar, graph databases, matrix multiplication, transitive closure} } @article{Valiant:1975:GCR:1739932.1740048, - author = {Valiant, Leslie G.}, - title = {General Context-free Recognition in Less Than Cubic Time}, - journal = {J. Comput. Syst. Sci.}, - issue_date = {April, 1975}, - volume = {10}, - number = {2}, - month = apr, - year = {1975}, - issn = {0022-0000}, - pages = {308--315}, - numpages = {8}, - url = {http://dx.doi.org/10.1016/S0022-0000(75)80046-8}, - doi = {10.1016/S0022-0000(75)80046-8}, - acmid = {1740048}, - publisher = {Academic Press, Inc.}, - address = {Orlando, FL, USA}, + author = {Valiant, Leslie G.}, + title = {General Context-free Recognition in Less Than Cubic Time}, + journal = {J. Comput. Syst. Sci.}, + issue_date = {April, 1975}, + volume = {10}, + number = {2}, + month = apr, + year = {1975}, + issn = {0022-0000}, + pages = {308--315}, + numpages = {8}, + url = {http://dx.doi.org/10.1016/S0022-0000(75)80046-8}, + doi = {10.1016/S0022-0000(75)80046-8}, + acmid = {1740048}, + publisher = {Academic Press, Inc.}, + address = {Orlando, FL, USA} } @inproceedings{Yannakis, -author = {Yannakakis, Mihalis}, -year = {1990}, -month = {01}, -pages = {230-242}, -title = {Graph-Theoretic Methods in Database Theory.}, -doi = {10.1145/298514.298576} + author = {Yannakakis, Mihalis}, + year = {1990}, + month = {01}, + pages = {230-242}, + title = {Graph-Theoretic Methods in Database Theory.}, + doi = {10.1145/298514.298576} } @inproceedings{Azimov:2018:CPQ:3210259.3210264, - author = {Azimov, Rustam and Grigorev, Semyon}, - title = {Context-free Path Querying by Matrix Multiplication}, - booktitle = {Proceedings of the 1st ACM SIGMOD Joint International Workshop on Graph Data Management Experiences \& Systems (GRADES) and Network Data Analytics (NDA)}, - series = {GRADES-NDA '18}, - year = {2018}, - isbn = {978-1-4503-5695-4}, - location = {Houston, Texas}, - pages = {5:1--5:10}, - articleno = {5}, - numpages = {10}, - url = {http://doi.acm.org/10.1145/3210259.3210264}, - doi = {10.1145/3210259.3210264}, - acmid = {3210264}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {GPGPU, context-free grammar, context-free path querying, graph databases, matrix multiplication, transitive closure}, + author = {Azimov, Rustam and Grigorev, Semyon}, + title = {Context-free Path Querying by Matrix Multiplication}, + booktitle = {Proceedings of the 1st ACM SIGMOD Joint International Workshop on Graph Data Management Experiences \& Systems (GRADES) and Network Data Analytics (NDA)}, + series = {GRADES-NDA '18}, + year = {2018}, + isbn = {978-1-4503-5695-4}, + location = {Houston, Texas}, + pages = {5:1--5:10}, + articleno = {5}, + numpages = {10}, + url = {http://doi.acm.org/10.1145/3210259.3210264}, + doi = {10.1145/3210259.3210264}, + acmid = {3210264}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {GPGPU, context-free grammar, context-free path querying, graph databases, matrix multiplication, transitive closure} } @inproceedings{Grigorev:2017:CPQ:3166094.3166104, - author = {Grigorev, Semyon and Ragozina, Anastasiya}, - title = {Context-free Path Querying with Structural Representation of Result}, - booktitle = {Proceedings of the 13th Central \& Eastern European Software Engineering Conference in Russia}, - series = {CEE-SECR '17}, - year = {2017}, - isbn = {978-1-4503-6396-9}, - location = {St. Petersburg, Russia}, - pages = {10:1--10:7}, - articleno = {10}, - numpages = {7}, - url = {http://doi.acm.org/10.1145/3166094.3166104}, - doi = {10.1145/3166094.3166104}, - acmid = {3166104}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {CFPQ, GLL, LL, context-free grammar, graph database, graph parsing, path query, top-down parsing}, + author = {Grigorev, Semyon and Ragozina, Anastasiya}, + title = {Context-free Path Querying with Structural Representation of Result}, + booktitle = {Proceedings of the 13th Central \& Eastern European Software Engineering Conference in Russia}, + series = {CEE-SECR '17}, + year = {2017}, + isbn = {978-1-4503-6396-9}, + location = {St. Petersburg, Russia}, + pages = {10:1--10:7}, + articleno = {10}, + numpages = {7}, + url = {http://doi.acm.org/10.1145/3166094.3166104}, + doi = {10.1145/3166094.3166104}, + acmid = {3166104}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {CFPQ, GLL, LL, context-free grammar, graph database, graph parsing, path query, top-down parsing} } @inproceedings{Kuijpers:2019:ESC:3335783.3335791, - author = {Kuijpers, Jochem and Fletcher, George and Yakovets, Nikolay and Lindaaker, Tobias}, - title = {An Experimental Study of Context-Free Path Query Evaluation Methods}, - booktitle = {Proceedings of the 31st International Conference on Scientific and Statistical Database Management}, - series = {SSDBM '19}, - year = {2019}, - isbn = {978-1-4503-6216-0}, - location = {Santa Cruz, CA, USA}, - pages = {121--132}, - numpages = {12}, - url = {http://doi.acm.org/10.1145/3335783.3335791}, - doi = {10.1145/3335783.3335791}, - acmid = {3335791}, - publisher = {ACM}, - address = {New York, NY, USA}, + author = {Kuijpers, Jochem and Fletcher, George and Yakovets, Nikolay and Lindaaker, Tobias}, + title = {An Experimental Study of Context-Free Path Query Evaluation Methods}, + booktitle = {Proceedings of the 31st International Conference on Scientific and Statistical Database Management}, + series = {SSDBM '19}, + year = {2019}, + isbn = {978-1-4503-6216-0}, + location = {Santa Cruz, CA, USA}, + pages = {121--132}, + numpages = {12}, + url = {http://doi.acm.org/10.1145/3335783.3335791}, + doi = {10.1145/3335783.3335791}, + acmid = {3335791}, + publisher = {ACM}, + address = {New York, NY, USA} } @article{MEDEIROS201975, -title = "LL-based query answering over RDF databases", -journal = "Journal of Computer Languages", -volume = "51", -pages = "75 - 87", -year = "2019", -issn = "2590-1184", -doi = "https://doi.org/10.1016/j.cola.2019.02.002", -url = "http://www.sciencedirect.com/science/article/pii/S1045926X18301915", -author = "Ciro M. Medeiros and Martin A. Musicante and Umberto S. Costa", -keywords = "Context-Free graph patterns, Graph databases, RDF, SPARQL", -abstract = "We present a method based on top-down parsing techniques for evaluating context-free path queries on RDF Graph Databases. The syntax of the query language is based on SPARQL. The language extends SPARQL by allowing the use of non-terminal symbols of a context-free grammar to specify paths on the graph. In this manner, the language subsumes the definition of regular graph patterns present in SPARQL. Our query evaluator takes an RDF graph, a context-free grammar and a declarative query, and produces tuples of values. The query evaluator proceeds in two stages: Firstly, the RDF graph is enriched with edges representing paths which correspond to strings derived by the grammar. We show that this algorithm is correct and presents a cubic worst-case run-time complexity on the number of nodes in the graph, which is an improvement over some previous work. The second stage of the evaluator uses the produced graph to identify tuples of values defined by a declarative query. In order to validate our approach, we conducted experiments by using some popular ontologies as well as synthetic databases. We compare performance results of our method with some related work." -} - - -@INPROCEEDINGS{8249039, -author={P. G. {Bradford}}, -booktitle={2017 IEEE 8th Annual Ubiquitous Computing, Electronics and Mobile Communication Conference (UEMCON)}, -title={Efficient exact paths for dyck and semi-dyck labeled path reachability (extended abstract)}, -year={2017}, -volume={}, -number={}, -pages={247-253}, -keywords={computational complexity;directed graphs;formal languages;graph theory;matrix multiplication;reachability analysis;efficient exact paths;weighted digraph;exact path length problem;exact path problem;original edge weights;path solutions;labeled digraph;semiDyck languages;Dyck languages;labeled path problems;Grammar;Heuristic algorithms;Jacobian matrices;Costing;Algorithm design and analysis;Shortest path problem}, -doi={10.1109/UEMCON.2017.8249039}, -ISSN={}, -month={Oct},} + title = {LL-based query answering over RDF databases}, + journal = {Journal of Computer Languages}, + volume = {51}, + pages = {75 - 87}, + year = {2019}, + issn = {2590-1184}, + doi = {https://doi.org/10.1016/j.cola.2019.02.002}, + url = {http://www.sciencedirect.com/science/article/pii/S1045926X18301915}, + author = {Ciro M. Medeiros and Martin A. Musicante and Umberto S. Costa}, + keywords = {Context-Free graph patterns, Graph databases, RDF, SPARQL}, + abstract = {We present a method based on top-down parsing techniques for evaluating context-free path queries on RDF Graph Databases. The syntax of the query language is based on SPARQL. The language extends SPARQL by allowing the use of non-terminal symbols of a context-free grammar to specify paths on the graph. In this manner, the language subsumes the definition of regular graph patterns present in SPARQL. Our query evaluator takes an RDF graph, a context-free grammar and a declarative query, and produces tuples of values. The query evaluator proceeds in two stages: Firstly, the RDF graph is enriched with edges representing paths which correspond to strings derived by the grammar. We show that this algorithm is correct and presents a cubic worst-case run-time complexity on the number of nodes in the graph, which is an improvement over some previous work. The second stage of the evaluator uses the produced graph to identify tuples of values defined by a declarative query. In order to validate our approach, we conducted experiments by using some popular ontologies as well as synthetic databases. We compare performance results of our method with some related work.} +} + + +@inproceedings{8249039, + author = {P. G. {Bradford}}, + booktitle = {2017 IEEE 8th Annual Ubiquitous Computing, Electronics and Mobile Communication Conference (UEMCON)}, + title = {Efficient exact paths for dyck and semi-dyck labeled path reachability (extended abstract)}, + year = {2017}, + volume = {}, + number = {}, + pages = {247-253}, + keywords = {computational complexity;directed graphs;formal languages;graph theory;matrix multiplication;reachability analysis;efficient exact paths;weighted digraph;exact path length problem;exact path problem;original edge weights;path solutions;labeled digraph;semiDyck languages;Dyck languages;labeled path problems;Grammar;Heuristic algorithms;Jacobian matrices;Costing;Algorithm design and analysis;Shortest path problem}, + doi = {10.1109/UEMCON.2017.8249039}, + issn = {}, + month = {Oct} +} @article{quadtree, -author = {El abbadi, Nidhal}, -year = {2014}, -month = {11}, -pages = {25-30}, -title = {An Efficient Storage Format for Large Sparse Matrices based on Quadtree}, -volume = {105}, -journal = {International Journal of Computer Applications} -} - -@InProceedings{10.1007/978-3-319-41579-6_22, -author="Verbitskaia, Ekaterina -and Grigorev, Semyon -and Avdyukhin, Dmitry", -editor="Mazzara, Manuel -and Voronkov, Andrei", -title="Relaxed Parsing of Regular Approximations of String-Embedded Languages", -booktitle="Perspectives of System Informatics", -year="2016", -publisher="Springer International Publishing", -address="Cham", -pages="291--302", -abstract="We present a technique for syntax analysis of a regular set of input strings. This problem is relevant for the analysis of string-embedded languages when a host program generates clauses of embedded language at run time. Our technique is based on a generalization of RNGLR algorithm, which, inherently, allows us to construct a finite representation of parse forest for regularly approximated set of input strings. This representation can be further utilized for semantic analysis and transformations in the context of reengineering, code maintenance, program understanding etc. The approach in question implements relaxed parsing: non-recognized strings in approximation set are ignored with no error detection.", -isbn="978-3-319-41579-6" + author = {El abbadi, Nidhal}, + year = {2014}, + month = {11}, + pages = {25-30}, + title = {An Efficient Storage Format for Large Sparse Matrices based on Quadtree}, + volume = {105}, + journal = {International Journal of Computer Applications} +} + +@inproceedings{10.1007/978-3-319-41579-6_22, + author = {Verbitskaia, Ekaterina + and Grigorev, Semyon + and Avdyukhin, Dmitry}, + editor = {Mazzara, Manuel + and Voronkov, Andrei}, + title = {Relaxed Parsing of Regular Approximations of String-Embedded Languages}, + booktitle = {Perspectives of System Informatics}, + year = {2016}, + publisher = {Springer International Publishing}, + address = {Cham}, + pages = {291--302}, + abstract = {We present a technique for syntax analysis of a regular set of input strings. This problem is relevant for the analysis of string-embedded languages when a host program generates clauses of embedded language at run time. Our technique is based on a generalization of RNGLR algorithm, which, inherently, allows us to construct a finite representation of parse forest for regularly approximated set of input strings. This representation can be further utilized for semantic analysis and transformations in the context of reengineering, code maintenance, program understanding etc. The approach in question implements relaxed parsing: non-recognized strings in approximation set are ignored with no error detection.}, + isbn = {978-3-319-41579-6} } @article{Lee:2002:FCG:505241.505242, - author = {Lee, Lillian}, - title = {Fast Context-free Grammar Parsing Requires Fast Boolean Matrix Multiplication}, - journal = {J. ACM}, - issue_date = {January 2002}, - volume = {49}, - number = {1}, - month = jan, - year = {2002}, - issn = {0004-5411}, - pages = {1--15}, - numpages = {15}, - url = {http://doi.acm.org/10.1145/505241.505242}, - doi = {10.1145/505241.505242}, - acmid = {505242}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {Boolean matrix multiplication, context-free grammar parsing}, + author = {Lee, Lillian}, + title = {Fast Context-free Grammar Parsing Requires Fast Boolean Matrix Multiplication}, + journal = {J. ACM}, + issue_date = {January 2002}, + volume = {49}, + number = {1}, + month = jan, + year = {2002}, + issn = {0004-5411}, + pages = {1--15}, + numpages = {15}, + url = {http://doi.acm.org/10.1145/505241.505242}, + doi = {10.1145/505241.505242}, + acmid = {505242}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {Boolean matrix multiplication, context-free grammar parsing} } @article{Chan2008, -author="Chan, Timothy M.", -title="All-Pairs Shortest Paths with Real Weights in $O(n^3/log{\thinspace}n)$ Time", -journal="Algorithmica", -year="2008", -month="Feb", -day="01", -volume="50", -number="2", -pages="236--243", -issn="1432-0541", -doi="10.1007/s00453-007-9062-1", -url="https://doi.org/10.1007/s00453-007-9062-1" + author = {Chan, Timothy M.}, + title = {All-Pairs Shortest Paths with Real Weights in $O(n^3/log{\thinspace}n)$ Time}, + journal = {Algorithmica}, + year = {2008}, + month = {Feb}, + day = {01}, + volume = {50}, + number = {2}, + pages = {236--243}, + issn = {1432-0541}, + doi = {10.1007/s00453-007-9062-1}, + url = {https://doi.org/10.1007/s00453-007-9062-1} } @inproceedings{Williams:2010:SEP:1917827.1918339, - author = {Williams, Virginia Vassilevska and Williams, Ryan}, - title = {Subcubic Equivalences Between Path, Matrix and Triangle Problems}, - booktitle = {Proceedings of the 2010 IEEE 51st Annual Symposium on Foundations of Computer Science}, - series = {FOCS '10}, - year = {2010}, - isbn = {978-0-7695-4244-7}, - pages = {645--654}, - numpages = {10}, - url = {http://dx.doi.org/10.1109/FOCS.2010.67}, - doi = {10.1109/FOCS.2010.67}, - acmid = {1918339}, - publisher = {IEEE Computer Society}, - address = {Washington, DC, USA}, - keywords = {all pairs shortest paths, subcubic algorithms, equivalences, reductions, matrix multiplication, triangle detection, minimum cycle, replacement paths}, + author = {Williams, Virginia Vassilevska and Williams, Ryan}, + title = {Subcubic Equivalences Between Path, Matrix and Triangle Problems}, + booktitle = {Proceedings of the 2010 IEEE 51st Annual Symposium on Foundations of Computer Science}, + series = {FOCS '10}, + year = {2010}, + isbn = {978-0-7695-4244-7}, + pages = {645--654}, + numpages = {10}, + url = {http://dx.doi.org/10.1109/FOCS.2010.67}, + doi = {10.1109/FOCS.2010.67}, + acmid = {1918339}, + publisher = {IEEE Computer Society}, + address = {Washington, DC, USA}, + keywords = {all pairs shortest paths, subcubic algorithms, equivalences, reductions, matrix multiplication, triangle detection, minimum cycle, replacement paths} } @inproceedings{Kroni:2013:PGA:2489837.2489844, - author = {Kr\"{o}ni, Daniel and Schweizer, Raphael}, - title = {Parsing Graphs: Applying Parser Combinators to Graph Traversals}, - booktitle = {Proceedings of the 4th Workshop on Scala}, - series = {SCALA '13}, - year = {2013}, - isbn = {978-1-4503-2064-1}, - location = {Montpellier, France}, - pages = {7:1--7:4}, - articleno = {7}, - numpages = {4}, - url = {http://doi.acm.org/10.1145/2489837.2489844}, - doi = {10.1145/2489837.2489844}, - acmid = {2489844}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {Scala, domain specific language, graph database, graph traversal, parser combinators}, + author = {Kr\"{o}ni, Daniel and Schweizer, Raphael}, + title = {Parsing Graphs: Applying Parser Combinators to Graph Traversals}, + booktitle = {Proceedings of the 4th Workshop on Scala}, + series = {SCALA '13}, + year = {2013}, + isbn = {978-1-4503-2064-1}, + location = {Montpellier, France}, + pages = {7:1--7:4}, + articleno = {7}, + numpages = {4}, + url = {http://doi.acm.org/10.1145/2489837.2489844}, + doi = {10.1145/2489837.2489844}, + acmid = {2489844}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {Scala, domain specific language, graph database, graph traversal, parser combinators} } @inproceedings{Reps, - author = {Reps, Thomas}, - title = {Program Analysis via Graph Reachability}, - booktitle = {Proceedings of the 1997 International Symposium on Logic Programming}, - series = {ILPS '97}, - year = {1997}, - isbn = {0-262-63180-6}, - location = {Port Washington, New York, USA}, - pages = {5--19}, - numpages = {15}, - url = {http://dl.acm.org/citation.cfm?id=271338.271343}, - acmid = {271343}, - publisher = {MIT Press}, - address = {Cambridge, MA, USA}, + author = {Reps, Thomas}, + title = {Program Analysis via Graph Reachability}, + booktitle = {Proceedings of the 1997 International Symposium on Logic Programming}, + series = {ILPS '97}, + year = {1997}, + isbn = {0-262-63180-6}, + location = {Port Washington, New York, USA}, + pages = {5--19}, + numpages = {15}, + url = {http://dl.acm.org/citation.cfm?id=271338.271343}, + acmid = {271343}, + publisher = {MIT Press}, + address = {Cambridge, MA, USA} } @inproceedings{LabelFlowCFLReachability, - title={Existential label flow inference via CFL reachability}, - author={Pratikakis, Polyvios and Foster, Jeffrey S and Hicks, Michael}, - booktitle={SAS}, - volume={6}, - pages={88--106}, - year={2006}, - organization={Springer} + title = {Existential label flow inference via CFL reachability}, + author = {Pratikakis, Polyvios and Foster, Jeffrey S and Hicks, Michael}, + booktitle = {SAS}, + volume = {6}, + pages = {88--106}, + year = {2006}, + organization = {Springer} } @inproceedings{Yannakakis, - title={Graph-theoretic methods in database theory}, - author={Yannakakis, Mihalis}, - booktitle={Proceedings of the ninth ACM SIGACT-SIGMOD-SIGART symposium on Principles of database systems}, - pages={230--242}, - year={1990}, - organization={ACM} + title = {Graph-theoretic methods in database theory}, + author = {Yannakakis, Mihalis}, + booktitle = {Proceedings of the ninth ACM SIGACT-SIGMOD-SIGART symposium on Principles of database systems}, + pages = {230--242}, + year = {1990}, + organization = {ACM} } @inproceedings{specificationCFLReachability, - title={Specification inference using context-free language reachability}, - author={Bastani, Osbert and Anand, Saswat and Aiken, Alex}, - booktitle={ACM SIGPLAN Notices}, - volume={50}, - number={1}, - pages={553--566}, - year={2015}, - organization={ACM} + title = {Specification inference using context-free language reachability}, + author = {Bastani, Osbert and Anand, Saswat and Aiken, Alex}, + booktitle = {ACM SIGPLAN Notices}, + volume = {50}, + number = {1}, + pages = {553--566}, + year = {2015}, + organization = {ACM} } @inproceedings{Zheng, - author = {Zheng, Xin and Rugina, Radu}, - title = {Demand-driven Alias Analysis for C}, - booktitle = {Proceedings of the 35th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages}, - series = {POPL '08}, - year = {2008}, - isbn = {978-1-59593-689-9}, - location = {San Francisco, California, USA}, - pages = {197--208}, - numpages = {12}, - url = {http://doi.acm.org/10.1145/1328438.1328464}, - doi = {10.1145/1328438.1328464}, - acmid = {1328464}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {CFL reachability, alias analysis, demand-driven analysis, memory disambiguation, pointer analysis}, + author = {Zheng, Xin and Rugina, Radu}, + title = {Demand-driven Alias Analysis for C}, + booktitle = {Proceedings of the 35th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages}, + series = {POPL '08}, + year = {2008}, + isbn = {978-1-59593-689-9}, + location = {San Francisco, California, USA}, + pages = {197--208}, + numpages = {12}, + url = {http://doi.acm.org/10.1145/1328438.1328464}, + doi = {10.1145/1328438.1328464}, + acmid = {1328464}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {CFL reachability, alias analysis, demand-driven analysis, memory disambiguation, pointer analysis} } @inproceedings{Nole:2016:RPQ:2949689.2949711, - author = {Nol{\'e}, Maurizio and Sartiani, Carlo}, - title = {Regular Path Queries on Massive Graphs}, - booktitle = {Proceedings of the 28th International Conference on Scientific and Statistical Database Management}, - series = {SSDBM '16}, - year = {2016}, - isbn = {978-1-4503-4215-5}, - location = {Budapest, Hungary}, - pages = {13:1--13:12}, - articleno = {13}, - numpages = {12}, - url = {http://doi.acm.org/10.1145/2949689.2949711}, - doi = {10.1145/2949689.2949711}, - acmid = {2949711}, - publisher = {ACM}, - address = {New York, NY, USA}, + author = {Nol{\'e}, Maurizio and Sartiani, Carlo}, + title = {Regular Path Queries on Massive Graphs}, + booktitle = {Proceedings of the 28th International Conference on Scientific and Statistical Database Management}, + series = {SSDBM '16}, + year = {2016}, + isbn = {978-1-4503-4215-5}, + location = {Budapest, Hungary}, + pages = {13:1--13:12}, + articleno = {13}, + numpages = {12}, + url = {http://doi.acm.org/10.1145/2949689.2949711}, + doi = {10.1145/2949689.2949711}, + acmid = {2949711}, + publisher = {ACM}, + address = {New York, NY, USA} } @article{DBLP:journals/corr/abs-1010-5023, - author = {Matthew Might and - David Darais}, - title = {Yacc is dead}, - journal = {CoRR}, - volume = {abs/1010.5023}, - year = {2010}, - url = {http://arxiv.org/abs/1010.5023}, - archivePrefix = {arXiv}, - eprint = {1010.5023}, - timestamp = {Mon, 13 Aug 2018 16:46:08 +0200}, - biburl = {https://dblp.org/rec/bib/journals/corr/abs-1010-5023}, - bibsource = {dblp computer science bibliography, https://dblp.org} + author = {Matthew Might and + David Darais}, + title = {Yacc is dead}, + journal = {CoRR}, + volume = {abs/1010.5023}, + year = {2010}, + url = {http://arxiv.org/abs/1010.5023}, + archiveprefix = {arXiv}, + eprint = {1010.5023}, + timestamp = {Mon, 13 Aug 2018 16:46:08 +0200}, + biburl = {https://dblp.org/rec/bib/journals/corr/abs-1010-5023}, + bibsource = {dblp computer science bibliography, https://dblp.org} } @inproceedings{Adams:2016:CPP:2908080.2908128, - author = {Adams, Michael D. and Hollenbeck, Celeste and Might, Matthew}, - title = {On the Complexity and Performance of Parsing with Derivatives}, - booktitle = {Proceedings of the 37th ACM SIGPLAN Conference on Programming Language Design and Implementation}, - series = {PLDI '16}, - year = {2016}, - isbn = {978-1-4503-4261-2}, - location = {Santa Barbara, CA, USA}, - pages = {224--236}, - numpages = {13}, - url = {http://doi.acm.org/10.1145/2908080.2908128}, - doi = {10.1145/2908080.2908128}, - acmid = {2908128}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {Parsing, Parsing with derivatives, Performance}, + author = {Adams, Michael D. and Hollenbeck, Celeste and Might, Matthew}, + title = {On the Complexity and Performance of Parsing with Derivatives}, + booktitle = {Proceedings of the 37th ACM SIGPLAN Conference on Programming Language Design and Implementation}, + series = {PLDI '16}, + year = {2016}, + isbn = {978-1-4503-4261-2}, + location = {Santa Barbara, CA, USA}, + pages = {224--236}, + numpages = {13}, + url = {http://doi.acm.org/10.1145/2908080.2908128}, + doi = {10.1145/2908080.2908128}, + acmid = {2908128}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {Parsing, Parsing with derivatives, Performance} } @article{Might:2011:PDF:2034574.2034801, - author = {Might, Matthew and Darais, David and Spiewak, Daniel}, - title = {Parsing with Derivatives: A Functional Pearl}, - journal = {SIGPLAN Not.}, - issue_date = {September 2011}, - volume = {46}, - number = {9}, - month = sep, - year = {2011}, - issn = {0362-1340}, - pages = {189--195}, - numpages = {7}, - url = {http://doi.acm.org/10.1145/2034574.2034801}, - doi = {10.1145/2034574.2034801}, - acmid = {2034801}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {context-free grammar, derivative, formal languages, parser combinator, parsing, regular expressions}, + author = {Might, Matthew and Darais, David and Spiewak, Daniel}, + title = {Parsing with Derivatives: A Functional Pearl}, + journal = {SIGPLAN Not.}, + issue_date = {September 2011}, + volume = {46}, + number = {9}, + month = sep, + year = {2011}, + issn = {0362-1340}, + pages = {189--195}, + numpages = {7}, + url = {http://doi.acm.org/10.1145/2034574.2034801}, + doi = {10.1145/2034574.2034801}, + acmid = {2034801}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {context-free grammar, derivative, formal languages, parser combinator, parsing, regular expressions} } @article{andersenparsing, - title={Parsing With Derivatives}, - author={Andersen, Leif} + title = {Parsing With Derivatives}, + author = {Andersen, Leif} } @phdthesis{SPPF, - title={Parser generation for interactive environments}, - author={Rekers, Joan Gerard}, - year={1992}, - school={Universiteit van Amsterdam} + title = {Parser generation for interactive environments}, + author = {Rekers, Joan Gerard}, + year = {1992}, + school = {Universiteit van Amsterdam} } @article{Scott:2006:RNG:1146809.1146810, - author = {Scott, Elizabeth and Johnstone, Adrian}, - title = {Right Nulled GLR Parsers}, - journal = {ACM Trans. Program. Lang. Syst.}, - issue_date = {July 2006}, - volume = {28}, - number = {4}, - month = jul, - year = {2006}, - issn = {0164-0925}, - pages = {577--618}, - numpages = {42}, - url = {http://doi.acm.org/10.1145/1146809.1146810}, - doi = {10.1145/1146809.1146810}, - acmid = {1146810}, - publisher = {ACM}, - address = {New York, NY, USA}, - keywords = {General context-free grammars, generalized LR parsing}, -} - -@InProceedings{10.1007/978-3-662-46663-6_5, -author="Afroozeh, Ali -and Izmaylova, Anastasia", -editor="Franke, Bj{\"o}rn", -title="Faster, Practical GLL Parsing", -booktitle="Compiler Construction", -year="2015", -publisher="Springer Berlin Heidelberg", -address="Berlin, Heidelberg", -pages="89--108", -abstract="Generalized LL (GLL) parsing is an extension of recursivedescent (RD) parsing that supports all context-free grammars in cubic time and space. GLL parsers have the direct relationship with the grammar that RD parsers have, and therefore, compared to GLR, are easier to understand, debug, and extend. This makes GLL parsing attractive for parsing programming languages.", -isbn="978-3-662-46663-6" + author = {Scott, Elizabeth and Johnstone, Adrian}, + title = {Right Nulled GLR Parsers}, + journal = {ACM Trans. Program. Lang. Syst.}, + issue_date = {July 2006}, + volume = {28}, + number = {4}, + month = jul, + year = {2006}, + issn = {0164-0925}, + pages = {577--618}, + numpages = {42}, + url = {http://doi.acm.org/10.1145/1146809.1146810}, + doi = {10.1145/1146809.1146810}, + acmid = {1146810}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {General context-free grammars, generalized LR parsing} +} + +@inproceedings{10.1007/978-3-662-46663-6_5, + author = {Afroozeh, Ali + and Izmaylova, Anastasia}, + editor = {Franke, Bj{\"o}rn}, + title = {Faster, Practical GLL Parsing}, + booktitle = {Compiler Construction}, + year = {2015}, + publisher = {Springer Berlin Heidelberg}, + address = {Berlin, Heidelberg}, + pages = {89--108}, + abstract = {Generalized LL (GLL) parsing is an extension of recursivedescent (RD) parsing that supports all context-free grammars in cubic time and space. GLL parsers have the direct relationship with the grammar that RD parsers have, and therefore, compared to GLR, are easier to understand, debug, and extend. This makes GLL parsing attractive for parsing programming languages.}, + isbn = {978-3-662-46663-6} } @article{Scott:2007:BCT:1289813.1289815, - author = {Scott, Elizabeth and Johnstone, Adrian and Economopoulos, Rob}, - title = {BRNGLR: A Cubic Tomita-style GLR Parsing Algorithm}, - journal = {Acta Inf.}, - issue_date = {September 2007}, - volume = {44}, - number = {6}, - month = sep, - year = {2007}, - issn = {0001-5903}, - pages = {427--461}, - numpages = {35}, - url = {http://dx.doi.org/10.1007/s00236-007-0054-z}, - doi = {10.1007/s00236-007-0054-z}, - acmid = {1289815}, - publisher = {Springer-Verlag New York, Inc.}, - address = {Secaucus, NJ, USA}, + author = {Scott, Elizabeth and Johnstone, Adrian and Economopoulos, Rob}, + title = {BRNGLR: A Cubic Tomita-style GLR Parsing Algorithm}, + journal = {Acta Inf.}, + issue_date = {September 2007}, + volume = {44}, + number = {6}, + month = sep, + year = {2007}, + issn = {0001-5903}, + pages = {427--461}, + numpages = {35}, + url = {http://dx.doi.org/10.1007/s00236-007-0054-z}, + doi = {10.1007/s00236-007-0054-z}, + acmid = {1289815}, + publisher = {Springer-Verlag New York, Inc.}, + address = {Secaucus, NJ, USA} } @inproceedings{Billot:1989:SSF:981623.981641, - author = {Billot, Sylvie and Lang, Bernard}, - title = {The Structure of Shared Forests in Ambiguous Parsing}, - booktitle = {Proceedings of the 27th Annual Meeting on Association for Computational Linguistics}, - series = {ACL '89}, - year = {1989}, - location = {Vancouver, British Columbia, Canada}, - pages = {143--151}, - numpages = {9}, - url = {https://doi.org/10.3115/981623.981641}, - doi = {10.3115/981623.981641}, - acmid = {981641}, - publisher = {Association for Computational Linguistics}, - address = {Stroudsburg, PA, USA}, - keywords = {Ambiguity, Chart Parsing, Context-Free Parsing, Dynamic Programming, Earley Parsing, Parse Forest, Parse Tree, Parsing Schemata, Parsing Strategies}, + author = {Billot, Sylvie and Lang, Bernard}, + title = {The Structure of Shared Forests in Ambiguous Parsing}, + booktitle = {Proceedings of the 27th Annual Meeting on Association for Computational Linguistics}, + series = {ACL '89}, + year = {1989}, + location = {Vancouver, British Columbia, Canada}, + pages = {143--151}, + numpages = {9}, + url = {https://doi.org/10.3115/981623.981641}, + doi = {10.3115/981623.981641}, + acmid = {981641}, + publisher = {Association for Computational Linguistics}, + address = {Stroudsburg, PA, USA}, + keywords = {Ambiguity, Chart Parsing, Context-Free Parsing, Dynamic Programming, Earley Parsing, Parse Forest, Parse Tree, Parsing Schemata, Parsing Strategies} } @article{Scott:2010:GP:1860132.1860320, - author = {Scott, Elizabeth and Johnstone, Adrian}, - title = {GLL Parsing}, - journal = {Electron. Notes Theor. Comput. Sci.}, - issue_date = {September, 2010}, - volume = {253}, - number = {7}, - month = sep, - year = {2010}, - issn = {1571-0661}, - pages = {177--189}, - numpages = {13}, - url = {http://dx.doi.org/10.1016/j.entcs.2010.08.041}, - doi = {10.1016/j.entcs.2010.08.041}, - acmid = {1860320}, - publisher = {Elsevier Science Publishers B. V.}, - address = {Amsterdam, The Netherlands, The Netherlands}, - keywords = {RNGLR and RIGLR parsing, context free languages, generalised parsing, recursive descent}, + author = {Scott, Elizabeth and Johnstone, Adrian}, + title = {GLL Parsing}, + journal = {Electron. Notes Theor. Comput. Sci.}, + issue_date = {September, 2010}, + volume = {253}, + number = {7}, + month = sep, + year = {2010}, + issn = {1571-0661}, + pages = {177--189}, + numpages = {13}, + url = {http://dx.doi.org/10.1016/j.entcs.2010.08.041}, + doi = {10.1016/j.entcs.2010.08.041}, + acmid = {1860320}, + publisher = {Elsevier Science Publishers B. V.}, + address = {Amsterdam, The Netherlands, The Netherlands}, + keywords = {RNGLR and RIGLR parsing, context free languages, generalised parsing, recursive descent} } @article{Okhotin:2014:PMM:2565359.2565379, - author = {Okhotin, Alexander}, - title = {Parsing by Matrix Multiplication Generalized to Boolean Grammars}, - journal = {Theor. Comput. Sci.}, - issue_date = {January, 2014}, - volume = {516}, - month = jan, - year = {2014}, - issn = {0304-3975}, - pages = {101--120}, - numpages = {20}, - url = {http://dx.doi.org/10.1016/j.tcs.2013.09.011}, - doi = {10.1016/j.tcs.2013.09.011}, - acmid = {2565379}, - publisher = {Elsevier Science Publishers Ltd.}, - address = {Essex, UK}, - keywords = {Boolean grammars, Conjunctive grammars, Context-free grammars, Matrix multiplication, Parsing}, + author = {Okhotin, Alexander}, + title = {Parsing by Matrix Multiplication Generalized to Boolean Grammars}, + journal = {Theor. Comput. Sci.}, + issue_date = {January, 2014}, + volume = {516}, + month = jan, + year = {2014}, + issn = {0304-3975}, + pages = {101--120}, + numpages = {20}, + url = {http://dx.doi.org/10.1016/j.tcs.2013.09.011}, + doi = {10.1016/j.tcs.2013.09.011}, + acmid = {2565379}, + publisher = {Elsevier Science Publishers Ltd.}, + address = {Essex, UK}, + keywords = {Boolean grammars, Conjunctive grammars, Context-free grammars, Matrix multiplication, Parsing} } @inproceedings{Okhotin:2003:BG:1758089.1758123, - author = {Okhotin, Alexander}, - title = {Boolean Grammars}, - booktitle = {Proceedings of the 7th International Conference on Developments in Language Theory}, - series = {DLT'03}, - year = {2003}, - isbn = {3-540-40434-1}, - location = {Szeged, Hungary}, - pages = {398--410}, - numpages = {13}, - url = {http://dl.acm.org/citation.cfm?id=1758089.1758123}, - acmid = {1758123}, - publisher = {Springer-Verlag}, - address = {Berlin, Heidelberg}, + author = {Okhotin, Alexander}, + title = {Boolean Grammars}, + booktitle = {Proceedings of the 7th International Conference on Developments in Language Theory}, + series = {DLT'03}, + year = {2003}, + isbn = {3-540-40434-1}, + location = {Szeged, Hungary}, + pages = {398--410}, + numpages = {13}, + url = {http://dl.acm.org/citation.cfm?id=1758089.1758123}, + acmid = {1758123}, + publisher = {Springer-Verlag}, + address = {Berlin, Heidelberg} } @article{OKHOTIN2014101, -title = "Parsing by matrix multiplication generalized to Boolean grammars", -journal = "Theoretical Computer Science", -volume = "516", -pages = "101 - 120", -year = "2014", -issn = "0304-3975", -doi = "https://doi.org/10.1016/j.tcs.2013.09.011", -url = "http://www.sciencedirect.com/science/article/pii/S0304397513006919", -author = "Alexander Okhotin", -keywords = "Boolean grammars, Conjunctive grammars, Context-free grammars, Matrix multiplication, Parsing", -abstract = "The well-known parsing algorithm for context-free grammars due to Valiant (1975) [25] is analyzed and extended to handle the more general Boolean grammars, which are context-free grammars augmented with conjunction and negation operators in the rules. The algorithm reduces construction of a parsing table to computing multiple products of Boolean matrices of various sizes. Its time complexity on an input string of length n is O(BMM(n)logn), where BMM(n) is the number of operations needed to multiply two Boolean matrices of size n×n, which is O(nω) with ω<2.373 as per the current knowledge. A parse tree can be constructed in time MM(n)logO(1)n (where MM(n) is the complexity of multiplying two integer matrices), by applying a known efficient procedure for determining witnesses for Boolean matrix multiplication. The algorithm has a succinct proof of correctness and is ready to be implemented." + title = {Parsing by matrix multiplication generalized to Boolean grammars}, + journal = {Theoretical Computer Science}, + volume = {516}, + pages = {101 - 120}, + year = {2014}, + issn = {0304-3975}, + doi = {https://doi.org/10.1016/j.tcs.2013.09.011}, + url = {http://www.sciencedirect.com/science/article/pii/S0304397513006919}, + author = {Alexander Okhotin}, + keywords = {Boolean grammars, Conjunctive grammars, Context-free grammars, Matrix multiplication, Parsing}, + abstract = {The well-known parsing algorithm for context-free grammars due to Valiant (1975) [25] is analyzed and extended to handle the more general Boolean grammars, which are context-free grammars augmented with conjunction and negation operators in the rules. The algorithm reduces construction of a parsing table to computing multiple products of Boolean matrices of various sizes. Its time complexity on an input string of length n is O(BMM(n)logn), where BMM(n) is the number of operations needed to multiply two Boolean matrices of size n×n, which is O(nω) with ω<2.373 as per the current knowledge. A parse tree can be constructed in time MM(n)logO(1)n (where MM(n) is the complexity of multiplying two integer matrices), by applying a known efficient procedure for determining witnesses for Boolean matrix multiplication. The algorithm has a succinct proof of correctness and is ready to be implemented.} } @article{f60a33d409364914be560cac0e54b12c, -title = "Conjunctive and boolean grammars: The true general case of the context-free grammars", -abstract = "Conjunctive grammars extend the definition of a context-free grammar by allowing a conjunction operation in the rules; Boolean grammars are further equipped with an explicit negation. These grammars maintain the main principle of the context-free grammars, that of defining syntactically correct strings inductively from their substrings, but lift the restriction of using disjunction only. This paper surveys the results on conjunctive and Boolean grammars obtained over the last decade, comparing them to the corresponding results for ordinary context-free grammars and their main subfamilies. Much attention is given to parsing algorithms, most of which are inherited from the case of ordinary context-free grammars without increasing their computational complexity. The intended readership includes any computer scientists looking for a compact and accessible description of this formal model and its properties, as well as for a general outlook on formal grammars. The paper is also addressed to theoretical computer scientists seeking a subject for research; an account of pure theoretical research in the area presented in this paper is accompanied by a list of significant open problems, with an award offered for the first correct solution of each problem. Several directions for future investigation are proposed.", -keywords = "Boolean grammars, Conjunctive grammars, Context-free grammars, Formal languages, Language equations, Parsing", -author = "Alexander Okhotin", -year = "2013", -month = "8", -day = "1", -doi = "10.1016/j.cosrev.2013.06.001", -language = "English", -volume = "9", -pages = "27--59", -journal = "Computer Science Review", -issn = "1574-0137", -publisher = "Elsevier", + title = {Conjunctive and boolean grammars: The true general case of the context-free grammars}, + abstract = {Conjunctive grammars extend the definition of a context-free grammar by allowing a conjunction operation in the rules; Boolean grammars are further equipped with an explicit negation. These grammars maintain the main principle of the context-free grammars, that of defining syntactically correct strings inductively from their substrings, but lift the restriction of using disjunction only. This paper surveys the results on conjunctive and Boolean grammars obtained over the last decade, comparing them to the corresponding results for ordinary context-free grammars and their main subfamilies. Much attention is given to parsing algorithms, most of which are inherited from the case of ordinary context-free grammars without increasing their computational complexity. The intended readership includes any computer scientists looking for a compact and accessible description of this formal model and its properties, as well as for a general outlook on formal grammars. The paper is also addressed to theoretical computer scientists seeking a subject for research; an account of pure theoretical research in the area presented in this paper is accompanied by a list of significant open problems, with an award offered for the first correct solution of each problem. Several directions for future investigation are proposed.}, + keywords = {Boolean grammars, Conjunctive grammars, Context-free grammars, Formal languages, Language equations, Parsing}, + author = {Alexander Okhotin}, + year = {2013}, + month = {8}, + day = {1}, + doi = {10.1016/j.cosrev.2013.06.001}, + language = {English}, + volume = {9}, + pages = {27--59}, + journal = {Computer Science Review}, + issn = {1574-0137}, + publisher = {Elsevier} } @article{565CECD7E8F5C6063935B41DB41797AA37D53B04, -author = {Azimov, Rustam and Grigorev, Semyon}, -year = {2018}, -month = {01}, -pages = {149-166}, -title = {Path querying using conjunctive grammars}, -volume = {30}, -journal = {Proceedings of the Institute for System Programming of the RAS}, -doi = {10.15514/ISPRAS-2018-30(2)-8} -} - -@InProceedings{10.1007/978-3-319-46523-4_38, -author="Zhang, Xiaowang -and Feng, Zhiyong -and Wang, Xin -and Rao, Guozheng -and Wu, Wenrui", -editor="Groth, Paul -and Simperl, Elena -and Gray, Alasdair -and Sabou, Marta -and Kr{\"o}tzsch, Markus -and Lecue, Freddy -and Fl{\"o}ck, Fabian -and Gil, Yolanda", -title="Context-Free Path Queries on RDF Graphs", -booktitle="The Semantic Web -- ISWC 2016", -year="2016", -publisher="Springer International Publishing", -address="Cham", -pages="632--648", -abstract="Navigational graph queries are an important class of queries that can extract implicit binary relations over the nodes of input graphs. Most of the navigational query languages used in the RDF community, e.g. property paths in W3C SPARQL 1.1 and nested regular expressions in nSPARQL, are based on the regular expressions. It is known that regular expressions have limited expressivity; for instance, some natural queries, like same generation-queries, are not expressible with regular expressions. To overcome this limitation, in this paper, we present cfSPARQL, an extension of SPARQL query language equipped with context-free grammars. The cfSPARQL language is strictly more expressive than property paths and nested expressions. The additional expressivity can be used for modelling graph similarities, graph summarization and ontology alignment. Despite the increasing expressivity, we show that cfSPARQL still enjoys a low computational complexity and can be evaluated efficiently.", -isbn="978-3-319-46523-4" + author = {Azimov, Rustam and Grigorev, Semyon}, + year = {2018}, + month = {01}, + pages = {149-166}, + title = {Path querying using conjunctive grammars}, + volume = {30}, + journal = {Proceedings of the Institute for System Programming of the RAS}, + doi = {10.15514/ISPRAS-2018-30(2)-8} +} + +@inproceedings{10.1007/978-3-319-46523-4_38, + author = {Zhang, Xiaowang + and Feng, Zhiyong + and Wang, Xin + and Rao, Guozheng + and Wu, Wenrui}, + editor = {Groth, Paul + and Simperl, Elena + and Gray, Alasdair + and Sabou, Marta + and Kr{\"o}tzsch, Markus + and Lecue, Freddy + and Fl{\"o}ck, Fabian + and Gil, Yolanda}, + title = {Context-Free Path Queries on RDF Graphs}, + booktitle = {The Semantic Web -- ISWC 2016}, + year = {2016}, + publisher = {Springer International Publishing}, + address = {Cham}, + pages = {632--648}, + abstract = {Navigational graph queries are an important class of queries that can extract implicit binary relations over the nodes of input graphs. Most of the navigational query languages used in the RDF community, e.g. property paths in W3C SPARQL 1.1 and nested regular expressions in nSPARQL, are based on the regular expressions. It is known that regular expressions have limited expressivity; for instance, some natural queries, like same generation-queries, are not expressible with regular expressions. To overcome this limitation, in this paper, we present cfSPARQL, an extension of SPARQL query language equipped with context-free grammars. The cfSPARQL language is strictly more expressive than property paths and nested expressions. The additional expressivity can be used for modelling graph similarities, graph summarization and ontology alignment. Despite the increasing expressivity, we show that cfSPARQL still enjoys a low computational complexity and can be evaluated efficiently.}, + isbn = {978-3-319-46523-4} } @inproceedings{hellingsRelational, - title={Conjunctive context-free path queries}, - author={Hellings, Jelle}, - booktitle={Proceedings of ICDT'14}, - pages={119--130}, - year={2014} + title = {Conjunctive context-free path queries}, + author = {Hellings, Jelle}, + booktitle = {Proceedings of ICDT'14}, + pages = {119--130}, + year = {2014} } @misc{hellings2015querying, - title={Querying for Paths in Graphs using Context-Free Path Queries}, - author={Jelle Hellings}, - year={2015}, - eprint={1502.02242}, - archivePrefix={arXiv}, - primaryClass={cs.DB} + title = {Querying for Paths in Graphs using Context-Free Path Queries}, + author = {Jelle Hellings}, + year = {2015}, + eprint = {1502.02242}, + archiveprefix = {arXiv}, + primaryclass = {cs.DB} } @article{Hellings2015PathRF, - title={Path Results for Context-free Grammar Queries on Graphs}, - author={Jelle Hellings}, - journal={ArXiv}, - year={2015}, - volume={abs/1502.02242} + title = {Path Results for Context-free Grammar Queries on Graphs}, + author = {Jelle Hellings}, + journal = {ArXiv}, + year = {2015}, + volume = {abs/1502.02242} } @inproceedings{bradford2007quickest, - title={Quickest path distances on context-free labeled graphs}, - author={Bradford, Phillip G}, - booktitle={Appear in 6-th WSEAS Conference on Computational Intelligence, Man-Machine Systems and Cybernetics}, - year={2007}, - organization={Citeseer} + title = {Quickest path distances on context-free labeled graphs}, + author = {Bradford, Phillip G}, + booktitle = {Appear in 6-th WSEAS Conference on Computational Intelligence, Man-Machine Systems and Cybernetics}, + year = {2007}, + organization = {Citeseer} } @inproceedings{ward2008distributed, - title={A distributed context-free language constrained shortest path algorithm}, - author={Ward, Charles B and Wiegand, Nathan M and Bradford, Phillip G}, - booktitle={2008 37th International Conference on Parallel Processing}, - pages={373--380}, - year={2008}, - organization={IEEE} + title = {A distributed context-free language constrained shortest path algorithm}, + author = {Ward, Charles B and Wiegand, Nathan M and Bradford, Phillip G}, + booktitle = {2008 37th International Conference on Parallel Processing}, + pages = {373--380}, + year = {2008}, + organization = {IEEE} } @inproceedings{bradford2016fast, - title={Fast point-to-point Dyck constrained shortest paths on a DAG}, - author={Bradford, Phillip G and Choppella, Venkatesh}, - booktitle={2016 IEEE 7th Annual Ubiquitous Computing, Electronics \& Mobile Communication Conference (UEMCON)}, - pages={1--7}, - year={2016}, - organization={IEEE} + title = {Fast point-to-point Dyck constrained shortest paths on a DAG}, + author = {Bradford, Phillip G and Choppella, Venkatesh}, + booktitle = {2016 IEEE 7th Annual Ubiquitous Computing, Electronics \& Mobile Communication Conference (UEMCON)}, + pages = {1--7}, + year = {2016}, + organization = {IEEE} } @inproceedings{Bradford:2008:LCG:1373936.1373946, - author = {Bradford, Phillip G.}, - title = {Language Constrained Graph Problems: A Microcosm of Engineering Research and Development}, - booktitle = {Proceedings of the 2Nd WSEAS International Conference on Computer Engineering and Applications}, - series = {CEA'08}, - year = {2008}, - isbn = {978-960-6766-33-6}, - location = {Acapulco, Mexico}, - pages = {71--76}, - numpages = {6}, - url = {http://dl.acm.org/citation.cfm?id=1373936.1373946}, - acmid = {1373946}, - publisher = {World Scientific and Engineering Academy and Society (WSEAS)}, - address = {Stevens Point, Wisconsin, USA}, - keywords = {creative destruction, entrepreneurship, integrated learning base, intellectual infrastructure, labeled graphs, paradigm shift, path problems, science and business}, + author = {Bradford, Phillip G.}, + title = {Language Constrained Graph Problems: A Microcosm of Engineering Research and Development}, + booktitle = {Proceedings of the 2Nd WSEAS International Conference on Computer Engineering and Applications}, + series = {CEA'08}, + year = {2008}, + isbn = {978-960-6766-33-6}, + location = {Acapulco, Mexico}, + pages = {71--76}, + numpages = {6}, + url = {http://dl.acm.org/citation.cfm?id=1373936.1373946}, + acmid = {1373946}, + publisher = {World Scientific and Engineering Academy and Society (WSEAS)}, + address = {Stevens Point, Wisconsin, USA}, + keywords = {creative destruction, entrepreneurship, integrated learning base, intellectual infrastructure, labeled graphs, paradigm shift, path problems, science and business} } @article{doi:10.1137/S0097539798337716, -author = {Barrett, C. and Jacob, R. and Marathe, M.}, -title = {Formal-Language-Constrained Path Problems}, -journal = {SIAM Journal on Computing}, -volume = {30}, -number = {3}, -pages = {809-837}, -year = {2000}, -doi = {10.1137/S0097539798337716}, -URL = {https://doi.org/10.1137/S0097539798337716}, -eprint = { https://doi.org/10.1137/S0097539798337716} + author = {Barrett, C. and Jacob, R. and Marathe, M.}, + title = {Formal-Language-Constrained Path Problems}, + journal = {SIAM Journal on Computing}, + volume = {30}, + number = {3}, + pages = {809-837}, + year = {2000}, + doi = {10.1137/S0097539798337716}, + url = {https://doi.org/10.1137/S0097539798337716}, + eprint = { https://doi.org/10.1137/S0097539798337716} } @article{barrett2007label, - title={Label constrained shortest path algorithms: An experimental evaluation using transportation networks}, - author={Barrett, Chris and Bisset, Keith and Holzer, Martin and Konjevod, Goran and Marathe, Madhav and Wagner, Dorothea}, - journal={March}, - volume={9}, - pages={2007}, - year={2007} + title = {Label constrained shortest path algorithms: An experimental evaluation using transportation networks}, + author = {Barrett, Chris and Bisset, Keith and Holzer, Martin and Konjevod, Goran and Marathe, Madhav and Wagner, Dorothea}, + journal = {March}, + volume = {9}, + pages = {2007}, + year = {2007} } @article{Ward:2010:CRL:1710158.1710234, - author = {Ward, Charles B. and Wiegand, Nathan M.}, - title = {Complexity Results on Labeled Shortest Path Problems from Wireless Routing Metrics}, - journal = {Comput. Netw.}, - issue_date = {February, 2010}, - volume = {54}, - number = {2}, - month = feb, - year = {2010}, - issn = {1389-1286}, - pages = {208--217}, - numpages = {10}, - url = {http://dx.doi.org/10.1016/j.comnet.2009.04.012}, - doi = {10.1016/j.comnet.2009.04.012}, - acmid = {1710234}, - publisher = {Elsevier North-Holland, Inc.}, - address = {New York, NY, USA}, - keywords = {Approximation algorithms, Labeled paths, Shortest paths, Wireless routing metrics}, + author = {Ward, Charles B. and Wiegand, Nathan M.}, + title = {Complexity Results on Labeled Shortest Path Problems from Wireless Routing Metrics}, + journal = {Comput. Netw.}, + issue_date = {February, 2010}, + volume = {54}, + number = {2}, + month = feb, + year = {2010}, + issn = {1389-1286}, + pages = {208--217}, + numpages = {10}, + url = {http://dx.doi.org/10.1016/j.comnet.2009.04.012}, + doi = {10.1016/j.comnet.2009.04.012}, + acmid = {1710234}, + publisher = {Elsevier North-Holland, Inc.}, + address = {New York, NY, USA}, + keywords = {Approximation algorithms, Labeled paths, Shortest paths, Wireless routing metrics} } @inproceedings{kupferman2016eulerian, - title={Eulerian paths with regular constraints}, - author={Kupferman, Orna and Vardi, Gal}, - booktitle={41st International Symposium on Mathematical Foundations of Computer Science (MFCS 2016)}, - year={2016}, - organization={Schloss Dagstuhl-Leibniz-Zentrum fuer Informatik} -} - -@InProceedings{10.1007/978-3-642-22321-1_24, -author="Holzer, Markus -and Kutrib, Martin -and Leiter, Ursula", -editor="Mauri, Giancarlo -and Leporati, Alberto", -title="Nodes Connected by Path Languages", -booktitle="Developments in Language Theory", -year="2011", -publisher="Springer Berlin Heidelberg", -address="Berlin, Heidelberg", -pages="276--287", -abstract="We investigate reachability problems on different types of labeled graphs constrained to formal languages from a family {\$}{\backslash}mathcal{\{}L{\}}{\$}. If every language in {\$}{\backslash}mathcal{\{}L{\}}{\$}is accepted by a one-way nondeterministic storage automaton, then we give an appealing characterization of the computational complexity of the labeled graph reachability problem in terms of two-way nondeterministic storage automata with auxiliary worktape that is logarithmic-space bounded. Moreover, we also consider acyclic graphs in the underlying reachability instance, obtaining a lower bound result for auxiliary storage automata that are simultaneously space and time restricted.", -isbn="978-3-642-22321-1" + title = {Eulerian paths with regular constraints}, + author = {Kupferman, Orna and Vardi, Gal}, + booktitle = {41st International Symposium on Mathematical Foundations of Computer Science (MFCS 2016)}, + year = {2016}, + organization = {Schloss Dagstuhl-Leibniz-Zentrum fuer Informatik} +} + +@inproceedings{10.1007/978-3-642-22321-1_24, + author = {Holzer, Markus + and Kutrib, Martin + and Leiter, Ursula}, + editor = {Mauri, Giancarlo + and Leporati, Alberto}, + title = {Nodes Connected by Path Languages}, + booktitle = {Developments in Language Theory}, + year = {2011}, + publisher = {Springer Berlin Heidelberg}, + address = {Berlin, Heidelberg}, + pages = {276--287}, + abstract = {We investigate reachability problems on different types of labeled graphs constrained to formal languages from a family {\$}{\backslash}mathcal{\{}L{\}}{\$}. If every language in {\$}{\backslash}mathcal{\{}L{\}}{\$}is accepted by a one-way nondeterministic storage automaton, then we give an appealing characterization of the computational complexity of the labeled graph reachability problem in terms of two-way nondeterministic storage automata with auxiliary worktape that is logarithmic-space bounded. Moreover, we also consider acyclic graphs in the underlying reachability instance, obtaining a lower bound result for auxiliary storage automata that are simultaneously space and time restricted.}, + isbn = {978-3-642-22321-1} } @inproceedings{axelsson2011formal, - title={Formal language constrained reachability and model checking propositional dynamic logics}, - author={Axelsson, Roland and Lange, Martin}, - booktitle={International Workshop on Reachability Problems}, - pages={45--57}, - year={2011}, - organization={Springer} + title = {Formal language constrained reachability and model checking propositional dynamic logics}, + author = {Axelsson, Roland and Lange, Martin}, + booktitle = {International Workshop on Reachability Problems}, + pages = {45--57}, + year = {2011}, + organization = {Springer} } @phdthesis{DBLP:phd/ethos/Economopoulos06, @@ -862,1123 +863,1145 @@ @phdthesis{DBLP:phd/ethos/Economopoulos06 } @article{DBLP:journals/jalc/Okhotin01, - author = {Alexander Okhotin}, - title = {Conjunctive Grammars}, - journal = {Journal of Automata, Languages and Combinatorics}, - volume = {6}, - number = {4}, - pages = {519--535}, - year = {2001}, - url = {https://doi.org/10.25596/jalc-2001-519}, - doi = {10.25596/jalc-2001-519}, - timestamp = {Thu, 15 Nov 2018 14:56:53 +0100}, - biburl = {https://dblp.org/rec/bib/journals/jalc/Okhotin01}, - bibsource = {dblp computer science bibliography, https://dblp.org} + author = {Alexander Okhotin}, + title = {Conjunctive Grammars}, + journal = {Journal of Automata, Languages and Combinatorics}, + volume = {6}, + number = {4}, + pages = {519--535}, + year = {2001}, + url = {https://doi.org/10.25596/jalc-2001-519}, + doi = {10.25596/jalc-2001-519}, + timestamp = {Thu, 15 Nov 2018 14:56:53 +0100}, + biburl = {https://dblp.org/rec/bib/journals/jalc/Okhotin01}, + bibsource = {dblp computer science bibliography, https://dblp.org} } @article{Okhotin2002, - author="Okhotin, A. S.", - title="Conjunctive Grammars and Systems of Language Equations", - journal="Programming and Computer Software", - year="2002", - month="Sep", - day="01", - volume="28", - number="5", - pages="243--249", - abstract="This paper studies systems of language equations that are resolved with respect to variables and contain the operations of concatenation, union and intersection. Every system of this kind is proved to have a least fixed point, and the equivalence of these systems to conjunctive grammars is established. This allows us to obtain an algebraic characterization of the language family generated by conjunctive grammars.", - issn="1608-3261", - doi="10.1023/A:1020213411126", - url="https://doi.org/10.1023/A:1020213411126" + author = {Okhotin, A. S.}, + title = {Conjunctive Grammars and Systems of Language Equations}, + journal = {Programming and Computer Software}, + year = {2002}, + month = {Sep}, + day = {01}, + volume = {28}, + number = {5}, + pages = {243--249}, + abstract = {This paper studies systems of language equations that are resolved with respect to variables and contain the operations of concatenation, union and intersection. Every system of this kind is proved to have a least fixed point, and the equivalence of these systems to conjunctive grammars is established. This allows us to obtain an algebraic characterization of the language family generated by conjunctive grammars.}, + issn = {1608-3261}, + doi = {10.1023/A:1020213411126}, + url = {https://doi.org/10.1023/A:1020213411126} } @article{DBLP:journals/tcs/Okhotin03a, - author = {Alexander Okhotin}, - title = {On the closure properties of linear conjunctive languages}, - journal = {Theor. Comput. Sci.}, - volume = {299}, - number = {1-3}, - pages = {663--685}, - year = {2003}, - url = {https://doi.org/10.1016/S0304-3975(02)00543-1}, - doi = {10.1016/S0304-3975(02)00543-1}, - timestamp = {Wed, 14 Jun 2017 20:32:07 +0200}, - biburl = {https://dblp.org/rec/bib/journals/tcs/Okhotin03a}, - bibsource = {dblp computer science bibliography, https://dblp.org} + author = {Alexander Okhotin}, + title = {On the closure properties of linear conjunctive languages}, + journal = {Theor. Comput. Sci.}, + volume = {299}, + number = {1-3}, + pages = {663--685}, + year = {2003}, + url = {https://doi.org/10.1016/S0304-3975(02)00543-1}, + doi = {10.1016/S0304-3975(02)00543-1}, + timestamp = {Wed, 14 Jun 2017 20:32:07 +0200}, + biburl = {https://dblp.org/rec/bib/journals/tcs/Okhotin03a}, + bibsource = {dblp computer science bibliography, https://dblp.org} } @article{SEKI1991191, - title = "On multiple context-free grammars", - journal = "Theoretical Computer Science", - volume = "88", - number = "2", - pages = "191 - 229", - year = "1991", - issn = "0304-3975", - doi = "https://doi.org/10.1016/0304-3975(91)90374-B", - url = "http://www.sciencedirect.com/science/article/pii/030439759190374B", - author = "Hiroyuki Seki and Takashi Matsumura and Mamoru Fujii and Tadao Kasami", - abstract = "Multiple context-free grammars (mcfg's) is a subclass of generalized context-free grammars introduced by Pollard (1984) in order to describe the syntax of natural languages. The class of languages generated by mcfg's (called multiple context-free languages or, shortly, mcfl's) properly includes the class of context-free languages and is properly included in the class of context-sensitive languages. First, the paper presents results on the generative capacity of mcfg's and also on the properties of mcfl's such as formal language-theoretic closure properties. Next, it is shown that the time complexity of the membership problem for multiple context-free languages is O(ne), where n is the length of an input string and e is a constant called the degree of a given mcfg. Head grammars (hg's) introduced by Pollard and tree adjoining grammars (tag's) introduced by Joshi et al. (1975) are also grammatical formalisms to describe the syntax of natural languages. The paper also presents the following results on the generative capacities of hg's, tag's and 2-mcfg's, which are a subclass of mcfg's: (1) The class HL of languages generated by hg's is the same as the one generated by tag's; (2) HL is the same as the one generated by left-wrapping hg's (or right-wrapping hg's) which is a proper subclass of hg's; (3) HL is properly included in the one generated by 2-mcfg's. As a corollary of (1), it is also shown that HL is a substitution-closed full AFL." -} - -@Inbook{Joshi1997, - author="Joshi, Aravind K. - and Schabes, Yves", - editor="Rozenberg, Grzegorz - and Salomaa, Arto", - title="Tree-Adjoining Grammars", - bookTitle="Handbook of Formal Languages: Volume 3 Beyond Words", - year="1997", - publisher="Springer Berlin Heidelberg", - address="Berlin, Heidelberg", - pages="69--123", - abstract="In this paper, we will describe a tree generating system called tree-adjoining grammar (TAG) and state some of the recent results about TAGs. The work on TAGs is motivated by linguistic considerations. However, a number of formal results have been established for TAGs, which we believe, would be of interest to researchers in formal languages and automata, including those interested in tree grammars and tree automata.", - isbn="978-3-642-59126-6", - doi="10.1007/978-3-642-59126-6_2", - url="https://doi.org/10.1007/978-3-642-59126-6_2" + title = {On multiple context-free grammars}, + journal = {Theoretical Computer Science}, + volume = {88}, + number = {2}, + pages = {191 - 229}, + year = {1991}, + issn = {0304-3975}, + doi = {https://doi.org/10.1016/0304-3975(91)90374-B}, + url = {http://www.sciencedirect.com/science/article/pii/030439759190374B}, + author = {Hiroyuki Seki and Takashi Matsumura and Mamoru Fujii and Tadao Kasami}, + abstract = {Multiple context-free grammars (mcfg's) is a subclass of generalized context-free grammars introduced by Pollard (1984) in order to describe the syntax of natural languages. The class of languages generated by mcfg's (called multiple context-free languages or, shortly, mcfl's) properly includes the class of context-free languages and is properly included in the class of context-sensitive languages. First, the paper presents results on the generative capacity of mcfg's and also on the properties of mcfl's such as formal language-theoretic closure properties. Next, it is shown that the time complexity of the membership problem for multiple context-free languages is O(ne), where n is the length of an input string and e is a constant called the degree of a given mcfg. Head grammars (hg's) introduced by Pollard and tree adjoining grammars (tag's) introduced by Joshi et al. (1975) are also grammatical formalisms to describe the syntax of natural languages. The paper also presents the following results on the generative capacities of hg's, tag's and 2-mcfg's, which are a subclass of mcfg's: (1) The class HL of languages generated by hg's is the same as the one generated by tag's; (2) HL is the same as the one generated by left-wrapping hg's (or right-wrapping hg's) which is a proper subclass of hg's; (3) HL is properly included in the one generated by 2-mcfg's. As a corollary of (1), it is also shown that HL is a substitution-closed full AFL.} +} + +@inbook{Joshi1997, + author = {Joshi, Aravind K. + and Schabes, Yves}, + editor = {Rozenberg, Grzegorz + and Salomaa, Arto}, + title = {Tree-Adjoining Grammars}, + booktitle = {Handbook of Formal Languages: Volume 3 Beyond Words}, + year = {1997}, + publisher = {Springer Berlin Heidelberg}, + address = {Berlin, Heidelberg}, + pages = {69--123}, + abstract = {In this paper, we will describe a tree generating system called tree-adjoining grammar (TAG) and state some of the recent results about TAGs. The work on TAGs is motivated by linguistic considerations. However, a number of formal results have been established for TAGs, which we believe, would be of interest to researchers in formal languages and automata, including those interested in tree grammars and tree automata.}, + isbn = {978-3-642-59126-6}, + doi = {10.1007/978-3-642-59126-6_2}, + url = {https://doi.org/10.1007/978-3-642-59126-6_2} } @article{cfpqBio, - author = {Sevon, Petteri and Eronen, Lauri}, - year = {2008}, - month = {06}, - pages = {}, - title = {Subgraph Queries by Context-free Grammars}, - volume = {5}, - journal = {Journal of Integrative Bioinformatics}, - doi = {10.1515/jib-2008-100} -} - -@article { Floyd1962, - title={Algorithm 97: shortest path}, - author={Floyd, Robert W}, - journal={Communications of the ACM}, - volume={5}, - number={6}, - pages={345}, - year={1962}, - publisher={ACM} -} - -@article { Bernard1959, - title={Transitivit{\'e} et connexit{\'e}}, - author={Roy, Bernard}, - journal={Comptes Rendus Hebdomadaires Des Seances De L Academie Des Sciences}, - volume={249}, - number={2}, - pages={216--218}, - year={1959}, - publisher={GAUTHIER-VILLARS/EDITIONS ELSEVIER 23 RUE LINOIS, 75015 PARIS, FRANCE} -} - -@article { Warshall1962, - title={A theorem on boolean matrices}, - author={Warshall, Stephen}, - booktitle={Journal of the ACM}, - year={1962}, - organization={Citeseer} -} - -@article{ FredmanAPSP1976, - title={New bounds on the complexity of the shortest path problem}, - author={Fredman, Michael L}, - journal={SIAM Journal on Computing}, - volume={5}, - number={1}, - pages={83--89}, - year={1976}, - publisher={SIAM} -} - -@article { Dobosiewicz1990, - title={A more efficient algorithm for the min-plus multiplication}, - author={Dobosiewicz, Wlodzimierz}, - journal={International journal of computer mathematics}, - volume={32}, - number={1-2}, - pages={49--60}, - year={1990}, - publisher={Taylor \& Francis} -} - -@article { Takaoka1992, - title={A new upper bound on the complexity of the all pairs shortest path problem}, - author={Takaoka, Tadao}, - journal={Information Processing Letters}, - volume={43}, - number={4}, - pages={195--199}, - year={1992}, - publisher={Elsevier} -} - -@inproceedings { Takaoka2004, - author = {Takaoka, T.}, - title = {A faster algorithm for the all-pairs shortest path problem and its application}, - booktitle = {Computing and Combinatorics}, - booktitleaddon = {10th international conference}, - year = {2004}, - volume = {3106}, - pages = {278--289} -} - -@article {Takaoka2005, - author = {Takaoka, T.}, - title = {An $O(n^3 \log \log n/ \log n)$ time algorithm for the all-pairs shortest path problem}, - year = {2005}, - journal = {Information Processing Letters}, - volume = {96}, - pages = {155--161} -} - -@article { Han2004, - title={Improved algorithm for all pairs shortest paths}, - author={Han, Yijie}, - journal={Information Processing Letters}, - volume={91}, - number={5}, - pages={245--250}, - year={2004}, - publisher={Elsevier} -} - -@inproceedings { Zwick2004, - title={A slightly improved sub-cubic algorithm for the all pairs shortest paths problem with real edge lengths}, - author={Zwick, Uri}, - booktitle={International Symposium on Algorithms and Computation}, - pages={921--932}, - year={2004}, - organization={Springer} -} - -@inproceedings { Lavallee2004, - title={An Efficient APSP Algorithm.}, - author={Lavall{\'e}e, Ivan and Bui, Marc and Quoc, Trung Ha}, - booktitle={RIVF}, - pages={211--214}, - year={2004} -} - -@article { Seidel1995, - title={On the all-pairs-shortest-path problem in unweighted undirected graphs}, - author={Seidel, Raimund}, - journal={Journal of computer and system sciences}, - volume={51}, - number={3}, - pages={400--403}, - year={1995}, - publisher={Elsevier} -} - -@article{ Strassen1969, - title={Gaussian elimination is not optimal}, - author={Strassen, Volker}, - journal={Numerische mathematik}, - volume={13}, - number={4}, - pages={354--356}, - year={1969}, - publisher={Springer} -} - -@inproceedings { Pan1978, - title={Strassen's algorithm is not optimal trilinear technique of aggregating, uniting and canceling for constructing fast algorithms for matrix operations}, - author={Pan, V. Ya.}, - booktitle={19th Annual Symposium on Foundations of Computer Science (sfcs 1978)}, - pages={166--176}, - year={1978}, - organization={IEEE}} -} - -@article{ BiniCapoRoma1979, - author={Bini, Dario Andrea and Capovani, Milvio and Romani, Francesco and Lotti, Grazia}, - title = {$O(n^{2.7799})$ complexity for approximate matrix multiplication}, - year = {1979}, - journal = {Information Processing Letters}, - volume = {8(5)}, - pages = {234--235} -} - -@article{ Schonhage1981, - title={Partial and total matrix multiplication}, - author={Sch{\"o}nhage, Arnold}, - journal={SIAM Journal on Computing}, - volume={10}, - number={3}, - pages={434--455}, - year={1981}, - publisher={SIAM} -} - -@article{ CoppWino1982, - title={On the asymptotic complexity of matrix multiplication}, - author={Coppersmith, Don and Winograd, Shmuel}, - journal={SIAM Journal on Computing}, - volume={11}, - number={3}, - pages={472--492}, - year={1982}, - publisher={SIAM} -} - -@article{ CoppWino1990, - title={Matrix multiplication via arithmetic progressions}, - author={Coppersmith, Don and Winograd, Shmuel}, - journal={Journal of symbolic computation}, - volume={9}, - number={3}, - pages={251--280}, - year={1990}, - publisher={Academic Press} + author = {Sevon, Petteri and Eronen, Lauri}, + year = {2008}, + month = {06}, + pages = {}, + title = {Subgraph Queries by Context-free Grammars}, + volume = {5}, + journal = {Journal of Integrative Bioinformatics}, + doi = {10.1515/jib-2008-100} +} + +@article{Floyd1962, + title = {Algorithm 97: shortest path}, + author = {Floyd, Robert W}, + journal = {Communications of the ACM}, + volume = {5}, + number = {6}, + pages = {345}, + year = {1962}, + publisher = {ACM} +} + +@article{Bernard1959, + title = {Transitivit{\'e} et connexit{\'e}}, + author = {Roy, Bernard}, + journal = {Comptes Rendus Hebdomadaires Des Seances De L Academie Des Sciences}, + volume = {249}, + number = {2}, + pages = {216--218}, + year = {1959}, + publisher = {GAUTHIER-VILLARS/EDITIONS ELSEVIER 23 RUE LINOIS, 75015 PARIS, FRANCE} +} + +@article{Warshall1962, + title = {A theorem on boolean matrices}, + author = {Warshall, Stephen}, + booktitle = {Journal of the ACM}, + year = {1962}, + organization = {Citeseer} +} + +@article{FredmanAPSP1976, + title = {New bounds on the complexity of the shortest path problem}, + author = {Fredman, Michael L}, + journal = {SIAM Journal on Computing}, + volume = {5}, + number = {1}, + pages = {83--89}, + year = {1976}, + publisher = {SIAM} +} + +@article{Dobosiewicz1990, + title = {A more efficient algorithm for the min-plus multiplication}, + author = {Dobosiewicz, Wlodzimierz}, + journal = {International journal of computer mathematics}, + volume = {32}, + number = {1-2}, + pages = {49--60}, + year = {1990}, + publisher = {Taylor \& Francis} +} + +@article{Takaoka1992, + title = {A new upper bound on the complexity of the all pairs shortest path problem}, + author = {Takaoka, Tadao}, + journal = {Information Processing Letters}, + volume = {43}, + number = {4}, + pages = {195--199}, + year = {1992}, + publisher = {Elsevier} +} + +@inproceedings{Takaoka2004, + author = {Takaoka, T.}, + title = {A faster algorithm for the all-pairs shortest path problem and its application}, + booktitle = {Computing and Combinatorics}, + booktitleaddon = {10th international conference}, + year = {2004}, + volume = {3106}, + pages = {278--289} +} + +@article{Takaoka2005, + author = {Takaoka, T.}, + title = {An $O(n^3 \log \log n/ \log n)$ time algorithm for the all-pairs shortest path problem}, + year = {2005}, + journal = {Information Processing Letters}, + volume = {96}, + pages = {155--161} +} + +@article{Han2004, + title = {Improved algorithm for all pairs shortest paths}, + author = {Han, Yijie}, + journal = {Information Processing Letters}, + volume = {91}, + number = {5}, + pages = {245--250}, + year = {2004}, + publisher = {Elsevier} +} + +@inproceedings{Zwick2004, + title = {A slightly improved sub-cubic algorithm for the all pairs shortest paths problem with real edge lengths}, + author = {Zwick, Uri}, + booktitle = {International Symposium on Algorithms and Computation}, + pages = {921--932}, + year = {2004}, + organization = {Springer} +} + +@inproceedings{Lavallee2004, + title = {An Efficient APSP Algorithm.}, + author = {Lavall{\'e}e, Ivan and Bui, Marc and Quoc, Trung Ha}, + booktitle = {RIVF}, + pages = {211--214}, + year = {2004} +} + +@article{Seidel1995, + title = {On the all-pairs-shortest-path problem in unweighted undirected graphs}, + author = {Seidel, Raimund}, + journal = {Journal of computer and system sciences}, + volume = {51}, + number = {3}, + pages = {400--403}, + year = {1995}, + publisher = {Elsevier} +} + +@article{Strassen1969, + title = {Gaussian elimination is not optimal}, + author = {Strassen, Volker}, + journal = {Numerische mathematik}, + volume = {13}, + number = {4}, + pages = {354--356}, + year = {1969}, + publisher = {Springer} +} + +@inproceedings{Pan1978, + title = {Strassen's algorithm is not optimal trilinear technique of aggregating, uniting and canceling for constructing fast algorithms for matrix operations}, + author = {Pan, V. Ya.}, + booktitle = {19th Annual Symposium on Foundations of Computer Science (sfcs 1978)}, + pages = {166--176}, + year = {1978}, + organization = {IEEE} +} +} + +@article{BiniCapoRoma1979, + author = {Bini, Dario Andrea and Capovani, Milvio and Romani, Francesco and Lotti, Grazia}, + title = {$O(n^{2.7799})$ complexity for approximate matrix multiplication}, + year = {1979}, + journal = {Information Processing Letters}, + volume = {8(5)}, + pages = {234--235} +} + +@article{Schonhage1981, + title = {Partial and total matrix multiplication}, + author = {Sch{\"o}nhage, Arnold}, + journal = {SIAM Journal on Computing}, + volume = {10}, + number = {3}, + pages = {434--455}, + year = {1981}, + publisher = {SIAM} +} + +@article{CoppWino1982, + title = {On the asymptotic complexity of matrix multiplication}, + author = {Coppersmith, Don and Winograd, Shmuel}, + journal = {SIAM Journal on Computing}, + volume = {11}, + number = {3}, + pages = {472--492}, + year = {1982}, + publisher = {SIAM} +} + +@article{CoppWino1990, + title = {Matrix multiplication via arithmetic progressions}, + author = {Coppersmith, Don and Winograd, Shmuel}, + journal = {Journal of symbolic computation}, + volume = {9}, + number = {3}, + pages = {251--280}, + year = {1990}, + publisher = {Academic Press} } @article{Chan2010, - title={More algorithms for all-pairs shortest paths in weighted graphs}, - author={Chan, Timothy M}, - journal={SIAM Journal on Computing}, - volume={39}, - number={5}, - pages={2075--2089}, - year={2010}, - publisher={SIAM} + title = {More algorithms for all-pairs shortest paths in weighted graphs}, + author = {Chan, Timothy M}, + journal = {SIAM Journal on Computing}, + volume = {39}, + number = {5}, + pages = {2075--2089}, + year = {2010}, + publisher = {SIAM} } @article{Wirth1977, - title={What can we do about the unnecessary diversity of notation for syntactic definitions?}, - author={Wirth, Niklaus}, - journal={Communications of the ACM}, - volume={20}, - number={11}, - pages={822--823}, - year={1977}, - publisher={ACM} + title = {What can we do about the unnecessary diversity of notation for syntactic definitions?}, + author = {Wirth, Niklaus}, + journal = {Communications of the ACM}, + volume = {20}, + number = {11}, + pages = {822--823}, + year = {1977}, + publisher = {ACM} } @article{Hemerik2009, - title={Towards a Taxonomy for ECFG and RRPG Parsing}, - author={Hemerik, Kees}, - journal={Proceedings of the 3rd International Conference on Language and Automata Theory and Applications}, - pages={410--421}, - year={2009}, - publisher={LATA} + title = {Towards a Taxonomy for ECFG and RRPG Parsing}, + author = {Hemerik, Kees}, + journal = {Proceedings of the 3rd International Conference on Language and Automata Theory and Applications}, + pages = {410--421}, + year = {2009}, + publisher = {LATA} } @inproceedings{tomita1988graph, - title = "Graph-structured Stack and Natural Language Parsing", - author = "Tomita, Masaru", - booktitle = "26th Annual Meeting of the Association for Computational Linguistics", - month = jun, - year = "1988", - address = "Buffalo, New York, USA", - publisher = "Association for Computational Linguistics", - url = "https://www.aclweb.org/anthology/P88-1031", - doi = "10.3115/982023.982054", - pages = "249--257", + title = {Graph-structured Stack and Natural Language Parsing}, + author = {Tomita, Masaru}, + booktitle = {26th Annual Meeting of the Association for Computational Linguistics}, + month = jun, + year = {1988}, + address = {Buffalo, New York, USA}, + publisher = {Association for Computational Linguistics}, + url = {https://www.aclweb.org/anthology/P88-1031}, + doi = {10.3115/982023.982054}, + pages = {249--257} } @article{tomita-1987-efficient, - title = "An Efficient Augmented-Context-Free Parsing Algorithm", - author = "Tomita, Masaru", - journal = "Computational Linguistics", - volume = "13", - year = "1987", - url = "https://www.aclweb.org/anthology/J87-1004", - pages = "31--46", + title = {An Efficient Augmented-Context-Free Parsing Algorithm}, + author = {Tomita, Masaru}, + journal = {Computational Linguistics}, + volume = {13}, + year = {1987}, + url = {https://www.aclweb.org/anthology/J87-1004}, + pages = {31--46} } @article{Brzozowski1964, - title = {Derivatives of Regular Expressions}, - author = {Brzozowski, Janusz A.}, - journal = {Journal of the ACM}, - volume = {11 (4)}, - year = {1964}, - pages = {481–-494}, - doi = {10.1145/321239.321249} + title = {Derivatives of Regular Expressions}, + author = {Brzozowski, Janusz A.}, + journal = {Journal of the ACM}, + volume = {11 (4)}, + year = {1964}, + pages = {481–-494}, + doi = {10.1145/321239.321249} } @online{Earley, - author = {{Sylvain Salvati}}, - title = {Multiple Context-free Grammars}, - url = {https://www.labri.fr/perso/salvati/downloads/cours/esslli/course2.pdf}, - organization = {NRIA Bordeaux Sud-Ouest}, - date = {2016-02-02}, - urldate = {2019-12-25} -} - -@article {Datalog, - author = {G. Gottlob and S. Ceri and L. Tanca}, - journal = {IEEE Transactions on Knowledge \& Data Engineering}, - title = {What You Always Wanted to Know About Datalog (And Never Dared to Ask)}, - year = {1989}, - volume = {1}, - number = {01}, - issn = {1558-2191}, - pages = {146-166}, - keywords = {optimisation methods; datalog; database query language; logic programming; syntax; semantics; relational database; logic programming; query languages; relational databases}, - doi = {10.1109/69.43410}, - publisher = {IEEE Computer Society}, - address = {Los Alamitos, CA, USA}, - month = {jan} + author = {{Sylvain Salvati}}, + title = {Multiple Context-free Grammars}, + url = {https://www.labri.fr/perso/salvati/downloads/cours/esslli/course2.pdf}, + organization = {NRIA Bordeaux Sud-Ouest}, + date = {2016-02-02}, + urldate = {2019-12-25} +} + +@article{Datalog, + author = {G. Gottlob and S. Ceri and L. Tanca}, + journal = {IEEE Transactions on Knowledge \& Data Engineering}, + title = {What You Always Wanted to Know About Datalog (And Never Dared to Ask)}, + year = {1989}, + volume = {1}, + number = {01}, + issn = {1558-2191}, + pages = {146-166}, + keywords = {optimisation methods; datalog; database query language; logic programming; syntax; semantics; relational database; logic programming; query languages; relational databases}, + doi = {10.1109/69.43410}, + publisher = {IEEE Computer Society}, + address = {Los Alamitos, CA, USA}, + month = {jan} } @inproceedings{Magic, - author = {Bancilhon, Francois and Maier, David and Sagiv, Yehoshua and Ullman, Jeffrey D}, - title = {Magic Sets and Other Strange Ways to Implement Logic Programs (Extended Abstract)}, - booktitle = {Proceedings of the Fifth ACM SIGACT-SIGMOD Symposium on Principles of Database Systems}, - series = {PODS '86}, - year = {1986}, - isbn = {0-89791-179-2}, - location = {Cambridge, Massachusetts, USA}, - pages = {1--15}, - numpages = {15}, - url = {http://doi.acm.org/10.1145/6012.15399}, - doi = {10.1145/6012.15399}, - acmid = {15399}, - publisher = {ACM}, - address = {New York, NY, USA}, + author = {Bancilhon, Francois and Maier, David and Sagiv, Yehoshua and Ullman, Jeffrey D}, + title = {Magic Sets and Other Strange Ways to Implement Logic Programs (Extended Abstract)}, + booktitle = {Proceedings of the Fifth ACM SIGACT-SIGMOD Symposium on Principles of Database Systems}, + series = {PODS '86}, + year = {1986}, + isbn = {0-89791-179-2}, + location = {Cambridge, Massachusetts, USA}, + pages = {1--15}, + numpages = {15}, + url = {http://doi.acm.org/10.1145/6012.15399}, + doi = {10.1145/6012.15399}, + acmid = {15399}, + publisher = {ACM}, + address = {New York, NY, USA} } @article{Dyrka2019, - doi = {10.7717/peerj.6559}, - url = {https://doi.org/10.7717/peerj.6559}, - year = {2019}, - month = mar, + doi = {10.7717/peerj.6559}, + url = {https://doi.org/10.7717/peerj.6559}, + year = {2019}, + month = mar, publisher = {{PeerJ}}, - volume = {7}, - pages = {e6559}, - author = {Witold Dyrka and Mateusz Pyzik and Fran{\c{c}}ois Coste and Hugo Talibart}, - title = {Estimating probabilistic context-free grammars for proteins using contact map constraints}, - journal = {{PeerJ}} + volume = {7}, + pages = {e6559}, + author = {Witold Dyrka and Mateusz Pyzik and Fran{\c{c}}ois Coste and Hugo Talibart}, + title = {Estimating probabilistic context-free grammars for proteins using contact map constraints}, + journal = {{PeerJ}} } @article{WJAnderson2012, - doi = {10.1186/1471-2105-13-78}, - url = {https://doi.org/10.1186/1471-2105-13-78}, - year = {2012}, + doi = {10.1186/1471-2105-13-78}, + url = {https://doi.org/10.1186/1471-2105-13-78}, + year = {2012}, publisher = {Springer Science and Business Media {LLC}}, - volume = {13}, - number = {1}, - pages = {78}, - author = {James WJ Anderson and Paula Tataru and Joe Staines and Jotun Hein and Rune Lyngs{\o}}, - title = {Evolving stochastic context--free grammars for {RNA} secondary structure prediction}, - journal = {{BMC} Bioinformatics} + volume = {13}, + number = {1}, + pages = {78}, + author = {James WJ Anderson and Paula Tataru and Joe Staines and Jotun Hein and Rune Lyngs{\o}}, + title = {Evolving stochastic context--free grammars for {RNA} secondary structure prediction}, + journal = {{BMC} Bioinformatics} } @article{zier2013rna, - title={RNA pseudoknot prediction through stochastic conjunctive grammars}, - author={Zier-Vogel, Ryan and Domaratzki, Michael}, - journal={Computability in Europe 2013. Informal Proceedings}, - pages={80--89}, - year={2013} + title = {RNA pseudoknot prediction through stochastic conjunctive grammars}, + author = {Zier-Vogel, Ryan and Domaratzki, Michael}, + journal = {Computability in Europe 2013. Informal Proceedings}, + pages = {80--89}, + year = {2013} } @inproceedings{10.5555/3305381.3305582, -author = {Kusner, Matt J. and Paige, Brooks and Hern\'{a}ndez-Lobato, Jos\'{e} Miguel}, -title = {Grammar Variational Autoencoder}, -year = {2017}, -publisher = {JMLR.org}, -booktitle = {Proceedings of the 34th International Conference on Machine Learning - Volume 70}, -pages = {1945–1954}, -numpages = {10}, -location = {Sydney, NSW, Australia}, -series = {ICML’17} + author = {Kusner, Matt J. and Paige, Brooks and Hern\'{a}ndez-Lobato, Jos\'{e} Miguel}, + title = {Grammar Variational Autoencoder}, + year = {2017}, + publisher = {JMLR.org}, + booktitle = {Proceedings of the 34th International Conference on Machine Learning - Volume 70}, + pages = {1945–1954}, + numpages = {10}, + location = {Sydney, NSW, Australia}, + series = {ICML’17} } @inproceedings{kasai-etal-2017-tag, - title = "{TAG} Parsing with Neural Networks and Vector Representations of Supertags", - author = "Kasai, Jungo and - Frank, Bob and - McCoy, Tom and - Rambow, Owen and - Nasr, Alexis", - booktitle = "Proceedings of the 2017 Conference on Empirical Methods in Natural Language Processing", - month = sep, - year = "2017", - address = "Copenhagen, Denmark", - publisher = "Association for Computational Linguistics", - url = "https://www.aclweb.org/anthology/D17-1180", - doi = "10.18653/v1/D17-1180", - pages = "1712--1722", - abstract = "We present supertagging-based models for Tree Adjoining Grammar parsing that use neural network architectures and dense vector representation of supertags (elementary trees) to achieve state-of-the-art performance in unlabeled and labeled attachment scores. The shift-reduce parsing model eschews lexical information entirely, and uses only the 1-best supertags to parse a sentence, providing further support for the claim that supertagging is {``}almost parsing.{''} We demonstrate that the embedding vector representations the parser induces for supertags possess linguistically interpretable structure, supporting analogies between grammatical structures like those familiar from recent work in distributional semantics. This dense representation of supertags overcomes the drawbacks for statistical models of TAG as compared to CCG parsing, raising the possibility that TAG is a viable alternative for NLP tasks that require the assignment of richer structural descriptions to sentences.", + title = {{TAG} Parsing with Neural Networks and Vector Representations of Supertags}, + author = {Kasai, Jungo and + Frank, Bob and + McCoy, Tom and + Rambow, Owen and + Nasr, Alexis}, + booktitle = {Proceedings of the 2017 Conference on Empirical Methods in Natural Language Processing}, + month = sep, + year = {2017}, + address = {Copenhagen, Denmark}, + publisher = {Association for Computational Linguistics}, + url = {https://www.aclweb.org/anthology/D17-1180}, + doi = {10.18653/v1/D17-1180}, + pages = {1712--1722}, + abstract = {We present supertagging-based models for Tree Adjoining Grammar parsing that use neural network architectures and dense vector representation of supertags (elementary trees) to achieve state-of-the-art performance in unlabeled and labeled attachment scores. The shift-reduce parsing model eschews lexical information entirely, and uses only the 1-best supertags to parse a sentence, providing further support for the claim that supertagging is {``}almost parsing.{''} We demonstrate that the embedding vector representations the parser induces for supertags possess linguistically interpretable structure, supporting analogies between grammatical structures like those familiar from recent work in distributional semantics. This dense representation of supertags overcomes the drawbacks for statistical models of TAG as compared to CCG parsing, raising the possibility that TAG is a viable alternative for NLP tasks that require the assignment of richer structural descriptions to sentences.} } @inproceedings{kasai-etal-2018-end, - title = "End-to-End Graph-Based {TAG} Parsing with Neural Networks", - author = "Kasai, Jungo and - Frank, Robert and - Xu, Pauli and - Merrill, William and - Rambow, Owen", - booktitle = "Proceedings of the 2018 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers)", - month = jun, - year = "2018", - address = "New Orleans, Louisiana", - publisher = "Association for Computational Linguistics", - url = "https://www.aclweb.org/anthology/N18-1107", - doi = "10.18653/v1/N18-1107", - pages = "1181--1194", - abstract = "We present a graph-based Tree Adjoining Grammar (TAG) parser that uses BiLSTMs, highway connections, and character-level CNNs. Our best end-to-end parser, which jointly performs supertagging, POS tagging, and parsing, outperforms the previously reported best results by more than 2.2 LAS and UAS points. The graph-based parsing architecture allows for global inference and rich feature representations for TAG parsing, alleviating the fundamental trade-off between transition-based and graph-based parsing systems. We also demonstrate that the proposed parser achieves state-of-the-art performance in the downstream tasks of Parsing Evaluation using Textual Entailments (PETE) and Unbounded Dependency Recovery. This provides further support for the claim that TAG is a viable formalism for problems that require rich structural analysis of sentences.", + title = {End-to-End Graph-Based {TAG} Parsing with Neural Networks}, + author = {Kasai, Jungo and + Frank, Robert and + Xu, Pauli and + Merrill, William and + Rambow, Owen}, + booktitle = {Proceedings of the 2018 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers)}, + month = jun, + year = {2018}, + address = {New Orleans, Louisiana}, + publisher = {Association for Computational Linguistics}, + url = {https://www.aclweb.org/anthology/N18-1107}, + doi = {10.18653/v1/N18-1107}, + pages = {1181--1194}, + abstract = {We present a graph-based Tree Adjoining Grammar (TAG) parser that uses BiLSTMs, highway connections, and character-level CNNs. Our best end-to-end parser, which jointly performs supertagging, POS tagging, and parsing, outperforms the previously reported best results by more than 2.2 LAS and UAS points. The graph-based parsing architecture allows for global inference and rich feature representations for TAG parsing, alleviating the fundamental trade-off between transition-based and graph-based parsing systems. We also demonstrate that the proposed parser achieves state-of-the-art performance in the downstream tasks of Parsing Evaluation using Textual Entailments (PETE) and Unbounded Dependency Recovery. This provides further support for the claim that TAG is a viable formalism for problems that require rich structural analysis of sentences.} } @article{10.1145/373243.360208, -author = {Rehof, Jakob and F\"{a}hndrich, Manuel}, -title = {Type-Base Flow Analysis: From Polymorphic Subtyping to CFL-Reachability}, -year = {2001}, -issue_date = {March 2001}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {36}, -number = {3}, -issn = {0362-1340}, -url = {https://doi.org/10.1145/373243.360208}, -doi = {10.1145/373243.360208}, -journal = {SIGPLAN Not.}, -month = jan, -pages = {54--66}, -numpages = {13} + author = {Rehof, Jakob and F\"{a}hndrich, Manuel}, + title = {Type-Base Flow Analysis: From Polymorphic Subtyping to CFL-Reachability}, + year = {2001}, + issue_date = {March 2001}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {36}, + number = {3}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/373243.360208}, + doi = {10.1145/373243.360208}, + journal = {SIGPLAN Not.}, + month = jan, + pages = {54--66}, + numpages = {13} } @inproceedings{10.1145/193173.195287, -author = {Reps, Thomas and Horwitz, Susan and Sagiv, Mooly and Rosay, Genevieve}, -title = {Speeding up Slicing}, -year = {1994}, -isbn = {0897916913}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/193173.195287}, -doi = {10.1145/193173.195287}, -booktitle = {Proceedings of the 2nd ACM SIGSOFT Symposium on Foundations of Software Engineering}, -pages = {11--20}, -numpages = {10}, -keywords = {flow-sensitive summary information, dynamic programming, program slicing, realizable path, program debugging, program dependence graph, dynamic transitive closure}, -location = {New Orleans, Louisiana, USA}, -series = {SIGSOFT '94} + author = {Reps, Thomas and Horwitz, Susan and Sagiv, Mooly and Rosay, Genevieve}, + title = {Speeding up Slicing}, + year = {1994}, + isbn = {0897916913}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/193173.195287}, + doi = {10.1145/193173.195287}, + booktitle = {Proceedings of the 2nd ACM SIGSOFT Symposium on Foundations of Software Engineering}, + pages = {11--20}, + numpages = {10}, + keywords = {flow-sensitive summary information, dynamic programming, program slicing, realizable path, program debugging, program dependence graph, dynamic transitive closure}, + location = {New Orleans, Louisiana, USA}, + series = {SIGSOFT '94} } @inproceedings{10.1145/2001420.2001440, -author = {Yan, Dacong and Xu, Guoqing and Rountev, Atanas}, -title = {Demand-Driven Context-Sensitive Alias Analysis for Java}, -year = {2011}, -isbn = {9781450305624}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/2001420.2001440}, -doi = {10.1145/2001420.2001440}, -booktitle = {Proceedings of the 2011 International Symposium on Software Testing and Analysis}, -pages = {155--165}, -numpages = {11}, -keywords = {demand-driven, alias analysis, context sensitivity}, -location = {Toronto, Ontario, Canada}, -series = {ISSTA '11} + author = {Yan, Dacong and Xu, Guoqing and Rountev, Atanas}, + title = {Demand-Driven Context-Sensitive Alias Analysis for Java}, + year = {2011}, + isbn = {9781450305624}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/2001420.2001440}, + doi = {10.1145/2001420.2001440}, + booktitle = {Proceedings of the 2011 International Symposium on Software Testing and Analysis}, + pages = {155--165}, + numpages = {11}, + keywords = {demand-driven, alias analysis, context sensitivity}, + location = {Toronto, Ontario, Canada}, + series = {ISSTA '11} } @article{10.1145/2714064.2660213, -author = {Zhang, Qirun and Xiao, Xiao and Zhang, Charles and Yuan, Hao and Su, Zhendong}, -title = {Efficient Subcubic Alias Analysis for C}, -year = {2014}, -issue_date = {December 2014}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {49}, -number = {10}, -issn = {0362-1340}, -url = {https://doi.org/10.1145/2714064.2660213}, -doi = {10.1145/2714064.2660213}, -journal = {SIGPLAN Not.}, -month = oct, -pages = {829--845}, -numpages = {17}, -keywords = {cfl-reachability, alias analysis} + author = {Zhang, Qirun and Xiao, Xiao and Zhang, Charles and Yuan, Hao and Su, Zhendong}, + title = {Efficient Subcubic Alias Analysis for C}, + year = {2014}, + issue_date = {December 2014}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {49}, + number = {10}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/2714064.2660213}, + doi = {10.1145/2714064.2660213}, + journal = {SIGPLAN Not.}, + month = oct, + pages = {829--845}, + numpages = {17}, + keywords = {cfl-reachability, alias analysis} } @article{Shemetova2019, - doi = {10.15514/ispras-2019-31(4)-14}, - url = {https://doi.org/10.15514/ispras-2019-31(4)-14}, - year = {2019}, + doi = {10.15514/ispras-2019-31(4)-14}, + url = {https://doi.org/10.15514/ispras-2019-31(4)-14}, + year = {2019}, publisher = {Institute for System Programming of the Russian Academy of Sciences}, - volume = {31}, - number = {4}, - pages = {211--226}, - author = {E.N. Shemetova and S.V. Grigorev}, - title = {Path querying on acyclic graphs using Boolean grammars}, - journal = {Proceedings of the Institute for System Programming of {RAS}} + volume = {31}, + number = {4}, + pages = {211--226}, + author = {E.N. Shemetova and S.V. Grigorev}, + title = {Path querying on acyclic graphs using Boolean grammars}, + journal = {Proceedings of the Institute for System Programming of {RAS}} } @article{DBLP:journals/corr/abs-0811-1714, - author = {Martin R. Albrecht and - Gregory V. Bard and - William Hart}, - title = {Efficient Multiplication of Dense Matrices over {GF(2)}}, - journal = {CoRR}, - volume = {abs/0811.1714}, - year = {2008}, - url = {http://arxiv.org/abs/0811.1714}, - archivePrefix = {arXiv}, - eprint = {0811.1714}, - timestamp = {Mon, 13 Aug 2018 16:45:56 +0200}, - biburl = {https://dblp.org/rec/journals/corr/abs-0811-1714.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -} - -@MISC{Cusp, - author = "Steven Dalton and Nathan Bell and Luke Olson and Michael Garland", - title = "Cusp: Generic Parallel Algorithms for Sparse Matrix and Graph Computations", - year = "2014", - url = "http://cusplibrary.github.io/", - note = "Version 0.5.0" + author = {Martin R. Albrecht and + Gregory V. Bard and + William Hart}, + title = {Efficient Multiplication of Dense Matrices over {GF(2)}}, + journal = {CoRR}, + volume = {abs/0811.1714}, + year = {2008}, + url = {http://arxiv.org/abs/0811.1714}, + archiveprefix = {arXiv}, + eprint = {0811.1714}, + timestamp = {Mon, 13 Aug 2018 16:45:56 +0200}, + biburl = {https://dblp.org/rec/journals/corr/abs-0811-1714.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@misc{Cusp, + author = {Steven Dalton and Nathan Bell and Luke Olson and Michael Garland}, + title = {Cusp: Generic Parallel Algorithms for Sparse Matrix and Graph Computations}, + year = {2014}, + url = {http://cusplibrary.github.io/}, + note = {Version 0.5.0} } @inproceedings{Davis2018Algorithm9S, - title={Algorithm 9xx: SuiteSparse:GraphBLAS: graph algorithms in the language of sparse linear algebra}, - author={Timothy A. Davis}, - year={2018} + title = {Algorithm 9xx: SuiteSparse:GraphBLAS: graph algorithms in the language of sparse linear algebra}, + author = {Timothy A. Davis}, + year = {2018} } @inproceedings{10.1145/3357766.3359532, -author = {Scott, Elizabeth and Johnstone, Adrian}, -title = {Multiple Lexicalisation (a Java Based Study)}, -year = {2019}, -isbn = {9781450369817}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/3357766.3359532}, -doi = {10.1145/3357766.3359532}, -booktitle = {Proceedings of the 12th ACM SIGPLAN International Conference on Software Language Engineering}, -pages = {71–82}, -numpages = {12}, -keywords = {syntax analysis, lexicalisation, generalised parsing}, -location = {Athens, Greece}, -series = {SLE 2019} + author = {Scott, Elizabeth and Johnstone, Adrian}, + title = {Multiple Lexicalisation (a Java Based Study)}, + year = {2019}, + isbn = {9781450369817}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/3357766.3359532}, + doi = {10.1145/3357766.3359532}, + booktitle = {Proceedings of the 12th ACM SIGPLAN International Conference on Software Language Engineering}, + pages = {71–82}, + numpages = {12}, + keywords = {syntax analysis, lexicalisation, generalised parsing}, + location = {Athens, Greece}, + series = {SLE 2019} } @article{BEATTY1980193, -title = "Two iteration theorems for the LL(k) languages", -journal = "Theoretical Computer Science", -volume = "12", -number = "2", -pages = "193 - 228", -year = "1980", -issn = "0304-3975", -doi = "https://doi.org/10.1016/0304-3975(80)90029-8", -url = "http://www.sciencedirect.com/science/article/pii/0304397580900298", -author = "John C. Beatty", -abstract = "The structure of derivation trees over an LL(k) grammar is explored and a property of these trees obtained which is shown to characterize the LL(k) grammars. This characterization, called the LL(k) Left Part Theorem, makes it possible to establish a pair of iteration theorems for the LL(k) languages. These theorems provide a general and powerful method of showing that a language is not LL(k) when that is the case. They thus provide for the first time a flexible tool with which to explore the structure of the LL(k) languages and with which to discriminate between the LL(k) and LR(k) language classes. Examples are given of LR(k) languages which, for various reasons, fail to be LL(k). Easy and rigorous proofs to this effect are given using our LL(k) iteration theorems. In particular, it is proven that the dangling-ELSE construct allowed in PL/I and Pascal cannot be generated by any LL(k) grammar. We also give a new and straightforward proof based on the LL(k) Left Part Theorem that every LL(k) grammar is LR(k)." + title = {Two iteration theorems for the LL(k) languages}, + journal = {Theoretical Computer Science}, + volume = {12}, + number = {2}, + pages = {193 - 228}, + year = {1980}, + issn = {0304-3975}, + doi = {https://doi.org/10.1016/0304-3975(80)90029-8}, + url = {http://www.sciencedirect.com/science/article/pii/0304397580900298}, + author = {John C. Beatty}, + abstract = {The structure of derivation trees over an LL(k) grammar is explored and a property of these trees obtained which is shown to characterize the LL(k) grammars. This characterization, called the LL(k) Left Part Theorem, makes it possible to establish a pair of iteration theorems for the LL(k) languages. These theorems provide a general and powerful method of showing that a language is not LL(k) when that is the case. They thus provide for the first time a flexible tool with which to explore the structure of the LL(k) languages and with which to discriminate between the LL(k) and LR(k) language classes. Examples are given of LR(k) languages which, for various reasons, fail to be LL(k). Easy and rigorous proofs to this effect are given using our LL(k) iteration theorems. In particular, it is proven that the dangling-ELSE construct allowed in PL/I and Pascal cannot be generated by any LL(k) grammar. We also give a new and straightforward proof based on the LL(k) Left Part Theorem that every LL(k) grammar is LR(k).} } @misc{VavilovGroups, - language={russian}, - author = {{\CYRN}иколай Вавилов}, - title = {КОНКРЕТНАЯ ТЕОРИЯ ГРУПП}, - year = {2005}, - url = {http://dobrochan.com/src/pdf/1512/Вавилов-Н.-Конкретная-теория-групп.-Основные-понят.pdf}, - note = {Дата доступа: 29 июня 2021 г.} + language = {russian}, + author = {Николай Вавилов}, + title = {КОНКРЕТНАЯ ТЕОРИЯ ГРУПП}, + year = {2005}, + url = {http://dobrochan.com/src/pdf/1512/Вавилов-Н.-Конкретная-теория-групп.-Основные-понят.pdf}, + note = {Дата доступа: 29 июня 2021 г.} } @misc{VavilovRings, - language={russian}, - author = {{\CYRN}иколай Вавилов}, - title = {КОНКРЕТНАЯ ТЕОРИЯ КОЛЕЦ}, - year = {2006}, - url = {http://www.add3d.ru/wp-content/uploads/2019/10/Vavilov-Rings.pdf}, - note = {Дата доступа: 29 июня 2021 г.} + language = {russian}, + author = {Николай Вавилов}, + title = {КОНКРЕТНАЯ ТЕОРИЯ КОЛЕЦ}, + year = {2006}, + url = {http://www.add3d.ru/wp-content/uploads/2019/10/Vavilov-Rings.pdf}, + note = {Дата доступа: 29 июня 2021 г.} } @misc{das2018lower, - title={Lower bounds for Combinatorial Algorithms for Boolean Matrix Multiplication}, - author={Debarati Das and Michal Koucký and Michael Saks}, - year={2018}, - eprint={1801.05202}, - archivePrefix={arXiv}, - primaryClass={cs.CC} + title = {Lower bounds for Combinatorial Algorithms for Boolean Matrix Multiplication}, + author = {Debarati Das and Michal Koucký and Michael Saks}, + year = {2018}, + eprint = {1801.05202}, + archiveprefix = {arXiv}, + primaryclass = {cs.CC} } @misc{alman2020refined, - title={A Refined Laser Method and Faster Matrix Multiplication}, - author={Josh Alman and Virginia Vassilevska Williams}, - year={2020}, - eprint={2010.05846}, - archivePrefix={arXiv}, - primaryClass={cs.DS} -} - -@INPROCEEDINGS{5438580, - author={Bansal, Nikhil and Williams, Ryan}, - booktitle={2009 50th Annual IEEE Symposium on Foundations of Computer Science}, - title={Regularity Lemmas and Combinatorial Algorithms}, - year={2009}, - volume={}, - number={}, - pages={745-754}, - doi={10.1109/FOCS.2009.76}} - -@InProceedings{10.1007/978-3-662-47672-7_89, -author="Yu, Huacheng", -editor="Halld{\'o}rsson, Magn{\'u}s M. -and Iwama, Kazuo -and Kobayashi, Naoki -and Speckmann, Bettina", -title="An Improved Combinatorial Algorithm for Boolean Matrix Multiplication", -booktitle="Automata, Languages, and Programming", -year="2015", -publisher="Springer Berlin Heidelberg", -address="Berlin, Heidelberg", -pages="1094--1105", -abstract="We present a new combinatorial algorithm for triangle finding and Boolean matrix multiplication that runs in {\$}{\$}{\backslash}hat{\{}O{\}}(n^3/{\backslash}log ^4 n){\$}{\$}O^(n3/log4n)time, where the {\$}{\$}{\backslash}hat{\{}O{\}}{\$}{\$}O^notation suppresses poly(loglog) factors. This improves the previous best combinatorial algorithm by Chan [4] that runs in {\$}{\$}{\backslash}hat{\{}O{\}}(n^3/{\backslash}log ^3 n){\$}{\$}O^(n3/log3n)time. Our algorithm generalizes the divide-and-conquer strategy of Chan's algorithm.", -isbn="978-3-662-47672-7" + title = {A Refined Laser Method and Faster Matrix Multiplication}, + author = {Josh Alman and Virginia Vassilevska Williams}, + year = {2020}, + eprint = {2010.05846}, + archiveprefix = {arXiv}, + primaryclass = {cs.DS} +} + +@inproceedings{5438580, + author = {Bansal, Nikhil and Williams, Ryan}, + booktitle = {2009 50th Annual IEEE Symposium on Foundations of Computer Science}, + title = {Regularity Lemmas and Combinatorial Algorithms}, + year = {2009}, + volume = {}, + number = {}, + pages = {745-754}, + doi = {10.1109/FOCS.2009.76} +} + +@inproceedings{10.1007/978-3-662-47672-7_89, + author = {Yu, Huacheng}, + editor = {Halld{\'o}rsson, Magn{\'u}s M. + and Iwama, Kazuo + and Kobayashi, Naoki + and Speckmann, Bettina}, + title = {An Improved Combinatorial Algorithm for Boolean Matrix Multiplication}, + booktitle = {Automata, Languages, and Programming}, + year = {2015}, + publisher = {Springer Berlin Heidelberg}, + address = {Berlin, Heidelberg}, + pages = {1094--1105}, + abstract = {We present a new combinatorial algorithm for triangle finding and Boolean matrix multiplication that runs in {\$}{\$}{\backslash}hat{\{}O{\}}(n^3/{\backslash}log ^4 n){\$}{\$}O^(n3/log4n)time, where the {\$}{\$}{\backslash}hat{\{}O{\}}{\$}{\$}O^notation suppresses poly(loglog) factors. This improves the previous best combinatorial algorithm by Chan [4] that runs in {\$}{\$}{\backslash}hat{\{}O{\}}(n^3/{\backslash}log ^3 n){\$}{\$}O^(n3/log3n)time. Our algorithm generalizes the divide-and-conquer strategy of Chan's algorithm.}, + isbn = {978-3-662-47672-7} } @article{ArlDinKro70, -author = {{\CYRV}. Арлазаров and {\CYRE}. Диниц and {\CYRM}. Кронрод and {\CYRI}. Фараджев}, -title = {Об экономном построении транзитивного замыкания ориентированного графа}, -journal = {Докл. АН СССР}, -year = {1970}, -volume = {194}, -number = {3}, -pages = {487--488}, -url = {http://mi.mathnet.ru/dan35675} + author = {В. Арлазаров and Е. Диниц and М. Кронрод and И. Фараджев}, + title = {Об экономном построении транзитивного замыкания ориентированного графа}, + journal = {Докл. АН СССР}, + year = {1970}, + volume = {194}, + number = {3}, + pages = {487--488}, + url = {http://mi.mathnet.ru/dan35675} } @book{doi:10.1137/1.9780898719918, -author = {Kepner, Jeremy and Gilbert, John},editor = {Jeremy Kepner and John Gilbert}, -title = {Graph Algorithms in the Language of Linear Algebra}, -publisher = {Society for Industrial and Applied Mathematics}, -year = {2011}, -doi = {10.1137/1.9780898719918}, -address = {}, -edition = {}, -URL = {https://epubs.siam.org/doi/abs/10.1137/1.9780898719918}, -eprint = {https://epubs.siam.org/doi/pdf/10.1137/1.9780898719918} -} -@Misc{tata2007, - author = {H. Comon and M. Dauchet and R. Gilleron and C. L\"oding -and F. Jacquemard -and D. Lugiez and S. Tison and M. Tommasi}, - title = {Tree Automata Techniques and Applications}, + author = {Kepner, Jeremy and Gilbert, John}, + editor = {Jeremy Kepner and John Gilbert}, + title = {Graph Algorithms in the Language of Linear Algebra}, + publisher = {Society for Industrial and Applied Mathematics}, + year = {2011}, + doi = {10.1137/1.9780898719918}, + address = {}, + edition = {}, + url = {https://epubs.siam.org/doi/abs/10.1137/1.9780898719918}, + eprint = {https://epubs.siam.org/doi/pdf/10.1137/1.9780898719918} +} +@misc{tata2007, + author = {H. Comon and M. Dauchet and R. Gilleron and C. L\"oding + and F. Jacquemard + and D. Lugiez and S. Tison and M. Tommasi}, + title = {Tree Automata Techniques and Applications}, howpublished = {Available on: \url{http://www.grappa.univ-lille3.fr/tata}}, - note = {release October, 12th 2007}, - year = 2007 + note = {release October, 12th 2007}, + year = 2007 } @inproceedings{Baras2010PathPI, - title={Path Problems in Networks}, - author={J. Baras and George Theodorakopoulos}, - booktitle={Path Problems in Networks}, - year={2010} + title = {Path Problems in Networks}, + author = {J. Baras and George Theodorakopoulos}, + booktitle = {Path Problems in Networks}, + year = {2010} } @article{EHRIG1992557, -title = {Introduction to graph grammars with applications to semantic networks}, -journal = {Computers \& Mathematics with Applications}, -volume = {23}, -number = {6}, -pages = {557-572}, -year = {1992}, -issn = {0898-1221}, -doi = {https://doi.org/10.1016/0898-1221(92)90124-Z}, -url = {https://www.sciencedirect.com/science/article/pii/089812219290124Z}, -author = {Hartmut Ehrig and Annegret Habel and Hans-Jörg Kreowski}, -abstract = {In the first half of this paper, we give an introductory survey on graph grammars that provide rule-based mechanisms for generating, manipulating and analyzing graphs. In the second half, two potential applications of graph-grammar concepts to semantic networks are indicated.} + title = {Introduction to graph grammars with applications to semantic networks}, + journal = {Computers \& Mathematics with Applications}, + volume = {23}, + number = {6}, + pages = {557-572}, + year = {1992}, + issn = {0898-1221}, + doi = {https://doi.org/10.1016/0898-1221(92)90124-Z}, + url = {https://www.sciencedirect.com/science/article/pii/089812219290124Z}, + author = {Hartmut Ehrig and Annegret Habel and Hans-Jörg Kreowski}, + abstract = {In the first half of this paper, we give an introductory survey on graph grammars that provide rule-based mechanisms for generating, manipulating and analyzing graphs. In the second half, two potential applications of graph-grammar concepts to semantic networks are indicated.} } @book{Courcelle2009, - doi = {10.1017/cbo9780511977619}, - url = {https://doi.org/10.1017/cbo9780511977619}, - year = {2009}, + doi = {10.1017/cbo9780511977619}, + url = {https://doi.org/10.1017/cbo9780511977619}, + year = {2009}, publisher = {Cambridge University Press}, - author = {Bruno Courcelle and Joost Engelfriet}, - title = {Graph Structure and Monadic Second-Order Logic} + author = {Bruno Courcelle and Joost Engelfriet}, + title = {Graph Structure and Monadic Second-Order Logic} } -@INPROCEEDINGS{9286186, author={Elekes, Márton and Nagy, Attila and Sándor, Dávid and Antal, János Benjamin and Davis, Timothy A. and Szárnyas, Gábor}, booktitle={2020 IEEE High Performance Extreme Computing Conference (HPEC)}, title={A GraphBLAS solution to the SIGMOD 2014 Programming Contest using multi-source BFS}, year={2020}, volume={}, number={}, pages={1-7}, doi={10.1109/HPEC43674.2020.9286186}} +@inproceedings{9286186, + author = {Elekes, Márton and Nagy, Attila and Sándor, Dávid and Antal, János Benjamin and Davis, Timothy A. and Szárnyas, Gábor}, + booktitle = {2020 IEEE High Performance Extreme Computing Conference (HPEC)}, + title = {A GraphBLAS solution to the SIGMOD 2014 Programming Contest using multi-source BFS}, + year = {2020}, + volume = {}, + number = {}, + pages = {1-7}, + doi = {10.1109/HPEC43674.2020.9286186} +} @inproceedings{10.1145/3315454.3329962, -author = {Spampinato, Daniele G. and Sridhar, Upasana and Low, Tze Meng}, -title = {Linear Algebraic Depth-First Search}, -year = {2019}, -isbn = {9781450367172}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/3315454.3329962}, -doi = {10.1145/3315454.3329962}, -abstract = {There is a recent push by a segment of the graph community to implement graph algorithms in the language of linear algebra. However, graph algorithms that depend on depth-first search (DFS) techniques are often highlighted as limitations of the linear algebraic approach as linear algebraic formulation of DFS algorithms are few, if any. This paper provides a linear algebraic approach for developing DFS graph algorithms and demonstrates its use for defining three classical DFS-based computations: Binary tree traversal, topological sort, and biconnected components.}, -booktitle = {Proceedings of the 6th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming}, -pages = {93–104}, -numpages = {12}, -keywords = {post-order traversal, pre-order traversal, topological sort, biconnected components, depth-first search, adjacency matrix, graph algorithms, linear algebra, permutations}, -location = {Phoenix, AZ, USA}, -series = {ARRAY 2019} + author = {Spampinato, Daniele G. and Sridhar, Upasana and Low, Tze Meng}, + title = {Linear Algebraic Depth-First Search}, + year = {2019}, + isbn = {9781450367172}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/3315454.3329962}, + doi = {10.1145/3315454.3329962}, + abstract = {There is a recent push by a segment of the graph community to implement graph algorithms in the language of linear algebra. However, graph algorithms that depend on depth-first search (DFS) techniques are often highlighted as limitations of the linear algebraic approach as linear algebraic formulation of DFS algorithms are few, if any. This paper provides a linear algebraic approach for developing DFS graph algorithms and demonstrates its use for defining three classical DFS-based computations: Binary tree traversal, topological sort, and biconnected components.}, + booktitle = {Proceedings of the 6th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming}, + pages = {93–104}, + numpages = {12}, + keywords = {post-order traversal, pre-order traversal, topological sort, biconnected components, depth-first search, adjacency matrix, graph algorithms, linear algebra, permutations}, + location = {Phoenix, AZ, USA}, + series = {ARRAY 2019} } @article{GEBHARDT202241, -title = {On is an n-MCFL}, -journal = {Journal of Computer and System Sciences}, -volume = {127}, -pages = {41-52}, -year = {2022}, -issn = {0022-0000}, -doi = {https://doi.org/10.1016/j.jcss.2022.02.003}, -url = {https://www.sciencedirect.com/science/article/pii/S0022000022000174}, -author = {Kilian Gebhardt and Frédéric Meunier and Sylvain Salvati}, -keywords = {Formal Languages, Multiple Context Free Languages, Commutative Languages, Tucker Lemma, Necklace splitting theorem, Word problem in groups}, -abstract = {Commutative properties in formal languages pose problems at the frontier of computer science, computational linguistics and computational group theory. A prominent problem of this kind is the position of the language On, the language that contains the same number of letters ai and a¯i with 1⩽i⩽n, in the known classes of formal languages. It has recently been shown that On is a Multiple Context-Free Language (MCFL). However the more precise conjecture of Nederhof that On is an MCFL of dimension n was left open. We prove this conjecture using tools from algebraic topology. On our way, we prove a variant of the necklace splitting theorem.} + title = {On is an n-MCFL}, + journal = {Journal of Computer and System Sciences}, + volume = {127}, + pages = {41-52}, + year = {2022}, + issn = {0022-0000}, + doi = {https://doi.org/10.1016/j.jcss.2022.02.003}, + url = {https://www.sciencedirect.com/science/article/pii/S0022000022000174}, + author = {Kilian Gebhardt and Frédéric Meunier and Sylvain Salvati}, + keywords = {Formal Languages, Multiple Context Free Languages, Commutative Languages, Tucker Lemma, Necklace splitting theorem, Word problem in groups}, + abstract = {Commutative properties in formal languages pose problems at the frontier of computer science, computational linguistics and computational group theory. A prominent problem of this kind is the position of the language On, the language that contains the same number of letters ai and a¯i with 1⩽i⩽n, in the known classes of formal languages. It has recently been shown that On is a Multiple Context-Free Language (MCFL). However the more precise conjecture of Nederhof that On is an MCFL of dimension n was left open. We prove this conjecture using tools from algebraic topology. On our way, we prove a variant of the necklace splitting theorem.} } @article{salvati:inria-00564552, - TITLE = {{MIX is a 2-MCFL and the word problem in $\mathbb{Z}^2$ is solved by a third-order collapsible pushdown automaton}}, - AUTHOR = {Salvati, Sylvain}, - URL = {https://inria.hal.science/inria-00564552}, - JOURNAL = {{Journal of Computer and System Sciences}}, - PUBLISHER = {{Elsevier}}, - VOLUME = {81}, - NUMBER = {7}, - PAGES = {1252 - 1277}, - YEAR = {2015}, - PDF = {https://inria.hal.science/inria-00564552/file/mix.pdf}, - HAL_ID = {inria-00564552}, - HAL_VERSION = {v1}, + title = {{MIX is a 2-MCFL and the word problem in $\mathbb{Z}^2$ is solved by a third-order collapsible pushdown automaton}}, + author = {Salvati, Sylvain}, + url = {https://inria.hal.science/inria-00564552}, + journal = {{Journal of Computer and System Sciences}}, + publisher = {{Elsevier}}, + volume = {81}, + number = {7}, + pages = {1252 - 1277}, + year = {2015}, + pdf = {https://inria.hal.science/inria-00564552/file/mix.pdf}, + hal_id = {inria-00564552}, + hal_version = {v1} } @article{10.1145/3093333.3009848, -author = {Zhang, Qirun and Su, Zhendong}, -title = {Context-Sensitive Data-Dependence Analysis via Linear Conjunctive Language Reachability}, -year = {2017}, -issue_date = {January 2017}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {52}, -number = {1}, -issn = {0362-1340}, -url = {https://doi.org/10.1145/3093333.3009848}, -doi = {10.1145/3093333.3009848}, -abstract = {Many program analysis problems can be formulated as graph reachability problems. In the literature, context-free language (CFL) reachability has been the most popular formulation and can be computed in subcubic time. The context-sensitive data-dependence analysis is a fundamental abstraction that can express a broad range of program analysis problems. It essentially describes an interleaved matched-parenthesis language reachability problem. The language is not context-free, and the problem is well-known to be undecidable. In practice, many program analyses adopt CFL-reachability to exactly model the matched parentheses for either context-sensitivity or structure-transmitted data-dependence, but not both. Thus, the CFL-reachability formulation for context-sensitive data-dependence analysis is inherently an approximation. To support more precise and scalable analyses, this paper introduces linear conjunctive language (LCL) reachability, a new, expressive class of graph reachability. LCL not only contains the interleaved matched-parenthesis language, but is also closed under all set-theoretic operations. Given a graph with n nodes and m edges, we propose an O(mn) time approximation algorithm for solving all-pairs LCL-reachability, which is asymptotically better than known CFL-reachability algorithms. Our formulation and algorithm offer a new perspective on attacking the aforementioned undecidable problem - the LCL-reachability formulation is exact, while the LCL-reachability algorithm yields a sound approximation. We have applied the LCL-reachability framework to two existing client analyses. The experimental results show that the LCL-reachability framework is both more precise and scalable than the traditional CFL-reachability framework. This paper opens up the opportunity to exploit LCL-reachability in program analysis.}, -journal = {SIGPLAN Not.}, -month = {jan}, -pages = {344–358}, -numpages = {15}, -keywords = {program analysis, Context-free language reachability, linear conjunctive grammar, trellis automata} + author = {Zhang, Qirun and Su, Zhendong}, + title = {Context-Sensitive Data-Dependence Analysis via Linear Conjunctive Language Reachability}, + year = {2017}, + issue_date = {January 2017}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {52}, + number = {1}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/3093333.3009848}, + doi = {10.1145/3093333.3009848}, + abstract = {Many program analysis problems can be formulated as graph reachability problems. In the literature, context-free language (CFL) reachability has been the most popular formulation and can be computed in subcubic time. The context-sensitive data-dependence analysis is a fundamental abstraction that can express a broad range of program analysis problems. It essentially describes an interleaved matched-parenthesis language reachability problem. The language is not context-free, and the problem is well-known to be undecidable. In practice, many program analyses adopt CFL-reachability to exactly model the matched parentheses for either context-sensitivity or structure-transmitted data-dependence, but not both. Thus, the CFL-reachability formulation for context-sensitive data-dependence analysis is inherently an approximation. To support more precise and scalable analyses, this paper introduces linear conjunctive language (LCL) reachability, a new, expressive class of graph reachability. LCL not only contains the interleaved matched-parenthesis language, but is also closed under all set-theoretic operations. Given a graph with n nodes and m edges, we propose an O(mn) time approximation algorithm for solving all-pairs LCL-reachability, which is asymptotically better than known CFL-reachability algorithms. Our formulation and algorithm offer a new perspective on attacking the aforementioned undecidable problem - the LCL-reachability formulation is exact, while the LCL-reachability algorithm yields a sound approximation. We have applied the LCL-reachability framework to two existing client analyses. The experimental results show that the LCL-reachability framework is both more precise and scalable than the traditional CFL-reachability framework. This paper opens up the opportunity to exploit LCL-reachability in program analysis.}, + journal = {SIGPLAN Not.}, + month = {jan}, + pages = {344–358}, + numpages = {15}, + keywords = {program analysis, Context-free language reachability, linear conjunctive grammar, trellis automata} } @inproceedings{10.1145/3009837.3009848, -author = {Zhang, Qirun and Su, Zhendong}, -title = {Context-Sensitive Data-Dependence Analysis via Linear Conjunctive Language Reachability}, -year = {2017}, -isbn = {9781450346603}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/3009837.3009848}, -doi = {10.1145/3009837.3009848}, -abstract = {Many program analysis problems can be formulated as graph reachability problems. In the literature, context-free language (CFL) reachability has been the most popular formulation and can be computed in subcubic time. The context-sensitive data-dependence analysis is a fundamental abstraction that can express a broad range of program analysis problems. It essentially describes an interleaved matched-parenthesis language reachability problem. The language is not context-free, and the problem is well-known to be undecidable. In practice, many program analyses adopt CFL-reachability to exactly model the matched parentheses for either context-sensitivity or structure-transmitted data-dependence, but not both. Thus, the CFL-reachability formulation for context-sensitive data-dependence analysis is inherently an approximation. To support more precise and scalable analyses, this paper introduces linear conjunctive language (LCL) reachability, a new, expressive class of graph reachability. LCL not only contains the interleaved matched-parenthesis language, but is also closed under all set-theoretic operations. Given a graph with n nodes and m edges, we propose an O(mn) time approximation algorithm for solving all-pairs LCL-reachability, which is asymptotically better than known CFL-reachability algorithms. Our formulation and algorithm offer a new perspective on attacking the aforementioned undecidable problem - the LCL-reachability formulation is exact, while the LCL-reachability algorithm yields a sound approximation. We have applied the LCL-reachability framework to two existing client analyses. The experimental results show that the LCL-reachability framework is both more precise and scalable than the traditional CFL-reachability framework. This paper opens up the opportunity to exploit LCL-reachability in program analysis.}, -booktitle = {Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages}, -pages = {344–358}, -numpages = {15}, -keywords = {program analysis, Context-free language reachability, linear conjunctive grammar, trellis automata}, -location = {Paris, France}, -series = {POPL '17} -} - -@InProceedings{10.1007/978-3-662-59620-3_5, -author="Kogkalidis, Konstantinos -and Melkonian, Orestis", -editor="Sikos, Jennifer -and Pacuit, Eric", -title="Towards a 2-Multiple Context-Free Grammar for the 3-Dimensional Dyck Language", -booktitle="At the Intersection of Language, Logic, and Information", -year="2019", -publisher="Springer Berlin Heidelberg", -address="Berlin, Heidelberg", -pages="79--92", -abstract="We discuss the open problem of parsing the Dyck language of 3 symbols, {\$}{\$}D^3{\$}{\$}, using a 2-Multiple Context-Free Grammar. We attempt to tackle this problem by implementing a number of novel meta-grammatical techniques and present the associated software packages we developed.", -isbn="978-3-662-59620-3" + author = {Zhang, Qirun and Su, Zhendong}, + title = {Context-Sensitive Data-Dependence Analysis via Linear Conjunctive Language Reachability}, + year = {2017}, + isbn = {9781450346603}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/3009837.3009848}, + doi = {10.1145/3009837.3009848}, + abstract = {Many program analysis problems can be formulated as graph reachability problems. In the literature, context-free language (CFL) reachability has been the most popular formulation and can be computed in subcubic time. The context-sensitive data-dependence analysis is a fundamental abstraction that can express a broad range of program analysis problems. It essentially describes an interleaved matched-parenthesis language reachability problem. The language is not context-free, and the problem is well-known to be undecidable. In practice, many program analyses adopt CFL-reachability to exactly model the matched parentheses for either context-sensitivity or structure-transmitted data-dependence, but not both. Thus, the CFL-reachability formulation for context-sensitive data-dependence analysis is inherently an approximation. To support more precise and scalable analyses, this paper introduces linear conjunctive language (LCL) reachability, a new, expressive class of graph reachability. LCL not only contains the interleaved matched-parenthesis language, but is also closed under all set-theoretic operations. Given a graph with n nodes and m edges, we propose an O(mn) time approximation algorithm for solving all-pairs LCL-reachability, which is asymptotically better than known CFL-reachability algorithms. Our formulation and algorithm offer a new perspective on attacking the aforementioned undecidable problem - the LCL-reachability formulation is exact, while the LCL-reachability algorithm yields a sound approximation. We have applied the LCL-reachability framework to two existing client analyses. The experimental results show that the LCL-reachability framework is both more precise and scalable than the traditional CFL-reachability framework. This paper opens up the opportunity to exploit LCL-reachability in program analysis.}, + booktitle = {Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages}, + pages = {344–358}, + numpages = {15}, + keywords = {program analysis, Context-free language reachability, linear conjunctive grammar, trellis automata}, + location = {Paris, France}, + series = {POPL '17} +} + +@inproceedings{10.1007/978-3-662-59620-3_5, + author = {Kogkalidis, Konstantinos + and Melkonian, Orestis}, + editor = {Sikos, Jennifer + and Pacuit, Eric}, + title = {Towards a 2-Multiple Context-Free Grammar for the 3-Dimensional Dyck Language}, + booktitle = {At the Intersection of Language, Logic, and Information}, + year = {2019}, + publisher = {Springer Berlin Heidelberg}, + address = {Berlin, Heidelberg}, + pages = {79--92}, + abstract = {We discuss the open problem of parsing the Dyck language of 3 symbols, {\$}{\$}D^3{\$}{\$}, using a 2-Multiple Context-Free Grammar. We attempt to tackle this problem by implementing a number of novel meta-grammatical techniques and present the associated software packages we developed.}, + isbn = {978-3-662-59620-3} } @inproceedings{Economopoulos2006GeneralisedLP, - title={Generalised LR parsing algorithms}, - author={Giorgios Economopoulos}, - year={2006}, - url={https://api.semanticscholar.org/CorpusID:29026667} + title = {Generalised LR parsing algorithms}, + author = {Giorgios Economopoulos}, + year = {2006}, + url = {https://api.semanticscholar.org/CorpusID:29026667} } @inproceedings{Cappers2014ExploringAV, - title={Exploring and visualizing GLL parsing}, - author={Bcm Bram Cappers}, - year={2014}, - url={https://api.semanticscholar.org/CorpusID:63190886} + title = {Exploring and visualizing GLL parsing}, + author = {Bcm Bram Cappers}, + year = {2014}, + url = {https://api.semanticscholar.org/CorpusID:63190886} } @inproceedings{Afroozeh2019PracticalGT, - title={Practical general top-down parsers}, - author={Ali Afroozeh and Anastasia Izmaylova}, - year={2019}, - url={https://api.semanticscholar.org/CorpusID:198351560} + title = {Practical general top-down parsers}, + author = {Ali Afroozeh and Anastasia Izmaylova}, + year = {2019}, + url = {https://api.semanticscholar.org/CorpusID:198351560} } @article{10.1145/3571252, -author = {Koutris, Paraschos and Deep, Shaleen}, -title = {The Fine-Grained Complexity of CFL Reachability}, -year = {2023}, -issue_date = {January 2023}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {7}, -number = {POPL}, -url = {https://doi.org/10.1145/3571252}, -doi = {10.1145/3571252}, -abstract = {Many problems in static program analysis can be modeled as the context-free language (CFL) reachability problem on directed labeled graphs. The CFL reachability problem can be generally solved in time O(n3), where n is the number of vertices in the graph, with some specific cases that can be solved faster. In this work, we ask the following question: given a specific CFL, what is the exact exponent in the monomial of the running time? In other words, for which cases do we have linear, quadratic or cubic algorithms, and are there problems with intermediate runtimes? This question is inspired by recent efforts to classify classic problems in terms of their exact polynomial complexity, known as fine-grained complexity. Although recent efforts have shown some conditional lower bounds (mostly for the class of combinatorial algorithms), a general picture of the fine-grained complexity landscape for CFL reachability is missing. Our main contribution is lower bound results that pinpoint the exact running time of several classes of CFLs or specific CFLs under widely believed lower bound conjectures (e.g., Boolean Matrix Multiplication, k-Clique, APSP, 3SUM). We particularly focus on the family of Dyck-k languages (which are strings with well-matched parentheses), a fundamental class of CFL reachability problems. Remarkably, we are able to show a Ω(n2.5) lower bound for Dyck-2 reachability, which to the best of our knowledge is the first super-quadratic lower bound that applies to all algorithms, and shows that CFL reachability is strictly harder that Boolean Matrix Multiplication. We also present new lower bounds for the case of sparse input graphs where the number of edges m is the input parameter, a common setting in the database literature. For this setting, we show a cubic lower bound for Andersen’s Pointer Analysis which significantly strengthens prior known results.}, -journal = {Proc. ACM Program. Lang.}, -month = {jan}, -articleno = {59}, -numpages = {27}, -keywords = {sparse graphs, static pointer analysis, Dyck reachability, Datalog, fine-grained complexity} + author = {Koutris, Paraschos and Deep, Shaleen}, + title = {The Fine-Grained Complexity of CFL Reachability}, + year = {2023}, + issue_date = {January 2023}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {7}, + number = {POPL}, + url = {https://doi.org/10.1145/3571252}, + doi = {10.1145/3571252}, + abstract = {Many problems in static program analysis can be modeled as the context-free language (CFL) reachability problem on directed labeled graphs. The CFL reachability problem can be generally solved in time O(n3), where n is the number of vertices in the graph, with some specific cases that can be solved faster. In this work, we ask the following question: given a specific CFL, what is the exact exponent in the monomial of the running time? In other words, for which cases do we have linear, quadratic or cubic algorithms, and are there problems with intermediate runtimes? This question is inspired by recent efforts to classify classic problems in terms of their exact polynomial complexity, known as fine-grained complexity. Although recent efforts have shown some conditional lower bounds (mostly for the class of combinatorial algorithms), a general picture of the fine-grained complexity landscape for CFL reachability is missing. Our main contribution is lower bound results that pinpoint the exact running time of several classes of CFLs or specific CFLs under widely believed lower bound conjectures (e.g., Boolean Matrix Multiplication, k-Clique, APSP, 3SUM). We particularly focus on the family of Dyck-k languages (which are strings with well-matched parentheses), a fundamental class of CFL reachability problems. Remarkably, we are able to show a Ω(n2.5) lower bound for Dyck-2 reachability, which to the best of our knowledge is the first super-quadratic lower bound that applies to all algorithms, and shows that CFL reachability is strictly harder that Boolean Matrix Multiplication. We also present new lower bounds for the case of sparse input graphs where the number of edges m is the input parameter, a common setting in the database literature. For this setting, we show a cubic lower bound for Andersen’s Pointer Analysis which significantly strengthens prior known results.}, + journal = {Proc. ACM Program. Lang.}, + month = {jan}, + articleno = {59}, + numpages = {27}, + keywords = {sparse graphs, static pointer analysis, Dyck reachability, Datalog, fine-grained complexity} } @misc{istomina2023finegrained, - title={Fine-grained reductions around CFL-reachability}, - author={Aleksandra Istomina and Semyon Grigorev and Ekaterina Shemetova}, - year={2023}, - eprint={2306.15967}, - archivePrefix={arXiv}, - primaryClass={cs.CC} + title = {Fine-grained reductions around CFL-reachability}, + author = {Aleksandra Istomina and Semyon Grigorev and Ekaterina Shemetova}, + year = {2023}, + eprint = {2306.15967}, + archiveprefix = {arXiv}, + primaryclass = {cs.CC} } @article{10.1145/3583660.3583664, -author = {Pavlogiannis, Andreas}, -title = {CFL/Dyck Reachability: An Algorithmic Perspective}, -year = {2023}, -issue_date = {October 2022}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {9}, -number = {4}, -url = {https://doi.org/10.1145/3583660.3583664}, -doi = {10.1145/3583660.3583664}, -abstract = {CFL/Dyck reachability is a simple graph-theoretic problem: given a CFL/Dyck language L over an alphabet Σ, a graph G = (V, E) of Σ-labeled edges, and two distinguished nodes s, t ∈ V, does there exist a path from s to t that spells out a word in L? This simple notion of language-based graph reachability serves as the algorithmic formulation of a large number of problems in diverse domains, such as graph databases and program static analysis. This paper takes an algorithmic perspective on CFL/Dyck reachability, and overviews several recent advances concerning the decidability and complexity of the problem and some its close variants, as realized in the areas of automata theory and program verification.}, -journal = {ACM SIGLOG News}, -month = {feb}, -pages = {5–25}, -numpages = {21} + author = {Pavlogiannis, Andreas}, + title = {CFL/Dyck Reachability: An Algorithmic Perspective}, + year = {2023}, + issue_date = {October 2022}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {9}, + number = {4}, + url = {https://doi.org/10.1145/3583660.3583664}, + doi = {10.1145/3583660.3583664}, + abstract = {CFL/Dyck reachability is a simple graph-theoretic problem: given a CFL/Dyck language L over an alphabet Σ, a graph G = (V, E) of Σ-labeled edges, and two distinguished nodes s, t ∈ V, does there exist a path from s to t that spells out a word in L? This simple notion of language-based graph reachability serves as the algorithmic formulation of a large number of problems in diverse domains, such as graph databases and program static analysis. This paper takes an algorithmic perspective on CFL/Dyck reachability, and overviews several recent advances concerning the decidability and complexity of the problem and some its close variants, as realized in the areas of automata theory and program verification.}, + journal = {ACM SIGLOG News}, + month = {feb}, + pages = {5–25}, + numpages = {21} } @inproceedings{Terekhov2021MultipleSourceCP, - title={Multiple-Source Context-Free Path Querying in Terms of Linear Algebra}, - author={Arseniy Terekhov and Vlada Pogozhelskaya and Vadim Abzalov and Timur Zinnatulin and Semyon V. Grigorev}, - booktitle={International Conference on Extending Database Technology}, - year={2021}, - url={https://api.semanticscholar.org/CorpusID:232284054} + title = {Multiple-Source Context-Free Path Querying in Terms of Linear Algebra}, + author = {Arseniy Terekhov and Vlada Pogozhelskaya and Vadim Abzalov and Timur Zinnatulin and Semyon V. Grigorev}, + booktitle = {International Conference on Extending Database Technology}, + year = {2021}, + url = {https://api.semanticscholar.org/CorpusID:232284054} } @article{10.1145/321239.321249, -author = {Brzozowski, Janusz A.}, -title = {Derivatives of Regular Expressions}, -year = {1964}, -issue_date = {Oct. 1964}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {11}, -number = {4}, -issn = {0004-5411}, -url = {https://doi.org/10.1145/321239.321249}, -doi = {10.1145/321239.321249}, -journal = {J. ACM}, -month = {oct}, -pages = {481–494}, -numpages = {14} + author = {Brzozowski, Janusz A.}, + title = {Derivatives of Regular Expressions}, + year = {1964}, + issue_date = {Oct. 1964}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {11}, + number = {4}, + issn = {0004-5411}, + url = {https://doi.org/10.1145/321239.321249}, + doi = {10.1145/321239.321249}, + journal = {J. ACM}, + month = {oct}, + pages = {481–494}, + numpages = {14} } @book{Leiss1999, - doi = {10.1007/978-1-4612-2156-2}, - url = {https://doi.org/10.1007/978-1-4612-2156-2}, - year = {1999}, + doi = {10.1007/978-1-4612-2156-2}, + url = {https://doi.org/10.1007/978-1-4612-2156-2}, + year = {1999}, publisher = {Springer New York}, - author = {Ernst L. Leiss}, - title = {Language Equations} + author = {Ernst L. Leiss}, + title = {Language Equations} } @article{MRYKHIN2023113829, -title = {The hardest language for grammars with context operators}, -journal = {Theoretical Computer Science}, -volume = {958}, -pages = {113829}, -year = {2023}, -issn = {0304-3975}, -doi = {https://doi.org/10.1016/j.tcs.2023.113829}, -url = {https://www.sciencedirect.com/science/article/pii/S0304397523001421}, -author = {Mikhail Mrykhin and Alexander Okhotin}, -keywords = {Formal language theory, Formal grammars, Hardest formal languages, Grammars with context operators, Inverse homomorphisms, Finite transducers}, -abstract = {In 1973, Greibach (“The hardest context-free language”, SIAM J. Comp., 1973) constructed a context-free language L0 with the property that every context-free language can be reduced to L0 by a homomorphism, thus representing it as an inverse homomorphic image h−1(L0). In this paper, a similar characterization is established for a family of grammars equipped with operators for referring to the left context of any substring, recently defined by Barash and Okhotin (“An extension of context-free grammars with one-sided context specifications”, Inform. Comput., 2014). An essential step of the argument is a new normal form for grammars with context operators, in which every nonterminal symbol defines only strings of odd length in left contexts of even length: the even-odd normal form. The characterization is completed by showing that the language family defined by grammars with context operators is closed under inverse homomorphisms; actually, it is closed under injective nondeterministic finite transductions.} + title = {The hardest language for grammars with context operators}, + journal = {Theoretical Computer Science}, + volume = {958}, + pages = {113829}, + year = {2023}, + issn = {0304-3975}, + doi = {https://doi.org/10.1016/j.tcs.2023.113829}, + url = {https://www.sciencedirect.com/science/article/pii/S0304397523001421}, + author = {Mikhail Mrykhin and Alexander Okhotin}, + keywords = {Formal language theory, Formal grammars, Hardest formal languages, Grammars with context operators, Inverse homomorphisms, Finite transducers}, + abstract = {In 1973, Greibach (“The hardest context-free language”, SIAM J. Comp., 1973) constructed a context-free language L0 with the property that every context-free language can be reduced to L0 by a homomorphism, thus representing it as an inverse homomorphic image h−1(L0). In this paper, a similar characterization is established for a family of grammars equipped with operators for referring to the left context of any substring, recently defined by Barash and Okhotin (“An extension of context-free grammars with one-sided context specifications”, Inform. Comput., 2014). An essential step of the argument is a new normal form for grammars with context operators, in which every nonterminal symbol defines only strings of odd length in left contexts of even length: the even-odd normal form. The characterization is completed by showing that the language family defined by grammars with context operators is closed under inverse homomorphisms; actually, it is closed under injective nondeterministic finite transductions.} } @article{markov1954theory, - title={The theory of algorithms}, - author={Markov, Andrei Andreevich}, - journal={Trudy Matematicheskogo Instituta Imeni VA Steklova}, - volume={42}, - pages={3--375}, - year={1954}, - publisher={Russian Academy of Sciences, Steklov Mathematical Institute of Russian~…} + title = {The theory of algorithms}, + author = {Markov, Andrei Andreevich}, + journal = {Trudy Matematicheskogo Instituta Imeni VA Steklova}, + volume = {42}, + pages = {3--375}, + year = {1954}, + publisher = {Russian Academy of Sciences, Steklov Mathematical Institute of Russian~…} } @book{10.5555/578595, -author = {Harrison, M. A.}, -title = {Introduction to Formal Language Theory}, -year = {1978}, -isbn = {0201029553}, -publisher = {Addison-Wesley Longman Publishing Co., Inc.}, -address = {USA}, -edition = {1st}, -abstract = {From the Publisher:Formal language theory was fist developed in the mid 1950's in an attempt to develop theories of natural language acquisition. It was soon realized that this theory (particularly the context-free portion) was quite relevant to the artificial languages that had originated in computer science. Since those days, the theory of formal languages has been developed extensively, and has several discernible trends, which include applications to the syntactic analysis of programming languages, program schemes, models of biological systems, and relationships with natural languages.} + author = {Harrison, M. A.}, + title = {Introduction to Formal Language Theory}, + year = {1978}, + isbn = {0201029553}, + publisher = {Addison-Wesley Longman Publishing Co., Inc.}, + address = {USA}, + edition = {1st}, + abstract = {From the Publisher:Formal language theory was fist developed in the mid 1950's in an attempt to develop theories of natural language acquisition. It was soon realized that this theory (particularly the context-free portion) was quite relevant to the artificial languages that had originated in computer science. Since those days, the theory of formal languages has been developed extensively, and has several discernible trends, which include applications to the syntactic analysis of programming languages, program schemes, models of biological systems, and relationships with natural languages.} } @book{hopcroft2001introduction, - title={Introduction to automata theory, languages, and computation}, - author={Hopcroft, John E and Motwani, Rajeev and Ullman, Jeffrey D}, - journal={Acm Sigact News}, - volume={32}, - number={1}, - pages={60--65}, - year={2001}, - publisher={ACM New York, NY, USA} + title = {Introduction to automata theory, languages, and computation}, + author = {Hopcroft, John E and Motwani, Rajeev and Ullman, Jeffrey D}, + journal = {Acm Sigact News}, + volume = {32}, + number = {1}, + pages = {60--65}, + year = {2001}, + publisher = {ACM New York, NY, USA} } @article{10.1145/3591472, -author = {Jia, Xiaodong and Kumar, Ashish and Tan, Gang}, -title = {A Derivative-Based Parser Generator for Visibly Pushdown Grammars}, -year = {2023}, -issue_date = {June 2023}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {45}, -number = {2}, -issn = {0164-0925}, -url = {https://doi.org/10.1145/3591472}, -doi = {10.1145/3591472}, -abstract = {In this article, we present a derivative-based, functional recognizer and parser generator for visibly pushdown grammars. The generated parser accepts ambiguous grammars and produces a parse forest containing all valid parse trees for an input string in linear time. Each parse tree in the forest can then be extracted also in linear time. Besides the parser generator, to allow more flexible forms of the visibly pushdown grammars, we also present a translator that converts a tagged CFG to a visibly pushdown grammar in a sound way, and the parse trees of the tagged CFG are further produced by running the semantic actions embedded in the parse trees of the translated visibly pushdown grammar. The performance of the parser is compared with popular parsing tools, including ANTLR, GNU Bison, and other popular hand-crafted parsers. The correctness and the time complexity of the core parsing algorithm are formally verified in the proof assistant Coq.}, -journal = {ACM Trans. Program. Lang. Syst.}, -month = {may}, -articleno = {9}, -numpages = {68}, -keywords = {Parser generators, derivative-based parsing, formal verification} + author = {Jia, Xiaodong and Kumar, Ashish and Tan, Gang}, + title = {A Derivative-Based Parser Generator for Visibly Pushdown Grammars}, + year = {2023}, + issue_date = {June 2023}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {45}, + number = {2}, + issn = {0164-0925}, + url = {https://doi.org/10.1145/3591472}, + doi = {10.1145/3591472}, + abstract = {In this article, we present a derivative-based, functional recognizer and parser generator for visibly pushdown grammars. The generated parser accepts ambiguous grammars and produces a parse forest containing all valid parse trees for an input string in linear time. Each parse tree in the forest can then be extracted also in linear time. Besides the parser generator, to allow more flexible forms of the visibly pushdown grammars, we also present a translator that converts a tagged CFG to a visibly pushdown grammar in a sound way, and the parse trees of the tagged CFG are further produced by running the semantic actions embedded in the parse trees of the translated visibly pushdown grammar. The performance of the parser is compared with popular parsing tools, including ANTLR, GNU Bison, and other popular hand-crafted parsers. The correctness and the time complexity of the core parsing algorithm are formally verified in the proof assistant Coq.}, + journal = {ACM Trans. Program. Lang. Syst.}, + month = {may}, + articleno = {9}, + numpages = {68}, + keywords = {Parser generators, derivative-based parsing, formal verification} } @inproceedings{10.1145/2983990.2984026, -author = {Brachth\"{a}user, Jonathan Immanuel and Rendel, Tillmann and Ostermann, Klaus}, -title = {Parsing with First-Class Derivatives}, -year = {2016}, -isbn = {9781450344449}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/2983990.2984026}, -doi = {10.1145/2983990.2984026}, -abstract = {Brzozowski derivatives, well known in the context of regular expressions, have recently been rediscovered to give a simplified explanation to parsers of context-free languages. We add derivatives as a novel first-class feature to a standard parser combinator language. First-class derivatives enable an inversion of the control flow, allowing to implement modular parsers for languages that previously required separate pre-processing steps or cross-cutting modifications of the parsers. We show that our framework offers new opportunities for reuse and supports a modular definition of interesting use cases of layout-sensitive parsing.}, -booktitle = {Proceedings of the 2016 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications}, -pages = {588–606}, -numpages = {19}, -keywords = {Left Quotient, Parser Combinators, Parsing, Derivative, Modularity}, -location = {Amsterdam, Netherlands}, -series = {OOPSLA 2016} + author = {Brachth\"{a}user, Jonathan Immanuel and Rendel, Tillmann and Ostermann, Klaus}, + title = {Parsing with First-Class Derivatives}, + year = {2016}, + isbn = {9781450344449}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/2983990.2984026}, + doi = {10.1145/2983990.2984026}, + abstract = {Brzozowski derivatives, well known in the context of regular expressions, have recently been rediscovered to give a simplified explanation to parsers of context-free languages. We add derivatives as a novel first-class feature to a standard parser combinator language. First-class derivatives enable an inversion of the control flow, allowing to implement modular parsers for languages that previously required separate pre-processing steps or cross-cutting modifications of the parsers. We show that our framework offers new opportunities for reuse and supports a modular definition of interesting use cases of layout-sensitive parsing.}, + booktitle = {Proceedings of the 2016 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications}, + pages = {588–606}, + numpages = {19}, + keywords = {Left Quotient, Parser Combinators, Parsing, Derivative, Modularity}, + location = {Amsterdam, Netherlands}, + series = {OOPSLA 2016} } @article{10.1145/3022671.2984026, -author = {Brachth\"{a}user, Jonathan Immanuel and Rendel, Tillmann and Ostermann, Klaus}, -title = {Parsing with First-Class Derivatives}, -year = {2016}, -issue_date = {October 2016}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {51}, -number = {10}, -issn = {0362-1340}, -url = {https://doi.org/10.1145/3022671.2984026}, -doi = {10.1145/3022671.2984026}, -abstract = {Brzozowski derivatives, well known in the context of regular expressions, have recently been rediscovered to give a simplified explanation to parsers of context-free languages. We add derivatives as a novel first-class feature to a standard parser combinator language. First-class derivatives enable an inversion of the control flow, allowing to implement modular parsers for languages that previously required separate pre-processing steps or cross-cutting modifications of the parsers. We show that our framework offers new opportunities for reuse and supports a modular definition of interesting use cases of layout-sensitive parsing.}, -journal = {SIGPLAN Not.}, -month = {oct}, -pages = {588–606}, -numpages = {19}, -keywords = {Left Quotient, Parsing, Modularity, Derivative, Parser Combinators} -} - -@article{caron_champarnaud_mignot_2014, title={A general framework for the derivation of regular expressions}, volume={48}, DOI={10.1051/ita/2014010}, number={3}, journal={RAIRO - Theoretical Informatics and Applications}, publisher={EDP Sciences}, author={Caron, Pascal and Champarnaud, Jean-Marc and Mignot, Ludovic}, year={2014}, pages={281–305}} + author = {Brachth\"{a}user, Jonathan Immanuel and Rendel, Tillmann and Ostermann, Klaus}, + title = {Parsing with First-Class Derivatives}, + year = {2016}, + issue_date = {October 2016}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {51}, + number = {10}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/3022671.2984026}, + doi = {10.1145/3022671.2984026}, + abstract = {Brzozowski derivatives, well known in the context of regular expressions, have recently been rediscovered to give a simplified explanation to parsers of context-free languages. We add derivatives as a novel first-class feature to a standard parser combinator language. First-class derivatives enable an inversion of the control flow, allowing to implement modular parsers for languages that previously required separate pre-processing steps or cross-cutting modifications of the parsers. We show that our framework offers new opportunities for reuse and supports a modular definition of interesting use cases of layout-sensitive parsing.}, + journal = {SIGPLAN Not.}, + month = {oct}, + pages = {588–606}, + numpages = {19}, + keywords = {Left Quotient, Parsing, Modularity, Derivative, Parser Combinators} +} + +@article{caron_champarnaud_mignot_2014, + title = {A general framework for the derivation of regular expressions}, + volume = {48}, + doi = {10.1051/ita/2014010}, + number = {3}, + journal = {RAIRO - Theoretical Informatics and Applications}, + publisher = {EDP Sciences}, + author = {Caron, Pascal and Champarnaud, Jean-Marc and Mignot, Ludovic}, + year = {2014}, + pages = {281–305} +} @article{10.1145/2034574.2034801, -author = {Might, Matthew and Darais, David and Spiewak, Daniel}, -title = {Parsing with Derivatives: A Functional Pearl}, -year = {2011}, -issue_date = {September 2011}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {46}, -number = {9}, -issn = {0362-1340}, -url = {https://doi.org/10.1145/2034574.2034801}, -doi = {10.1145/2034574.2034801}, -abstract = {We present a functional approach to parsing unrestricted context-free grammars based on Brzozowski's derivative of regular expressions. If we consider context-free grammars as recursive regular expressions, Brzozowski's equational theory extends without modification to context-free grammars (and it generalizes to parser combinators). The supporting actors in this story are three concepts familiar to functional programmers - laziness, memoization and fixed points; these allow Brzozowski's original equations to be transliterated into purely functional code in about 30 lines spread over three functions.Yet, this almost impossibly brief implementation has a drawback: its performance is sour - in both theory and practice. The culprit? Each derivative can double the size of a grammar, and with it, the cost of the next derivative.Fortunately, much of the new structure inflicted by the derivative is either dead on arrival, or it dies after the very next derivative. To eliminate it, we once again exploit laziness and memoization to transliterate an equational theory that prunes such debris into working code. Thanks to this compaction, parsing times become reasonable in practice.We equip the functional programmer with two equational theories that, when combined, make for an abbreviated understanding and implementation of a system for parsing context-free languages.}, -journal = {SIGPLAN Not.}, -month = {sep}, -pages = {189–195}, -numpages = {7}, -keywords = {derivative, context-free grammar, regular expressions, parsing, parser combinator, formal languages} + author = {Might, Matthew and Darais, David and Spiewak, Daniel}, + title = {Parsing with Derivatives: A Functional Pearl}, + year = {2011}, + issue_date = {September 2011}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {46}, + number = {9}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/2034574.2034801}, + doi = {10.1145/2034574.2034801}, + abstract = {We present a functional approach to parsing unrestricted context-free grammars based on Brzozowski's derivative of regular expressions. If we consider context-free grammars as recursive regular expressions, Brzozowski's equational theory extends without modification to context-free grammars (and it generalizes to parser combinators). The supporting actors in this story are three concepts familiar to functional programmers - laziness, memoization and fixed points; these allow Brzozowski's original equations to be transliterated into purely functional code in about 30 lines spread over three functions.Yet, this almost impossibly brief implementation has a drawback: its performance is sour - in both theory and practice. The culprit? Each derivative can double the size of a grammar, and with it, the cost of the next derivative.Fortunately, much of the new structure inflicted by the derivative is either dead on arrival, or it dies after the very next derivative. To eliminate it, we once again exploit laziness and memoization to transliterate an equational theory that prunes such debris into working code. Thanks to this compaction, parsing times become reasonable in practice.We equip the functional programmer with two equational theories that, when combined, make for an abbreviated understanding and implementation of a system for parsing context-free languages.}, + journal = {SIGPLAN Not.}, + month = {sep}, + pages = {189–195}, + numpages = {7}, + keywords = {derivative, context-free grammar, regular expressions, parsing, parser combinator, formal languages} } @inproceedings{10.1145/2034773.2034801, -author = {Might, Matthew and Darais, David and Spiewak, Daniel}, -title = {Parsing with Derivatives: A Functional Pearl}, -year = {2011}, -isbn = {9781450308656}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/2034773.2034801}, -doi = {10.1145/2034773.2034801}, -abstract = {We present a functional approach to parsing unrestricted context-free grammars based on Brzozowski's derivative of regular expressions. If we consider context-free grammars as recursive regular expressions, Brzozowski's equational theory extends without modification to context-free grammars (and it generalizes to parser combinators). The supporting actors in this story are three concepts familiar to functional programmers - laziness, memoization and fixed points; these allow Brzozowski's original equations to be transliterated into purely functional code in about 30 lines spread over three functions.Yet, this almost impossibly brief implementation has a drawback: its performance is sour - in both theory and practice. The culprit? Each derivative can double the size of a grammar, and with it, the cost of the next derivative.Fortunately, much of the new structure inflicted by the derivative is either dead on arrival, or it dies after the very next derivative. To eliminate it, we once again exploit laziness and memoization to transliterate an equational theory that prunes such debris into working code. Thanks to this compaction, parsing times become reasonable in practice.We equip the functional programmer with two equational theories that, when combined, make for an abbreviated understanding and implementation of a system for parsing context-free languages.}, -booktitle = {Proceedings of the 16th ACM SIGPLAN International Conference on Functional Programming}, -pages = {189–195}, -numpages = {7}, -keywords = {regular expressions, context-free grammar, parser combinator, formal languages, derivative, parsing}, -location = {Tokyo, Japan}, -series = {ICFP '11} + author = {Might, Matthew and Darais, David and Spiewak, Daniel}, + title = {Parsing with Derivatives: A Functional Pearl}, + year = {2011}, + isbn = {9781450308656}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/2034773.2034801}, + doi = {10.1145/2034773.2034801}, + abstract = {We present a functional approach to parsing unrestricted context-free grammars based on Brzozowski's derivative of regular expressions. If we consider context-free grammars as recursive regular expressions, Brzozowski's equational theory extends without modification to context-free grammars (and it generalizes to parser combinators). The supporting actors in this story are three concepts familiar to functional programmers - laziness, memoization and fixed points; these allow Brzozowski's original equations to be transliterated into purely functional code in about 30 lines spread over three functions.Yet, this almost impossibly brief implementation has a drawback: its performance is sour - in both theory and practice. The culprit? Each derivative can double the size of a grammar, and with it, the cost of the next derivative.Fortunately, much of the new structure inflicted by the derivative is either dead on arrival, or it dies after the very next derivative. To eliminate it, we once again exploit laziness and memoization to transliterate an equational theory that prunes such debris into working code. Thanks to this compaction, parsing times become reasonable in practice.We equip the functional programmer with two equational theories that, when combined, make for an abbreviated understanding and implementation of a system for parsing context-free languages.}, + booktitle = {Proceedings of the 16th ACM SIGPLAN International Conference on Functional Programming}, + pages = {189–195}, + numpages = {7}, + keywords = {regular expressions, context-free grammar, parser combinator, formal languages, derivative, parsing}, + location = {Tokyo, Japan}, + series = {ICFP '11} } @article{10.1017/S0956796808007090, -author = {Owens, Scott and Reppy, John and Turon, Aaron}, -title = {Regular-Expression Derivatives Re-Examined}, -year = {2009}, -issue_date = {March 2009}, -publisher = {Cambridge University Press}, -address = {USA}, -volume = {19}, -number = {2}, -issn = {0956-7968}, -url = {https://doi.org/10.1017/S0956796808007090}, -doi = {10.1017/S0956796808007090}, -abstract = {Regular-expression derivatives are an old, but elegant, technique for compiling regular expressions to deterministic finite-state machines. It easily supports extending the regular-expression operators with boolean operations, such as intersection and complement. Unfortunately, this technique has been lost in the sands of time and few computer scientists are aware of it. In this paper, we reexamine regular-expression derivatives and report on our experiences in the context of two different functional-language implementations. The basic implementation is simple and we show how to extend it to handle large character sets (e.g., Unicode). We also show that the derivatives approach leads to smaller state machines than the traditional algorithm given by McNaughton and Yamada.}, -journal = {J. Funct. Program.}, -month = {mar}, -pages = {173–190}, -numpages = {18} + author = {Owens, Scott and Reppy, John and Turon, Aaron}, + title = {Regular-Expression Derivatives Re-Examined}, + year = {2009}, + issue_date = {March 2009}, + publisher = {Cambridge University Press}, + address = {USA}, + volume = {19}, + number = {2}, + issn = {0956-7968}, + url = {https://doi.org/10.1017/S0956796808007090}, + doi = {10.1017/S0956796808007090}, + abstract = {Regular-expression derivatives are an old, but elegant, technique for compiling regular expressions to deterministic finite-state machines. It easily supports extending the regular-expression operators with boolean operations, such as intersection and complement. Unfortunately, this technique has been lost in the sands of time and few computer scientists are aware of it. In this paper, we reexamine regular-expression derivatives and report on our experiences in the context of two different functional-language implementations. The basic implementation is simple and we show how to extend it to handle large character sets (e.g., Unicode). We also show that the derivatives approach leads to smaller state machines than the traditional algorithm given by McNaughton and Yamada.}, + journal = {J. Funct. Program.}, + month = {mar}, + pages = {173–190}, + numpages = {18} } @inproceedings{10.1145/2949689.2949711, -author = {Nol\'{e}, Maurizio and Sartiani, Carlo}, -title = {Regular Path Queries on Massive Graphs}, -year = {2016}, -isbn = {9781450342155}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -url = {https://doi.org/10.1145/2949689.2949711}, -doi = {10.1145/2949689.2949711}, -abstract = {Regular Path Queries (RPQs) represent a powerful tool for querying graph databases and are of particular interest, because they form the building blocks of other query languages, and because they can be used in many theoretical or practical contexts for different purposes.In this paper we present a novel system for processing regular path queries on massive data graphs. As confirmed by an extensive experimental evaluation, our system scales linearly with the number of vertices and/or edges, and it can efficiently query graphs up to a billion vertices and 100 billion edges.}, -booktitle = {Proceedings of the 28th International Conference on Scientific and Statistical Database Management}, -articleno = {13}, -numpages = {12}, -location = {Budapest, Hungary}, -series = {SSDBM '16} + author = {Nol\'{e}, Maurizio and Sartiani, Carlo}, + title = {Regular Path Queries on Massive Graphs}, + year = {2016}, + isbn = {9781450342155}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/2949689.2949711}, + doi = {10.1145/2949689.2949711}, + abstract = {Regular Path Queries (RPQs) represent a powerful tool for querying graph databases and are of particular interest, because they form the building blocks of other query languages, and because they can be used in many theoretical or practical contexts for different purposes.In this paper we present a novel system for processing regular path queries on massive data graphs. As confirmed by an extensive experimental evaluation, our system scales linearly with the number of vertices and/or edges, and it can efficiently query graphs up to a billion vertices and 100 billion edges.}, + booktitle = {Proceedings of the 28th International Conference on Scientific and Statistical Database Management}, + articleno = {13}, + numpages = {12}, + location = {Budapest, Hungary}, + series = {SSDBM '16} } @article{chomsky1958finite, - title={Finite state languages}, - author={Chomsky, Noam and Miller, George A}, - journal={Information and control}, - volume={1}, - number={2}, - pages={91--112}, - year={1958}, - publisher={Elsevier} -} \ No newline at end of file + title = {Finite state languages}, + author = {Chomsky, Noam and Miller, George A}, + journal = {Information and control}, + volume = {1}, + number = {2}, + pages = {91--112}, + year = {1958}, + publisher = {Elsevier} +} diff --git a/tex/FormalLanguageConstrainedReachabilityLectureNotes.tex b/tex/FormalLanguageConstrainedReachabilityLectureNotes.tex index b4e36b7..e445460 100644 --- a/tex/FormalLanguageConstrainedReachabilityLectureNotes.tex +++ b/tex/FormalLanguageConstrainedReachabilityLectureNotes.tex @@ -1,204 +1,70 @@ -%\documentclass[a4paper,12pt]{article} % standard LaTeX, 12 point type -\documentclass[12pt, a4paper, table]{book} - -\usepackage{algpseudocode} -\usepackage{algorithm} -\usepackage{algorithmicx} - -\usepackage{geometry} -\usepackage{amsfonts,latexsym} -\usepackage{amsthm, amsmath} -\usepackage{amssymb} -\usepackage[utf8]{inputenc} % Кодировка -\usepackage[english,russian]{babel} % Многоязычность -\usepackage{mathtools} -\usepackage{hyperref} -\usepackage[dvipsnames]{xcolor} -\usepackage{tikz} -\usepackage{dsfont} -\usepackage{multicol} -\usepackage[bb=boondox]{mathalfa} -\usepackage{subcaption} -\usepackage{fontawesome} - -\usetikzlibrary{fit,calc,automata,positioning} -\usetikzlibrary{shapes.geometric} -\usetikzlibrary{decorations.pathmorphing} - -\theoremstyle{definition} -\newtheorem{definition}{Определение}[section] -\newtheorem{example}{Пример}[section] -\newtheorem{theorem}{Теорема}[section] -\newtheorem{proposition}[theorem]{Proposition} -\newtheorem{lemma}[theorem]{Лемма} -\newtheorem{corollary}[theorem]{Corollary} -\newtheorem{conjecture}[theorem]{Conjecture} -\newtheorem{note}[theorem]{Утверждение} - - -% unnumbered environments: - -\theoremstyle{remark} -\newtheorem*{remark}{Remark} -%\newtheorem*{notation}{Notation} - -\setlength{\parskip}{5pt plus 2pt minus 1pt} -%\setlength{\parindent}{0pt} - -\tikzset{snake it/.style={decorate, decoration=snake}} -\tikzset{ - side by side/.style 2 args={ - line width=2pt, - #1, - postaction={ - clip,postaction={draw,#2} - } - } -} - -\algtext*{EndWhile}% Remove "end while" text -\algtext*{EndIf}% Remove "end if" text -\algtext*{EndFor}% Remove "end for" text -\algtext*{EndFunction}% Remove "end function" text - - -% \usepackage{color} -\usepackage{listings} -\usepackage{caption} -\usepackage{graphicx} -\usepackage{ucs} - -% \graphicspath{{pics/}} - -%\geometry{left=2cm} -%\geometry{right=1.5cm} -%\geometry{top=2cm} -%\geometry{bottom=2cm} - - - - -%\lstnewenvironment{algorithm}[1][] -%{ -% \lstset{ -% frame=tB, -% numbers=left, -% mathescape=true, -% numberstyle=\small, -% basicstyle=\small, -% inputencoding=utf8, -% extendedchars=\true, -% keywordstyle=\color{black}\bfseries, -% keywords={,function, procedure, return, datatype, function, in, if, else, for, foreach, while, denote, do, and, then, assert,} -% numbers=left, -% xleftmargin=.04\textwidth, -% #1 % this is to add specific settings to an usage of this environment (for instnce, the caption and referable label) -% } -%} -%{} - -\newcommand{\tab}[1][0.3cm]{\ensuremath{\hspace*{#1}}} - -\newcommand{\rvline}{\hspace*{-\arraycolsep}\vline\hspace*{-\arraycolsep}} - -\newcommand{\derives}[1][*]{\xRightarrow[]{#1}} -\newcommand{\first}[1][1]{\textsc{first}_{#1}} -\newcommand{\follow}[1][1]{\textsc{follow}_{#1}} - -\newcommand{\highlight}[2][yellow]{\mathchoice% - {\colorbox{#1}{$\displaystyle#2$}}% - {\colorbox{#1}{$\textstyle#2$}}% - {\colorbox{#1}{$\scriptstyle#2$}}% - {\colorbox{#1}{$\scriptscriptstyle#2$}}}% - -\setcounter{MaxMatrixCols}{20} - - -\tikzset{ -%->, % makes the edges directed -%>=stealth’, % makes the arrow heads bold -node distance=4cm, % specifies the minimum distance between two nodes. Change if necessary. -%every state/.style={thick, fill=gray!10}, % sets the properties for each ’state’ node -initial text=$ $, % sets the text that appears on the start arrow -} - -\tikzstyle{symbol_node} = [shape=rectangle, rounded corners, draw, align=center] - -\tikzstyle{r_state} = [shape=rectangle, draw, minimum size=0.2cm] - -\tikzstyle{num_state} = [draw=none, fill=none, anchor=south west, red] - -\tikzstyle{prod_node} = [shape=rectangle, draw, align=center] - -\tikzset{ - between/.style args={#1 and #2}{ - at = ($(#1)!0.5!(#2)$) - }, - >= stealth, - every state/.style={minimum size=1pt} -} - -%every node/.style = {shape=rectangle, rounded corners, -% draw, align=center, -% top color=white, bottom color=blue!20} - -\newcommand{\bfgray}[1]{\cellcolor{lightgray}\textbf{#1}} - -\newenvironment{scaledalign}[4] - { - \begingroup - #1 - \setlength\arraycolsep{#2} - \renewcommand{\arraystretch}{#3} - \begin{center} - \begin{equation} - \begin{aligned} - #4 - } - { - \end{aligned} - \end{equation} - \end{center} - \endgroup - } - -\title{О достижимости с ограничениями в терминах формальных языков} -\author{Семён Григорьев} -\date{\today} - -\begin{document} -\maketitle -\newpage -\tableofcontents -\newpage - - -\input{List_of_contributors} -\input{Introduction} -\input{LinearAlgebra} -\input{GraphTheoryIntro} -\input{FormalLanguageTheoryIntro} -\input{RegularLanguages} -\input{Context-Free_Languages} -\input{Multiple_Context-Free_Languages} -%\input{ConjunctiveAndBooleanLanguages} -\input{FLPQ} -\input{RPQ} -%\input{CFPQ} -\input{CYK_for_CFPQ} -\input{Matrix-based_CFPQ} -\input{TensorProduct} -\input{SPPF} -\input{GLL-based_CFPQ} -\input{GLR-based_CFPQ} -%\input{CombinatorsForCFPQ} -\input{Multiple_Context-Free_Language_Reachability} -%\input{DerivativesForCFPQ} -%\input{CFPQ_to_Datalog} -\input{Conclusion} - -\bibliographystyle{abbrv} -\bibliography{FormalLanguageConstrainedReachabilityLectureNotes} - - -\end{document} +\documentclass[ + fontsize=10pt, + a4paper, + twoside=false, + parskip=false, +]{kaobook} + +\input{styles/language.tex} +\input{styles/utils.tex} +\input{styles/tikz.tex} +\input{styles/math.tex} +\input{styles/theorems.tex} + +\usepackage{kaobiblio} % Обертка для biblatex, позволяет печатать сноску сбоку +\addbibresource{FormalLanguageConstrainedReachabilityLectureNotes.bib} + +\usepackage[]{pseudo} +\newtcbtheorem{algorithm}{Листинг}{pseudo/booktabs, float, floatplacement=h, separator sign={.}}{algo} + +\pghyphenation[]{russian}{% +тео-ре-ти-ко-мно-жест-вен-ных +} + +\tikzexternalize + +\title{О достижимости с ограничениями в терминах формальных языков} +\author{Семён Григорьев} +\date{\gitVer{}} + +\begin{document} + +\frontmatter + +\maketitle +\tableofcontents + +\input{List_of_contributors} + +\mainmatter +\setchapterstyle{kao} + +\input{Introduction} +\input{LinearAlgebra} +\input{GraphTheoryIntro} +\input{FormalLanguageTheoryIntro} +\input{RegularLanguages} +\input{Context-Free_Languages} +% \input{Multiple_Context-Free_Languages} % FIXME: Переписать главу +% %\input{ConjunctiveAndBooleanLanguages} +\input{FLPQ} +% \input{RPQ} +% %\input{CFPQ} +% \input{CYK_for_CFPQ} +% \input{Matrix-based_CFPQ} +% \input{TensorProduct} +% \input{SPPF} +% \input{GLL-based_CFPQ} +% \input{GLR-based_CFPQ} +% %\input{CombinatorsForCFPQ} +% \input{Multiple_Context-Free_Language_Reachability} % FIXME: Исправить главу +% %\input{DerivativesForCFPQ} +% %\input{CFPQ_to_Datalog} +% \input{Conclusion} + +\backmatter +\setchapterstyle{plain} + +\printbibliography + +\end{document} diff --git a/tex/FormalLanguageTheoryIntro.tex b/tex/FormalLanguageTheoryIntro.tex index 01fd1a9..d220298 100644 --- a/tex/FormalLanguageTheoryIntro.tex +++ b/tex/FormalLanguageTheoryIntro.tex @@ -1,297 +1,310 @@ -\chapter[Общие сведения теории формальных языков]{Общие сведения теории формальных языков\footnote{В рамках данной работы мы будем говорить о ``типичных'' языках, элементами которых являются объекты, максимально похожие на строки. При этом будет оставлен за бортом тот факт, что базовое определение позволяет нам рассматривать в качестве ``строительных элементов'' (алфавита) практически произвольные объекты, а значит, создавать весьма нетривиальные конструкции в качестве слов языка. Примерами ``нестроковых'' языков могут послужить языки деревьев~\cite{tata2007} или языки графов~\cite{EHRIG1992557, Courcelle2009}.}}\label{chpt:FormalLanguageTheoryIntro} - -В данной главе мы рассмотрим основные понятия из теории формальных языков, которые пригодятся нам в дальнейшем изложении. -Заметим, что мы рассмотрим лишь те результаты теории формальных языков,которые будут необходимы нам для дальнейшего изложения. -Для более глубокого изучения именно теории формальных языков рекомендуется обратиться к классической литературе. -Например, к работам Харрисона~\cite{10.5555/578595}, Хопкрофта~\cite{hopcroft2001introduction} или другой подобной литературе. - -\begin{definition} -\textit{Алфавит} --- это конечное множество. -Элементы этого множества будем называть \textit{символами}. -\end{definition} - -\begin{example} - Примеры алфавитов - - \begin{itemize} - \item Латинский алфавит $\Sigma = \{ a, b, c, \dots, z\}$ - \item Кириллический алфавит $\Sigma = \{ \text{а, б, в, \dots, я}\}$ - \item Алфавит натуральных чисел в шестнадцатеричной записи - $$\Sigma = \{0, 1, 2, 3, 4, 5, 6, 7 ,8,9, A, B, C, D, E, F \}$$ - \end{itemize} -\end{example} - -Традиционное обозначение для алфавита --- $\Sigma$. -Также мы будем использовать различные прописные буквы латинского алфавита. Для обозначения символов алфавита будем использовать строчные буквы латинского алфавита: $a, b, \dots, x, y, z$. - -Будем считать, что над алфавитом $\Sigma$ всегда определена операция конкатенации $(\cdot): \Sigma^* \times \Sigma^* \to \Sigma^*$. -При записи выражений символ точки (обозначение операции конкатенации) часто будем опускать: $a \cdot b = ab$. - -\begin{definition} -\textit{Слово} над алфавитом $\Sigma$ --- это конечная конкатенация символов алфавита $\Sigma$: $\omega = a_0 \cdot a_1 \cdot \ldots \cdot a_m$, где $\omega$ --- слово, а $a_i \in \Sigma$ для любого $i$. -Для обозначения пустого слова (слова, содержащего ноль символов) будем использовать специальный символ $\varepsilon, \varepsilon \notin \Sigma$. -\end{definition} - -\begin{definition} -Пусть $\omega = a_0 \cdot a_1 \cdot \ldots \cdot a_m$ --- слово над алфавитом $\Sigma$. -Будем называть $m + 1$ \textit{длиной слова} и обозначать как $|\omega|$. Длина пустого слова равна нулю. -\end{definition} - -\begin{definition} - Пусть $\omega$ --- слово над алфавитом $\Sigma$. Пусть $t \in \Sigma$ --- некоторый символ из алфавита. - Тогда будем обозначать количество вхождений символа $t$ в слове $\omega$ как $|\omega|_t$. - \end{definition} - -\begin{definition} -\textit{Язык} над алфавитом $\Sigma$ --- это множество слов над алфавитом $\Sigma$. -\end{definition} - -\begin{example} - -Примеры языков. - - \begin{itemize} - \item Язык целых чисел в двоичной записи $\{0, 1, -1, 10, 11, -10, -11, \dots\}.$ - \item Язык всех правильных скобочных последовательностей $$\{(), (()), ()(), (())(), \dots\}.$$ - \end{itemize} -\end{example} - -Любой язык над алфавитом $\Sigma$ является подмножеством универсального множества $\Sigma^*$ --- множества всех слов над алфавитом $\Sigma$. - -Заметим, что язык не обязан быть конечным множеством, в то время как алфавит в нашей области всегда конечен\footnote{Существуют ситуации, когда возникают бесконечные алфавиты.} и изучаем мы конечные слова\footnote{Существуют ситуации, когда возникают бесконечные слова. Например работы по обработке потоков.}. - -Можно выделить следующие основные \textit{способы задания языков.} -\begin{itemize} -\item Перечислить все элементы. Такой способ работает только для конечных языков. Перечислить бесконечное множество за конечное время не получится. -\item Задать генератор --- процедуру, которая возвращает очередное слово языка. -\item Задать распознаватель --- процедуру, которая по данному слову может определить, принадлежит оно заданному языку или нет. -\end{itemize} - -Стоит отметить, что существуют и другие способы задания. -Например, язык может определяться как решение некоторого \textit{языкового уравнения}~\cite{Leiss1999}. - -\section{Теоретико-множественные операции над языками} - -Так как язык --- это \textit{множество} слов, то над языками естественным образом определены теоретико-множественные операции, такие как объединение, пересечение, дополнение. -\begin{itemize} - \item $L_1 \cup L_2 = \{ \omega \mid \omega \in L_1 \text{ или } \omega \in L_2\}$ - \item $L_1 \cap L_2 = \{ \omega \mid \omega \in L_1 \text{ и } \omega \in L_2\}$ - \item $\overline{L} = \{ \omega \mid \omega \in \Sigma^* \text{ и } \omega \notin L\}$, где $L$ --- язык над алфавитом $\Sigma$ . -\end{itemize} - -Но кроме этого, нам потребуются и относительно специальные операции, определённые ниже. - -\begin{definition} -Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, $S_2 \subseteq S$, тогда -$$ -S_1 \odot S_2 = \{ s_1 \odot s_2 \mid s_1 \in S_1, s_2 \in S_2\} -$$ -\end{definition} - -\begin{definition} -Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, тогда -$$ -S_1 ^ n = \{ \underbrace{s_1 \odot s_1 \odot \ldots \odot s_1}_{\text{n раз}} \mid s_1 \in S_1\} -$$ -При этом $S_1^0 = \{\varepsilon\}$\footnote{В данном случае нулевая степень даёт единицу, как мы и привыкли.}. -\end{definition} - -\begin{definition} -Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, тогда -$$ -S_1 ^ * = \bigcup_{n = 0}^{\infty} S_1^n -$$ -\end{definition} - -Многие прикладные задачи, в которых возникают языки, достаточно естественным образом формулируются в теоретико-множественных терминах. -Так, задача распознавания --- это задача проверки принадлежности элемента множеству. -Далее мы рассмотрим прикладные задачи, решение которых требует, например, проверки включения одного языка в другой, или проверки непустоты пересечения двух языков. -Разрешимость таких задач, алгоритмы решения, их сложность и другие свойства, зависят от свойств языков. -Это даёт дополнительную связь теоретико-языковых конструкций с решением прикладных задач, позволяя более аккуратно рассуждать о свойствах получаемых решений. - -\section{Производные} - -Производные для языков предложил Януш Бжозовский в работе\cite{10.1145/321239.321249}. - -\begin{definition} - Производная $\partial_c L = \{ w' \mid w \in L, w = cw'\}$ -\end{definition} - -Заметим, что если для слова $w, |w|=n$ верно, что $$\varepsilon \in (\partial_{w[n-1]} \circ \ldots \circ \partial_{w[1]} \circ \partial_{w[0]}) (L)$$, то $w \in L$. -Таким образом, существует возможность использовать производные для проверки принадлежность слов заданному языку. -Данная возможность активно используется для регулярных языков~\cite{caron_champarnaud_mignot_2014}, языков, распознаваемых автоматами, управляемыми входом (Input Driven Pushdown Automata, IDPDA)~\cite{10.1145/3591472}, и контекстно-свободных языков~\cite{10.1145/2034773.2034801, 10.1145/3022671.2984026}. -Кроме этого, с помощью производных можно построить элегантный алгоритм построения конечного автомата по регулярному выражению~\cite{10.1017/S0956796808007090} и для выполнения регулярных запросов~\cite{10.1145/2949689.2949711}. - - -\section{Распознаватели} - -Распознаватель может быть сконструирован как некоторая формальная машина, которая принимает или отвергает те или иные слова, записанные на входной ленте. -Таким образом, язык задаваемый некоторым вычислителем --- это множество принимаемых им слов. -Далее становится возможно классифицировать языки по тому, какого класса распознаватель необходим и достаточен, чтобы их задать. -Например, можно выделить класс языков, задаваемых конечными автоматами. -На этом, в частности, построена \textit{иерархия Хомского}. - - - - - -\section{Генераторы} - -Один из базовых способов задать генератор языка опирается на \textit{системы переписывания строк}, из которых, в дальнейшем, можно получить так называемые \textit{порождающие грамматики}. - -\begin{definition} - \textit{Система переписывания (строк)}\footnote{Один из классически примеров систем переписывания строк --- это машины Маркова, или алгорифмы Маркова~\cite{markov1954theory}.} --- это пара $R = \langle \Sigma, P \rangle$, где $\Sigma$ --- алфавит, $P= \{p \mid p = w' \to w'', w' \in \Sigma^+, w'' \in \Sigma^*\}$ --- набор правил переписывания. -\end{definition} - -Один шаг работы системы состоит из замены любого вхождения любой из левых частей правил на соответствующую правую часть правила. -Иными словами, пусть есть слово $w = w_0w_1w_2$ и имеется правило $w_1 \to w_3 \in P$. -Тогда после переписывания по этому правилу будет получено слово $w' = w_0w_3w_2$. -Заметим, что выбор заменяемого вхождения, как и выбор применяемого правила недетерминирован: может быть выбрано любое из вхождений и применено любое из доступных правил. -В качестве критерия остановки выберем невозможность применить ни одно из доступных правил. -Получившееся при этом слово будем считать результатом работы машины. -Зафиксировав стартовую строку и набор правил, можно достаточно естественным образом получить язык, как множество всех слов, являющихся результатом работы машины. - -Представленная система является, скорее, неформальной базой для создания более содержательных систем. -Далее, накладывая дополнительные ограничения на правила машины и алгоритм её работы, мы будем получать некоторые содержательные классы языков. - -Отметим, что подход к определению языков через системы переписывания не всегда удобен. Например, не получается с их использованием естественным образом определить булевы языки. - - -\section{Классы языков} - -Иерархия языков, предложенная Ноамом Хомским (Noam Chomsky), является на текущий момент классической и представлена на рисунке~\ref{fig:Chomsky}. -Она основана на сопоставлении языкам тех или иных формальных вычислителей, способных их распознать. -Например, для распознавания любого регулярного языка достаточно конечного автомата. Для контекстно-свободного --- магазинного автомата. И так далее. - - -\begin{figure} - \begin{center} - \includegraphics[width=0.9\textwidth]{figures/Chomsky.pdf} - \end{center} - \caption{Иерархия языков по Хомскому} - \label{fig:Chomsky} -\end{figure} - -Однако, данная иерархия постепенно теряет свою актуальность, так как появляются новые классы языков, свойства которых уже не удаётся адекватным образом отобразить, используя её. - -Один из вариантов иерархии языков, более полно отображающий современное состояние дел, предложен Александром Охотиным\footnote{Иерархия и некоторые отражаемые ей свойства подробно обсуждаются в презентации Александра Охотина ``Underlying principles -and recurring ideas of formal grammars'' (\url{https://users.math-cs.spbu.ru/~okhotin/talks/grammars_lata_talk.pdf}). -Также, с данной презентацией рекомендуется ознакомиться чтобы представить себе состояние области в целом.}. -Вариация предложенной Александром Охотиным иерархии представлена на изображении~\ref{fig:hierarchyOkhotin}~\footnote{Данная вариация скомпонована из версии, представленной в презентации ``Underlying principles -and recurring ideas of formal grammars'' и версии, взятой из работы~\cite{MRYKHIN2023113829}.}. -Приведённая диаграмма содержит регулярные и контекстно-свободные. -Так и подклассы, лежащие между ними. -Вместе с этим, классы, лежащие выше контекстно-свободных: многокомпонентные контекстно-свободные, булевы, конъюнктивные, их подклассы. - -\begin{figure} - \begin{center} - \begin{tikzpicture}[node distance=1.0cm,bend angle=45,auto] - \tikzstyle{lang}=[circle,thick,draw=blue!75,fill=blue!75,minimum size=1mm] - \node [lang] (reg) [label=below:\textit{Reg}] {}; - \node [right of = reg] (reg_dummy) {}; - \node [lang] (lllin) [right of=reg_dummy, label=below:\textit{LLLin}] {}; - \node [right of = lllin] (lllin_dummy) {}; - \node [lang] (lrlin) [right of=lllin_dummy, label=below:\textit{LRLin}] {}; - \node [right of = lrlin] (lrlin_dummy) {}; - \node [lang] (unamblin) [right of=lrlin_dummy, label=below:\textit{UnambLin}] {}; - \node [right of = unamblin] (unamblin_dummy) {}; - \node [lang] (lin) [right of=unamblin_dummy, label=below:\textit{Lin}] {}; - \node [right of = lin] (lin_dummy) {}; - \node [right of = lin_dummy] (lin_dummy_2) {}; - \node [right of = lin_dummy_2] (lin_dummy_3) {}; - \node [lang] (conj) [right of=lin_dummy_3, label=below:\textit{Conj}] {}; - \node [right of = conj] (conj_dummy) {}; - \node [lang] (bool) [right of=conj_dummy, label=right:\textit{Bool}] {}; - - \node [above of = lrlin] (lrlin_up_dummy) {}; - \node [lang] (ll) [above of=lrlin_up_dummy, label=above:\textit{LL}] {}; - \node [right of = ll] (ll_dummy) {}; - \node [lang] (lr) [right of=ll_dummy, label=above:\textit{LR}] {}; - \node [right of = lr] (lr_dummy) {}; - \node [lang] (unamb) [right of=lr_dummy, label=above:\textit{Unamb}] {}; - \node [right of = unamb] (unamb_dummy) {}; - \node [lang] (ordinary) [right of=unamb_dummy, label=right:\textit{Ordinary}] {}; - - \node [lang] (conjleftcontext) [above of=conj_dummy, label=right:\textit{Conj$+\lhd$}] {}; - - \node [below of = lrlin] (lrlin_down_dummy) {}; - \node [lang] (vpda) [below of=lrlin_down_dummy, label=below:\textit{VPDA}] {}; - \node [below of = lin] (lin_down_dummy_1) {}; - \node [below of = lin_down_dummy_1] (lin_down_dummy_2) {}; - \node [right of = lin_down_dummy_2] (lin_right_dummy_1) {}; - \node [lang] (linconj) [right of=lin_right_dummy_1, label=below:\textit{LinConj}] {}; - - \node [lang] (unambtag) [above of=unamb_dummy, label=above:\textit{UnambTAG}] {}; - \node [right of = unambtag] (unambtag_dummy) {}; - \node [lang] (tag) [right of=unambtag_dummy, label=above:\textit{TAG}] {}; - \node [right of = tag] (tag_dummy) {}; - \node [lang] (mcfl) [right of=tag_dummy, label=above:\textit{MCFL}] {}; - - \node [above of = linconj] (linconj_above_dummy) {}; - \node [lang] (unambconj) [right of=linconj_above_dummy, label=below:\textit{UnambConj}] {}; - \node [right of = unambconj] (unambconj_dummy) {}; - \node [lang] (unambbool) [right of=unambconj_dummy, label=right:\textit{UnambBool}] {}; - - \node [below of = linconj] (linconj_below_dummy) {}; - \node [lang] (rtca) [right of=linconj_below_dummy, label=below:\textit{RT-CA}] {}; - \node [right of = rtca] (rtca_dummy) {}; - \node [lang] (ltca) [right of=rtca_dummy, label=right:\textit{LT-CA}] {}; - - \path[->] - (reg) edge node {} (lllin) - (lllin) edge node {} (lrlin) - (lrlin) edge node {} (unamblin) - (unamblin) edge node {} (lin) - - (lllin) edge node {} (ll) - (ll) edge node {} (lr) - (ll) edge node {} (lr) - (lr) edge node {} (unamb) - (unamb) edge node {} (ordinary) - - (lrlin) edge node {} (lr) - (unamblin) edge node {} (unamb) - (lin) edge node {} (ordinary) - - (reg) edge node {} (vpda) - (vpda) edge node {} (lr) - (vpda) edge node {} (linconj) - - (ordinary) edge node {} (conj) - (conj) edge node {} (bool) - (conj) edge node {} (conjleftcontext) - - (unamb) edge node {} (unambtag) - (ordinary) edge node {} (tag) - (unambtag) edge node {} (tag) - (tag) edge node {} (mcfl) - - (lin) edge node {} (linconj) - (linconj) edge node {} (unambconj) - (unambconj) edge node {} (unambbool) - (unambconj) edge node {} (conj) - (unambbool) edge node {} (bool) - (unamb) edge node {} (unambconj) - - (linconj) edge node {} (rtca) - (rtca) edge node {} (ltca) - ; - \end{tikzpicture} -\end{center} -\caption{Иерархия. \textit{Reg} --- регулярные, \textit{LLLin}, \textit{LRLin}, \textit{UnambLin}, \textit{Lin}, \textit{LL}, \textit{LR}, \textit{Unamb} --- однозначные, \textit{Ordinary} --- обыкновенные (контекстно-свободные) -\textit{Conj} --- конъюнктивные, \textit{Boolean} --- булевы, \textit{UnamnbBool}, \textit{UnambConj}, \textit{VPDA}, \textit{LinConj}, \textit{UnambTAG}, \textit{TAG}, \textit{MCFL},} -\label{fig:hierarchyOkhotin} -\end{figure} - -Для того, чтобы содержательно рассуждать про различные классы языков, необходимо иметь механизм, позволяющий чётко отделить один класс от другого. -\textit{Лемма о накачке} для соответствующего класса --- один из классических таких механизмов. -Однако, не для всех классов языков соответствующие результаты получены. -Так, например, формулировка леммы о накачки для многокомпонентных контекстно-свободных языков в общем виде всё ещё не найдена, хотя существуют формулировки для отдельных подклассов. -Аналогично, для булевых и конъюнктивных языков всё ещё не предложены аналоги лемм о накачке. - - -%\section{Вопросы и задачи} -%\begin{enumerate} -% \item !!! -% \item !!! -%\end{enumerate} +\setchapterpreamble[u]{\margintoc} +\chapter{Общие сведения теории формальных языков} +\label{chpt:FormalLanguageTheoryIntro} +\tikzsetfigurename{FormalLanguageTheoryIntro_} + +В данной главе мы рассмотрим основные понятия из теории формальных языков, которые пригодятся нам в дальнейшем изложении. +Заметим, что мы рассмотрим лишь те результаты теории формальных языков,которые будут необходимы нам для дальнейшего изложения. +Для более глубокого изучения именно теории формальных языков рекомендуется обратиться к классической литературе. +Например, к работам Харрисона~\cite{10.5555/578595}, Хопкрофта~\cite{hopcroft2001introduction} или другой подобной литературе. +\marginnote[*2]{ + В рамках данной работы мы будем говорить о \enquote{типичных} языках, элементами которых являются объекты, максимально похожие на строки. + При этом будет оставлен за бортом тот факт, что базовое определение позволяет нам рассматривать в качестве \enquote{строительных элементов} (алфавита) практически произвольные объекты, а значит, создавать весьма нетривиальные конструкции в качестве слов языка. + Примерами \enquote{нестроковых} языков могут послужить языки деревьев~\cite{tata2007} или языки графов~\cite{EHRIG1992557, Courcelle2009}. +} + +\begin{definition}[Алфавит] + \emph{Алфавит}~--- это конечное множество. + Элементы этого множества будем называть \emph{символами}. +\end{definition} + +\begin{example} + Примеры алфавитов. + \begin{itemize} + \item Латинский алфавит $\Sigma = \{a, b, c, \dots, z\}$. + \item Кириллический алфавит $\Sigma = \{\text{а, б, в, \dots, я}\}$. + \item Алфавит натуральных чисел в шестнадцатеричной записи + \[\Sigma = \{0, 1, 2, 3, 4, 5, 6, 7 ,8, 9, A, B, C, D, E, F\}.\] + \end{itemize} +\end{example} + +Традиционное обозначение для алфавита~--- $\Sigma$. +Также мы будем использовать различные прописные буквы латинского алфавита. +Для обозначения символов алфавита будем использовать строчные буквы латинского алфавита: $a, b, \dots, x, y, z$. + +Будем считать, что над алфавитом $\Sigma$ всегда определена операция конкатенации $\cdot: \Sigma^* \times \Sigma^* \to \Sigma^*$. +\marginnote{TODO: объяснить звездочку Клини} +При записи выражений символ точки (обозначение операции конкатенации) часто будем опускать: $a \cdot b = ab$. + +\begin{definition}[Слово] + \emph{Слово} над алфавитом $\Sigma$~--- это конечная конкатенация символов алфавита $\Sigma$: $\omega = a_0 \cdot a_1 \cdot \dots \cdot a_m$, где $\omega$~--- слово, а $a_i \in \Sigma$ для любого $i$. + Для обозначения пустого слова (слова, содержащего ноль символов) будем использовать специальный символ $\varepsilon, \varepsilon \notin \Sigma$. +\end{definition} + +\begin{definition}[Длина слова] + Пусть $\omega = a_0 \cdot a_1 \cdot \dots \cdot a_m$~--- слово над алфавитом $\Sigma$. + Будем называть $m + 1$ \emph{длиной слова} и обозначать как $|\omega|$. + Длина пустого слова равна нулю. +\end{definition} + +\begin{definition}[Количество вхождений символа] + Пусть $\omega$~--- слово над алфавитом $\Sigma$. Пусть $t \in \Sigma$~--- некоторый символ из алфавита. + Тогда будем обозначать количество вхождений символа $t$ в слове $\omega$ как $|\omega|_t$. +\end{definition} + +\begin{definition}[Язык] + \emph{Язык} над алфавитом $\Sigma$~--- это множество слов над алфавитом $\Sigma$. +\end{definition} + +\begin{example} + Примеры языков. + + \begin{itemize} + \item Язык целых чисел в двоичной записи $\{0, 1, -1, 10, 11, -10, -11, \dots\}$. + \marginnote{TODO: Меня смущает - перед бинарными числами} + \item Язык всех правильных скобочных последовательностей + \[\{(), (()), ()(), (())(), \dots\}.\] + \end{itemize} +\end{example} + +Любой язык над алфавитом $\Sigma$ является подмножеством универсального множества $\Sigma^*$~--- множества всех слов над алфавитом $\Sigma$. + +Заметим, что язык не обязан быть конечным множеством, в то время как алфавит в нашей области всегда конечен% +\sidenote{Существуют ситуации, когда возникают бесконечные алфавиты.} +и изучаем мы конечные слова% +\sidenote{ + Существуют ситуации, когда возникают бесконечные слова. + Например работы по обработке потоков. +}. + +Можно выделить следующие основные \emph{способы задания языков}. +\begin{itemize} + \item Перечислить все элементы. + Такой способ работает только для конечных языков. + Перечислить бесконечное множество за конечное время не получится. + \item Задать генератор~--- процедуру, которая возвращает очередное слово языка. + \item Задать распознаватель~--- процедуру, которая по данному слову может определить, принадлежит оно заданному языку или нет. +\end{itemize} + +Стоит отметить, что существуют и другие способы задания. +Например, язык может определяться как решение некоторого \emph{языкового уравнения}~\sidecite{Leiss1999}. + +\section{Теоретико-множественные операции над языками} + +Так как язык~--- это \emph{множество} слов, то над языками естественным образом определены теоретико-множественные операции, такие как объединение, пересечение, дополнение. +\begin{itemize} + \item $L_1 \cup L_2 = \{ \omega \mid \omega \in L_1 \text{ или } \omega \in L_2\}$ + \item $L_1 \cap L_2 = \{ \omega \mid \omega \in L_1 \text{ и } \omega \in L_2\}$ + \item $\overline{L} = \{ \omega \mid \omega \in \Sigma^* \text{ и } \omega \notin L\}$, где $L$~--- язык над алфавитом $\Sigma$ . +\end{itemize} + +Но кроме этого, нам потребуются и относительно специальные операции, определённые ниже. + +\begin{definition}[TODO: Что ты такое] + Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, $S_2 \subseteq S$, тогда + \[S_1 \odot S_2 = \{ s_1 \odot s_2 \mid s_1 \in S_1, s_2 \in S_2\}.\] +\end{definition} + +\begin{definition}[TODO: ???] + Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, тогда + \[S_1^n = \{ \underbrace{s_1 \odot s_1 \odot \dots \odot s_1}_{\text{n раз}} \mid s_1 \in S_1\}.\] + При этом $S_1^0 = \{\varepsilon\}$% + \sidenote{В данном случае нулевая степень даёт единицу, как мы и привыкли.}. +\end{definition} + +\begin{definition}[TODO: ???] + Пусть дано множество $S$ с определённой на нём операцией $\odot: S \times S \to S$, $S_1 \subseteq S$, тогда + \[S_1^* = \bigcup_{n = 0}^{\infty} S_1^n.\] +\end{definition} + +Многие прикладные задачи, в которых возникают языки, достаточно естественным образом формулируются в теоретико-множественных терминах. +Так, задача распознавания~--- это задача проверки принадлежности элемента множеству. +Далее мы рассмотрим прикладные задачи, решение которых требует, например, проверки включения одного языка в другой, или проверки непустоты пересечения двух языков. +Разрешимость таких задач, алгоритмы решения, их сложность и другие свойства, зависят от свойств языков. +Это даёт дополнительную связь теоретико-языковых конструкций с решением прикладных задач, позволяя более аккуратно рассуждать о свойствах получаемых решений. + +\section{Производные} + +Производные для языков предложил Януш Бжозовский в работе~\sidecite{10.1145/321239.321249}. + +\begin{definition}[Производная Бжозовского] + Производная $\partial_c L = \{ w' \mid w \in L, w = cw'\}$. +\end{definition} + +Заметим, что если для слова $w$, $|w| = n$ верно, что +\[\varepsilon \in (\partial_{w[n-1]} \circ \dots \circ \partial_{w[1]} \circ \partial_{w[0]}) (L),\] +то $w \in L$. +Таким образом, существует возможность использовать производные для проверки принадлежность слов заданному языку. +Данная возможность активно используется для регулярных языков~\sidecite{caron_champarnaud_mignot_2014}, языков, распознаваемых автоматами, управляемыми входом (Input Driven Pushdown Automata, IDPDA)~\sidecite{10.1145/3591472}, и контекстно-свободных языков~\sidecite{10.1145/2034773.2034801, 10.1145/3022671.2984026}. +Кроме этого, с помощью производных можно построить элегантный алгоритм построения конечного автомата по регулярному выражению~\sidecite{10.1017/S0956796808007090} и для выполнения регулярных запросов~\sidecite{10.1145/2949689.2949711}. + +\section{Распознаватели} + +Распознаватель может быть сконструирован как некоторая формальная машина, которая принимает или отвергает те или иные слова, записанные на входной ленте. +Таким образом, язык задаваемый некоторым вычислителем~--- это множество принимаемых им слов. +Далее становится возможно классифицировать языки по тому, какого класса распознаватель необходим и достаточен, чтобы их задать. +Например, можно выделить класс языков, задаваемых конечными автоматами. +На этом, в частности, построена \emph{иерархия Хомского}. + +\section{Генераторы} + +Один из базовых способов задать генератор языка опирается на \emph{системы переписывания строк}, из которых, в дальнейшем, можно получить так называемые \emph{порождающие грамматики}. + +\begin{definition}[Система переписывания] + \emph{Система переписывания (строк)}% + \sidenote{Один из классически примеров систем переписывания строк~--- это машины Маркова, или алгорифмы Маркова~\cite{markov1954theory}.}~--- + это пара $R = \langle \Sigma, P \rangle$, где $\Sigma$~--- алфавит, $P= \{p \mid p = w' \to w'', w' \in \Sigma^+, w'' \in \Sigma^*\}$~--- набор правил переписывания. +\end{definition} + +Один шаг работы системы состоит из замены любого вхождения любой из левых частей правил на соответствующую правую часть правила. +Иными словами, пусть есть слово $w = w_0 w_1 w_2$ и имеется правило $w_1 \to w_3 \in P$. +Тогда после переписывания по этому правилу будет получено слово $w' = w_0 w_3 w_2$. +Заметим, что выбор заменяемого вхождения, как и выбор применяемого правила недетерминирован: может быть выбрано любое из вхождений и применено любое из доступных правил. +В качестве критерия остановки выберем невозможность применить ни одно из доступных правил. +Получившееся при этом слово будем считать результатом работы машины. +Зафиксировав стартовую строку и набор правил, можно достаточно естественным образом получить язык, как множество всех слов, являющихся результатом работы машины. + +Представленная система является, скорее, неформальной базой для создания более содержательных систем. +Далее, накладывая дополнительные ограничения на правила машины и алгоритм её работы, мы будем получать некоторые содержательные классы языков. + +Отметим, что подход к определению языков через системы переписывания не всегда удобен. Например, не получается с их использованием естественным образом определить булевы языки. + +\section{Классы языков} + +Иерархия языков, предложенная Ноамом Хомским (Noam Chomsky), является на текущий момент классической и представлена на рисунке~\ref{fig:Chomsky}. +Она основана на сопоставлении языкам тех или иных формальных вычислителей, способных их распознать. +Например, для распознавания любого регулярного языка достаточно конечного автомата. Для контекстно-свободного~--- магазинного автомата. И так далее. + +\begin{figure} + \caption{Иерархия языков по Хомскому} + \label{fig:Chomsky} + \begin{center} + \includegraphics[width=0.9\textwidth]{figures/Chomsky.pdf} + \end{center} +\end{figure} + +Однако, данная иерархия постепенно теряет свою актуальность, так как появляются новые классы языков, свойства которых уже не удаётся адекватным образом отобразить, используя её. + +Один из вариантов иерархии языков, более полно отображающий современное состояние дел, предложен Александром Охотиным% +\sidenote{ + Иерархия и некоторые отражаемые ей свойства подробно обсуждаются в презентации Александра Охотина \enquote{Underlying principles and recurring ideas of formal grammars} (\url{https://users.math-cs.spbu.ru/~okhotin/talks/grammars_lata_talk.pdf}). + Также, с данной презентацией рекомендуется ознакомиться чтобы представить себе состояние области в целом. +}. +Вариация предложенной Александром Охотиным иерархии представлена на изображении~\ref{fig:hierarchyOkhotin}~ +\sidenote{Данная вариация скомпонована из версии, представленной в презентации \enquote{Underlying principles and recurring ideas of formal grammars} и версии, взятой из работы~\cite{MRYKHIN2023113829}.}. +Приведённая диаграмма содержит регулярные и контекстно-свободные. +Так и подклассы, лежащие между ними. +Вместе с этим, классы, лежащие выше контекстно-свободных: многокомпонентные контекстно-свободные, булевы, конъюнктивные, их подклассы. + +\begin{figure*}[h!] + \caption{Иерархия. \emph{Reg}~--- регулярные, \emph{LLLin}, \emph{LRLin}, \emph{UnambLin}, \emph{Lin}, \emph{LL}, \emph{LR}, \emph{Unamb}~--- однозначные, \emph{Ordinary}~--- обыкновенные (контекстно-свободные) + \emph{Conj}~--- конъюнктивные, \emph{Boolean}~--- булевы, \emph{UnamnbBool}, \emph{UnambConj}, \emph{VPDA}, \emph{LinConj}, \emph{UnambTAG}, \emph{TAG}, \emph{MCFL},} + \label{fig:hierarchyOkhotin} + \begin{center} + \begin{tikzpicture}[node distance=1.0cm,bend angle=45,auto] + \tikzstyle{lang}=[circle,thick,draw=blue!75,fill=blue!75,minimum size=1mm] + \node [lang] (reg) [label=below:\emph{Reg}] {}; + \node [right of = reg] (reg_dummy) {}; + \node [lang] (lllin) [right of=reg_dummy, label=below:\emph{LLLin}] {}; + \node [right of = lllin] (lllin_dummy) {}; + \node [lang] (lrlin) [right of=lllin_dummy, label=below:\emph{LRLin}] {}; + \node [right of = lrlin] (lrlin_dummy) {}; + \node [lang] (unamblin) [right of=lrlin_dummy, label=below:\emph{UnambLin}] {}; + \node [right of = unamblin] (unamblin_dummy) {}; + \node [lang] (lin) [right of=unamblin_dummy, label=below:\emph{Lin}] {}; + \node [right of = lin] (lin_dummy) {}; + \node [right of = lin_dummy] (lin_dummy_2) {}; + \node [right of = lin_dummy_2] (lin_dummy_3) {}; + \node [lang] (conj) [right of=lin_dummy_3, label=below:\emph{Conj}] {}; + \node [right of = conj] (conj_dummy) {}; + \node [lang] (bool) [right of=conj_dummy, label=right:\emph{Bool}] {}; + + \node [above of = lrlin] (lrlin_up_dummy) {}; + \node [lang] (ll) [above of=lrlin_up_dummy, label=above:\emph{LL}] {}; + \node [right of = ll] (ll_dummy) {}; + \node [lang] (lr) [right of=ll_dummy, label=above:\emph{LR}] {}; + \node [right of = lr] (lr_dummy) {}; + \node [lang] (unamb) [right of=lr_dummy, label=above:\emph{Unamb}] {}; + \node [right of = unamb] (unamb_dummy) {}; + \node [lang] (ordinary) [right of=unamb_dummy, label=right:\emph{Ordinary}] {}; + + \node [lang] (conjleftcontext) [above of=conj_dummy, label=right:\emph{Conj$+\lhd$}] {}; + + \node [below of = lrlin] (lrlin_down_dummy) {}; + \node [lang] (vpda) [below of=lrlin_down_dummy, label=below:\emph{VPDA}] {}; + \node [below of = lin] (lin_down_dummy_1) {}; + \node [below of = lin_down_dummy_1] (lin_down_dummy_2) {}; + \node [right of = lin_down_dummy_2] (lin_right_dummy_1) {}; + \node [lang] (linconj) [right of=lin_right_dummy_1, label=below:\emph{LinConj}] {}; + + \node [lang] (unambtag) [above of=unamb_dummy, label=above:\emph{UnambTAG}] {}; + \node [right of = unambtag] (unambtag_dummy) {}; + \node [lang] (tag) [right of=unambtag_dummy, label=above:\emph{TAG}] {}; + \node [right of = tag] (tag_dummy) {}; + \node [lang] (mcfl) [right of=tag_dummy, label=above:\emph{MCFL}] {}; + + \node [above of = linconj] (linconj_above_dummy) {}; + \node [lang] (unambconj) [right of=linconj_above_dummy, label=below:\emph{UnambConj}] {}; + \node [right of = unambconj] (unambconj_dummy) {}; + \node [lang] (unambbool) [right of=unambconj_dummy, label=right:\emph{UnambBool}] {}; + + \node [below of = linconj] (linconj_below_dummy) {}; + \node [lang] (rtca) [right of=linconj_below_dummy, label=below:\emph{RT-CA}] {}; + \node [right of = rtca] (rtca_dummy) {}; + \node [lang] (ltca) [right of=rtca_dummy, label=right:\emph{LT-CA}] {}; + + \path[->] + (reg) edge node {} (lllin) + (lllin) edge node {} (lrlin) + (lrlin) edge node {} (unamblin) + (unamblin) edge node {} (lin) + + (lllin) edge node {} (ll) + (ll) edge node {} (lr) + (ll) edge node {} (lr) + (lr) edge node {} (unamb) + (unamb) edge node {} (ordinary) + + (lrlin) edge node {} (lr) + (unamblin) edge node {} (unamb) + (lin) edge node {} (ordinary) + + (reg) edge node {} (vpda) + (vpda) edge node {} (lr) + (vpda) edge node {} (linconj) + + (ordinary) edge node {} (conj) + (conj) edge node {} (bool) + (conj) edge node {} (conjleftcontext) + + (unamb) edge node {} (unambtag) + (ordinary) edge node {} (tag) + (unambtag) edge node {} (tag) + (tag) edge node {} (mcfl) + + (lin) edge node {} (linconj) + (linconj) edge node {} (unambconj) + (unambconj) edge node {} (unambbool) + (unambconj) edge node {} (conj) + (unambbool) edge node {} (bool) + (unamb) edge node {} (unambconj) + + (linconj) edge node {} (rtca) + (rtca) edge node {} (ltca) + ; + \end{tikzpicture} + \end{center} +\end{figure*} + +Для того, чтобы содержательно рассуждать про различные классы языков, необходимо иметь механизм, позволяющий чётко отделить один класс от другого. +\emph{Лемма о накачке} для соответствующего класса~--- один из классических таких механизмов. +Однако, не для всех классов языков соответствующие результаты получены. +Так, например, формулировка леммы о накачки для многокомпонентных контекстно-свободных языков в общем виде всё ещё не найдена, хотя существуют формулировки для отдельных подклассов. +Аналогично, для булевых и конъюнктивных языков всё ещё не предложены аналоги лемм о накачке. + + +%\section{Вопросы и задачи} +%\begin{enumerate} +% \item !!! +% \item !!! +%\end{enumerate} diff --git a/tex/GraphTheoryIntro.tex b/tex/GraphTheoryIntro.tex index 3823810..c36fccf 100644 --- a/tex/GraphTheoryIntro.tex +++ b/tex/GraphTheoryIntro.tex @@ -1,4 +1,7 @@ -\chapter{Некоторые сведения из теории графов}\label{chpt:GraphTheoryIntro} +\setchapterpreamble[u]{\margintoc} +\chapter{Некоторые сведения из теории графов} +\label{chpt:GraphTheoryIntro} +\tikzsetfigurename{GraphTheoryIntro_} В данном разделе мы дадим определения базовым понятиям из теории графов, рассмотрим несколько классических задач из области анализа графов и алгоритмы их решения. Кроме этого, поговорим о связи между линейной алгеброй и некоторыми задачами анализа графов. @@ -6,321 +9,357 @@ \chapter{Некоторые сведения из теории графов}\lab \section{Основные определения} -\begin{definition} - \textit{Помеченный ориентированный граф} $\mathcal{G} = \langle V, E, L \rangle$, где $V$ --- конечное множество вершин, $E$ --- конечное множество рёбер, т.ч. $E \subseteq V \times L \times V$, $L$ --- конечное множество меток на рёбрах. В некоторых случаях метки называют \textit{весами}\footnote{Весами метки называют, как правило, тогда, когда они берутся из какого-либо поля, например $\mathbb{R}$ или $\mathbb{N}$.} и тогда говорят о \textit{взвешенном} графе. +\begin{definition}[Помеченный ориентированный граф] + \emph{Помеченный ориентированный граф} $\mbfscrG = \langle V, E, L \rangle$, где $V$~--- конечное множество вершин, $E$~--- конечное множество рёбер, т.ч. $E \subseteq V \times L \times V$, $L$~--- конечное множество меток на рёбрах. + В некоторых случаях метки называют \emph{весами}% + \sidenote{Весами метки называют, как правило, тогда, когда они берутся из какого-либо числового множества, например $\BbbR$ или $\BbbN$.} + и тогда говорят о \emph{взвешенном} графе. \end{definition} - -\begin{definition} - В случае, если для любого ребра $(u,l,v)$ в графе также содержится ребро $(v,l,u)$, говорят, что граф \textit{неориентированный}. +\begin{definition}[Помеченный неориентированный граф] + В случае, если для любого ребра $(u, l, v)$ в графе также содержится ребро $(v, l, u)$, говорят, что граф \emph{неориентированный}. \end{definition} - +\marginnote{ + \begin{example} + Пусть дан граф + \begin{align*} + \mbfscrG_1 = \langle V & =\{0, 1, 2, 3\}, \\ + E & =\{(0, a, 1), (1, a, 2), (2, a, 0), \\ + & \ \ \ (2, b, 3), (3, b, 2)\}, \\ + L & =\{a, b\} \rangle. + \end{align*} + Графическое представление графа $\mbfscrG_1$: + \begin{center} + \input{figures/graph/graph0} + \end{center} + $(0, a, 1)$ и $(3,b,2)$~--- это рёбра графа $\mbfscrG_1$. + При этом $(3, b, 2)$ и $(2, b, 3)$~--- это разные рёбра. + \end{example} +} В дальнейшем речь будет идти о конечных ориентированных помеченных графах. -Мы будем использовать термин \textit{граф} подразумевая именно конечный ориентированный помеченный граф, если только не оговорено противное. +Мы будем использовать термин \emph{граф} подразумевая именно конечный ориентированный помеченный граф, если только не оговорено противное. Также мы будем считать, что все вершины занумерованы подряд с нуля. -То есть можно считать, что $V$ --- это отрезок $[0, |V| - 1]$ неотрицательных целых чисел, где $|V|$ --- мощность множества $V$. - -\begin{example}[Пример графа и его графического представления] - Пусть дан граф - \begin{align*} - \mathcal{G} = \langle V&=\{0,1,2,3\},\\ - E&=\{(0,a,1), (1,a,2), (2,a,0), (2,b,3), (3,b,2)\}, \\ - L&=\{a,b\} \rangle. - \end{align*} - - Графическое представление графа $\mathcal{G}$: - \begin{center} - \input{figures/graph/graph0} - \end{center} -\end{example} +То есть можно считать, что $V$~--- это отрезок $[0 \rng |V| - 1]$, где $|V|$~--- мощность множества $V$. -\begin{example}[Пример рёбер графа] -$(0,a,1)$ и $(3,b,2)$ --- это рёбра графа $\mathcal{G}_1$. При этом $(3,b,2)$ $(2,b,3)$ --- это разные рёбра. -\end{example} - -\begin{definition} - \textit{Путём} $\pi$ в графе $\mathcal{G}$ будем называть последовательность рёбер такую, что для любых двух последовательных рёбер $e_1=(u_1,l_1,v_1)$ и $e_2=(u_2,l_2,v_2)$ в этой последовательности, конечная вершина первого ребра является начальной вершиной второго, то есть $v_1 = u_2$. Будем обозначать путь из вершины $v_0$ в вершину $v_n$ как $v_0 \pi v_n$. Иными совами, $$v_0 \pi v_n = e_0,e_1, \dots, e_{n-1} = (v_0, l_0, v_1),(v_1,l_1,v_2),\dots,(v_{n-1},l_{n-1},v_n).$$ - - Часто для представления пути мы буем использовать следующие нотации: +\begin{definition}[Путь] + \emph{Путём} $\pi$ в графе $\mbfscrG$ будем называть последовательность рёбер такую, что для любых двух последовательных рёбер $e_1 = (u_1, l_1, v_1)$ и $e_2 = (u_2, l_2, v_2)$ в этой последовательности, конечная вершина первого ребра является начальной вершиной второго, то есть $v_1 = u_2$. + Будем обозначать путь из вершины $v_0$ в вершину $v_n$ как $v_0 \pi v_n$. + Иными совами, + \[v_0 \pi v_n = e_0,e_1, \dots, e_{n-1} = (v_0, l_0, v_1),(v_1,l_1,v_2),\dots,(v_{n-1},l_{n-1},v_n).\] +\end{definition} +Часто для представления пути мы буем использовать следующие нотации: \begin{center} - \input{figures/graph/path0.tex} + \input{figures/graph/path0.tex} \end{center} -\end{definition} - или -$$ -v_0 \xrightarrow[]{l_0} v_1 \xrightarrow[]{l_1} v_2 \xrightarrow[]{l_2} \ldots \xrightarrow[]{l_{n-2}} v_{n-1} \xrightarrow[]{l_{n-1}} v_n. -$$ - -\begin{example}[Пример путей графа] -$(0,a,1),(1,a,2) = 0\pi_1 2$ --- путь из вершины 0 в вершину 2 в графе $\mathcal{G}_1$. -При этом $(0,a,1),(1,a,2),(2,b,3),(3,b,2) = 0\pi_2 2$ --- это тоже путь из вершины 0 в вершину 2 в графе $\mathcal{G}_1$, но он не равен $0\pi_1 2$. +или +\[ + v_0 \xrightarrow[]{l_0} v_1 \xrightarrow[]{l_1} v_2 \xrightarrow[]{l_2} \ldots \xrightarrow[]{l_{n-2}} v_{n-1} \xrightarrow[]{l_{n-1}} v_n. +\] + +\begin{example} + $(0,a,1), (1,a,2) = 0 \pi_1 2$~--- путь из вершины 0 в вершину 2 в графе $\mbfscrG_1$. + При этом $(0, a, 1), (1, a, 2), (2, b, 3), (3, b, 2) = 0 \pi_2 2$~--- это тоже путь из вершины 0 в вершину 2 в графе $\mbfscrG_1$, но он не равен $0 \pi_1 2$. \end{example} Кроме того, нам потребуется отношение, отражающее факт существования пути между двумя вершинами. -\begin{definition}\label{def:reach} - \textit{Отношение достижимости} в графе: - $(v_i,v_j) \in P \iff \exists v_i \pi v_j$. +\begin{definition}[Достижимость в графе] + \label{def:reach} + \emph{Отношение достижимости} в графе: $(v_i,v_j) \in P \iff \exists v_i \pi v_j$. + \marginnote{TODO: Не надо ли множество $P$ ввести аккуратнее?} \end{definition} -Отметим, что в некоторых задачах удобно считать по умолчанию, что $(v_i,v_i) \in P$, однако наше определение такого не допускает. Исправить ситуацию можно явно добавив петли $(v_i,l,v_i)$ для всех вершин. - -Один из способов задать граф --- это задать его \textit{матрицу смежности}. +Отметим, что в некоторых задачах удобно считать по умолчанию, что $(v_i,v_i) \in P$, однако наше определение такого не допускает. +Исправить ситуацию можно явно добавив петли $(v_i,l,v_i)$ для всех вершин. -\begin{definition} - \textit{Матрица смежности} графа $\mathcal{G}=\langle V,E,L \rangle$ --- это квадратная матрица $M$ размера $n \times n$, где $|V| = n$, построенная над коммутативным моноидом $\mathbb{G} = (S,\circ\colon S \times S \to S)$, который конструируется следующим образом. +Один из способов задать граф~--- это задать его \emph{матрицу смежности}. - \begin{enumerate} - \item $L \subseteq S$. - \item $\circ$ --- коммутативная бинарная операция. - \item Существует $ \mathbb{0} \in (S \setminus L)$ --- нейтральный элемент относительно $\circ$. - \end{enumerate} - - При этом $M[i,j] = \bigcirc_{(i,l,j) \in E}l$, где $\bigcirc_\varnothing = \mathbb{0}$. +\begin{definition}[Матрица смежности] + \emph{Матрица смежности} графа $\mbfscrG = \langle V, E, L \rangle$~--- это квадратная матрица $M$ размера $n \times n$, где $|V| = n$, построенная над коммутативным моноидом $\BbbG = (S, \circ: S \times S \to S)$, который конструируется следующим образом. + \begin{enumerate} + \item $L \subseteq S$. + \item $\circ$~--- коммутативная бинарная операция. + \item Существует $\Bbbzero \in (S \setminus L)$~--- нейтральный элемент относительно $\circ$. + \end{enumerate} + При этом $M[i,j] = \bigcirc_{(i, l, j) \in E}l$, где $\bigcirc_\varnothing = \Bbbzero$. \end{definition} -Заметим, что наше определение матрицы смежности отличается от классического, в котором матрица является булевой и отражает лишь факт наличия хотя бы одного ребра. То есть $M[i,j] = 1 \iff \exists e = (i,\_,j) \in E$. - -\begin{example}[Пример матрицы смежности неориентированного графа]\label{exmpl:undirectedGraphMatrix} - Пусть дан следующий неориентированный граф. - \begin{center} - \input{figures/graph/graph1.tex} - \end{center} - -$\mathbb{G} = (S,\circ)$ в этом случае конструируется следующим образом. Во-первых, придётся предположить, что $L$ --- множество с одним элементом, скажем $s$, и считать, что все рёбра помечены им\footnote{А раз все рёбра имеют одинаковый заранее известный вес, то можно его и не писать для каждого ребра при задании графа. Поэтому привычное нам изображение получается достаточно логичным.}. Далее, $S = L \cup{\{n\}} = \{s,n\}$, где $n$ --- нейтральный элемент относительно $\circ$. Тогда $\circ$ можно определить поточечно следующим образом. -\begin{itemize} - \item $s \circ s = s$ - \item $s \circ n = n \circ s = s$ - \item $n \circ n = n$ -\end{itemize} - -Таким образом, матрица смежности данного графа выглядит следующим образом: -$$ -\begin{pmatrix} - n & s & s & n \\ - s & n & s & n \\ - s & s & n & s \\ - n & n & s & n -\end{pmatrix} -$$ -, что может показаться несколько непривычным. Однако заметим, что построенная нами структура $\mathbb{G} = (\{s,n\}, \circ)$ изоморфна $\mathbb{G}' = (\{1,0\}, \vee)$. При переходе к $\mathbb{G}'$ мы получим привычную нам булеву матрицу смежности: - $$ - \begin{pmatrix} - 0 & 1 & 1 & 0 \\ - 1 & 0 & 1 & 0 \\ - 1 & 1 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} - $$ - Заметим, что матрица смежности неориентированного графа всегда симметрична относительно главной диагонали. +Заметим, что наше определение матрицы смежности отличается от классического, в котором матрица является булевой и отражает лишь факт наличия хотя бы одного ребра. +То есть $M[i,j] = 1 \iff \exists e = (i,\_,j) \in E$. + +\begin{marginfigure} + \caption{Неориентированный граф} + \label{gr:graph1} + \begin{center} + \input{figures/graph/graph1.tex} + \end{center} +\end{marginfigure} +\begin{example}[Пример матрицы смежности неориентированного графа] + \label{exmpl:undirectedGraphMatrix} + Пусть дан неориентированный граф (см. рисунок \ref{gr:graph1}). + $\BbbG = (S, \circ)$ в этом случае конструируется следующим образом. + Во-первых, придётся предположить, что $L$~--- множество с одним элементом, скажем $s$, и считать, что все рёбра помечены им% + \sidenote{А раз все рёбра имеют одинаковый заранее известный вес, то можно его и не писать для каждого ребра при задании графа. + Поэтому привычное нам изображение получается достаточно логичным.}. + Далее, $S = L \cup{\{n\}} = \{s,n\}$, где $n$~--- нейтральный элемент относительно $\circ$. + \marginnote{TODO: Здесь $n$~--- нейтральный из-за клэша с $e$ из алгебры?} + Тогда $\circ$ можно определить поточечно следующим образом. + \begin{itemize} + \item $s \circ s = s$ + \item $s \circ n = n \circ s = s$ + \item $n \circ n = n$ + \end{itemize} + + Таким образом, матрица смежности данного графа выглядит следующим образом: + \[ + \begin{pmatrix} + n & s & s & n \\ + s & n & s & n \\ + s & s & n & s \\ + n & n & s & n + \end{pmatrix}, + \] + что может показаться несколько непривычным. + Однако заметим, что построенная нами структура $\BbbG = (\{s,n\}, \circ)$ изоморфна $\BbbG' = (\{1,0\}, \lor)$. + При переходе к $\BbbG'$ мы получим привычную нам булеву матрицу смежности: + \[ + \begin{pmatrix} + 0 & 1 & 1 & 0 \\ + 1 & 0 & 1 & 0 \\ + 1 & 1 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix} + \] + Заметим, что матрица смежности неориентированного графа всегда симметрична относительно главной диагонали. \end{example} -\begin{example}[Пример матрицы смежности ориентированного графа]\label{example:diGraph} - Дан ориентированный граф: - \begin{center} - \input{figures/graph/graph2.tex} - \end{center} - - Построить его булеву матрицу смежности можно применив рассуждения из предыдущего примера (\ref{exmpl:undirectedGraphMatrix}) и выглядеть она будет следующим образом: - $$ - \begin{pmatrix} - 0 & 1 & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 1 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} - $$ +\begin{marginfigure} + \caption{Ориентированный граф} + \label{gr:graph2} + \begin{center} + \input{figures/graph/graph2.tex} + \end{center} +\end{marginfigure} +\begin{example}[Пример матрицы смежности ориентированного графа] + \label{example:diGraph} + Дан ориентированный граф (см. рисунок \ref{gr:graph2}). + Построить его булеву матрицу смежности можно применив рассуждения из предыдущего примера (\ref{exmpl:undirectedGraphMatrix}) и выглядеть она будет следующим образом: + \[ + \begin{pmatrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 1 & 0 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix}. + \] \end{example} +\begin{marginfigure} + \caption{Помеченный граф} + \label{gr:graph3} + \begin{center} + \input{figures/graph/graph3.tex} + \end{center} +\end{marginfigure} \begin{example}[Пример матрицы смежности помеченного графа] - Пусть дан следующий помеченный граф. - \begin{center} - \input{figures/graph/graph3.tex} - \end{center} - - В данном случае $L = \{\{a\},\{b\}\}$, а $\mathbb{G} = ( \{\{a\},\{b\},\{a,b\},\varnothing\} ,\cup)$, где $\varnothing$ --- нейтральный элемент. - Тогда матрица матрица смежности исходного графа выглядит следующим образом: - $$ - \begin{pmatrix} - \varnothing & \{a\} & \varnothing & \varnothing \\ - \varnothing & \varnothing & \{a\} & \varnothing \\ - \{a\} & \varnothing & \varnothing & \{a,b\} \\ - \varnothing & \varnothing & \{b\} & \varnothing - \end{pmatrix} - $$ + Пусть дан помеченный граф (см. рисунок \ref{gr:graph3}). + В данном случае $L = \{\{a\},\{b\}\}$, а $\BbbG = ( \{\{a\},\{b\},\{a,b\},\varnothing\} ,\cup)$, где $\varnothing$~--- нейтральный элемент. + Тогда матрица матрица смежности исходного графа выглядит следующим образом: + \[ + \begin{pmatrix} + \varnothing & \{a\} & \varnothing & \varnothing \\ + \varnothing & \varnothing & \{a\} & \varnothing \\ + \{a\} & \varnothing & \varnothing & \{a,b\} \\ + \varnothing & \varnothing & \{b\} & \varnothing + \end{pmatrix}. + \] \end{example} -Необходимо заметить, что свойства структуры $\mathbb{G}$, а значит и детали её построения, зависят от задачи, в рамках которой рассматривается граф. В примерах выше мы строили $\mathbb{G}$ из некоторых общих соображений, не специфицируя решаемую задачу, стараясь получить ожидаемый результат. Далее мы рассмотрим пример, в котором видно, как решаемая задача влияет на построение $\mathbb{G}$. - -\begin{example}[Пример матрицы смежности взвешенного графа]\label{example:apspGraph} - Пусть дан следующий взвешенный граф: - \begin{center} - \input{figures/graph/graph4.tex} - \end{center} - - Будем считать, что веса берутся из $\mathbb{R}$, а решаемая задача --- поиск кратчайших путей между вершинами. В таком случае естественно предположить, что для любой вершины $v_i$ существует петля $(v_i,0,v_i)$, хоть она явно и не изображена. Далее, $\mathbb{G} = ( \mathbb{R}\cup \{\infty\} , \min)$, где $\infty$ --- нейтральный элемент относительно операции $\min$. - - В результате мы получим следующую матрицу смежности: - $$ - \begin{pmatrix} - 0 & -1.4 & \infty & \infty \\ - \infty & 0 & 2.2 & \infty \\ - 0.5 & \infty & 0 & 1.85 \\ - \infty & \infty & -0.76 & 0 - \end{pmatrix} - $$ +Необходимо заметить, что свойства структуры $\BbbG$, а значит и детали её построения, зависят от задачи, в рамках которой рассматривается граф. +В примерах выше мы строили $\BbbG$ из некоторых общих соображений, не специфицируя решаемую задачу, стараясь получить ожидаемый результат. +Далее мы рассмотрим пример, в котором видно, как решаемая задача влияет на построение $\BbbG$. + +\begin{marginfigure} + \caption{Взвешенный граф} + \label{gr:graph4} + \begin{center} + \input{figures/graph/graph4.tex} + \end{center} +\end{marginfigure} +\begin{example}[Пример матрицы смежности взвешенного графа] + \label{example:apspGraph} + \marginnote{TODO: Как по мне подписи для примеров излишни, потому что из их содержания легко понять о чём пример. } + Пусть дан взвешенный граф (см. рисунок \ref{gr:graph4}). + Будем считать, что веса берутся из $\BbbR$, а решаемая задача~--- поиск кратчайших путей между вершинами. + В таком случае естественно предположить, что для любой вершины $v_i$ существует петля $(v_i, 0, v_i)$, хоть она явно и не изображена. + Далее, $\BbbG = (\BbbR \cup \{+\infty\}, \min)$, где $+\infty$~--- нейтральный элемент относительно операции $\min$. + + В результате мы получим следующую матрицу смежности: + \[ + \begin{pmatrix} + 0 & -1.4 & \infty & \infty \\ + \infty & 0 & 2.2 & \infty \\ + 0.5 & \infty & 0 & 1.85 \\ + \infty & \infty & -0.76 & 0 + \end{pmatrix}. + \] \end{example} -Таким образом, уже можно заметить, что введение моноида как абстракции позволяет достаточно унифицированным образом смотреть на различные графы и их матрицы смежности. Далее мы увидим, что данный путь позволит решать унифицированным образом достаточно широкий круг задач, связанных с анализом путей в графах. Но сперва мы сформулируем различные варианты задачи поиска путей в графе. % Это необходимо для формулировки задач, на решение которых мы в конечном итоге нацелены. - +Таким образом, уже можно заметить, что введение моноида как абстракции позволяет достаточно унифицированным образом смотреть на различные графы и их матрицы смежности. +Далее мы увидим, что данный путь позволит решать унифицированным образом достаточно широкий круг задач, связанных с анализом путей в графах. +Но сперва мы сформулируем различные варианты задачи поиска путей в графе. +% Это необходимо для формулировки задач, на решение которых мы в конечном итоге нацелены. \section{Обход графа в ширину} -Обход графа в ширину (Breadth-First Search, BFS) --- это одна из фундаментальных задач анализа графов, для решения которой существует соответствующий алгоритм, изложенный в классической литературе (подробнее, например, в~\cite{} или ~\cite{}). +Обход графа в ширину (Breadth-First Search, BFS)~--- это одна из фундаментальных задач анализа графов, для решения которой существует соответствующий алгоритм, изложенный в классической литературе. +%(подробнее, например, в~\cite{} или~\cite{}). Данный алгоритм является основой для многих алгоритмов поиска в графе. -В общих чертах, задача заключается в том, чтобы начиная с некоторой заданной вершины графа (источника) обойти все достижимые из неё вершины в некотором порядке. -Шаг --- просмотр все смежных. И так для всего фронта. Главное не посещать одну и ту же вершину несколько раз. +В общих чертах, задача заключается в том, чтобы начиная с некоторой заданной вершины графа (источника) обойти все достижимые из неё вершины в некотором порядке. +Шаг~--- просмотр все смежных. +И так для всего фронта. +Главное не посещать одну и ту же вершину несколько раз. Псевдокод классического алгоритма Пример. -Алгоритм обхода в ширину может быть переформулирован в терминах матрично-векторных операций следующим образом\footnote{ -Стоит отметить, что ситуация с не менее известным обходом в глубину (Depth-First Search, DFS) более сложная: -на момент написания текста не известно естественного выражения данного обхода в терминах линейной алгебры. -Доказательство невозможности такого построения также не предъявлены. -При этом, решения для частных случаев (деревья, ориентированные графы без циклов) предложены, например, в работе~\cite{10.1145/3315454.3329962}.}. -Пусть фронт --- вектор размера $n$, а сам граф представлен матрицей смежности. -Тогда один шаг --- получение нового фронта --- это умножение текущего фронта на матрицу смежности. -Для того, чтобы отслеживать посещённые вершины нужна маска. +Алгоритм обхода в ширину может быть переформулирован в терминах матрично-векторных операций следующим образом% +\sidenote{ + Стоит отметить, что ситуация с не менее известным обходом в глубину (Depth-First Search, DFS) более сложная: на момент написания текста не известно естественного выражения данного обхода в терминах линейной алгебры. + Доказательство невозможности такого построения также не предъявлены. + При этом, решения для частных случаев (деревья, ориентированные графы без циклов) предложены, например, в работе~\cite{10.1145/3315454.3329962}.}. +Пусть фронт~--- вектор размера $n$, а сам граф представлен матрицей смежности. +Тогда один шаг~--- получение нового фронта~--- это умножение текущего фронта на матрицу смежности. +Для того, чтобы отслеживать посещённые вершины нужна маска. Псевдокод алгоритма на ЛА \begin{example} - Рассмотрим обход в ширину графа из примера~\ref{example:diGraph} начиная с вершины 2. - Для обозначения текущего фронта будем использовать зелёный цвет, а для достижимых из него за один шаг --- жёлтый, обведём вершину красным, если она посешается повторно. - -\begin{tabular}[t]{c | c} - \begin{minipage}[c]{0.35\textwidth} - \input{figures/graph/graph_BFS_1.tex} - \end{minipage} - & - \begin{minipage}{0.7\textwidth} - $\begin{aligned} - \textit{current\_front} & = - \begin{pmatrix} - 0 & 0 & 1 & 0 - \end{pmatrix} - \\ - \textit{visited} & = - \begin{pmatrix} - 0 & 0 & 0 & 0 - \end{pmatrix} - \\ - \textit{new\_front} & = - \textit{current\_front} \cdot M - \\ - & = - \begin{pmatrix} - 0 & 0 & 1 & 0 - \end{pmatrix} - \begin{pmatrix} - 0 & 1 & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 1 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} \\ - & = - \begin{pmatrix} - 1 & 0 & 0 & 1 - \end{pmatrix} - \\ - \textit{visited} & = \textit{visited} \textit{new\_front} \\ - &= - \begin{pmatrix} - 0 & 0 & 0 & 0 - \end{pmatrix} - \begin{pmatrix} - 0 & 0 & 1 & 0 - \end{pmatrix} - \\ - \textit{current\_front} & = \textit{visited} \textit{new\_front} - \\ - & = - \begin{pmatrix} - 1 & 0 & 0 & 1 - \end{pmatrix} - \begin{pmatrix} - 0 & 0 & 1 & 0 - \end{pmatrix} \\ - & = - \begin{pmatrix} - 1 & 0 & 0 & 1 - \end{pmatrix} \\ - \end{aligned}$ - \end{minipage} - \\ \hline - \begin{minipage}[c]{0.35\textwidth} - \input{figures/graph/graph_BFS_2.tex} - \end{minipage} - & - $\begin{aligned} - & \begin{pmatrix} - 1 & 0 & 0 & 1 - \end{pmatrix} - \begin{pmatrix} - 0 & 1 & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 1 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} \\ &= - \begin{pmatrix} - 0 & 1 & 1 & 0 - \end{pmatrix} -\end{aligned}$ - \\ \hline - \begin{minipage}[c]{0.35\textwidth} - \input{figures/graph/graph_BFS_3.tex} - \end{minipage} - & - $ - \begin{pmatrix} - 0 & 1 & 0 & 0 - \end{pmatrix} - \begin{pmatrix} - 0 & 1 & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 1 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} = - \begin{pmatrix} - 0 & 0 & 1 & 0 - \end{pmatrix} - $ -\end{tabular} + Рассмотрим обход в ширину графа из примера~\ref{example:diGraph} начиная с вершины 2. + Для обозначения текущего фронта будем использовать зелёный цвет, а для достижимых из него за один шаг~--- жёлтый, обведём вершину красным, если она посешается повторно. + \marginnote{TODO: Как по мне, так надо просто написать каждый шаг словами, и тогда станет сильно проще сверстать} + \begin{tabular}[t]{c | c} + \begin{minipage}[c]{0.35\textwidth} + \input{figures/graph/graph_BFS_1.tex} + \end{minipage} + & + \begin{minipage}{0.7\textwidth} + $\begin{aligned} + \emph{current\_front} & = + \begin{pmatrix} + 0 & 0 & 1 & 0 + \end{pmatrix} + \\ + \emph{visited} & = + \begin{pmatrix} + 0 & 0 & 0 & 0 + \end{pmatrix} + \\ + \emph{new\_front} & = + \emph{current\_front} \cdot M + \\ + & = + \begin{pmatrix} + 0 & 0 & 1 & 0 + \end{pmatrix} + \begin{pmatrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 1 & 0 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix} \\ + & = + \begin{pmatrix} + 1 & 0 & 0 & 1 + \end{pmatrix} + \\ + \emph{visited} & = \emph{visited} \emph{new\_front} \\ + & = + \begin{pmatrix} + 0 & 0 & 0 & 0 + \end{pmatrix} + \begin{pmatrix} + 0 & 0 & 1 & 0 + \end{pmatrix} + \\ + \emph{current\_front} & = \emph{visited} \emph{new\_front} + \\ + & = + \begin{pmatrix} + 1 & 0 & 0 & 1 + \end{pmatrix} + \begin{pmatrix} + 0 & 0 & 1 & 0 + \end{pmatrix} \\ + & = + \begin{pmatrix} + 1 & 0 & 0 & 1 + \end{pmatrix} \\ + \end{aligned}$ + \end{minipage} + \\ \hline + \begin{minipage}[c]{0.35\textwidth} + \input{figures/graph/graph_BFS_2.tex} + \end{minipage} + & + $\begin{aligned} + & \begin{pmatrix} + 1 & 0 & 0 & 1 + \end{pmatrix} + \begin{pmatrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 1 & 0 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix} \\ &= + \begin{pmatrix} + 0 & 1 & 1 & 0 + \end{pmatrix} + \end{aligned}$ + \\ \hline + \begin{minipage}[c]{0.35\textwidth} + \input{figures/graph/graph_BFS_3.tex} + \end{minipage} + & + $ + \begin{pmatrix} + 0 & 1 & 0 & 0 + \end{pmatrix} + \begin{pmatrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 1 & 0 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix} = + \begin{pmatrix} + 0 & 0 & 1 & 0 + \end{pmatrix} + $ + \end{tabular} \end{example} -multiple-source BFS. Тот же обход в ширину, только источников несколько и надо помнить, какая из вершин из какого источника достижима. Постановка задачи. Решение через линейную алгебру~\cite{9286186} Уже не вектор, а матрица: храним информацию про каждую стартовую вершину отдельно. +multiple-source BFS. Тот же обход в ширину, только источников несколько и надо помнить, какая из вершин из какого источника достижима. Постановка задачи. Решение через линейную алгебру~\sidecite{9286186} Уже не вектор, а матрица: храним информацию про каждую стартовую вершину отдельно. Псевдокод алгоритма на ЛА Пример. \begin{minipage}[c]{0.35\textwidth} - \input{figures/graph/graph_MS-BFS_1.tex} + \input{figures/graph/graph_MS-BFS_1.tex} \end{minipage} \begin{minipage}{0.7\textwidth} \end{minipage} \begin{minipage}[c]{0.35\textwidth} - \input{figures/graph/graph_MS-BFS_2.tex} + \input{figures/graph/graph_MS-BFS_2.tex} \end{minipage} \begin{minipage}{0.7\textwidth} \end{minipage} @@ -328,211 +367,299 @@ \section{Обход графа в ширину} \section{Задачи поиска путей} -Одна из классических задач анализа графов --- это задача поиска путей между вершинами с различными ограничениями. +Одна из классических задач анализа графов~--- это задача поиска путей между вершинами с различными ограничениями. При этом возможны различные постановки задачи. С одной стороны, постановки различаются тем, что именно мы хотим получить в качестве результата. Здесь наиболее частыми являются следующие варианты. \begin{itemize} -\item Наличие хотя бы одного пути, удовлетворяющего ограничениям, в графе. В данном случае не важно, между какими вершинами существует путь, важно лишь наличие его в графе. - -\item Наличие пути, удовлетворяющего ограничениям, между некоторыми вершинами: задача достижимости. - При данной постановке задачи, нас интересует ответ на вопрос достижимости вершины $v_i$ из вершины $v_j$ по пути, удовлетворяющему ограничениям. - Такая постановка требует лишь проверить существование пути, но не его предоставления в явном виде. - -\item Поиск одного пути, удовлетворяющего ограничениям: необходимо не только установить факт наличия пути, но и предъявить его. При этом часто подразумевается, что возвращается любой путь, являющийся решением, без каких-либо дополнительных ограничений. Хотя, например, в некоторых задачах дополнительное требование простоты или наименьшей длины выглядит достаточно естественным. - -\item Поиск всех путей: необходимо предоставить все пути, удовлетворяющие заданным ограничениям. + \item Наличие хотя бы одного пути, удовлетворяющего ограничениям, в графе. + В данном случае не важно, между какими вершинами существует путь, важно лишь наличие его в графе. + \item Наличие пути, удовлетворяющего ограничениям, между некоторыми вершинами: задача достижимости. + При данной постановке задачи, нас интересует ответ на вопрос достижимости вершины $v_i$ из вершины $v_j$ по пути, удовлетворяющему ограничениям. + Такая постановка требует лишь проверить существование пути, но не его предоставления в явном виде. + \item Поиск одного пути, удовлетворяющего ограничениям: необходимо не только установить факт наличия пути, но и предъявить его. + При этом часто подразумевается, что возвращается любой путь, являющийся решением, без каких-либо дополнительных ограничений. + Хотя, например, в некоторых задачах дополнительное требование простоты или наименьшей длины выглядит достаточно естественным. + \item Поиск всех путей: необходимо предоставить все пути, удовлетворяющие заданным ограничениям. \end{itemize} С другой стороны, задачи могут различаться ещё и тем, как фиксируются множества стартовых и конечных вершин. Здесь возможны следующие варианты: \begin{itemize} -\item от одной вершины до всех, -\item между всеми парами вершин, -\item между фиксированной парой вершин, -\item между двумя множествами вершин $V_1$ и $V_2$, что подразумевает решение задачи для всех $(v_i,v_j) \in V_1 \times V_2$. + \item от одной вершины до всех, + \item между всеми парами вершин, + \item между фиксированной парой вершин, + \item между двумя множествами вершин $V_1$ и $V_2$, что подразумевает решение задачи для всех $(v_i,v_j) \in V_1 \times V_2$. \end{itemize} -Стоит отметить, что последний вариант является самым общим и остальные --- лишь его частные случаи. +Стоит отметить, что последний вариант является самым общим и остальные~--- лишь его частные случаи. Однако этот вариант часто выделяют отдельно, подразумевая, что остальные, выделенные, варианты в него не включаются. -В итоге, перебирая возможные варианты желаемого результата и способы фиксации стартовых и финальных вершин, мы можем сформулировать достаточно большое количество задач. Например, задачу поиска всех путей между двумя заданными вершинами, задачу поиска одного пути от фиксированной стартовой вершины до каждой вершины в графе, или задачу достижимости между всеми парами вершин. - -Часто поиск путей сопровождается изучением их свойств, что далее приводит к формулированию дополнительных ограничений на пути в терминах этих свойств. Например, можно потребовать, чтобы пути были простыми или не проходили через определённые вершины. Один из естественных способов описывать свойства и, как следствие, задавать ограничения --- это использовать ту алгебраическую структуру, из которой берутся веса рёбер графа\footnote{На самом деле здесь наблюдается некоторая двойственность. С одной стороны, действительно, удобно считать, что свойства описываются в терминах некоторой заданной алгебраической структуры. Но, вместе с этим, структура подбирается исходя из решаемой задачи.}. - -Предположим, что дан граф $\mathcal{G} = \langle V, E, L\rangle $, где $L = \langle S, \oplus, \otimes \rangle$ --- это полукольцо. Тогда изучение свойств путей можно описать следующим образом: -\begin{equation} \label{eq:algPathProblem} - \{(v_i, v_j, c) \mid \exists v_i \pi v_j, c = \bigoplus_{\forall v_i \pi v_j} \bigotimes_{(u,l,v) \in \pi } l \}. +В итоге, перебирая возможные варианты желаемого результата и способы фиксации стартовых и финальных вершин, мы можем сформулировать достаточно большое количество задач. +Например, задачу поиска всех путей между двумя заданными вершинами, задачу поиска одного пути от фиксированной стартовой вершины до каждой вершины в графе, или задачу достижимости между всеми парами вершин. + +Часто поиск путей сопровождается изучением их свойств, что далее приводит к формулированию дополнительных ограничений на пути в терминах этих свойств. +Например, можно потребовать, чтобы пути были простыми или не проходили через определённые вершины. +Один из естественных способов описывать свойства и, как следствие, задавать ограничения~--- это использовать ту алгебраическую структуру, из которой берутся веса рёбер графа% +\sidenote{На самом деле здесь наблюдается некоторая двойственность. + С одной стороны, действительно, удобно считать, что свойства описываются в терминах некоторой заданной алгебраической структуры. + Но, вместе с этим, структура подбирается исходя из решаемой задачи.}. + +Предположим, что дан граф $\mbfscrG = \langle V, E, L\rangle $, где $L = (S, \oplus, \otimes)$~--- это полукольцо. +Тогда изучение свойств путей можно описать следующим образом: +\begin{equation} + \label{eq:algPathProblem} + \left\{(v_i, v_j, c) \mid \exists v_i \pi v_j, c = \bigoplus_{\forall v_i \pi v_j} \bigotimes_{(u, l, v) \in \pi } l\right\}. \end{equation} +\marginnote{TODO: В общем случае меня смущает forall множестве, по которому происходит бинарная операция} -Иными словами, для каждой пары вершин, для которой существует хотя бы один путь, их соединяющий, мы агрегируем (с помощью операции $\oplus$ из полукольца) информацию обо всех путях между этими вершинами. При этом информация о пути получается как свёртка меток рёбер пути с использованием операции $\otimes$\footnote{Заметим, что детали свёртки вдоль пути зависят от свойств полукольца (и от решаемой задачи). Так, если полукольцо коммутативно, то нам не обязательно соблюдать порядок рёбер. В дальнейшем мы увидим, что данные особенности полукольца существенно влияют на особенности алгоритмов решения соответствующих задач.}. - -Естественным требованием (хотя бы для прикладных задач, решаемых таким способом) является существование и конечность указанной суммы. На данном этапе мы не будем касаться того, какие именно свойства полукольца могут нам обеспечить данное свойство, однако в дальнейшем будем считать, что оно выполняется. Более того, будем стараться приводить частные для конкретной задачи рассуждения, показывающие, почему это свойство выполняется в рассматриваемых в задаче ограничениях. +Иными словами, для каждой пары вершин, для которой существует хотя бы один путь, их соединяющий, мы агрегируем (с помощью операции $\oplus$ из полукольца) информацию обо всех путях между этими вершинами. +При этом информация о пути получается как свёртка меток рёбер пути с использованием операции $\otimes$\sidenote{Заметим, что детали свёртки вдоль пути зависят от свойств полукольца (и от решаемой задачи). + Так, если полукольцо коммутативно, то нам не обязательно соблюдать порядок рёбер. + В дальнейшем мы увидим, что данные особенности полукольца существенно влияют на особенности алгоритмов решения соответствующих задач.}. -Описанная выше задача общего вида называется анализом свойств путей алгебраическими методами (Algebraic Path Problem~\cite{Baras2010PathPI}) и предоставляет общий способ для решения широкого класса прикладных задач\footnote{В работе ``Path Problems in Networks''~\cite{Baras2010PathPI} собран действительно большой список прикладных задач с описанием соответствующих полуколец. Сводная таблица на страницах 58--59 содержит 29 различных прикладных задач и соответствующих полуколец.}. Наиболее известными являются такие задачи, как построение транзитивного замыкания графа и поиск кратчайших путей (All PAirs Shortest Path или APSP). Далее мы подробнее обсудим эти две задачи и предложим алгоритмы их решения. +Естественным требованием (хотя бы для прикладных задач, решаемых таким способом) является существование и конечность указанной суммы. +На данном этапе мы не будем касаться того, какие именно свойства полукольца могут нам обеспечить данное свойство, однако в дальнейшем будем считать, что оно выполняется. +Более того, будем стараться приводить частные для конкретной задачи рассуждения, показывающие, почему это свойство выполняется в рассматриваемых в задаче ограничениях. +Описанная выше задача общего вида называется анализом свойств путей алгебраическими методами (Algebraic Path Problem)~\sidecite{Baras2010PathPI} и предоставляет общий способ для решения широкого класса прикладных задач% +\sidenote{В работе \enquote{Path Problems in Networks}~\cite{Baras2010PathPI} собран действительно большой список прикладных задач с описанием соответствующих полуколец. + Сводная таблица на страницах 58--59 содержит 29 различных прикладных задач и соответствующих полуколец.}. +Наиболее известными являются такие задачи, как построение транзитивного замыкания графа и поиск кратчайших путей (All Pairs Shortest Path или APSP). +Далее мы подробнее обсудим эти две задачи и предложим алгоритмы их решения. \section{Алгоритм Флойда-Уоршелла} -Наиболее естественным образом решение обсуждаемых выражается в терминах операций над матрицей смежности исходного графа. Поэтому предположим, что исходный граф задан матрицей над моноидом $\mathbb{G} = (S,\oplus)$. - -Как мы видели ранее, операция $\oplus$ позволяет нам агрегировать информацию по всем параллельным рёбрам. Ровно она же и будет агрегировать информацию по всем путям между двумя вершинами\footnote{Вообще говоря, работая с матрицей смежности мы не видим разницу между путём и ребром, так как любая запись в матрице смежности в ячейке $[i,j]$ говорит нам только о том, что вершины $i$ и $j$ связаны и эта связь обладает некоторым свойством (значение в ячейке), и ничего не говорит о том, как эта связь устроена.}. Таким образом, осталось сконструировать операцию, отвечающую за агрегацию информации вдоль пути. Здесь мы будем исходить из того, что новый путь может быть получен из двух подпутей, а свойство нового пути зависит только от свойств исходных подпутей. - -Таким образом, дополнительная операция, обозначим её $\otimes: S \times S \to S$\footnote{При первом рассмотрении такой выбор кажется контринтуитивным. Действительно, ведь при соединении путей мы как бы ``складываем'' их веса. Но при более детальном анализе поведения этой операции, в частности, относительно нейтрального элемента, становится понятно, что она ведёт себя очень похоже на умножение. Вероятно, стоит обратить внимание на операцию конкатенации, которая, с одной стороны, ``делает то, что нам нужно'', а с другой, (и неспроста) часто обозначается $\cdot$.}, должна вести себя следующим образом. Пусть $S$ --- носитель моноида, $\mathbb{0} \in S$ --- нейтральный элемент относительно $\oplus$. -\begin{itemize}\label{itm:otimesIntro} - \item $s_1 \otimes s_2 = s_3, s_i \in S, s_i \neq \mathbb{0}$ : если существует путь $i \pi j$ со свойством $s_1$ и путь $j \pi k$ со свойством $s_2$, то существует путь $i \pi k$ со свойством $s_3$. - \item $s \otimes \mathbb{0} = \mathbb{0}$ : если существует путь $i \pi j$ со свойством $s$ и не существует пути $j \pi k$, то не существует и пути $i \pi k$. - \item $\mathbb{0} \otimes s = \mathbb{0}$ : если не существует пути $i \pi j$ и существует путь $j \pi k$ со свойством $s$, то не существует и пути $i \pi k$. - \item $\mathbb{0} \otimes \mathbb{0} = \mathbb{0}$ : если не существует пути $i \pi j$ и не существует пути $j \pi k$, то не существует и пути $i \pi k$. +Наиболее естественным образом решение обсуждаемых выражается в терминах операций над матрицей смежности исходного графа. +Поэтому предположим, что исходный граф задан матрицей над моноидом $\BbbG = (S,\oplus)$. + +Как мы видели ранее, операция $\oplus$ позволяет нам агрегировать информацию по всем параллельным рёбрам. +Ровно она же и будет агрегировать информацию по всем путям между двумя вершинами% +\sidenote{Вообще говоря, работая с матрицей смежности мы не видим разницу между путём и ребром, так как любая запись в матрице смежности в ячейке $[i, j]$ говорит нам только о том, что вершины $i$ и $j$ связаны и эта связь обладает некоторым свойством (значение в ячейке), и ничего не говорит о том, как эта связь устроена.}. +Таким образом, осталось сконструировать операцию, отвечающую за агрегацию информации вдоль пути. +Здесь мы будем исходить из того, что новый путь может быть получен из двух подпутей, а свойство нового пути зависит только от свойств исходных подпутей. + +Таким образом, дополнительная операция, обозначим её $\otimes: S \times S \to S$% +\sidenote{При первом рассмотрении такой выбор кажется контринтуитивным. + Действительно, ведь при соединении путей мы как бы \enquote{складываем} их веса. + Но при более детальном анализе поведения этой операции, в частности, относительно нейтрального элемента, становится понятно, что она ведёт себя очень похоже на умножение. + Вероятно, стоит обратить внимание на операцию конкатенации, которая, с одной стороны, \enquote{делает то, что нам нужно}, а с другой, (и неспроста) часто обозначается $\cdot$.}% +, должна вести себя следующим образом. Пусть $S$~--- носитель моноида, $\Bbbzero \in S$~--- нейтральный элемент относительно $\oplus$. +\begin{itemize} + \label{itm:otimesIntro} + \item $s_1 \otimes s_2 = s_3$, $s_i \in S$, $s_i \neq \Bbbzero$: если существует путь $i \pi j$ со свойством $s_1$ и путь $j \pi k$ со свойством $s_2$, то существует путь $i \pi k$ со свойством $s_3$. + \item $s \otimes \Bbbzero = \Bbbzero$: если существует путь $i \pi j$ со свойством $s$ и не существует пути $j \pi k$, то не существует и пути $i \pi k$. + \item $\Bbbzero \otimes s = \Bbbzero$: если не существует пути $i \pi j$ и существует путь $j \pi k$ со свойством $s$, то не существует и пути $i \pi k$. + \item $\Bbbzero \otimes \Bbbzero = \Bbbzero$: если не существует пути $i \pi j$ и не существует пути $j \pi k$, то не существует и пути $i \pi k$. \end{itemize} -Новую операцию добавим к моноиду и получим новую алгебраическую структуру $\mathbb{G}' = (S, \oplus,\otimes)$. Данная структура является коммутативным моноидом по сложению (по построению) с нейтральным элементом $\mathbb{0}$. Из построения $\otimes$ видно, что $\mathbb{0}$ является аннигилятором. Ничего более про операцию $\otimes$, а значит и про $\mathbb{G}'$ мы сказать, исходя из построения, не можем. Классический фреймворк для решения algebraic path problem подразумевает, что $\mathbb{G}'$ является полукольцом, однако далее мы увидим, что существуют задачи, в которых $\otimes$, например, не является ассоциативной\footnote{Такой будет рассматриваемая в данной работе задача достижимости с ограничениями в терминах формальных языков. Другие примеры можно найти в уже упоминавшейся работе~\cite{Baras2010PathPI}.}. А значит, согласно нашему определению, $\mathbb{G}'$ полукольцом не является. +Новую операцию добавим к моноиду и получим новую алгебраическую структуру $\BbbG' = (S, \oplus,\otimes)$. +Данная структура является коммутативным моноидом по сложению (по построению) с нейтральным элементом $\Bbbzero$. +Из построения $\otimes$ видно, что $\Bbbzero$ является аннигилятором. +Ничего более про операцию $\otimes$, а значит и про $\BbbG'$ мы сказать, исходя из построения, не можем. +Классический фреймворк для решения algebraic path problem подразумевает, что $\BbbG'$ является полукольцом, однако далее мы увидим, что существуют задачи, в которых $\otimes$, например, не является ассоциативной% +\sidenote{Такой будет рассматриваемая в данной работе задача достижимости с ограничениями в терминах формальных языков. + Другие примеры можно найти в уже упоминавшейся работе~\cite{Baras2010PathPI}.}. +А значит, согласно нашему определению, $\BbbG'$ полукольцом не является. Теперь, когда построена алгебраическая структура, обеспечивающая вычисление формулы~ -\ref{eq:algPathProblem}, мы можем предложить алгоритм вычисления этой формулы и данным алгоритмом в интересующих нас частных случаях будет являться алгоритм Флойда-Уоршелла~\cite{Floyd1962, Bernard1959, Warshall1962}. Псевдокод алгоритма представлен на листинге~\ref{lst:algoFloydWarxhall}, а его сложность $O(n^3)$. Он практически дословно основан на описанной выше идее сборки путей из двух подпутей: тройной вложенный цикл перебирает все возможные разбиения пути на две части, а в строке 7 как раз и происходит вычисление формулы~ -\ref{eq:algPathProblem}. - -Необходимо обратить внимание на несколько вещей. Первая --- порядок обхода. Внешний цикл перебирает возможные точки разбиения (хотя мог бы, например, перебирать начальные вершины) для того, чтобы гарантировать правильный порядок вычисления подпутей (информация ни о каких подпутях не будет получена после того, как они поучаствовали в построении более длинного пути). Вторая --- количество итераций. В данном случае мы ограничились тройным вложенным циклом от 0 до $n$ и для наших задач этого будет достаточно, однако, как доказательство этого факта, так и построение аналогичного алгоритма для других задач требует аккуратного анализа решаемой задачи и последующего доказательства корректности построенного алгоритма. - -\begin{algorithm} - \floatname{algorithm}{Listing} -\begin{algorithmic}[1] -\caption{Алгоритм Флойда-Уоршелла} -\label{lst:algoFloydWarxhall} -\Function{FloydWarshall}{$\mathcal{G}$} - \State{$M \gets$ матрица смежности $\mathcal{G}$} - \Comment{Матрица над $\mathbb{G}=(S,\oplus,\otimes)$} - \State{$n \gets |V(\mathcal{G})|$} - \For{k = 0; k < n; k++} - \For{i = 0; i < n; i++} - \For{j = 0; j < n; j++} - \State{$M[i,j] \gets M[i,j] \oplus (M[i,k] \otimes M[k,j])$} - \EndFor - \EndFor - \EndFor -\State \Return $M$ -\EndFunction -\end{algorithmic} -\end{algorithm} - -Хотя изначально данный алгоритм был предложен для решения задачи о кратчайших путях, при абстрагировании алгебраической структуры он превращается в алгоритм решения целого ряда задач. В частности --- нахождения транзитивного замыкания. Так, если возьмём тропическое полукольцо $(\mathbb{R}_{+\infty}, \min, +)$, то получим алгоритм для поиска кратчайших путей. Если же возьмём булево полукольцо, то получим алгоритм для построения транзитивного замыкания графа. - -\begin{example}[Транзитивное замыкание графа]\label{exmpl:transitiveClosure} - Пусть дан следующий граф: - \begin{center} - \input{figures/graph/graph2.tex} - \end{center} - - Его матрица смежности: - $$ M = - \begin{pmatrix} - 0 & 1 & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 1 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{pmatrix} - $$ - - Здесь мы считаем, что отношение достижимости не рефлексивно: все диагональные элементы матрицы $M$ равны 0. - - Воспользовавшись алгоритмом из листинга~\ref{lst:algoFloydWarxhall}, специализированного на случай булева полукольца, можно получить следующую матрицу смежности. - - $$ M' = - \begin{pmatrix} - 1 & 1 & 1 & 1 \\ - 1 & 1 & 1 & 1 \\ - 1 & 1 & 1 & 1 \\ - 1 & 1 & 1 & 1 - \end{pmatrix} - $$ - - А значит, транзитивным замыканием исходного графа является полный граф и он выглядит следующим образом. - - \begin{center} - \input{figures/graph/graph5.tex} - \end{center} - +\ref{eq:algPathProblem}, мы можем предложить алгоритм вычисления этой формулы и данным алгоритмом в интересующих нас частных случаях будет являться алгоритм Флойда-Уоршелла~\sidecite{Floyd1962, Bernard1959, Warshall1962}. +Псевдокод алгоритма представлен на листинге~\ref{lst:algoFloydWarshall}, а его сложность $O(n^3)$. +Он практически дословно основан на описанной выше идее сборки путей из двух подпутей: тройной вложенный цикл перебирает все возможные разбиения пути на две части, а в строке 7 как раз и происходит вычисление формулы~\ref{eq:algPathProblem}. + +Необходимо обратить внимание на несколько вещей. +Первая~--- порядок обхода. +Внешний цикл перебирает возможные точки разбиения (хотя мог бы, например, перебирать начальные вершины) для того, чтобы гарантировать правильный порядок вычисления подпутей (информация ни о каких подпутях не будет получена после того, как они поучаствовали в построении более длинного пути). +Вторая~--- количество итераций. +В данном случае мы ограничились тройным вложенным циклом от 0 до $n$ и для наших задач этого будет достаточно, однако, как доказательство этого факта, так и построение аналогичного алгоритма для других задач требует аккуратного анализа решаемой задачи и последующего доказательства корректности построенного алгоритма. + +% \begin{algorithm} +% \floatname{algorithm}{Listing} +% \begin{algorithmic}[1] +% \caption{Алгоритм Флойда-Уоршелла} +% \label{lst:algoFloydWarshall} +% \Function{FloydWarshall}{$\mbfscrG$} +% \State{$M \gets$ матрица смежности $\mbfscrG$} +% \Comment{Матрица над $\BbbG=(S,\oplus,\otimes)$} +% \State{$n \gets |V(\mbfscrG)|$} +% \For{k = 0; k < n; k++} +% \For{i = 0; i < n; i++} +% \For{j = 0; j < n; j++} +% \State{$M[i,j] \gets M[i,j] \oplus (M[i,k] \otimes M[k,j])$} +% \EndFor +% \EndFor +% \EndFor +% \State \Return $M$ +% \EndFunction +% \end{algorithmic} +% \end{algorithm} + +Хотя изначально данный алгоритм был предложен для решения задачи о кратчайших путях, при абстрагировании алгебраической структуры он превращается в алгоритм решения целого ряда задач. +В частности~--- нахождения транзитивного замыкания. +Так, если возьмём тропическое полукольцо $(\BbbR_{+\infty}, \min, +)$, то получим алгоритм для поиска кратчайших путей. +Если же возьмём булево полукольцо, то получим алгоритм для построения транзитивного замыкания графа. + +\begin{marginfigure} + \caption{Не полный граф} + \label{gr:graph2nottc} + \begin{center} + \input{figures/graph/graph2.tex} + \end{center} +\end{marginfigure} +\begin{marginfigure} + \caption{Полный граф} + \label{gr:graph5} + \begin{center} + \input{figures/graph/graph5.tex} + \end{center} +\end{marginfigure} +\begin{example}[Транзитивное замыкание графа] + \label{exmpl:transitiveClosure} + Пусть дан граф (см. рисунок~\ref{gr:graph2nottc}). + Его матрица смежности: + \[ + M = + \begin{pmatrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 1 & 0 & 0 & 1 \\ + 0 & 0 & 1 & 0 + \end{pmatrix}. + \] + + Здесь мы считаем, что отношение достижимости не рефлексивно: все диагональные элементы матрицы $M$ равны 0. + + Воспользовавшись алгоритмом из листинга~\ref{lst:algoFloydWarshall}, специализированного на случай булева полукольца, можно получить следующую матрицу смежности. + \[ + M' = + \begin{pmatrix} + 1 & 1 & 1 & 1 \\ + 1 & 1 & 1 & 1 \\ + 1 & 1 & 1 & 1 \\ + 1 & 1 & 1 & 1 + \end{pmatrix}. + \] + + А значит, транзитивным замыканием исходного графа является полный граф, изображенный на рисунке~\ref{gr:graph5}. \end{example} -Заметим, что рефлексивность отношения (значения элементов на главной диагонали матрицы смежности) непосредственно связана с особенностями решаемой задачи. Например, если говорить о кратчайших расстояниях, то кажется естественным считать расстояние от вершины до самой себя равной нулю. Однако для задачи транзитивного замыкания это уже не столь естественное предположение и часто отдельно говорят о рефлексивно-транзитивном замыкании, которое отдельно явным образом привносит рефлексивность (петли, диагональные элементы матрицы смежности). +Заметим, что рефлексивность отношения (значения элементов на главной диагонали матрицы смежности) непосредственно связана с особенностями решаемой задачи. +Например, если говорить о кратчайших расстояниях, то кажется естественным считать расстояние от вершины до самой себя равной нулю. +Однако для задачи транзитивного замыкания это уже не столь естественное предположение и часто отдельно говорят о рефлексивно-транзитивном замыкании, которое отдельно явным образом привносит рефлексивность (петли, диагональные элементы матрицы смежности). Аналогичным образом, используя данный алгоритм, но уже для тропического полукольца, можно решить задачу о поиске кратчайших путей для графа из примера~\ref{example:apspGraph}. Идеи, заложенные в алгоритме Флойда-Уоршелла, а также возможность абстрагировать его, помогут нам в дальнейшем предложить алгоритм для задачи достижимости с ограничениями в терминах формальных языков. - -\section{Анализ путей в графе и линейная алгебра} - -В данной главе мы рассмотрим некоторые связи\footnote{Связь между графами и линейной алгеброй --- обширная область, в которой можно даже выделить отдельные направления, такие как спектральная теория графов. С точки зрения практики данная связь также подмечена давно и более полно с ней можно ознакомиться, например, в работах~\cite{doi:10.1137/1.9780898719918, Davis2018Algorithm9S}. Кроме этого, много полезной информации можно найти на сайте \url{https://graphblas.github.io/GraphBLAS-Pointers/}.} между графами и операциями над ними и матрицами и операциями над матрицами. - -Как мы видели, достаточно естественное представление графа --- это его матрица смежности. Далее можно заметить некоторое сходство между определением матричного умножения~\ref{def:MxM} и мыслями, которыми мы руководствовались, вводя операцию $\otimes$ (\ref{itm:otimesIntro}). -Действительно, пусть есть матрица $M$ размера $n \times n$ над $\mathbb{G} = (S,\oplus,\otimes)$\footnote{Здесь мы уже сталкиваемся с тем, что могут иметь смысл относительно экзотические алгебраические структуры. Действительно, как мы выяснили, матрица смежности может быть определена на чем-то более бедным, чем полукольцо, а матичное умножение мы определяли над полукольцом. Но если задуматься, то и для определения произведения матриц полукольцо вовсе необязательно, достаточно более бедной структуры.} --- матрица смежности графа. Умножим её саму на себя: вычислим $M'= M \cdot M$. Тогда, по~\ref{def:MxM}, $M'[i,j] = \bigoplus_{0 \leq l < n} M[i,l] \otimes M[l,j]$. Размер $M'$ также $n \times n$. То есть $M'$ задаёт такой граф, что в нём будет путь со свойством, являющимся агрегацией свойств всех путей, составленных из двух подпутей в исходном графе. А именно, если в исходном графе есть путь из $i$ в $l$ с некоторым свойством (его значение хранится в $M[i,l]$), и был путь из $l$ в $j$ (его значение хранится в $M[l,j]$), то в новом графе свойство $M[i,l] \otimes M[l,j]$ аддитивно (используя $\oplus$) учтётся в свойстве пути из $i$ в $j$. - -Таким образом, произведение матриц смежности соответствует обработке информации о путях интересующим нас образом. Это наблюдение позволяет предложить решение задач анализа свойств путей, основанное на операциях над матрицами. Рассмотрим такое решение для задачи о кратчайших путях. - -Пусть $D_k$ --- матрица кратчайших путей, состоящих не более чем из $k$ рёбер. То есть $D_k[i,j]$ --- это длина кратчайшего пути из вершины $i$ в вершину $j$, такого, что он состоит не более чем из $k$ ребер. Если такого пути нет, то $D_k[i,j] = \infty$. - -Таким образом, $D_1 = M$, где $M$ --- это матрица смежности исходного графа, а решением APSP является $D_{n-1}$, вычисляемая с помощью следующего рекуррентного соотношения: - -\begin{center} - $D(1) = M$ \\ - $D(2) = D(1) \cdot M = M^2$ \\ - $D(3) = D(2) \cdot M = M^3$ \\ - $\dots$ \\ - $D(n-1) = D(n-2) \cdot M = M^{(n - 1)}$ \\ -\end{center} - -Здесь мы пользуемся той особенностью задачи, что кратчайший путь в ориентированном графе (без отрицательных циклов) не может быть длиннее $n$\footnote{Раз отрицательных циклов нету, то проходить через одну вершину, коих $n$, больше одного раза бессмысленно.}. -Более того, мы пользуемся тем, что используемая структура именно полукольцо, а исходное отношение рефлексивно\footnote{Тот факт, что в любой вершине есть петля с весом 0, а 0 --- нейтральный для $\otimes$, позволяет не суммировать матрицы. Итоговая матрица содержит данные о путях длины \textit{не больше чем} вычисляемая степень, хотя должна бы содержать данные о путях ровно и только такой длины. Предлагается самостоятельно исследовать данный феномен.}. - -Таким образом, решение APSP сведено к произведению матриц над тропическим полукольцом, однако вычислительная сложность решения слишком большая: $O(n K(n))$, где $K(n)$ --- сложность алгоритма умножения матриц. - -Чтобы улучшить сложность, заметим, что, например, $D_3$ вычислять не обязательно, так как можно сразу вычислить $D_4$ как $D_2 \cdot D_2$. - -В итоге получим следующую последовательность вычислений: - -\begin{center} - $D_1 = M$ \\ - $D_2 = M^2 = M \cdot M$ \\ - $D_4 = M^4 = M^2 \cdot M^2$ \\ - $D_8 = M^8 = M^4 \cdot M^4$ \\ - $\dots$ \\ - $D_{2^{\log(n-1)}} = M^{2^{\log(n-1)}} = M^{2^{\log(n-1)} - 1} \cdot M^{2^{\log(n-1)} - 1}$ \\ - $D_{n-1} = D_{2^{\log(n-1)}}$ \\ -\end{center} - -Теперь вместо $n$ итераций нам нужно $\log{n}$, а итоговая сложность решения --- $O(\log{n} K(n))$\footnote{Заметим, что это оценка для худшего случая. На практике при использовании данного подхода можно прекращать вычисления как только при двух последовательных шагах получились одинаковые матрицы ($D_i = D_{i-1}$). Это приводит нас к понятию \textit{неподвижной точки}, обсуждение которого лежит за рамками повествования.}. -Данный алгоритм называется \textit{repeated squaring}\footnote{Пример решения APSP с помощью repeated squaring: \url{http://users.cecs.anu.edu.au/~Alistair.Rendell/Teaching/apac_comp3600/module4/all_pairs_shortest_paths.xhtml}}. Здесь мы предполагаем, что $n-1 = 2^k$ для какого-то $k$. На практике такое верно далеко не всегда. Если это условие не выполняется, то необходимо взять ближайшую сверху степень двойки\footnote{Кажется, что это приведёт к избыточным вычислениям. Попробуйте оценить, на сколько много лишних вычислений будет сделано в худшем случае.}. - -Таким образом, APSP сводится к умножению матриц над полукольцом, что, к сожалению, не позволяет этим путём получить истинно субкубический алгоритм для задачи. тем не менее, позволяет получить слегка субкубический. Приведем некоторые работы по APSP для ориентированных графов с вещественными весами (здесь $n$ --- количество вершин в графе), по которым можно более детально ознакомиться как с историей вопроса, так и с текущими результатами: -\begin{itemize} - \item M.L. Fredman (1976) --- $O(n^3(\log \log n / \log n)^\frac{1}{3})$ --- использование дерева решений~\cite{FredmanAPSP1976} - \item W. Dobosiewicz (1990) --- $O(n^3 / \sqrt{\log n})$ --- использование операций на Word Random Access Machine~\cite{Dobosiewicz1990} - \item T. Takaoka (1992) --- $O(n^3 \sqrt{\log \log n / \log n})$ --- использование таблицы поиска~\cite{Takaoka1992} - \item Y. Han (2004) --- $O(n^3 (\log \log n / \log n)^\frac{5}{7})$~\cite{Han2004} - \item T. Takoaka (2004) --- $O(n^3 (\log \log n)^2 / \log n)$~\cite{Takaoka2004} - \item T. Takoaka (2005) --- $O(n^3 \log \log n / \log n)$~\cite{Takaoka2005} - \item U. Zwick (2004) --- $O(n^3 \sqrt{\log \log n} / \log n)$~\cite{Zwick2004} - \item T.M. Chan (2006) --- $O(n^3 / \log n)$ --- многомерный принцип ``разделяй и властвуй''~\cite{Chan2008} -\end{itemize} - -Вопрос же о истинно субкубических алгоритмах решения APSP всё ещё открыт~\cite{Chan2010} и активно обсуждается в научном сообществе. - -Аналогичным образом можно свести транзитивное замыкание к матричным операциям. Предлагаем проделать это самостоятельно, заодно обратив внимание на важность рефлексивности (в примере~\ref{exmpl:transitiveClosure} её нет). - -Заметим, что оптимизация, связанная с возведением в квадрат возможна только при ассоциативности произведения матриц, что зависит от свойств алгебраической структуры, над которой построены матрицы. Для полукольца такая оптимизация законна, однако в некоторых случаях её применить нельзя. Таким случаем как раз и будет рассматриваемая в нашей работе задача. Поэтому построение алгоритма её решения через операции над матрицами, хотя и будет основано на указанных выше соображениях, но будет сопряжено с некоторыми трудностями. - - -%\section{Вопросы и задачи} -%\begin{enumerate} -% \item Реализуйте абстракцию полукольца, позволяющую конструировать полукольца с произвольными операциями. -% \item Реализуйте алгоритм произведения матриц над произвольным полукольцом. Используйте результат решения предыдущей задачи. -% \item Используя результаты предыдущих задач, реализуйте алгоритм построения транзитивного замыкания через произведение матриц. -% \item Используя результаты предыдущих задач, реализуйте алгоритм решения задачи APSP для ориентированного через произведение матриц. -% \item Используя существующую библиотеку линейной алгебры для CPU, решите задачу построения транзитивного замыкания графа. -% \item Используя существующую библиотеку линейной алгебры для CPU, решите задачу APSP для ориентированного графа. -% \item Используя существующую библиотеку линейной алгебры для GPGPU, решите задачу построения транзитивного замыкания графа. -% \item Используя существующую библиотеку линейной алгебры для GPGPU, решите задачу APSP для ориентированного графа. -% \item Сравните произволительность решений предыдущих задач -%\end{enumerate} +%% FIXME: Исправить раздел +% \section{Анализ путей в графе и линейная алгебра} + +% В данной главе мы рассмотрим некоторые связи% +% \sidenote{Связь между графами и линейной алгеброй~--- обширная область, в которой можно даже выделить отдельные направления, такие как спектральная теория графов. +% С точки зрения практики данная связь также подмечена давно и более полно с ней можно ознакомиться, например, в работах~\cite{doi:10.1137/1.9780898719918, Davis2018Algorithm9S}. +% Кроме этого, много полезной информации можно найти на сайте \url{https://graphblas.github.io/GraphBLAS-Pointers/}.} +% между графами и операциями над ними и матрицами и операциями над матрицами. + +% Как мы видели, достаточно естественное представление графа~--- это его матрица смежности. +% Далее можно заметить некоторое сходство между определением матричного умножения~\ref{def:MxM} и мыслями, которыми мы руководствовались, вводя операцию $\otimes$ (\ref{itm:otimesIntro}). +% Действительно, пусть есть матрица $M$ размера $n \times n$ над $\BbbG = (S, \oplus, \otimes)$% +% \sidenote{Здесь мы уже сталкиваемся с тем, что могут иметь смысл относительно экзотические алгебраические структуры. +% Действительно, как мы выяснили, матрица смежности может быть определена на чем-то более бедным, чем полукольцо, а матричное умножение мы определяли над полукольцом. +% Но если задуматься, то и для определения произведения матриц полукольцо вовсе необязательно, достаточно более бедной структуры.}~--- матрица смежности графа. +% Умножим её саму на себя: вычислим $M'= M \cdot M$. +% Тогда, по~\ref{def:MxM}, $M'[i, j] = \bigoplus_{l \in [0 \rng n-1]} M[i, l] \otimes M[l, j]$. +% Размер $M'$ также $n \times n$. +% То есть $M'$ задаёт такой граф, что в нём будет путь со свойством, являющимся агрегацией свойств всех путей, составленных из двух подпутей в исходном графе. +% А именно, если в исходном графе есть путь из $i$ в $l$ с некоторым свойством (его значение хранится в $M[i, l]$), и был путь из $l$ в $j$ (его значение хранится в $M[l,j]$), то в новом графе свойство $M[i, l] \otimes M[l, j]$ аддитивно (используя $\oplus$) учтётся в свойстве пути из $i$ в $j$. + +% Таким образом, произведение матриц смежности соответствует обработке информации о путях интересующим нас образом. +% Это наблюдение позволяет предложить решение задач анализа свойств путей, основанное на операциях над матрицами. +% Рассмотрим такое решение для задачи о кратчайших путях. + +% Пусть $D_k$~--- матрица кратчайших путей, состоящих не более чем из $k$ рёбер. +% То есть $D_k[i, j]$~--- это длина кратчайшего пути из вершины $i$ в вершину $j$, такого, что он состоит не более чем из $k$ ребер. +% Если такого пути нет, то $D_k[i, j] = +\infty$. + +% Таким образом, $D_1 = M$, где $M$~--- это матрица смежности исходного графа, а решением APSP является $D_{n-1}$, вычисляемая с помощью следующего рекуррентного соотношения: +% \begin{gather*} +% D(1) = M \\ +% D(2) = D(1) \cdot M = M^2 \\ +% D(3) = D(2) \cdot M = M^3 \\ +% \vdots \\ +% D(n - 1) = D(n - 2) \cdot M = M^{(n - 1)} +% \end{gather*} + +% Здесь мы пользуемся той особенностью задачи, что кратчайший путь в ориентированном графе (без отрицательных циклов) не может быть длиннее $n$% +% \sidenote{Раз отрицательных циклов нету, то проходить через одну вершину, коих $n$, больше одного раза бессмысленно.}. +% Более того, мы пользуемся тем, что используемая структура именно полукольцо, а исходное отношение рефлексивно% +% \sidenote{ +% Тот факт, что в любой вершине есть петля с весом 0, а 0~--- нейтральный для $\otimes$, позволяет не суммировать матрицы. +% Итоговая матрица содержит данные о путях длины \emph{не больше чем} вычисляемая степень, хотя должна бы содержать данные о путях ровно и только такой длины. +% Предлагается самостоятельно исследовать данный феномен.}. + +% Таким образом, решение APSP сведено к произведению матриц над тропическим полукольцом, однако вычислительная сложность решения слишком большая: $O(n K(n))$, где $K(n)$~--- сложность алгоритма умножения матриц. + +% Чтобы улучшить сложность, заметим, что, например, $D_3$ вычислять не обязательно, так как можно сразу вычислить $D_4$ как $D_2 \cdot D_2$. + +% В итоге получим следующую последовательность вычислений: +% \begin{gather*} +% D_1 = M \\ +% D_2 = M^2 = M \cdot M \\ +% D_4 = M^4 = M^2 \cdot M^2 \\ +% D_8 = M^8 = M^4 \cdot M^4 \\ +% \vdots \\ +% D_{2^{\log(n-1)}} = M^{2^{\log(n-1)}} = M^{2^{\log(n-1)} - 1} \cdot M^{2^{\log(n-1)} - 1} \\ +% D_{n-1} = D_{2^{\log(n-1)}} +% \end{gather*} + +% Теперь вместо $n$ итераций нам нужно $\log{n}$, а итоговая сложность решения~--- $O(\log{n} K(n))$% +% \sidenote{ +% Заметим, что это оценка для худшего случая. +% На практике при использовании данного подхода можно прекращать вычисления как только при двух последовательных шагах получились одинаковые матрицы ($D_i = D_{i-1}$). +% Это приводит нас к понятию \emph{неподвижной точки}, обсуждение которого лежит за рамками повествования.}. +% Данный алгоритм называется \emph{repeated squaring}% +% \sidenote{Пример решения APSP с помощью repeated squaring: \url{http://users.cecs.anu.edu.au/~Alistair.Rendell/Teaching/apac_comp3600/module4/all_pairs_shortest_paths.xhtml}}. +% Здесь мы предполагаем, что $n-1 = 2^k$ для какого-то $k$. +% На практике такое верно далеко не всегда. +% Если это условие не выполняется, то необходимо взять ближайшую сверху степень двойки% +% \sidenote{ +% Кажется, что это приведёт к избыточным вычислениям. +% Попробуйте оценить, на сколько много лишних вычислений будет сделано в худшем случае.}. + +% Таким образом, APSP сводится к умножению матриц над полукольцом, что, к сожалению, не позволяет этим путём получить истинно субкубический алгоритм для задачи. +% Тем не менее, позволяет получить слегка субкубический. +% Приведем некоторые работы по APSP для ориентированных графов с вещественными весами (здесь $n$~--- количество вершин в графе), по которым можно более детально ознакомиться как с историей вопроса, так и с текущими результатами: +% \begin{itemize} +% \item M.L. Fredman (1976)~--- $O(n^3(\log \log n / \log n)^\frac{1}{3})$~--- использование дерева решений~\sidecite{FredmanAPSP1976} +% \item W. Dobosiewicz (1990)~--- $O(n^3 / \sqrt{\log n})$~--- использование операций на Word Random Access Machine~\sidecite{Dobosiewicz1990} +% \item T. Takaoka (1992)~--- $O(n^3 \sqrt{\log \log n / \log n})$~--- использование таблицы поиска~\sidecite{Takaoka1992} +% \item Y. Han (2004)~--- $O(n^3 (\log \log n / \log n)^\frac{5}{7})$~\sidecite{Han2004} +% \item T. Takoaka (2004)~--- $O(n^3 (\log \log n)^2 / \log n)$~\sidecite{Takaoka2004} +% \item T. Takoaka (2005)~--- $O(n^3 \log \log n / \log n)$~\sidecite{Takaoka2005} +% \item U. Zwick (2004)~--- $O(n^3 \sqrt{\log \log n} / \log n)$~\sidecite{Zwick2004} +% \item T.M. Chan (2006)~--- $O(n^3 / \log n)$~--- многомерный принцип \enquote{разделяй и властвуй}~\sidecite{Chan2008} +% \end{itemize} + +% Вопрос же о истинно субкубических алгоритмах решения APSP всё ещё открыт~\sidecite{Chan2010} и активно обсуждается в научном сообществе. + +% Аналогичным образом можно свести транзитивное замыкание к матричным операциям. +% Предлагаем проделать это самостоятельно, заодно обратив внимание на важность рефлексивности (в примере~\ref{exmpl:transitiveClosure} её нет). + +% Заметим, что оптимизация, связанная с возведением в квадрат возможна только при ассоциативности произведения матриц, что зависит от свойств алгебраической структуры, над которой построены матрицы. +% Для полукольца такая оптимизация законна, однако в некоторых случаях её применить нельзя. +% Таким случаем как раз и будет рассматриваемая в нашей работе задача. +% Поэтому построение алгоритма её решения через операции над матрицами, хотя и будет основано на указанных выше соображениях, но будет сопряжено с некоторыми трудностями. + +% %\section{Вопросы и задачи} +% %\begin{enumerate} +% % \item Реализуйте абстракцию полукольца, позволяющую конструировать полукольца с произвольными операциями. +% % \item Реализуйте алгоритм произведения матриц над произвольным полукольцом. Используйте результат решения предыдущей задачи. +% % \item Используя результаты предыдущих задач, реализуйте алгоритм построения транзитивного замыкания через произведение матриц. +% % \item Используя результаты предыдущих задач, реализуйте алгоритм решения задачи APSP для ориентированного через произведение матриц. +% % \item Используя существующую библиотеку линейной алгебры для CPU, решите задачу построения транзитивного замыкания графа. +% % \item Используя существующую библиотеку линейной алгебры для CPU, решите задачу APSP для ориентированного графа. +% % \item Используя существующую библиотеку линейной алгебры для GPGPU, решите задачу построения транзитивного замыкания графа. +% % \item Используя существующую библиотеку линейной алгебры для GPGPU, решите задачу APSP для ориентированного графа. +% % \item Сравните произволительность решений предыдущих задач +% %\end{enumerate} diff --git a/tex/Introduction.tex b/tex/Introduction.tex index 2c8c9e5..970f9c5 100644 --- a/tex/Introduction.tex +++ b/tex/Introduction.tex @@ -1,45 +1,46 @@ -\chapter*{Введение\markboth{Введение}{}} +\addchap{Введение} +\tikzsetfigurename{Introduction_} Теория формальных языков находит применение не только в ставших уже классическими задачах синтаксического анализа кода (языков программирования, искусственных языков) и естественных языков, но и в других областях, таких как статический анализ кода, графовые базы данных, биоинформатика, машинное обучение. -Например, в машинном обучении использование формальных грамматик позволяет передать искусственной генеративной нейронной сети, предназначенной для построения цепочек с определёнными свойствами, знания о синтаксической структуре этих цепочек, что позволяет существенно упростить процесс обучения и повысить качество результата~\cite{10.5555/3305381.3305582}. -Вместе с этим, развиваются подходы, позволяющие нейронным сетям наоборот извлекать синтаксическую структуру (строить дерево вывода) для входных цепочек~\cite{kasai-etal-2017-tag,kasai-etal-2018-end}. +Например, в машинном обучении использование формальных грамматик позволяет передать искусственной генеративной нейронной сети, предназначенной для построения цепочек с определёнными свойствами, знания о синтаксической структуре этих цепочек, что позволяет существенно упростить процесс обучения и повысить качество результата~\sidecite{10.5555/3305381.3305582}. +Вместе с этим, развиваются подходы, позволяющие нейронным сетям наоборот извлекать синтаксическую структуру (строить дерево вывода) для входных цепочек~\sidecite{kasai-etal-2017-tag,kasai-etal-2018-end}. -В биоинформатике формальные грамматики нашли широкое применение для описания особенностей вторичной структуры геномных и белковых последовательностей~\cite{Dyrka2019,WJAnderson2012,zier2013rna}. +В биоинформатике формальные грамматики нашли широкое применение для описания особенностей вторичной структуры геномных и белковых последовательностей~\sidecite{Dyrka2019,WJAnderson2012,zier2013rna}. Соответствующие алгоритмы синтаксического анализа используются при создании инструментов обработки данных. Таким образом, теория формальных языков выступает в качестве основы для многих прикладных областей, а алгоритмы синтаксического анализа применимы не только для обработки естественных языков или языков программирования. Нас же в данной работе будет интересовать применение теории формальных языков и алгоритмов синтаксического анализа для анализа графовых баз данных и для статического анализа кода. -Одна из классических задач, связанных с анализом графов --- это поиск путей в графе. +Одна из классических задач, связанных с анализом графов~--- это поиск путей в графе. Возможны различные формулировки этой задачи. В некоторых случаях необходимо выяснить, существует ли путь с определёнными свойствами между двумя выбранными вершинами. В других же ситуациях необходимо найти все пути в графе, удовлетворяющие некоторым свойствам или ограничениям. Например, в качестве ограничений можно указать, что искомый путь должен быть простым, кратчайшим, гамильтоновым и так далее. Один из способов задавать ограничения на пути в графе основан на использовании формальных языков. -Базовое определение языка говорит нам, что язык --- это множество слов над некоторым алфавитом. +Базовое определение языка говорит нам, что язык~--- это множество слов над некоторым алфавитом. Если рассмотреть граф, рёбра которого помечены символами из алфавита, то путь в таком графе будет задавать слово: достаточно соединить последовательно символы, лежащие на рёбрах пути. Множество же таких путей будет задавать множество слов или язык. Таким образом, если мы хотим найти некоторое множество путей в графе, то в качестве ограничения можно описать язык, который должно задавать это множество. Иными словами, задача поиска путей может быть сформулирована следующим образом: необходимо найти такие пути в графе, что слова, получаемые конкатенацией меток их рёбер, принадлежат заданному языку. Такой класс задач будем называть задачами поиска путей с ограничениям в терминах формальных языков. -Подобный класс задач часто возникает в областях, связанных с анализом граф-структурированных данных и активно исследуется~\cite{doi:10.1137/S0097539798337716,axelsson2011formal,10.1007/978-3-642-22321-1_24,Ward:2010:CRL:1710158.1710234,barrett2007label,doi:10.1137/S0097539798337716}. +Подобный класс задач часто возникает в областях, связанных с анализом граф-структурированных данных и активно исследуется~\sidecite{doi:10.1137/S0097539798337716,axelsson2011formal,10.1007/978-3-642-22321-1_24,Ward:2010:CRL:1710158.1710234,barrett2007label,doi:10.1137/S0097539798337716}. Исследуются как классы языков, применяемых для задания ограничений, так и различные постановки задачи. Граф-структурированные данные встречаются не только в графовых базах данных, но и при статическом анализе кода: по программе можно построить различные графы отображающие её свойства. Скажем, граф вызовов, граф потока данных и так далее. Оказывается, что поиск путей в специального вида графах с использованием ограничений в терминах формальных языков позволяет исследовать некоторые нетривиальные свойства программы. -Например проводить межпроцедурный анализ указателей или анализ псевдонимов (алиасов)~\cite{Zheng,10.1145/2001420.2001440,10.1145/2714064.2660213}, строить срезы программ~\cite{10.1145/193173.195287}, проводить анализ типов~\cite{10.1145/373243.360208}. +Например проводить межпроцедурный анализ указателей или анализ псевдонимов (алиасов)~\sidecite{Zheng,10.1145/2001420.2001440,10.1145/2714064.2660213}, строить срезы программ~\sidecite{10.1145/193173.195287}, проводить анализ типов~\sidecite{10.1145/373243.360208}. В данной работе представлен ряд алгоритмов для поиска путей с ограничениями в терминах формальных языков. -Основной акцент будет сделан на контекстно-свободных языках, однако будут затронуты и другие классы: регулярные, многокомпонентные контекстно-свободные (Multiple Context-Free Languages, MCFL~\cite{SEKI1991191}) и конъюнктивные языки. +Основной акцент будет сделан на контекстно-свободных языках, однако будут затронуты и другие классы: регулярные, многокомпонентные контекстно-свободные (Multiple Context-Free Languages, MCFL~\sidecite{SEKI1991191}) и конъюнктивные языки. Будет показано, что теория формальных языков и алгоритмы синтаксического анализа применимы не только для анализа языков программирования или естественных языков, а также для анализа графовых баз данных и статического анализа кода, что приводит к возникновению новых задач и переосмыслению старых. - Структура данной работы такова. -В начале (в части~\ref{chpt:GraphTheoryIntro}) мы рассмотрим основные понятия из теории графов, необходимые в данной работе. Данные разделы являются подготовительными и не обязательны к прочтению, если такие понятия как \textit{ориентированный граф} и \textit{матрица смежности} уже известны читателю. Более того, они лишь вводят определения, подразумевая, что более детальное изучение соответствующих разделов науки остается за рамками этой работы и скорее всего уже проделано читателем. +В начале (в части~\ref{chpt:GraphTheoryIntro}) мы рассмотрим основные понятия из теории графов, необходимые в данной работе. Данные разделы являются подготовительными и не обязательны к прочтению, если такие понятия как \textit{ориентированный граф} и \textit{матрица смежности} уже известны читателю. +Более того, они лишь вводят определения, подразумевая, что более детальное изучение соответствующих разделов науки остается за рамками этой работы и скорее всего уже проделано читателем. Затем, в главе~\ref{chpt:FormalLanguageTheoryIntro} мы введём основные понятия из теории формальных языков. Далее, в главе~\ref{chpt:FLPQ} рассмотрим различные варианты постановки задачи поиска путей с ограничениями в терминах формальных языков, обсудим базовые свойства задач, её разрешимость в различных постановках и т.д.. И в итоге зафиксируем постановку, которую будем изучать далее. @@ -47,32 +48,41 @@ \chapter*{Введение\markboth{Введение}{}} Большинство алгоритмов будут основаны на классических алгоритмах синтаксического анализа, таких как CYK или LR. %Все главы, начиная с~\ref{chpt:GraphTheoryIntro}, снабжены списком вопросов и задач для самостоятельного решения и закрепления материала. -\begin{center} - \begin{tikzpicture}[shorten >=1pt,on grid,auto] - \node (q_linal) [text width=4cm] {Некоторые понятия линейной алгебры}; - \node (q_graphtheory) [below of=q_linal, text width=4cm] {Некоторые сведения из теории графов}; - \node (q_fortmallang) [right of=q_graphtheory, text width=4cm] {Общие сведения теории формальных языков}; - \node (q_reglang) [below of=q_fortmallang, text width=4cm] {Регулярные языки}; - \node (q_cflang) [right of=q_reglang, text width=4cm] {Контекстно-свободные языки и грамматики}; - \node (q_mcfl) [right of=q_cflang, text width=4cm] {Многокомпонентные контекстно-свободные языки}; - \node (q_flpq) [below of=q_graphtheory, text width=4cm] {Пути с ограничениями в терминах формальных языков}; - - \node (q_rpq) [below of=q_reglang, text width=4cm] {Поиск путей с регулярными ограничениями}; - \node (q_cfpq) [below of=q_cflang, text width=4cm] {Пути с ограничениями в терминах контекстно-свободных языков}; - \node (q_mcfpq) [below of=q_mcfl, text width=4cm] {Пути с ограничениями в терминах многокомпонентных контекстно-свободных языков}; - \path[->] - (q_linal) edge node {} (q_graphtheory) - (q_graphtheory) edge node {} (q_flpq) - (q_fortmallang) edge node {} (q_flpq) - (q_fortmallang) edge node {} (q_reglang) - (q_fortmallang) edge node {} (q_cflang) - (q_fortmallang) edge node {} (q_mcfl) - (q_reglang) edge node {} (q_rpq) - (q_cflang) edge node {} (q_cfpq) - (q_mcfl) edge node {} (q_mcfpq) - (q_flpq) edge node {} (q_rpq) - (q_flpq) edge node {} (q_cfpq) - (q_flpq) edge node {} (q_mcfpq) - ; - \end{tikzpicture} -\end{center} \ No newline at end of file +\begin{figure*} + \caption{Структура данной книги} + \begin{center} + \begin{tikzpicture}[shorten >= 1pt, + auto, + node distance=0.5cm, + every node/.style = {shape=rectangle, draw, rounded corners}, + align = center] + \node (q_linal) {Некоторые понятия \\ линейной алгебры}; + + \node (q_graphtheory) [below = of q_linal, ] {Некоторые сведения \\ из теории графов}; + \node (q_fortmallang) [right = 2 of q_graphtheory] {Общие сведения теории \\ формальных языков}; + + \node (q_flpq) [below = of q_graphtheory] {Пути с ограничениями \\ в терминах формальных \\ языков}; + \node (q_reglang) [right = of q_flpq] {Регулярные \\ языки}; + \node (q_cflang) [right = of q_reglang] {Контекстно-свободные \\ языки и грамматики}; + \node (q_mcfl) [right = of q_cflang] {Многокомпонентные \\ контекстно-свободные \\ языки}; + + \node (q_rpq) [below = 2 of q_flpq] {Поиск путей \\ с регулярными \\ ограничениями}; + \node (q_cfpq) [below = 2 of q_reglang] {Пути с ограничениями \\ в терминах \\ контекстно-свободных \\ языков}; + \node (q_mcfpq) [right = of q_cfpq] {Пути с ограничениями \\ в терминах \\ многокомпонентных \\ контекстно-свободных \\ языков}; + + \path[->] + (q_linal) edge (q_graphtheory) + (q_graphtheory) edge (q_flpq) + (q_fortmallang) edge (q_flpq) + (q_fortmallang) edge (q_reglang) + (q_fortmallang) edge (q_cflang) + (q_fortmallang) edge (q_mcfl) + (q_reglang) edge (q_rpq) + (q_cflang) edge (q_cfpq) + (q_mcfl) edge (q_mcfpq) + (q_flpq) edge (q_rpq) + (q_flpq) edge (q_cfpq) + (q_flpq) edge (q_mcfpq); + \end{tikzpicture} + \end{center} +\end{figure*} diff --git a/tex/LinearAlgebra.tex b/tex/LinearAlgebra.tex index 6eb03a4..bd44a90 100644 --- a/tex/LinearAlgebra.tex +++ b/tex/LinearAlgebra.tex @@ -1,774 +1,804 @@ -\chapter[Некоторые понятия линейной алгебры]{Некоторые понятия линейной алгебры\footnote{Неообходимо понимать, что, с одной строны, в данном разделе рассматриваются самые базовые понятия, которые даются практически в любом учебнике алгебры. С другой же стороны, определения данных понятий оказываются весьма вариативными и часто вызывают дискуссии. Напрмиер, интересный анализ тонкостей определения группы можно найти в первом и втором параграфах первого раздела книги Николая Александровича Вавилова ``Конкретная теория групп''~\cite{VavilovGroups}. Мы же дадим определения, удобные для дальнейшего изложения материала.}}\label{chpt:LinAlIntro} +\setchapterpreamble[u]{\margintoc} +\chapter{Некоторые понятия линейной алгебры} +\label{chpt:LinAlIntro} +\tikzsetfigurename{LinearAlgebra_} При изложении ряда алгоритмов будут активно использоваться некоторые понятия и инструменты линейной алгебры, такие как моноид, полукольцо или матрица. -В данном разделе необходимые понятия будут определены и приведены некоторые примеры соответствующих конструкций. Для более глубокого изучения материала рекомендуются обратиться к соответствующим разделам алгебры. - +В данном разделе необходимые понятия будут определены и приведены некоторые примеры соответствующих конструкций. +Для более глубокого изучения материала рекомендуются обратиться к соответствующим разделам алгебры. +\marginnote[*6]{ + Неообходимо понимать, что, с одной строны, в данном разделе рассматриваются самые базовые понятия, которые даются практически в любом учебнике алгебры. + С другой же стороны, определения данных понятий оказываются весьма вариативными и часто вызывают дискуссии. + Например, интересный анализ тонкостей определения группы можно найти в первом и втором параграфах первого раздела книги Николая Александровича Вавилова \enquote{Конкретная теория групп}~\cite{VavilovGroups}. + Мы же дадим определения, удобные для дальнейшего изложения материала. +} \section{Бинарные операции и их свойства} +Введём понятие \emph{бинарной операции} и рассмотрим некоторые её свойства, такие как \emph{коммутативность} и \emph{ассоциативность}. -Введём понятие \textit{бинарной операции} и рассмотрим некоторые её свойства, такие как \textit{коммутативность} и \textit{ассоциативность}. - -\begin{definition} - \textit{Функцией} будем называть бинарное отношение на двух множествах $X$ и $Y$, такое, что каждому элементу из $X$ сопоставляется ровно один элемент из $Y$. Запись $f: X \to Y$ как раз и обозначает, что функция $f$ сопоставляет элементы из $X$ элементам из $Y$. +\begin{definition}[Функция] + \emph{Функцией} будем называть бинарное отношение на двух множествах $S$ и $T$, такое, что каждому элементу из $S$ сопоставляется ровно один элемент из $T$. + Запись $f: S \to T$ как раз и обозначает, что функция $f$ сопоставляет элементы из $S$ элементам из $T$. \end{definition} -\begin{definition} - Для функции $f: X \to Y$, множество $X$ называется \textit{областью определения функции} или \textit{доменом функции}. +\begin{definition}[Домен функции] + Для функции $f: S \to T$, множество $S$ называется \emph{областью определения функции} или \emph{доменом функции}. \end{definition} -\begin{definition} - Для функции $f: X \to Y$, множество $Y$ называется \textit{областью значений функции} или \textit{кодоменом функции}. +\begin{definition}[Кодомен функции] + Для функции $f: S \to T$, множество $T$ называется \emph{областью значений функции} или \emph{кодоменом функции}. \end{definition} -\begin{definition} - Функцию, принимающую два аргумента, $f: S \times K \to Q$ будем называть \emph{двухместной} или \emph{функцией арности два}. -Для записи таких функций будем использовать типичную нотацию: $c = f(a,b)$. +\begin{definition}[Двухместная функция] + Функцию, принимающую два аргумента, $f: R \times S \to T$ будем называть \emph{двухместной} или \emph{функцией арности два}. + Для записи таких функций будем использовать типичную нотацию: $t = f(r, s)$. \end{definition} - -\begin{definition} -\emph{Бинарная операция} --- это двухместная функция, от которой дополнительно требуется, чтобы оба аргумента и результат лежали в одном и том же множестве: $f: S \times S \to S$. В таком случае говорят, что бинарная операция определена на некотором множестве $S$. Для обозначения произвольной бинарной операции будем использовать символ $\circ$ и пользоваться инфиксной нотацией для записи: $c = a \circ b$. +\begin{definition}[Бинарная операция] + \emph{Бинарная операция}~--- это двухместная функция, от которой дополнительно требуется, чтобы оба аргумента и результат лежали в одном и том же множестве: $f: S \times S \to S$. + В таком случае говорят, что бинарная операция определена на некотором множестве $S$. Для обозначения произвольной бинарной операции будем использовать символ $\circ$ и пользоваться инфиксной нотацией для записи: $s_3 = s_1 \circ s_2$. \end{definition} - - - -\begin{definition} -\emph{Внешняя бинарная операция} --- это бинарная операция, у которой аргументы лежат в разных множествах, при этом результат --- в одном из этих множеств. Иными словами $\circ: K \times S \to S$, где $K$ может не совпадать с $S$ --- внешняя бинарная операция. +\begin{definition}[Внешняя бинарная операция] + \emph{Внешняя бинарная операция}~--- это бинарная операция, у которой аргументы лежат в разных множествах, при этом результат~--- в одном из этих множеств. + Иными словами $\circ: R \times S \to S$, где $R$ может не совпадать с $S$~--- внешняя бинарная операция. \end{definition} +Необходимо помнить, что как функции, так и бинарные операции, могут быть частично определёнными (частичные функции, частичные бинарные операции). +Типичным примером частично определённой бинарной операции является деление на целых числах: она не определена, если второй аргумент равен нулю. -Необходимо помнить, что как функции, так и бинарные операции, могут быть частично определёнными (частичные функции, частичные бинарные операции). Типичным примером частично определённой бинарной операции является деление на целых числах: она не определена, если второй аргумент равен нулю. - - -Бинарные операции могут обладать некоторыми дополнительными свойствами, такими как \textit{коммутативность} или \textit{ассоциативность}, позволяющими преобразовывать выражения, составленные с использованием этих операций. - +Бинарные операции могут обладать некоторыми дополнительными свойствами, такими как \emph{коммутативность} или \emph{ассоциативность}, позволяющими преобразовывать выражения, составленные с использованием этих операций. -\begin{definition} -Бинарная операция $\circ : S \times S \to S$ называется \emph{коммутативной}, если для любых $x_1 \in S, x_2 \in S$ верно, что $x_1 \circ x_2 = x_2 \circ x_1$. +\begin{definition}[Коммутативная операция] + Бинарная операция $\circ : S \times S \to S$ называется \emph{коммутативной}, если для любых $s_1, s_2 \in S$ верно, что $s_1 \circ s_2 = s_2 \circ s_1$. \end{definition} -\begin{example} Рассмотрим несколько примеров коммутативных и некоммутативных операций. - \begin{itemize} - \item Операция сложения на целых числах $+$ является коммутативной: известный ещё со школы перестановочный закон сложения. - \item Операция конкатенации на строках $\cdot$ не является коммутативной: $$``ab" \cdot ``c" \, = ``abc" \neq ``cab" \, = ``c" \cdot ``ab".$$ - \item Операция умножения на целых числах является коммутативной: известный ещё со школы перестановочный закон умножения. - \item Операция умножения матриц (над целыми числами) $\cdot$ не является коммутативной: - $$\begin{pmatrix} - 1 & 1 \\ 0 & 0 - \end{pmatrix} - \cdot - \begin{pmatrix} - 0 & 0 \\ 1 & 1 - \end{pmatrix} - = - \begin{pmatrix} - 1 & 1 \\ 0 & 0 - \end{pmatrix} - \neq - \begin{pmatrix} - 0 & 0 \\ 1 & 1 - \end{pmatrix} - = - \begin{pmatrix} - 0 & 0 \\ 1 & 1 - \end{pmatrix} - \cdot - \begin{pmatrix} - 1 & 1 \\ 0 & 0 - \end{pmatrix} - .$$ - \end{itemize} +\begin{example} + Рассмотрим несколько примеров коммутативных и некоммутативных операций. + \begin{itemize} + \item Операция сложения на целых числах является коммутативной: известный ещё со школы перестановочный закон сложения. + \item Операция умножения на целых числах является коммутативной: известный ещё со школы перестановочный закон умножения. + \item Операция конкатенации на строках\marginnote{TODO: Здесь слова о том, что из текста далее будет понятно, почему именно точка} $\cdot$ не является коммутативной: + \["ab" \cdot "c" = "abc" \neq "cab" = "c" \cdot "ab".\] + \item Операция умножения матриц (над целыми числами) $\cdot$ не является коммутативной: + \[\begin{pmatrix} + 1 & 1 \\ + 0 & 0 + \end{pmatrix} + \cdot + \begin{pmatrix} + 0 & 0 \\ + 1 & 1 + \end{pmatrix} + = + \begin{pmatrix} + 1 & 1 \\ + 0 & 0 + \end{pmatrix} + \neq + \begin{pmatrix} + 0 & 0 \\ + 1 & 1 + \end{pmatrix} + = + \begin{pmatrix} + 0 & 0 \\ + 1 & 1 + \end{pmatrix} + \cdot + \begin{pmatrix} + 1 & 1 \\ + 0 & 0 + \end{pmatrix} + .\] + \end{itemize} \end{example} -\begin{definition} -Бинарная операция $\circ : S \times S \to S$ называется \emph{ассоциативной}, если для любых $x_1 \in S, x_2 \in S, x_3 \in S$ верно, что $(x_1 \circ x_2) \circ x_3 = x_1 \circ (x_2 \circ x_3)$. Иными словами, для ассоциативной операции результат вычислений не зависит от порядка применения операций. +\begin{definition}[Ассоциативная бинарная операция] + Бинарная операция $\circ: S \times S \to S$ называется \emph{ассоциативной}, если для любых $s_1, s_2, s_3 \in S$ верно, что $(s_1 \circ s_2) \circ s_3 = s_1 \circ (s_2 \circ s_3)$. + Иными словами, для ассоциативной операции результат вычислений не зависит от порядка применения операций. \end{definition} \begin{example} Рассмотрим несколько примеров ассоциативных и неассоциативных операций. - \begin{itemize} - \item Операция сложения на целых числах $+$ является ассоциативной. - \item Операция умножения на целых числах является ассоциативной. - \item Операция конкатенации на строках $\cdot$ является ассоциативной: $$(``a" \cdot ``b") \cdot ``c" \, = ``a" \cdot (``b" \cdot ``c") = ``abc" .$$ - \item Операция возведения в степень (над целыми числами) $\hat{\mkern6mu}$ не является ассоциативной: - $$(2\hat{\mkern6mu}2)\hat{\mkern6mu}3 = 4 \hat{\mkern6mu} 3 = 64 \neq 256 = 2 \hat{\mkern6mu} 8 = 2\hat{\mkern6mu}(2\hat{\mkern6mu}3).$$ - \end{itemize} + \begin{itemize} + \item Операция сложения на целых числах является ассоциативной. + \item Операция умножения на целых числах является ассоциативной. + \item Операция конкатенации на строках $\cdot$ является ассоциативной: + \[("a" \cdot "b") \cdot "c" = "a" \cdot ("b" \cdot "c") = "abc".\] + \item Операция возведения в степень (над целыми числами) $\hat{\mkern6mu}$ не является ассоциативной: + \[(2\hat{\mkern6mu}2)\hat{\mkern6mu}3 = 4 \hat{\mkern6mu} 3 = 64 \neq 256 = 2 \hat{\mkern6mu} 8 = 2\hat{\mkern6mu}(2\hat{\mkern6mu}3).\] + \end{itemize} \end{example} - -\begin{definition} -Говорят, что бинарная операция $\otimes : S \times S \to S$ является \emph{дистрибутивной} относительно бинарной операции $\oplus : S \times S \to S$, если -\begin{enumerate} - \item Для любых $x_1,x_2,x_3 \in S, x_1 \otimes (x_2 \oplus x_3) = (x_1 \otimes x_2) \oplus (x_1 \otimes x_3)$ (дистрибутивность слева). - \item Для любых $x_1,x_2,x_3 \in S, (x_2 \oplus x_3) \otimes x_1 = (x_2 \otimes x_1) \oplus (x_3 \otimes x_1)$ (дистрибутивность справа). -\end{enumerate} - -Если операция $\otimes$ является коммутативной, то дистрибутивность слева и справа равносильны. - +\begin{definition}[Дистрибутивная бинарная операция] + Говорят, что бинарная операция $\otimes: S \times S \to S$ является \emph{дистрибутивной} относительно бинарной операции $\oplus: S \times S \to S$, если + \begin{enumerate} + \item Для любых $s_1, s_2, s_3 \in S$, $s_1 \otimes (s_2 \oplus s_3) = (s_1 \otimes s_2) \oplus (s_1 \otimes s_3)$ (дистрибутивность слева). + \item Для любых $s_1, s_2 ,s_3 \in S$, $(s_2 \oplus s_3) \otimes s_1 = (s_2 \otimes s_1) \oplus (s_3 \otimes s_1)$ (дистрибутивность справа). + \end{enumerate} + Если операция $\otimes$ является коммутативной, то дистрибутивность слева и справа равносильны. \end{definition} -\begin{example} Рассмотрим несколько примеров дистрибутивных операций. - -\begin{itemize} - \item Умножение целых чисел дистрибутивно относительно сложения и вычитания: классический \textit{распределительный закон}, знакомый всем со школы. - \item Операция деления (допустим, на действительных числах) не коммутативна. При этом, она дистрибутивна справа относительно сложения и вычитания, но не дистрибутивна слева\footnote{Здесь может быть уместно вспомнить правила сложения дробей. Дроби с общим знаминателем складывать проще как раз из-за дистрибутивности справа.}. - $$(a + b) / c = (a / c) + (b / c) $$ - но - $$c / (a + b) \neq (c / a) + (c / b).$$ -\end{itemize} - +\begin{example} + Рассмотрим несколько примеров дистрибутивных операций. + \begin{itemize} + \item Умножение целых чисел дистрибутивно относительно сложения и вычитания: классический \emph{распределительный закон}, знакомый всем со школы. + \item Операция деления (допустим, на действительных числах) не коммутативна. + При этом, она дистрибутивна справа относительно сложения и вычитания, но не дистрибутивна слева% + \sidenote{ + Здесь может быть уместно вспомнить правила сложения дробей. + Дроби с общим знаминателем складывать проще как раз из-за дистрибутивности справа.}. + Так, $(a + b) / c = (a / c) + (b / c)$, но $c / (a + b) \neq (c / a) + (c / b)$. + \end{itemize} \end{example} -\begin{definition} -Бинарная операция $\circ : S \times S \to S$ называется \emph{идемпотентной}, если для любого $x \in S$ верно, что $x \circ x = x$. +\begin{definition}[Идемпотентная бинарная операция] + Бинарная операция $\circ: S \times S \to S$ называется \emph{идемпотентной}, если для любого $s \in S$ верно, что $s \circ s = s$. \end{definition} - - -\begin{example} Рассмотрим несколько примеров идемпотентных операций. - -\begin{itemize} - \item Операция объединения множеств $\cup$ является идемпотентной: для любого множества $S$ верно, что $S \cup S = S$. - \item Операция сложения на целых числах не является идемпотентной. - \item Операции ``логическое и'' $\wedge$ и ``логическое или'' $\vee$ являются идемпотентными. - \item Операция ``исключающее или'' (\texttt{XOR}) не является идемпотентной. -\end{itemize} - +\begin{example} + Рассмотрим несколько примеров идемпотентных операций. + \begin{itemize} + \item Операция объединения множеств $\cup$ является идемпотентной: для любого множества $S$ верно, что $S \cup S = S$. + \item Операция сложения на целых числах не является идемпотентной. + \item Операции \enquote{логическое и} $\land$ и \enquote{логическое или} $\lor$ являются идемпотентными. + \item Операция \enquote{исключающее или} (\textsf{XOR}) не является идемпотентной. + \end{itemize} \end{example} -\begin{definition} -Пусть есть коммутативная бинарная операция $\circ$ на множестве $S$. Говорят, что $x\in S$ является \emph{нейтральным элементом} по операции $\circ$, если для любого $y\in S$ верно, что $x \circ y = y \circ x = y$. Если бинарная операция не является коммутативной, то можно определить \textit{нейтральный слева} и \textit{нейтральный справа} элементы по аналогии. +\begin{definition}[Нейтральный элемент] + Пусть есть коммутативная бинарная операция $\circ$ на множестве $S$. + Говорят, что $e \in S$ является \emph{нейтральным элементом} по операции $\circ$, если для любого $s \in S$ верно, что $e \circ s = s \circ e = s$. + Если бинарная операция не является коммутативной, то можно определить \emph{нейтральный слева} и \emph{нейтральный справа} элементы по аналогии. \end{definition} - \section{Полугруппа} - -\begin{definition} -Множество $S$ с заданной на нём ассоциативной бинарной операцией $\cdot : S \times S \to S$ называется \emph{полугруппой} и обозначается $(S, \cdot)$. -Если операция $\cdot$ является коммутативной, то говорят о \textit{коммутативной полугруппе}. +\begin{definition}[Полугруппа] + Множество $S$ с заданной на нём ассоциативной бинарной операцией $\cdot: S \times S \to S$ называется \emph{полугруппой} и обозначается $(S, \cdot)$. + Если операция $\cdot$ является коммутативной, то говорят о \emph{коммутативной полугруппе}. \end{definition} - -\begin{example} Приведём несколько примеров полугрупп. -\begin{itemize} - \item Множество положительных целых чисел с операцией сложения является коммутативной полугруппой. - \item Множество целых чисел с операцией взятия наибольшего из двух ($\max$) является коммутативной полугруппой. - \item Множество всех строк конечной длины без пустой строки\footnote{Множество всех строк конечной длины c пустой строкой также является полугруппой. Однако, такая структура является ещё и моноидом, что будет показано далее.} над фиксированным алфавитом $\Sigma$ с операцией конкатенации является полугруппой. Так как конкатенация на строках не является коммутативной операцией, то и полугруппа не является коммутативной. -\end{itemize} +\begin{example} + Приведём несколько примеров полугрупп. + \begin{itemize} + \item Множество положительных целых чисел с операцией сложения является коммутативной полугруппой. + \item Множество целых чисел с операцией взятия наибольшего из двух ($\max$) является коммутативной полугруппой. + \item Множество всех строк конечной длины без пустой строки% + \sidenote{ + Множество всех строк конечной длины c пустой строкой также является полугруппой. + Однако, такая структура является ещё и моноидом, что будет показано далее.} + над фиксированным алфавитом $\Sigma$ с операцией конкатенации является полугруппой. + Так как конкатенация на строках не является коммутативной операцией, то и полугруппа не является коммутативной. + \end{itemize} \end{example} - \section{Моноид} - -\begin{definition} - \emph{Моноидом} называется полугруппа с нейтральным элементом. Если операция является коммутативной, то можно говорить о \emph{коммутативном моноиде}. +\begin{definition}[Моноид] + \emph{Моноидом} называется полугруппа с нейтральным элементом. + Если операция является коммутативной, то можно говорить о \emph{коммутативном моноиде}. \end{definition} -\begin{example} Приведём примеры моноидов, построенных на основе полугрупп из предыдущего раздела. - -\begin{itemize} - \item Неотрицательные целые числа (или же натуральные числа с нулём) с операцией сложения являются моноидом. Нейтральный элемент --- $0$. - \item Целые числа, дополненные значением $-\infty$ (``минус-бесконечность'') с операцией взятия наибольшего из двух ($\max$) являются моноидом. Нейтральный элемент --- $-\infty$. - \item Множество всех строк конечной длины с пустой строкой (строка длины 0) над фиксированным алфавитом $\Sigma$ и операцией конкатенации является моноидом. Нейтральный элемент --- пустая строка. - \item Квадратные неотрицательные матрицы\footnote{Неотрицательной называется матрица, все элементы которой не меньше нуля.} фиксированного размера с операцией умножения задают моноид. Нейтральный элемент --- единичная матрица. -\end{itemize} +\begin{example} + Приведём примеры моноидов, построенных на основе полугрупп из предыдущего раздела. + \begin{itemize} + \item Неотрицательные целые числа (или же натуральные числа с нулём) с операцией сложения являются моноидом. + Нейтральный элемент~--- $0$. + \item Целые числа, дополненные значением $-\infty$ (\enquote{минус бесконечность}) с операцией взятия наибольшего из двух ($\max$) являются моноидом. + Нейтральный элемент~--- $-\infty$. + \item Множество всех строк конечной длины с пустой строкой (строка длины 0) над фиксированным алфавитом $\Sigma$ и операцией конкатенации является моноидом. + Нейтральный элемент~--- пустая строка. + \item Квадратные неотрицательные матрицы% + \sidenote{Неотрицательной называется матрица, все элементы которой не меньше нуля.} фиксированного размера с операцией умножения задают моноид. + Нейтральный элемент~--- единичная матрица. + \end{itemize} \end{example} - \section{Группа} -\begin{definition} -Непустое\footnote{Требование непустоты здесь, как и далее, в определениях полукольца и кольца --- дискуссионный вопрос.} множество $G$ с заданной на нём бинарной операцией $\circ: {G} \times {G} \to {G}$ называется \emph{группой} $(G ,\circ)$, если выполнены следующие аксиомы: -\begin{enumerate} -\item ассоциативность: $\forall (a,b,c\in G)\colon (a\circ b)\circ c = a\circ (b \circ c)$; -\item наличие нейтрального элемента: $ \exists e \in G \quad \forall a\in G\colon (e \circ a = a \circ e = a)$; -\item наличие обратного элемента: $ \forall a\in G\quad \exists a^{-1}\in G\colon (a \circ a^{-1}=a^{-1} \circ a = e)$. -\end{enumerate} - -Иными словами, группа --- это моноид с дополнительным требованием наличия обратных элементов. +\begin{definition}[Группа] + Непустое% + \sidenote{Требование непустоты здесь, как и далее, в определениях полукольца и кольца~--- дискуссионный вопрос.} + множество $G$ с заданной на нём бинарной операцией $\circ: {G} \times {G} \to {G}$ называется \emph{группой} $(G ,\circ)$, если выполнены следующие аксиомы: + \begin{enumerate} + \item ассоциативность: для любых $a, b, c \in G$ выполнено $(a \circ b) \circ c = a \circ (b \circ c)$; + \item наличие нейтрального элемента $e$: для любого $a \in G$ выполнено $e \circ a = a \circ e = a$; + \item наличие обратного элемента: для любого $a \in G$ существует $a^{-1} \in G$, такой что $a \circ a^{-1} = a^{-1} \circ a = e$. + \end{enumerate} + Иными словами, группа~--- это моноид с дополнительным требованием наличия обратных элементов. \end{definition} -\begin{definition} -Если операция $\circ$ коммутативна, то говорят, что группа \textit{Абелева}. +\begin{definition}[Абелева группа] + Если операция $\circ$ коммутативна, то говорят, что группа \emph{абелева}. \end{definition} \begin{example} -Рассмотрим несколько примеров групп. -\begin{itemize} - \item Целые числа $\mathbb{Z}$ с операцией сложения $+$ являются группой. Получается дополнением моноида из предыдущего раздела обратными по сложению элементами. - \item Целые числа $\mathbb{Z}$ без нуля\footnote{При наличии нуля возникают трудности с нейтральным элементом. Логично считать $1$ нейтральным по умножению, однако $0\cdot1 = 0$, а не 1, как того требует определение.} с операцией умножения $\cdot$ не являются группой, так как нет обратных по умножению. Действительно, возьмём $a = 3$, тогда должен существовать $a^{-1} \in \mathbb{Z}$, такой что $3 \cdot a^{-1} = 1$. Видим, что $a^{-1} = \frac{1}{3}$, но $\frac{1}{3} \notin \mathbb{Z}$. - \item Множество обратимых\footnote{Квадратная матрица $M$ называется обратимой, если существует матрица $N$, называемая обратной, такая что $M \cdot N = N \cdot M = I$, где $I$ --- единичная матрица. К сожалению, не все матрицы являются обратимыми, потому, чтобы сконструировать группу, нам приходится требовать обратимость явно.} матриц с операцией матричного умножения задают группу. -\end{itemize} + Рассмотрим несколько примеров групп. + \begin{itemize} + \item Целые числа $\BbbZ$ с операцией сложения $+$ являются группой. + Получается дополнением моноида из предыдущего раздела обратными по сложению элементами. + \item Целые числа $\BbbZ$ без нуля% + \sidenote{ + При наличии нуля возникают трудности с нейтральным элементом. + Логично считать $1$ нейтральным по умножению, однако $0 \cdot 1 = 0$, а не 1, как того требует определение.} + с операцией умножения $\cdot$ не являются группой, так как нет обратных по умножению. + Действительно, возьмём $a = 3$, тогда должен существовать $a^{-1} \in \BbbZ$, такой что $3 \cdot a^{-1} = 1$. + Видим, что $a^{-1} = 1/3$, но $1/3 \notin \BbbZ$. + \item Множество обратимых% + \sidenote{ + Квадратная матрица $M$ называется обратимой, если существует матрица $N$, называемая обратной, такая что $M \cdot N = N \cdot M = I$, где $I$~--- единичная матрица. + К сожалению, не все матрицы являются обратимыми, потому, чтобы сконструировать группу, нам приходится требовать обратимость явно.} + матриц с операцией матричного умножения задают группу. + \end{itemize} \end{example} \section{Полукольцо} -\begin{definition} - -Непустое множество $R$ с двумя бинарными операциями $\oplus\colon R \times R \to R$ (часто называют сложением) и $\otimes \colon R \times R \to R$ (часто называют умножением) называется \emph{полукольцом}, если выполнены следующие условия. -\begin{enumerate} - -\item $(R, \oplus)$ --- это коммутативный моноид, нейтральный элемент которого --- $\mathbb{0}$. Для любых $a,b,c \in R$: -\begin{itemize} - \item $(a \oplus b) \oplus c = a \oplus (b \oplus c)$ - \item $\mathbb{0} \oplus a = a \oplus \mathbb{0} = a$ - \item $a \oplus b = b \oplus a$ -\end{itemize} - -\item $(R, \otimes)$ --- это моноид, нейтральный элемент которого --- $\mathbb{1}$. Для любых $a,b,c \in R$: -\begin{itemize} - \item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$ - \item $\mathbb{1} \otimes a = a \otimes \mathbb{1} = a$ -\end{itemize} - -\item $\otimes$ дистрибутивно слева и справа относительно $\oplus$: -\begin{itemize} - \item $a \otimes (b \oplus c) = (a \otimes b) \oplus (a \otimes c)$ - \item $(a \oplus b) \otimes c = (a \otimes c) \oplus (b \otimes c)$ -\end{itemize} - - -\item $\mathbb{0}$ является \textit{аннигилятором} по умножению: -\begin{itemize} - \item $\forall a \in R: \mathbb{0} \otimes a = a \otimes \mathbb{0} = \mathbb{0}$ -\end{itemize} - -\end{enumerate} - -Если операция $\otimes$ коммутативна, то говорят о коммутативном полукольце. -Если операция $\oplus$ идемпотентна, то говорят об идемпотентном полукольце. - +\begin{definition}[Полукольцо] + Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (часто называют сложением) и $\otimes: R \times R \to R$ (часто называют умножением) называется \emph{полукольцом}, если выполнены следующие условия. + \begin{enumerate} + \item $(R, \oplus)$~--- это коммутативный моноид, нейтральный элемент которого~--- $\Bbbzero$. Для любых $a, b, c \in R$: + \begin{itemize} + \item $(a \oplus b) \oplus c = a \oplus (b \oplus c)$ + \item $\Bbbzero \oplus a = a \oplus \Bbbzero = a$ + \item $a \oplus b = b \oplus a$ + \end{itemize} + \item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- $\Bbbzero$. Для любых $a, b, c \in R$: + \begin{itemize} + \item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$ + \item $\Bbbzero \otimes a = a \otimes \Bbbzero = a$ + \end{itemize} + \item $\otimes$ дистрибутивно слева и справа относительно $\oplus$: + \begin{itemize} + \item $a \otimes (b \oplus c) = (a \otimes b) \oplus (a \otimes c)$ + \item $(a \oplus b) \otimes c = (a \otimes c) \oplus (b \otimes c)$ + \end{itemize} + \item $\Bbbzero$ является \emph{аннигилятором} по умножению: + \begin{itemize} + \item для любых $a \in R$ выполнено $\Bbbzero \otimes a = a \otimes \Bbbzero = \Bbbzero$ + \end{itemize} + \end{enumerate} + Если операция $\otimes$ коммутативна, то говорят о \emph{коммутативном полукольце}. + Если операция $\oplus$ идемпотентна, то говорят об \emph{идемпотентном полукольце}. \end{definition} -\begin{example}\label{exmpl:semiring} -Рассмотрим пример полукольца, а заодно покажем, что левая и правая дистрибутивность могут существовать независимо для некоммутативного умножения\footnote{Хороший пример того, почему левую и правую дистрибутивность в случае некоммутативного умножения нужно проверять независимо (правда, для колец), приведён Николаем Александровичем Вавиловым в книге ``Конкретная теория колец'' на странице 6~\cite{VavilovRings}.}. - -В качестве $R$ возьмём множество множеств строк конечной длины над некоторым алфавитом $\Sigma$. В качестве сложения возьмём теоретико-множественное объединение: $\oplus \equiv \cup$. Нейтральный элемент по сложению --- это пустое множество ($\varnothing$). -В качестве умножения возьмём конкатенацию множеств ($\otimes \equiv \odot$) и определим её следующим образом: -$$ S_1 \odot S_2 = \{ w_1 \cdot w_2 \mid w_1 \in S_1, w_2 \in S_2\}$$, где $\cdot$ --- конкатенация строк. Нейтральным элементом по умножению будет являться множество из пустой строки: $\{\varepsilon\}$, где $\varepsilon$ --- обозначение для пустой строки. - -Проверим, что $(R, \cup, \odot)$ действительно полукольцо по нашему определению. - -\begin{enumerate} - -\item $(R, \cup)$ --- действительно коммутативный моноид с нейтральным элементом $\varnothing$. Для любых $a,b,c \in R$ по свойствам теоретико-множественного объединения верно: -\begin{itemize} - \item $(a \cup b) \cup c = a \cup (b \cup c)$ - \item $\varnothing \cup a = a \cup \varnothing = a$ - \item $a \cup b = b \cup a$. -\end{itemize} - -\item $(R, \odot)$ --- действительно моноид с нейтральным элементом $\{\varepsilon\}$. Для любых $a,b,c \in R$: -\begin{itemize} - \item $(a \odot b) \odot c = a \odot (b \odot c)$ по определению $\odot$ - \item $\{\varepsilon\} \odot a = \{\varepsilon \cdot w \mid w \in a \} = \{w \mid w \in a \} = a \odot \{\varepsilon\} = a$ -\end{itemize} -Вообще говоря, сконструированный нами моноид не является коммутативным: легко проверить, например, что существуют непустые $a,b \in R, a \neq b, a \neq \{\varepsilon\}, b \neq \{\varepsilon\}$: $a \cdot b \neq b \cdot a$ по причине некоммутативности конкатенации строк. - -\item $\odot$ дистрибутивно слева и справа относительно $\cup$: -\begin{itemize} - \item Сначала проверим дистрибутивность слева. - \begin{align*} - a \odot (b \cup c) & = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in b \cup c\} \\ - & = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in b \} \cup \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in c \} \\ - & = (a \odot b) \cup (a \odot c) - \end{align*} - - \item Аналогично, $(a \cup b) \odot c = (a \odot c) \cup (b \odot c)$ -\end{itemize} -При этом, в общем случае, $a \odot (b \cup c) \neq (b \cup c) \odot a$ из-за некоммутативности операции $\odot$. Действительно, - -\begin{align*} - & \{``a"\}\odot(\{``b"\} \cup \{``c"\}) = \{``a"\}\odot \{``b" \ ,``c" \} = \{``ab"\ ,``ac" \} \neq \\ - \neq & (\{``b"\} \cup \{``c"\}) \odot \{``a"\} = \{``b",``c" \} \odot \{``a"\} = \{``ba"\ ,``ca" \} -\end{align*} - - -\item $\varnothing$ является \textit{аннигилятором} по умножению: для любого $a \in R$ верно, что -$\varnothing \odot a = \{ w_1 \cdot w_2 \mid w_1 \in \varnothing, w_2 \in a \} = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in \varnothing \} = a \odot \varnothing = \varnothing$ - -\end{enumerate} - +\begin{example} + \label{exmpl:semiring} + Рассмотрим пример полукольца, а заодно покажем, что левая и правая дистрибутивность могут существовать независимо для некоммутативного умножения% + \sidenote{ + Хороший пример того, почему левую и правую дистрибутивность в случае некоммутативного умножения нужно проверять независимо (правда, для колец), приведён Николаем Александровичем Вавиловым в книге \enquote{Конкретная теория колец} на странице 6~\cite{VavilovRings}.}% + . + + В качестве $R$ возьмём множество множеств строк конечной длины над некоторым алфавитом $\Sigma$. + В качестве сложения возьмём теоретико-множественное объединение: $\oplus \equiv \cup$. + Нейтральный элемент по сложению~--- это пустое множество ($\varnothing$). + В качестве умножения возьмём конкатенацию множеств ($\otimes \equiv \odot$) и определим её следующим образом: + \[S_1 \odot S_2 = \left\{ w_1 \cdot w_2 \mid w_1 \in S_1, w_2 \in S_2\right\},\] + где $\cdot$~--- конкатенация строк. + Нейтральным элементом по умножению будет являться множество из пустой строки: $\{\varepsilon\}$, где $\varepsilon$~--- обозначение для пустой строки. + + Проверим, что $(R, \cup, \odot)$ действительно полукольцо по нашему определению. + \begin{enumerate} + \item $(R, \cup)$~--- действительно коммутативный моноид с нейтральным элементом $\varnothing$. + Для любых $a, b, c \in R$ по свойствам теоретико-множественного объединения верно: + \begin{itemize} + \item $(a \cup b) \cup c = a \cup (b \cup c)$ + \item $\varnothing \cup a = a \cup \varnothing = a$ + \item $a \cup b = b \cup a$. + \end{itemize} + \item $(R, \odot)$~--- действительно моноид с нейтральным элементом $\{\varepsilon\}$. + Для любых $a, b, c \in R$: + \begin{itemize} + \item $(a \odot b) \odot c = a \odot (b \odot c)$ по определению $\odot$ + \item $\{\varepsilon\} \odot a = \{\varepsilon \cdot w \mid w \in a \} = \{w \mid w \in a \} = a \odot \{\varepsilon\} = a$ + \end{itemize} + Вообще говоря, сконструированный нами моноид не является коммутативным: легко проверить, например, что существуют непустые $a, b \in R$, $a \neq b$, $a \neq \{\varepsilon\}$, $b \neq \{\varepsilon\}$, такие что $a \cdot b \neq b \cdot a$ по причине некоммутативности конкатенации строк. + \item $\odot$ дистрибутивно слева и справа относительно $\cup$: + \begin{itemize} + \item Сначала проверим дистрибутивность слева. + \begin{align*} + a \odot (b \cup c) & = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in b \cup c\} \\ + & = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in b \} \cup \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in c \} \\ + & = (a \odot b) \cup (a \odot c) + \end{align*} + \item Аналогично, $(a \cup b) \odot c = (a \odot c) \cup (b \odot c)$ + \end{itemize} + При этом, в общем случае, $a \odot (b \cup c) \neq (b \cup c) \odot a$ из-за некоммутативности операции $\odot$. + Действительно, + \begin{gather*} + \{"a"\} \odot (\{"b"\} \cup \{"c"\}) = \{"a"\} \odot \{"b","c" \} = \{"ab","ac" \} \\ + (\{"b"\} \cup \{"c"\}) \odot \{"a"\} = \{"b", "c"\} \odot \{"a"\} = \{"ba","ca"\} \\ + \{"ab","ac"\} \neq \{"ba","ca"\} + \end{gather*} + \item $\varnothing$ является \emph{аннигилятором} по умножению: для любого $a \in R$ верно, что + $\varnothing \odot a = \{ w_1 \cdot w_2 \mid w_1 \in \varnothing, w_2 \in a \} = \{ w_1 \cdot w_2 \mid w_1 \in a, w_2 \in \varnothing \} = a \odot \varnothing = \varnothing$ + \end{enumerate} \end{example} \section{Кольцо} +\begin{definition}[Кольцо] + Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (умножение) и $\otimes: R \times R \to R$ (сложение) называется \emph{кольцом}, если выполнены следующие условия. + \begin{enumerate} + \item $(R, \oplus)$~--- это абелева группа, нейтральный элемент которой~--- $\Bbbzero$. + Для любых $a, b, c \in R$: + \begin{itemize} + \item $(a \oplus b) \oplus c = a \oplus (b \oplus c)$ + \item $\Bbbzero \oplus a = a \oplus \Bbbzero = a$ + \item $a \oplus b = b \oplus a$ + \item для любого $a \in R$ существует $-a \in R$, такой что $a + (-a) = \Bbbzero$. + \end{itemize} + В последнем пункте кроется отличие от полукольца. + \item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- $\Bbbzero$. + Для любых $a, b, c \in R$: + \begin{itemize} + \item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$ + \item $\Bbbzero \otimes a = a \otimes \Bbbzero = a$ + \end{itemize} + \item $\otimes$ дистрибутивно слева и справа относительно $\oplus$: + \begin{itemize} + \item $a \otimes (b \oplus c) = (a \otimes b) \oplus (a \otimes c)$ + \item $(a \oplus b) \otimes c = (a \otimes c) \oplus (b \otimes c)$ + \end{itemize} + \end{enumerate} +\end{definition} -\begin{definition} - -Непустое множество $R$ с двумя бинарными операциями $\oplus\colon R \times R \to R$ (умножение) и $\otimes \colon R \times R \to R$ (сложение) называется \emph{кольцом}, если выполнены следующие условия. -\begin{enumerate} - -\item $(R, \oplus)$ --- это Абелева группа, нейтральный элемент которой --- $\mathbb{0}$. Для любых $a,b,c \in R$: -\begin{itemize} - \item $(a \oplus b) \oplus c = a \oplus (b \oplus c)$ - \item $\mathbb{0} \oplus a = a \oplus \mathbb{0} = a$ - \item $a \oplus b = b \oplus a$ - \item для любого $a \in R$ существует $-a \in R$, такое что $a + (-a) = \mathbb{0}$. -\end{itemize} -В последнем пункте кроется отличие от полукольца. - -\item $(R, \otimes)$ --- это моноид, нейтральный элемент которого --- $\mathbb{1}$. Для любых $a,b,c \in R$: -\begin{itemize} - \item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$ - \item $\mathbb{1} \otimes a = a \otimes \mathbb{1} = a$ -\end{itemize} - -\item $\otimes$ дистрибутивно слева и справа относительно $\oplus$: -\begin{itemize} - \item $a \otimes (b \oplus c) = (a \otimes b) \oplus (a \otimes c)$ - \item $(a \oplus b) \otimes c = (a \otimes c) \oplus (b \otimes c)$ -\end{itemize} - -\end{enumerate} - -Заметим, что мультипликативное свойство $\mathbb{0}$ (быть аннигилятором по умножению) не указыватеся явно, так как может быть выведено из остальных утверждений. Действительно, +Заметим, что мультипликативное свойство $\Bbbzero$ (быть аннигилятором по умножению) не указыватеся явно, так как может быть выведено из остальных утверждений. +Действительно, \begin{enumerate} - \item $a \otimes \mathbb{0} = a \otimes (\mathbb{0} \oplus \mathbb{0})$, так как $\mathbb{0}$ --- нейтральный по сложению, то $\mathbb{0} \oplus \mathbb{0} = \mathbb{0}$ - \item Воспользуемся дистрибутивностью: $a \otimes (\mathbb{0} \oplus \mathbb{0}) = a \otimes \mathbb{0} \oplus a \otimes \mathbb{0}$. В итоге: $a \otimes \mathbb{0} = a \otimes \mathbb{0} \oplus a \otimes \mathbb{0}$ - \item Так как у нас есть группа по сложению, то для любого $a$ существует обратный элемент $a^{-1}, a \oplus a^{-1} = \mathbb{0}$. Прибавим $a^{-1} \otimes \mathbb{0}$ к левой и правой части равенства\footnote{Обычно данное действие воспринимается как очевидное, но, строго говоря, оно требует аккуратного введения структур с равенством и соответствующих аксиом.}, полученного на предыдущем шаге: - $$a \otimes \mathbb{0} \oplus a^{-1} \otimes \mathbb{0} = a \otimes \mathbb{0} \oplus a \otimes \mathbb{0} \oplus a^{-1} \otimes \mathbb{0}.$$ - \item Воспользуемся дистрибутивностью и ассоциативностью. - \begin{align*} - (a \oplus a^{-1}) \otimes \mathbb{0} & = a \otimes \mathbb{0} \oplus (a \oplus a^{-1}) \otimes \mathbb{0} \\ - \mathbb{0} \otimes \mathbb{0} & = a \otimes \mathbb{0} \oplus \mathbb{0} \otimes \mathbb{0} \\ - \mathbb{0} & = a \otimes \mathbb{0} - \end{align*} - \item Аналогично можно доказать, что $\mathbb{0} = \mathbb{0} \otimes a$. + \item $a \otimes \Bbbzero = a \otimes (\Bbbzero \oplus \Bbbzero)$, так как $\Bbbzero$~--- нейтральный по сложению, то $\Bbbzero \oplus \Bbbzero = \Bbbzero$ + \item Воспользуемся дистрибутивностью: $a \otimes (\Bbbzero \oplus \Bbbzero) = a \otimes \Bbbzero \oplus a \otimes \Bbbzero$. + В итоге: $a \otimes \Bbbzero = a \otimes \Bbbzero \oplus a \otimes \Bbbzero$ + \item Так как у нас есть группа по сложению, то для любого $a$ существует обратный элемент $a^{-1}$, $a \oplus a^{-1} = \Bbbzero$. + Прибавим $a^{-1} \otimes \Bbbzero$ к левой и правой части равенства% + \sidenote{Обычно данное действие воспринимается как очевидное, но, строго говоря, оно требует аккуратного введения структур с равенством и соответствующих аксиом.}% + , полученного на предыдущем шаге: + \[a \otimes \Bbbzero \oplus a^{-1} \otimes \Bbbzero = a \otimes \Bbbzero \oplus a \otimes \Bbbzero \oplus a^{-1} \otimes \Bbbzero.\] + \item Воспользуемся дистрибутивностью и ассоциативностью. + \begin{align*} + (a \oplus a^{-1}) \otimes \Bbbzero & = a \otimes \Bbbzero \oplus (a \oplus a^{-1}) \otimes \Bbbzero \\ + \Bbbzero \otimes \Bbbzero & = a \otimes \Bbbzero \oplus \Bbbzero \otimes \Bbbzero \\ + \Bbbzero & = a \otimes \Bbbzero + \end{align*} + \item Аналогично можно доказать, что $\Bbbzero = \Bbbzero \otimes a$. \end{enumerate} -\end{definition} - - %\section{Поле} \section{Матрицы и вектора} К определению матрицы мы подойдём структурно, так как в дальнейшем будем сопоставлять эту структуру с объектами различной природы, а значит определение матрицы через какой-либо из этих объектов (например через квадратичные формы) будет менее удобным. -Договоримся, что \textit{алгебраическая структура} --- это собирательное название для объектов вида ``множество с набором операций'' (например, кольцо, моноид, группа и т.д.), а соответствующее множество будем назвать \textit{носителем} этой структуры. - -\begin{definition} - -Предположим, что у нас есть некоторая алгебраическая структура с носителем $S$. Тогда \emph{матрицей} будем называть прямоугольный массив размера $n\times m, n > 0, m > 0$, заполненный элементами из $S$. +Договоримся, что \emph{алгебраическая структура}~--- это собирательное название для объектов вида \enquote{множество с набором операций} (например, кольцо, моноид, группа и т.д.), а соответствующее множество будем назвать \emph{носителем} этой структуры. -Говорят, что $n$ --- это высота матрицы или количество строк в ней, а $m$ --- ширина матрицы или количество столбцов. +\begin{definition}[Матрица] + Предположим, что у нас есть некоторая алгебраическая структура с носителем $S$. Тогда \emph{матрицей} будем называть прямоугольный массив размера $n \times m$, $n > 0$, $m > 0$, заполненный элементами из $S$. + Говорят, что $n$~--- это высота матрицы или количество строк в ней, а $m$~--- ширина матрицы или количество столбцов. \end{definition} -При доступе к элементам матрицы используются их индексы. При этом нумерация ведётся с левого верхнего угла, первым указывается строка, вторым --- столбец. В нашей работе мы будем использовать ``программистскую'' традицию и нумеровать строки и столбцы с нуля\footnote{В противоположность ``математической'' традиции нумеровать строки и столбцы с единицы. Стоит, правда, отметить, что в некоторых языках программирования (например, Fortran или COBOL) жива ``математическая'' традиция.}. - -\begin{example}[Матрица] - -Пусть есть моноид $(S,\cdot)$, где $S$ --- множество строк конечной длины над алфавитом \{a,b,c\}. -Тогда можно построить, например, следующую матрицу $2\times 3$. -$$ -M_{2\times 3} = -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix} -$$ - -$$ -M_{2\times 3}[1,1] = ``bab" -$$ +При доступе к элементам матрицы используются их индексы. +При этом нумерация ведётся с левого верхнего угла, первым указывается строка, вторым~--- столбец. +В нашей работе мы будем использовать \enquote{программистскую} традицию и нумеровать строки и столбцы с нуля% +\sidenote{ + В противоположность \enquote{математической} традиции нумеровать строки и столбцы с единицы. + Стоит, правда, отметить, что в некоторых языках программирования (например, Fortran или COBOL) жива \enquote{математическая} традиция.}% +. +\begin{example} + Пусть есть моноид $(S, \cdot)$, где $S$~--- множество строк конечной длины над алфавитом $\{a, b, c\}$. + Тогда можно построить, например, следующую матрицу $2 \times 3$. + \[ + M_{2 \times 3} = + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix} + \] + Для доступа к элементу матрицы будем использовать такую запись: $M_{2 \times 3}[1, 1] = "bab"$. \end{example} К определению вектора мы также подойдём структурно. - -\begin{definition} - -\emph{Вектором} будем называть матрицу, хотя бы один из размеров которой равен единице. Если единице равна высота матрицы, то это \textit{вектор-строка}, если же единице равна ширина матрицы, то это \textit{вектор-столбец}. - +\begin{definition}[Вектор] + \emph{Вектором} будем называть матрицу, хотя бы один из размеров которой равен единице. + Если единице равна высота матрицы, то это \emph{вектор-строка}, если же единице равна ширина матрицы, то это \emph{вектор-столбец}. \end{definition} - Операции над матрицами можно условно разделить на две группы: \begin{itemize} - \item \textit{структурные} --- не зависящие от алгебраической структуры, над которой строилась матрица, и работающие только с её структурой; - \item \textit{алгебраические} --- определение таковых опирается на свойства алгебраической структуры, над которой построена матрица. + \item \emph{структурные}~--- не зависящие от алгебраической структуры, над которой строилась матрица, и работающие только с её структурой; + \item \emph{алгебраические}~--- определение таковых опирается на свойства алгебраической структуры, над которой построена матрица. \end{itemize} -Примерами структурных операций является \textit{транспонирование}, \textit{взятие подматрицы} и \textit{взятие элемента по индексу}. - +Примерами структурных операций является \emph{транспонирование}, \emph{взятие подматрицы} и \emph{взятие элемента по индексу}. + +\marginnote{ + \begin{example} + Транспонирование матрицы. + \[ + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix}^\top = + \begin{pmatrix} + "a" & "ac" \\ + "ba" & "bab" \\ + "cd" & "b" + \end{pmatrix} + \] + \end{example} +} \begin{definition}[Транспонирование матрицы] -Пусть дана матрица $M_{n\times m}$. Тогда результат её \emph{транспонирования}, это такая матрица $M'_{m\times n}$, что $M'[i,j] = M[j,i]$ для всех $0\leq i \leq m - 1$ и $0\leq j \leq n - 1$. - -Операцию транспонирования принято обозначать как $M^{T}$. + Пусть дана матрица $M_{n \times m}$. + Тогда результат её \emph{транспонирования}, это такая матрица $M'_{m \times n}$, что $M'[i,j] = M[j,i]$ для всех $i \in [0 \rng m - 1]$ и $j \in [0 \rng n - 1]$. + Операцию транспонирования принято обозначать как $M^\top$. \end{definition} -\begin{example} -$$ -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix}^T = -\begin{pmatrix} -``a" & ``ac" \\ -``ba" & ``bab" \\ -``cd" & ``b" \\ -\end{pmatrix} -$$ -\end{example} - - \begin{definition}[Прямая сумма матриц] - Пусть даны матрицы $M_{n_1\times m_1}$ и $N_{n_2\times m_2}$. Тогда \emph{прямой суммой} этих матриц называется матрица $L_{n_1+n_2 \times m_1+m_2}$ вида - $$ - L = - \left[ - \begin{matrix} - M & 0 \\ - 0 & N - \end{matrix} - \right] - $$ - - Где 0 обозначает нулевой блок. Прямая сумма обозначается $L = M \bigoplus N$. - -\end{definition} - + Пусть даны матрицы $M_{n_1 \times m_1}$ и $N_{n_2 \times m_2}$. + Тогда \emph{прямой суммой} этих матриц называется матрица $L_{(n_1 + n_2) \times (m_1 + m_2)}$ вида + \[ + L = + \begin{pmatrix} + M & 0 \\ + 0 & N + \end{pmatrix} + \] + Где 0 обозначает нулевой блок. Прямая сумма обозначается $L = M \oplus N$. +\end{definition} +\marginnote{ + \begin{example} + Взятие подматрицы. + \begin{multline*} + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix} [0 \rng 1, 1 \rng 2] = \\ + = \begin{pmatrix} + "ba" & "cb" \\ + "bab" & "b" + \end{pmatrix} + \end{multline*} + \end{example} +} \begin{definition}[Взятие подматрицы] -Пусть дана матрица $M_{n\times m}$. Тогда -$ -M_{n\times m}[i_0..i_1,j_0..j_1] -$ - --- это такая $M'_{i_1 - i_0 + 1, j_1 - j_0 + 1}$ что $M'[i,j] = M[i_0 + i,j_0 + j]$ для всех $0\leq i \leq i_1 - i_0 + 1$ и $0\leq j \leq j_1 - j_0 + 1$. + Пусть дана матрица $M_{n\times m}$. + Тогда $M_{n \times m}[i_0 \rng i_1, j_0 \rng j_1]$~--- это такая $M'_{(i_1 - i_0 + 1) \times (j_1 - j_0 + 1)}$, что $M'[i, j] = M[i_0 + i, j_0 + j]$ для всех $i \in [0 \rng i_1 - i_0 + 1]$ и $j \in [0 \rng j_1 - j_0 + 1]$. \end{definition} - -\begin{example} -$$ -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix}[0..1,1..2] = -\begin{pmatrix} -``ba" & ``cb" \\ -``bab" & ``b" \\ -\end{pmatrix} -$$ -\end{example} - - -\begin{definition} -\emph{Взятие элемента по индексу} --- это частный случай взятия подматрицы, когда начало и конец ``среза'' совпадают: -$ -M[i,j] = M[i..i,j..j] -$ +\marginnote{ + \begin{example} + Взятие элемента по индексу. + \[ + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix}[0, 1] = "ba" + \] + \end{example} +} +\begin{definition}[Взятие элемента по индексу] + \emph{Взятие элемента по индексу}~--- это частный случай взятия подматрицы, когда начало и конец \enquote{среза} совпадают: $M[i, j] = M[i \rng i, j \rng j]$. \end{definition} -\begin{example} -$$ -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix}[0,1] = ``ba" -$$ -\end{example} - -Из алгебраических операций над матрицами нас в дальнейшем будут интересовать \textit{поэлементные операции}, \textit{скалярные операции}, \textit{матричное умножение}, \textit{произведение Кронекера}. - +Из алгебраических операций над матрицами нас в дальнейшем будут интересовать \emph{поэлементные операции}, \emph{скалярные операции}, \emph{матричное умножение}, \emph{произведение Кронекера}. \begin{definition}[Поэлементные операции] - -Пусть $G = (S,\circ)$ --- полугруппа\footnote{Здесь, как и в дальнейшем, требование к структуре быть полугруппой не обязательно. Оно лишь позволяет нам получить ассоциативность соответствующих операций над матрицами, что может оказаться полезным при дальнейшей работе.}, $M_{n \times m}, N_{n\times m}$ --- две матрицы одинакового размера над этой полугруппой. -Тогда -$ -ewise(M,N,\circ) = P_{n \times m} -$ -,такая, что $P[i,j] = M[i,j] \circ N[i,j]$. + Пусть $G = (S, \circ)$~--- полугруппа% + \sidenote{Здесь, как и в дальнейшем, требование к структуре быть полугруппой не обязательно. + Оно лишь позволяет нам получить ассоциативность соответствующих операций над матрицами, что может оказаться полезным при дальнейшей работе.}% + , $M_{n \times m}$, $N_{n \times m}$~--- две матрицы одинакового размера над этой полугруппой. + Тогда $\mathrm{ewise}(M, N, \circ) = P_{n \times m}$, такая, что $P[i, j] = M[i, j] \circ N[i, j]$. \end{definition} - \begin{example} - -Пусть $G$ --- полугруппа строк с конкатенацией $\cdot$, - -$$ -M = -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix}, -$$ - -$$ -N = -\begin{pmatrix} -``c" & ``aa" & ``b" \\ -``a" & ``bac" & ``bb" \\ -\end{pmatrix}. -$$ - -Тогда - -$$ -ewise(M,N, \cdot) = -\begin{pmatrix} -``ac" & ``baaa" & ``cbb" \\ -``aca" & ``babbac" & ``bbb" \\ -\end{pmatrix}. -$$ - - + Пусть $G$~--- полугруппа строк с конкатенацией $\cdot$, + \[M = + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix}, + \qquad + N = + \begin{pmatrix} + "c" & "aa" & "b" \\ + "a" & "bac" & "bb" + \end{pmatrix}. + \] + Тогда + \[ + \mathrm{ewise}(M, N, \cdot) = + \begin{pmatrix} + "ac" & "baaa" & "cbb" \\ + "aca" & "babbac" & "bbb" + \end{pmatrix}. + \] \end{example} - \begin{definition}[Скалярная операция] -Пусть $G = (S,\circ)$ --- полугруппа, $M_{n \times m}$ --- матрица над этой полугруппой, $x \in S$. -Тогда -$ -scalar(M,x,\circ) = P_{n \times m} -$ -, такая, что $P[i,j] = M[i,j] \circ x$, а -$ -scalar(x,M,\circ) = P_{n \times m} -$ -, такая, что $P[i,j] = x \circ M[i,j]$. - + Пусть $G = (S, \circ)$~--- полугруппа, $M_{n \times m}$~--- матрица над этой полугруппой, $x \in S$. + Тогда $\mathrm{scalar}(M, x,\circ) = P_{n \times m}$, такая, что $P[i, j] = M[i, j] \circ x$, а $\mathrm{scalar}(x, M, \circ) = P_{n \times m}$, такая, что $P[i, j] = x \circ M[i, j]$. \end{definition} \begin{example} - -Пусть $G$ --- полугруппа строк с конкатенацией $\cdot$, $x = ``c"$, - -$$ -M = -\begin{pmatrix} -``a" & ``ba" & ``cb" \\ -``ac" & ``bab" & ``b" \\ -\end{pmatrix}. -$$ - -Тогда -$$ -scalar(M,x, \cdot) = -\begin{pmatrix} -``ac" & ``bac" & ``cbc" \\ -``acc" & ``babc" & ``bc" \\ -\end{pmatrix}, -$$ - -$$ -scalar(x, M, \cdot) = -\begin{pmatrix} -``ca" & ``cba" & ``ccb" \\ -``cac" & ``cbab" & ``cb" \\ -\end{pmatrix}. -$$ - + Пусть $G$~--- полугруппа строк с конкатенацией $\cdot$, $x = "c"$, + \[ + M = + \begin{pmatrix} + "a" & "ba" & "cb" \\ + "ac" & "bab" & "b" + \end{pmatrix}. + \] + Тогда + \begin{gather*} + \mathrm{scalar}(M,x, \cdot) = + \begin{pmatrix} + "ac" & "bac" & "cbc" \\ + "acc" & "babc" & "bc" + \end{pmatrix},\\ + \mathrm{scalar}(x, M, \cdot) = + \begin{pmatrix} + "ca" & "cba" & "ccb" \\ + "cac" & "cbab" & "cb" + \end{pmatrix}. + \end{gather*} \end{example} - -\begin{definition}[Матричное умножение]\label{def:MxM} - -Пусть $G = (S,\oplus, \otimes)$ --- полукольцо, $M_{n \times m}, N_{m\times k}$ --- две матрицы над этим полукольцом. -Тогда -$ -M\cdot N = P_{n \times k} -$ -, такая, что $P[i,j] = \bigoplus_{0 \leq l < m} M[i,l] \otimes N[l,j]$. - +\begin{definition}[Матричное умножение] + \label{def:MxM} + Пусть $G = (S, \oplus, \otimes)$~--- полукольцо, $M_{n \times m}$, $N_{m\times k}$~--- две матрицы над этим полукольцом. + Тогда $M \cdot N = P_{n \times k}$, такая, что $P[i, j] = \bigoplus_{l \in [0 \rng m - 1]} M[i, l] \otimes N[l, j]$. \end{definition} \begin{example} -Пусть $G$ --- полукольцо из примера~\ref{exmpl:semiring}, -$$ M = -\begin{pmatrix} -\{``a"\} & \{``a"\}\\ -\{``b"\} & \{``b"\}\\ -\end{pmatrix}, -$$ -$$ N = -\begin{pmatrix} -\{``c"\} \\ -\{``d"\} \\ -\end{pmatrix}. -$$ - -Тогда -$$ -M \cdot N = -\begin{pmatrix} -\{``a" \cdot ``c"\} \cup \{``a" \cdot ``d"\} \\ -\{``b" \cdot ``c"\} \cup \{``b" \cdot ``d"\} -\end{pmatrix}= -\begin{pmatrix} -\{``ac" \ , ``ad"\} \\ -\{``bc" \ , ``bd"\} -\end{pmatrix}. -$$ - + Пусть $G$~--- полукольцо из примера~\ref{exmpl:semiring}, + \[ + M = + \begin{pmatrix} + \{"a"\} & \{"a"\} \\ + \{"b"\} & \{"b"\} + \end{pmatrix}, + \qquad + N = + \begin{pmatrix} + \{"c"\} \\ + \{"d"\} + \end{pmatrix}. + \] + Тогда + \[ + M \cdot N = + \begin{pmatrix} + \{"a" \cdot "c"\} \cup \{"a" \cdot "d"\} \\ + \{"b" \cdot "c"\} \cup \{"b" \cdot "d"\} + \end{pmatrix}= + \begin{pmatrix} + \{"ac" \ , "ad"\} \\ + \{"bc" \ , "bd"\} + \end{pmatrix}. + \] \end{example} - \begin{definition}[Произведение Кронекера] -Пусть $G = (S,\circ)$ --- полугруппа, $M_{m\times n}$ и $N_{p\times q}$ --- две матрицы над этой полугруппой. -Тогда произведение Кронекера или тензорное произведение матриц $M$ и $N$ --- это блочная матрица $C$ размера $mp \times nq$, вычисляемая следующим образом: -$$ -C = A \otimes B = -\begin{pmatrix} -scalar(M[0,0],N,\circ) & \cdots & scalar(M[0,n-1],N,\circ) \\ -\vdots & \ddots & \vdots \\ -scalar(M[m-1,0],N,\circ) & \cdots & scalar(M[m-1,n-1],N,\circ) -\end{pmatrix} -$$ - + Пусть $G = (S, \circ)$~--- полугруппа, $M_{m \times n}$ и $N_{p \times q}$~--- две матрицы над этой полугруппой. + Тогда \emph{произведение Кронекера} или \emph{тензорное произведение} матриц $M$ и $N$~--- это блочная матрица $K$ размера $mp \times nq$, вычисляемая следующим образом: + \begin{multline*} + K = M \otimes N = \\ + \begin{pmatrix} + \mathrm{scalar}(M[0,0],N,\circ) & \cdots & \mathrm{scalar}(M[0,n-1],N,\circ) \\ + \vdots & \ddots & \vdots \\ + \mathrm{scalar}(M[m-1,0],N,\circ) & \cdots & \mathrm{scalar}(M[m-1,n-1],N,\circ) + \end{pmatrix} + \end{multline*} \end{definition} -\begin{note}\label{note:KronIsNotCommutative} -Произведение Кронекера не является коммутативным. -При этом всегда существуют две матрицы перестановок $P$ и $Q$ такие, что $A \otimes B = P(B \otimes A)Q$. -\end{note} +\begin{remark} + \label{note:KronIsNotCommutative} + Произведение Кронекера не является коммутативным. + При этом всегда существуют две матрицы перестановок $P$ и $Q$ такие, что $A \otimes B = P(B \otimes A)Q$. +\end{remark} +\begingroup \newcommand{\examplemtrx} { -\begin{pmatrix} -5 & 6 & 7 & 8 \\ -9 & 10 & 11 & 12 \\ -13 & 14 & 15 & 16 -\end{pmatrix} + \begin{pmatrix} + 5 & 6 & 7 & 8 \\ + 9 & 10 & 11 & 12 \\ + 13 & 14 & 15 & 16 + \end{pmatrix} } \begin{example} -Возьмём в качестве полугруппы целые числа с умножением. -$$M= -\begin{pmatrix} -1 & 2 \\ -3 & 4 -\end{pmatrix} -$$ -$$N=\examplemtrx -$$ -Тогда -\begin{align} -M \otimes N & = -\begin{pmatrix} -1 & 2 \\ -3 & 4 -\end{pmatrix} -\otimes -\examplemtrx = \notag \\ &= -\begin{pmatrix} -1\examplemtrx & 2\examplemtrx \\ -3\examplemtrx & 4\examplemtrx -\end{pmatrix} -=\notag \\ -&= -\left(\begin{array}{c c c c | c c c c} -5 & 6 & 7 & 8 & 10 & 12 & 14 & 16 \\ -9 & 10 & 11 & 12 & 18 & 20 & 22 & 24 \\ -13 & 14 & 15 & 16 & 26 & 28 & 30 & 32 \\ -\hline -15 & 18 & 21 & 24 & 20 & 24 & 28 & 32 \\ -27 & 30 & 33 & 36 & 36 & 40 & 44 & 48 \\ -39 & 42 & 45 & 48 & 52 & 56 & 60 & 64 -\end{array}\right) -\end{align} + Возьмём в качестве полугруппы целые числа с умножением. + \[ + M= + \begin{pmatrix} + 1 & 2 \\ + 3 & 4 + \end{pmatrix}, + \qquad + N=\examplemtrx + \] + Тогда + \begin{align*} + M \otimes N & = + \begin{pmatrix} + 1 & 2 \\ + 3 & 4 + \end{pmatrix} + \otimes + \examplemtrx = \\ + & = + \begin{pNiceArray}[margin]{c|c} + 1 \examplemtrx & 2 \examplemtrx \\ + \midrule + 3 \examplemtrx & 4 \examplemtrx + \end{pNiceArray} = \\ + & = + \begin{pNiceArray}[margin]{cccc|cccc} + 5 & 6 & 7 & 8 & 10 & 12 & 14 & 16 \\ + 9 & 10 & 11 & 12 & 18 & 20 & 22 & 24 \\ + 13 & 14 & 15 & 16 & 26 & 28 & 30 & 32 \\ + \midrule + 15 & 18 & 21 & 24 & 20 & 24 & 28 & 32 \\ + 27 & 30 & 33 & 36 & 36 & 40 & 44 & 48 \\ + 39 & 42 & 45 & 48 & 52 & 56 & 60 & 64 + \end{pNiceArray} + \end{align*} \end{example} - - -\section{Теоретическая сложность умножения матриц} - -В рамках такого раздела теории сложности, как мелкозернистая сложность (fine-grained complexity) задача умножения двух матриц оказалась достаточно важной, так как через вычислительную сложность этой задачи можно оценить сложность большого класса различных задач. С примерами таких задач можно ознакомиться в работе~\cite{Williams:2010:SEP:1917827.1918339}. Поэтому рассмотрим алгоритмы нахождения произведения двух матриц более подробно. Далее для простоты мы будем предполагать, что перемножаются две квадратные матрицы одинакового размера $n \times n$. - -Для начала построим наивный алгоритм, сконструированный на основе определении произведения матриц. Такой алгоритм представлен на листинге~\ref{algo:MxM}. Его работу можно описать следующим образом: для каждой строки в первой матрице и для каждого столбца в второй матрице найти сумму произведений соответствующих элементов. Данная сумма будет значением соответствующей ячейки результирующей матрицы. - -\begin{algorithm} - \floatname{algorithm}{Listing} -\begin{algorithmic}[1]\label{algo:MxM} -\caption{Наивное перемножение матриц} -\Function{MatrixMult}{$M_1, M_2, G=(S,\oplus,\otimes)$} - \State{$M_3 =$ empty matrix of size $n \times n$} - \For {$i \in 0..n-1$} - \For {$j \in 0..n-1$} - \For {$k \in 0..n-1$} - \State{$M_3[i,j] = M_3[i,j] \oplus ( M_1[i,k] \otimes M_2[k,j])$} - \EndFor - \EndFor - \EndFor - \State{\Return $M_3$} - -\EndFunction -\end{algorithmic} -\end{algorithm} - -Сложность наивного произведения двух матриц составляет $O(n^3)$ из-за тройного вложенного цикла, где каждый уровень вложенности привносит $n$ итераций. Но можно ли улучшить этот алгоритм? Первый положительный ответ был опубликовал Ф. Штрассен в 1969 году~\cite{Strassen1969}. Сложность предложенного им алгоритма --- $O(n^{\log_2 7}) \approx O(n^{2.81})$. Основная идея --- рекурсивное разбиение исходных матриц на блоки и вычисление их произведения с помощью только 7 умножений, а не 8. - -Рассмотрим алгоритм Штрассена более подробно. Пусть $A$ и $B$ --- две квадратные матрицы размера $2^n \times 2^n$ над кольцом $R=(S,\oplus,\otimes)$. Если размер умножаемых матриц не является натуральной степенью двойки, то дополняем исходные матрицы дополнительными нулевыми строками и столбцами. Наша задача найти матрицу $C = A \cdot B$. - -Разделим матрицы $A, B$ и $C$ на четыре равные по размеру блока. -$$ -A = -\begin{pmatrix} - A_{1,1} & A_{1,2} \\ - A_{2,1} & A_{2,2} - \end{pmatrix} \mbox{ , } - B = - \begin{pmatrix} - B_{1,1} & B_{1,2} \\ - B_{2,1} & B_{2,2} - \end{pmatrix} \mbox{ , } - C = - \begin{pmatrix} - C_{1,1} & C_{1,2} \\ - C_{2,1} & C_{2,2} - \end{pmatrix} -$$ - -По определению произведения матриц выполняются следующие равенства. -\begin {align*} -C_{1,1}&= A_{1,1} \cdot B_{1,1} + A_{1,2} \cdot B_{2,1} \\ -C_{1,2}&= A_{1,1} \cdot B_{1,2} + A_{1,2} \cdot B_{2,2} \\ -C_{2,1}&= A_{2,1} \cdot B_{1,1} + A_{2,2} \cdot B_{2,1} \\ -C_{2,2}&= A_{2,1} \cdot B_{1,2} + A_{2,2} \cdot B_{2,2} -\end {align*} - -Данная процедура не даёт нам ничего нового с точки зрения вычислительной сложности. Но мы можем двинуться дальше и определить следующие элементы. - -\begin {align*} -P_1 & \equiv (A_{1,1} + A_{2,2}) \cdot (B_{1,1} + B_{2,2}) \\ -P_2 & \equiv (A_{2,1} + A_{2,2}) \cdot B_{1,1} \\ -P_3 & \equiv A_{1,1} \cdot (B_{1,2} - B_{2,2}) \\ -P_4 & \equiv A_{2,2} \cdot (B_{2,1} - B_{1,1}) \\ -P_5 & \equiv (A_{1,1} + A_{1,2}) \cdot B_{2,2} \\ -P_6 & \equiv (A_{2,1} - A_{1,1}) \cdot (B_{1,1} + B_{1,2}) \\ -P_7 & \equiv (A_{1,2} - A_{2,2}) \cdot (B_{2,1} + B_{2,2}) -\end {align*} - -Используя эти элементы мы можем выразить блоки результирующей матрицы следующим образом. - -\begin {align*} -C_{1,1} & = P_1 + P_4 - P_5 + P_7 \\ -C_{1,2} & = P_3 + P_5 \\ -C_{2,1} & = P_2 + P_4 \\ -C_{2,2} & = P_1 - P_2 + P_3 + P_6 -\end {align*} - -При таком способе вычисления мы получаем на одно умножение подматриц меньше, чем при наивном подходе. Это и приводит, в конечном итоге, к улучшению сложности всего алгоритма, который основывается на рекурсивном повторении проделанной выше процедуры. - -Впоследствии сложность постепенно понижалась в ряде работ, таких как ~\cite{Pan1978,BiniCapoRoma1979,Schonhage1981,CoppWino1982,CoppWino1990}. Было введено специальное обозначение для показателя степени в данной оценке: $\omega$. То есть сложность умножения матриц --- это $O(n^\omega)$, и задача сводится к уменьшению значения $\omega$. В настоящее время работа над уменьшением показателя степени продолжается и сейчас уже предложены решения с $\omega < 2.373$\footnote{В данной области достаточно регулярно появляются новые результаты, дающие сравнительно небольшие, в терминах абсолютных величин, изменения. Так, в 2021 была представлена работа, улучшающая значение $\omega$ в пятом знаке после запятой~\cite{alman2020refined}. Несмотря на кажущуюся несерьёзность результата, подобные работы имеют большое теоретическое значение, так как улучшают наше понимание исходной задачи и её свойств.}. - -Всё тем же Ф. Штрассеном ещё в 1969 году была выдвинута гипотеза о том, что для достаточно больших $n$ существует алгоритм, который для любого сколь угодно маленького наперёд заданного $\varepsilon$ перемножает матрицы за $O(n^{2+\varepsilon})$. На текущий момент ни доказательства, ни опровержения этой гипотезы не предъявлено. - -Важной особенностью указанного выше направления улучшения алгоритмов является то, что оно допускает использования (и даже основывается на использовании) более богатых алгебраических структур, чем требуется для определения умножения двух матриц. Так, уже алгоритм Штрасеена использует операцию вычитания, что приводит к необходимости иметь обратные элементы по сложению, а значит определять матрицы над кольцом. Хотя для исходного определения (\ref{def:MxM}) достаточно более бедной структуры. При этом, часто, структуры, возникающие в прикладных задачах кольцами не являются. Примерами могут служить тропическое (или $\{min,+\}$) полукольцо, играющее ключевую роль в тропической математике, или булево ($\{\vee,\wedge\}$) полукольцо, возникающее, например, при работе с отношениями\footnote{Вообще говоря, в некоторых прикладных задачах возникают структуры, не являющиеся даже полукольцом. Предположим, что есть три различных множества $S_1, S_2$ и $S_3$ и две двухместные функции $f:S_1 \times S_2 \to S_3$ и $g: S_3 \times S_3 \to S_3$. Этого достаточно, чтобы определить произведение двух матриц $M_1$ и $M_2$, построенных из элементов множеств $S_1$ и $S_2$ соответственно. Результирующая матрица будет состоять из элементов $S_3$. Как видно, функции не являются бинарными операциями в смысле нашего определения. Несмотря на кажущуюся экзотичность, подобные структуры возникают на практике при работе с графами и учитываются, например, в стандарте GraphBLAS (\url{https://graphblas.github.io/}), где, кстати, называются полукольцами, что выглядит не вполне корректно.}. Значит, описанные выше решения не применимы и вопрос о существовании алгоритма с менее чем кубической сложностью снова актуален. - -В попытках ответить на этот вопрос появились так называемые комбинаторные алгоритмы умножения матриц\footnote{В противовес описанным выше, не являющимся комбинаторными. Стоит отметить, что строгое определение комбинаторных алгоритмов отсутствует, хотя этот термин и получил широкое употребление. В частности, Н.~Бансал (Nikhil Bansal) и Р.~Уильямс (Ryan Williams) в работе~\cite{5438580} дают определение комбинаторного алгоритма, но тут же замечают следующее: ``We would like to give a definition of ``combinatorial algorithm'', but this appears elusive. Although the term has been used in many of the cited references, nothing in the literature resembles a definition. For the purposes of this paper, let us think of a ``combinatorial algorithm'' simply as one that does not call an oracle for ring matrix multiplication.''. Ещё один вариант определения и его обсуждение можно найти в~\cite{das2018lower}.}. Классический результат в данной области --- это алгоритм четырёх русских, предложенный В. Л. Арлазаровым, Е. А. Диницем, М. А. Кронродом и И. А. Фараджевым в 1970 году~\cite{ArlDinKro70}, позволяющий перемножить матрицы над конечным полукольцом за $O(n^3/\log n)$. Лучшим результатом\footnote{В работе~\cite{das2018lower} предложен алгоритм со сложностью $\Omega(n^{7/3}/2^{O(\sqrt{\log n})})$, однако авторы утверждают, что сами не уверены в комбинаторности предложенного решения. По-видимому, полученные результаты ещё должны быть проверены сообществом.} в настоящее время является алгоритм со сложностью\footnote{Нотация $\hat{O}$ скрывает $poly(\log\log)$ коэффициенты.} $\hat{O}(n^3/\log^4 n)$~\cite{10.1007/978-3-662-47672-7_89}. - -Как видим, особенности алгебраических структур накладывают серьёзные ограничения на возможности конструирования алгоритмов. Отметим, что, хотя, в указанных случаях и предлагаются решения лучшие, чем наивное кубическое, они обладают принципиально разной асимптотической сложностью. в первом случае сложность оценивается полиномом, степень которого меньше третьей. Такие решения принято называть \textit{истинно субкубическими} (truly subcubic). В то время как в случае комбинаторных алгоритмов степень полинома остается прежней, третьей, хотя сложность и уменьшается на логарифмический фактор. Такие решения принято называть \textit{слегка субкубическими} (mildly subcubic). Естественный вопрос о существовании истинно субкубического алгоритма перемножения матриц над полукольцами (или же комбинаторного перемножения матриц) всё ещё не решён\footnote{Один из кандидатов --- работа~\cite{das2018lower}, однако на текущий момент предложенное в ней решение требует проверки.}. - -%Заметим, что скалярная операция --- это частный случай произвеления Кронекера: достаточно превратить элемент носителя полугруппы в матрицу размера $1\times 1$. - -%\section{Вопросы и задачи} -%\begin{enumerate} -% \item Привидите примеры некоммутативных операций. -% \item Привидите примеры ситуаций, когда наличие у бинарных операций каких-либо дополнитльных свойств (ассоциативности, коммутативности), позволяет строить более эффективные алгоритмы, чем в общем случае. -%\end{enumerate} +\endgroup + +%% FIXME: Исправить раздел +% \section{Теоретическая сложность умножения матриц} + +% В рамках такого раздела теории сложности, как мелкозернистая сложность (fine-grained complexity) задача умножения двух матриц оказалась достаточно важной, так как через вычислительную сложность этой задачи можно оценить сложность большого класса различных задач. +% С примерами таких задач можно ознакомиться в работе~\sidecite{Williams:2010:SEP:1917827.1918339}. Поэтому рассмотрим алгоритмы нахождения произведения двух матриц более подробно. +% Далее для простоты мы будем предполагать, что перемножаются две квадратные матрицы одинакового размера $n \times n$. + +% Для начала построим наивный алгоритм, сконструированный на основе определения произведения матриц. +% Такой алгоритм представлен на листинге~\ref{algo:MxM}. +% \marginnote{TODO: Оформление алгоритмов точно надо обсудить, потому что я в этом мало понимаю.} +% Его работу можно описать следующим образом: для каждой строки в первой матрице и для каждого столбца в второй матрице найти сумму произведений соответствующих элементов. +% Данная сумма будет значением соответствующей ячейки результирующей матрицы. + +% \begin{algorithm}{Наивное умножение матриц}{MxM} +% \begin{pseudo}[] +% \kw{function} \pr{MatrixMult}(M_1, M_2, G = (S, \oplus, \otimes)) \\+ +% $M_3 = $ пустая матрица размера $n \times n$ \\ +% \kw{for} $i \in [0 \rng n - 1]$ \\+ +% \kw{for} $j \in [0 \rng n - 1]$ \\+ +% \kw{for} $k \in [0 \rng n - 1]$ \\+ +% $M_3[i, j] = M_3[i, j] \oplus (M_1[i, k] \otimes M_2[k, j])$ \\--- +% \kw{return} $M_3$ +% \end{pseudo} +% \end{algorithm} + +% Сложность наивного произведения двух матриц составляет $O(n^3)$ из-за тройного вложенного цикла, где каждый уровень вложенности привносит $n$ итераций. +% Но можно ли улучшить этот алгоритм? +% Первый положительный ответ был опубликовал Ф. Штрассен в 1969 году~\sidecite{Strassen1969}. +% Сложность предложенного им алгоритма~--- $O(n^{\log_2 7}) \approx O(n^{2.81})$. +% Основная идея~--- рекурсивное разбиение исходных матриц на блоки и вычисление их произведения с помощью только 7 умножений, а не 8. + +% Рассмотрим алгоритм Штрассена более подробно. +% Пусть $A$ и $B$~--- две квадратные матрицы размера $2^n \times 2^n$ над кольцом $R=(S, \oplus, \otimes)$. +% Если размер умножаемых матриц не является натуральной степенью двойки, то дополняем исходные матрицы дополнительными нулевыми строками и столбцами. +% Наша задача найти матрицу $C = A \cdot B$. + +% Разделим матрицы $A, B$ и $C$ на четыре равные по размеру блока. +% \[ +% A = +% \begin{pmatrix} +% A_{1,1} & A_{1,2} \\ +% A_{2,1} & A_{2,2} +% \end{pmatrix}, +% \quad +% B = +% \begin{pmatrix} +% B_{1,1} & B_{1,2} \\ +% B_{2,1} & B_{2,2} +% \end{pmatrix}, +% \quad +% C = +% \begin{pmatrix} +% C_{1,1} & C_{1,2} \\ +% C_{2,1} & C_{2,2} +% \end{pmatrix} +% \] + +% По определению произведения матриц выполняются следующие равенства. +% \marginnote{TODO: Вообще можно попробовать раскидать на 2 столбца} +% \begin{align*} +% C_{1, 1} & = A_{1, 1} \cdot B_{1, 1} + A_{1, 2} \cdot B_{2, 1} \\ +% C_{1, 2} & = A_{1, 1} \cdot B_{1, 2} + A_{1, 2} \cdot B_{2, 2} \\ +% C_{2, 1} & = A_{2, 1} \cdot B_{1, 1} + A_{2, 2} \cdot B_{2, 1} \\ +% C_{2, 2} & = A_{2, 1} \cdot B_{1, 2} + A_{2, 2} \cdot B_{2, 2} +% \end{align*} + +% Данная процедура не даёт нам ничего нового с точки зрения вычислительной сложности. +% Но мы можем двинуться дальше и определить следующие элементы. +% \begin{align*} +% P_1 & \equiv (A_{1, 1} + A_{2, 2}) \cdot (B_{1, 1} + B_{2, 2}) \\ +% P_2 & \equiv (A_{2, 1} + A_{2, 2}) \cdot B_{1, 1} \\ +% P_3 & \equiv A_{1, 1} \cdot (B_{1, 2} - B_{2, 2}) \\ +% P_4 & \equiv A_{2, 2} \cdot (B_{2, 1} - B_{1, 1}) \\ +% P_5 & \equiv (A_{1, 1} + A_{1, 2}) \cdot B_{2, 2} \\ +% P_6 & \equiv (A_{2, 1} - A_{1, 1}) \cdot (B_{1, 1} + B_{1, 2}) \\ +% P_7 & \equiv (A_{1, 2} - A_{2, 2}) \cdot (B_{2, 1} + B_{2, 2}) +% \end{align*} + +% Используя эти элементы мы можем выразить блоки результирующей матрицы следующим образом. +% \begin{align*} +% C_{1, 1} & = P_1 + P_4 - P_5 + P_7 \\ +% C_{1, 2} & = P_3 + P_5 \\ +% C_{2, 1} & = P_2 + P_4 \\ +% C_{2, 2} & = P_1 - P_2 + P_3 + P_6 +% \end{align*} + +% При таком способе вычисления мы получаем на одно умножение подматриц меньше, чем при наивном подходе. +% Это и приводит, в конечном итоге, к улучшению сложности всего алгоритма, который основывается на рекурсивном повторении проделанной выше процедуры. + +% \marginnote{TODO: здесь \textbackslash{}sidecite не влезает} +% Впоследствии сложность постепенно понижалась в ряде работ, таких как~\cite{Pan1978,BiniCapoRoma1979,Schonhage1981,CoppWino1982,CoppWino1990}. +% Было введено специальное обозначение для показателя степени в данной оценке: $\omega$. +% То есть сложность умножения матриц~--- это $O(n^\omega)$, и задача сводится к уменьшению значения $\omega$. +% В настоящее время работа над уменьшением показателя степени продолжается и сейчас уже предложены решения с $\omega < 2.373$% +% \sidenote{ +% В данной области достаточно регулярно появляются новые результаты, дающие сравнительно небольшие, в терминах абсолютных величин, изменения. +% Так, в 2021 была представлена работа, улучшающая значение $\omega$ в пятом знаке после запятой~\cite{alman2020refined}. +% Несмотря на кажущуюся несерьёзность результата, подобные работы имеют большое теоретическое значение, так как улучшают наше понимание исходной задачи и её свойств.}% +% . + +% Всё тем же Ф. Штрассеном ещё в 1969 году была выдвинута гипотеза о том, что для достаточно больших $n$ существует алгоритм, который для любого сколь угодно маленького наперёд заданного $\varepsilon$ перемножает матрицы за $O(n^{2+\varepsilon})$. +% На текущий момент ни доказательства, ни опровержения этой гипотезы не предъявлено. + +% Важной особенностью указанного выше направления улучшения алгоритмов является то, что оно допускает использования (и даже основывается на использовании) более богатых алгебраических структур, чем требуется для определения умножения двух матриц. +% Так, уже алгоритм Штрасеена использует операцию вычитания, что приводит к необходимости иметь обратные элементы по сложению, а значит определять матрицы над кольцом. +% Хотя для исходного определения (\ref{def:MxM}) достаточно более бедной структуры. +% При этом, часто, структуры, возникающие в прикладных задачах кольцами не являются. +% \marginnote{TODO: Не кажется ли что текста на полях слишком много и его можно прямо в главу вписать?} +% Примерами могут служить тропическое (или $\{min, +\}$) полукольцо, играющее ключевую роль в тропической математике, или булево ($\{\lor, \land\}$) полукольцо, возникающее, например, при работе с отношениями% +% \sidenote{ +% Вообще говоря, в некоторых прикладных задачах возникают структуры, не являющиеся даже полукольцом. +% Предположим, что есть три различных множества $S_1$, $S_2$ и $S_3$ и две двухместные функции $f: S_1 \times S_2 \to S_3$ и $g: S_3 \times S_3 \to S_3$. +% Этого достаточно, чтобы определить произведение двух матриц $M_1$ и $M_2$, построенных из элементов множеств $S_1$ и $S_2$ соответственно. +% Результирующая матрица будет состоять из элементов $S_3$. +% Как видно, функции не являются бинарными операциями в смысле нашего определения. +% Несмотря на кажущуюся экзотичность, подобные структуры возникают на практике при работе с графами и учитываются, например, в стандарте GraphBLAS (\url{https://graphblas.github.io/}), где, кстати, называются полукольцами, что выглядит не вполне корректно.}% +% . +% Значит, описанные выше решения не применимы и вопрос о существовании алгоритма с менее чем кубической сложностью снова актуален. + +% В попытках ответить на этот вопрос появились так называемые комбинаторные алгоритмы умножения матриц% +% \sidenote{ +% В противовес описанным выше, не являющимся комбинаторными. +% Стоит отметить, что строгое определение комбинаторных алгоритмов отсутствует, хотя этот термин и получил широкое употребление. +% В частности, Н.~Бансал (Nikhil Bansal) и Р.~Уильямс (Ryan Williams) в работе~\cite{5438580} дают определение комбинаторного алгоритма, но тут же замечают следующее: \enquote{We would like to give a definition of \enquote{combinatorial algorithm}, but this appears elusive. Although the term has been used in many of the cited references, nothing in the literature resembles a definition. For the purposes of this paper, let us think of a \enquote{combinatorial algorithm} simply as one that does not call an oracle for ring matrix multiplication.}. +% Ещё один вариант определения и его обсуждение можно найти в~\cite{das2018lower}.}% +% . +% Классический результат в данной области~--- это алгоритм четырёх русских, предложенный В. Л. Арлазаровым, Е. А. Диницем, М. А. Кронродом и И. А. Фараджевым в 1970 году~\cite{ArlDinKro70}, позволяющий перемножить матрицы над конечным полукольцом за $O(n^3/\log n)$. +% Лучшим результатом% +% \sidenote{ +% В работе~\cite{das2018lower} предложен алгоритм со сложностью $\Omega(n^{7/3}/2^{O(\sqrt{\log n})})$, однако авторы утверждают, что сами не уверены в комбинаторности предложенного решения. +% По-видимому, полученные результаты ещё должны быть проверены сообществом.} +% в настоящее время является алгоритм со сложностью% +% \sidenote{Нотация $\hat{O}$ скрывает $poly(\log\log)$ коэффициенты.} $\hat{O}(n^3/\log^4 n)$~\cite{10.1007/978-3-662-47672-7_89}. + +% Как видим, особенности алгебраических структур накладывают серьёзные ограничения на возможности конструирования алгоритмов. +% Отметим, что, хотя, в указанных случаях и предлагаются решения лучшие, чем наивное кубическое, они обладают принципиально разной асимптотической сложностью. +% В первом случае сложность оценивается полиномом, степень которого меньше третьей. +% Такие решения принято называть \emph{истинно субкубическими} (truly subcubic). +% В то время как в случае комбинаторных алгоритмов степень полинома остается прежней, третьей, хотя сложность и уменьшается на логарифмический фактор. +% Такие решения принято называть \emph{слегка субкубическими} (mildly subcubic). +% Естественный вопрос о существовании истинно субкубического алгоритма перемножения матриц над полукольцами (или же комбинаторного перемножения матриц) всё ещё не решён% +% \sidenote{Один из кандидатов~--- работа~\cite{das2018lower}, однако на текущий момент предложенное в ней решение требует проверки.}. + +% %Заметим, что скалярная операция~--- это частный случай произвеления Кронекера: достаточно превратить элемент носителя полугруппы в матрицу размера $1\times 1$. + +% %\section{Вопросы и задачи} +% %\begin{enumerate} +% % \item Привидите примеры некоммутативных операций. +% % \item Привидите примеры ситуаций, когда наличие у бинарных операций каких-либо дополнитльных свойств (ассоциативности, коммутативности), позволяет строить более эффективные алгоритмы, чем в общем случае. +% %\end{enumerate} diff --git a/tex/List_of_contributors.tex b/tex/List_of_contributors.tex index 66b0e68..ae6d48e 100644 --- a/tex/List_of_contributors.tex +++ b/tex/List_of_contributors.tex @@ -1,30 +1,19 @@ -\chapter*{Список авторов\markboth{Введение}{Список авторов}} -%\begin{multicols}{2} - \begin{itemize} - \item \textbf{Семён Григорьев} \\ - Санкт-Петербургский государственный университет, Университетская набережная, 7/9, Санкт-Петербург, 199034, Россия \\ - \url{s.v.grigoriev@spbu.ru}\\ - \\ - JetBrains Research, Приморский проспект 68-70, здание 1, Санкт-Петербург, 197374, Россия \\ - \url{semyon.grigorev@jetbrains.com} - - - \item \textbf{Екатерина Вербицкая} \\ -% Санкт-Петербургский государственный университет \\ -% Университетская набережная, 7/9 \\ -% Санкт-Петербург, 199034, Россия \\ -% \url{s.v.grigoriev@spbu.ru}\\ -% \\ - JetBrains Research, Приморский проспект 68-70, здание 1, Санкт-Петербург, 197374, Россия \\ - \url{ekaterina.verbitskaya@jetbrains.com} - - - \item \textbf{Дмитрий Кутленков} \\ - Санкт-Петербургский государственный университет, Университетская набережная, 7/9, Санкт-Петербург, 199034, Россия \\ - \url{kutlenkov.dmitri@gmail.com} - - \item Полный список людей, внёсших свой вклад в данную работу, можно посмотреть на страничке проекта: \\ \small{\href{https://github.com/FormalLanguageConstrainedPathQuerying/FormalLanguageConstrainedReachability-LectureNotes}{https://github.com/FormalLanguageConstrainedPathQuerying/\\FormalLanguageConstrainedReachability-LectureNotes}} - - \end{itemize} -%\end{multicols} - +\addchap{Список авторов} + +\begin{description}[style=nextline] + \item[Семён Григорьев] + Санкт-Петербургский государственный университет, Университетская набережная, 7/9, Санкт-Петербург, 199034, Россия \\ + \email{s.v.grigoriev@spbu.ru}\\ + JetBrains Research, Приморский проспект 68-70, здание 1, Санкт-Петербург, 197374, Россия \\ + \email{semyon.grigorev@jetbrains.com} + \item[Екатерина Вербицкая] + JetBrains Research, Приморский проспект 68-70, здание 1, Санкт-Петербург, 197374, Россия \\ + \email{ekaterina.verbitskaya@jetbrains.com} + \item[Дмитрий Кутленков] + Санкт-Петербургский государственный университет, Университетская набережная, 7/9, Санкт-Петербург, 199034, Россия \\ + \email{kutlenkov.dmitri@gmail.com} + \item[] +\end{description} + +Полный список людей, внёсших свой вклад в данную работу, можно посмотреть на страничке проекта: +\url{https://github.com/FormalLanguageConstrainedPathQuerying/FormalLanguageConstrainedReachability-LectureNotes} diff --git a/tex/Makefile b/tex/Makefile new file mode 100644 index 0000000..e889e56 --- /dev/null +++ b/tex/Makefile @@ -0,0 +1,27 @@ +NAME = FormalLanguageConstrainedReachabilityLectureNotes +ENGINE = lualatex # Only `xelatex` or `lualatex` are allowed here + +.PHONY: $(NAME).pdf clean dist-clean format + +all: $(NAME).pdf + +$(NAME).pdf: + latexmk -$(ENGINE) -synctex=1 -interaction=nonstopmode -file-line-error -shell-escape $(NAME).tex + +clean: + latexmk -c $(NAME).tex + +dist-clean: + latexmk -C $(NAME).tex + +# https://stackoverflow.com/a/12959694 +# Make does not offer a recursive wildcard function, so here's one: +rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) + +FILES_TO_FORMAT := $(call rwildcard,./,*.tex) \ + $(call rwildcard,./,*.cls) \ + $(call rwildcard,./,*.bib) +#$(info $(FILES_TO_FORMAT)) + +format: + $(foreach file, $(FILES_TO_FORMAT), latexindent -l -s -o=$(file) -m $(file);) diff --git a/tex/Matrix-based_CFPQ.tex b/tex/Matrix-based_CFPQ.tex index 6cab06b..d6a2698 100644 --- a/tex/Matrix-based_CFPQ.tex +++ b/tex/Matrix-based_CFPQ.tex @@ -188,38 +188,39 @@ \end{example} -\subsection{Расширение алгоритма для конъюнктивных грамматик} - -Матричный алгоритм для конъюнктивных грамматик отличается от алгоритма~\ref{alg:graphParse} для контекстно-свободных грамматик только операцией умножения матриц, в остальном алгоритм остается без изменений. Определим операцию умножения матриц. -\begin{definition} - Пусть $M_1$ и $M_2$ матрицы размера $n$. Определим операцию $\circ$ следующим образом: - \[M_1 \circ M_2 = M_3,\] - \[M_3 [i,j] = \{A \mid \exists (A \rightarrow B_1 C_1 \& \ldots \& B_m C_m) \in P, (B_k , C_k) \in d[i,j] \forall k = 1,\ldots,m\}\], - где \[d[i,j] = \bigcup_{k = 1}^{n} M_1 [i,k] \times M_2 [k,j].\] -\end{definition} - -Важно заметить, что алгоритм для конъюнктивных грамматик, в отличие от алгоритма для контекстно-свободных грамматик, дает лишь верхнюю оценку ответа. То есть все нетерминалы, которые должны быть в ячейках матрицы результата, содержатся там, но вместе с ними содержатся и лишние нетерминалы. Рассмотрим пример, иллюстрирующий появление лишних нетерминалов. - -\begin{example} - Грамматика $G$: - \begin{align*} - S &\to AB \& DC & C &\to c \\ - A &\to a & D &\to DC \mid b\\ - B &\to BC \mid b - \end{align*} - Очевидно, что грамматика $G$ задает язык из одного слова $L(G) = \{abc\} = \{abc^*\} \cap \{a^* bc\}$. - - Пусть есть граф $\mathcal{G}$: - \begin{center} - \input{figures/multi/graph0.tex} - \end{center} - Применяя алгоритм, получим, что существует путь из вершины 0 в вершину 4, выводимый из нетерминала $S$. Однако очевидно, что в графе такого пути нет. - Такое поведение алгоритма наблюдается из-за того, что существует путь ``abcc'', соответствующий $L(AB) = \{abc^*\}$ и путь ``aabc'', соответствующий $L(DC) = \{a^{*}bc\}$, но они различны. Однако алгоритм не может это проверить, так как оперирует понятием достижимости между вершинами, а не наличием различных путей. Более того, в общем случае для конъюнктивных грамматик такую проверку реалиховать нельзя. Поэтому для классической семантики достидимости с ограничениями в терминах конъюнктивных грамматик результат работы алгоритма является оценкой сверху. - - Существует альтернативная семантика, когда мы трактуем конъюнкцию в правой части правил как конъюнкцию в Datalog (подробнее о Datalog в параграфе~\ref{Subsection Datalog}). Т.е если есть правило $S \to AB \& DC$, то должен быть путь принадлежащий языку $L(AB)$ и путь принадлежащий языку $L(DC)$. В такой семантике алгоритм дает точный ответ. -\end{example} - -Подробнее алгоритм описан в статье Рустама Азимова и Семёна Григорьева~\cite{565CECD7E8F5C6063935B41DB41797AA37D53B04}. Стоит также отметить, что обобщения данного алгоритма для булевых грамматик не существует, хотя и существует частное решение для случая, когда граф не содержит циклов (является DAG-ом), предложенное Екатериной Шеметовой~\cite{Shemetova2019}. +%% FIXME: Исправить подраздел +% \subsection{Расширение алгоритма для конъюнктивных грамматик} + +% Матричный алгоритм для конъюнктивных грамматик отличается от алгоритма~\ref{alg:graphParse} для контекстно-свободных грамматик только операцией умножения матриц, в остальном алгоритм остается без изменений. Определим операцию умножения матриц. +% \begin{definition} +% Пусть $M_1$ и $M_2$ матрицы размера $n$. Определим операцию $\circ$ следующим образом: +% \[M_1 \circ M_2 = M_3,\] +% \[M_3 [i,j] = \{A \mid \exists (A \rightarrow B_1 C_1 \& \ldots \& B_m C_m) \in P, (B_k , C_k) \in d[i,j] \forall k = 1,\ldots,m\}\], +% где \[d[i,j] = \bigcup_{k = 1}^{n} M_1 [i,k] \times M_2 [k,j].\] +% \end{definition} + +% Важно заметить, что алгоритм для конъюнктивных грамматик, в отличие от алгоритма для контекстно-свободных грамматик, дает лишь верхнюю оценку ответа. То есть все нетерминалы, которые должны быть в ячейках матрицы результата, содержатся там, но вместе с ними содержатся и лишние нетерминалы. Рассмотрим пример, иллюстрирующий появление лишних нетерминалов. + +% \begin{example} +% Грамматика $G$: +% \begin{align*} +% S &\to AB \& DC & C &\to c \\ +% A &\to a & D &\to DC \mid b\\ +% B &\to BC \mid b +% \end{align*} +% Очевидно, что грамматика $G$ задает язык из одного слова $L(G) = \{abc\} = \{abc^*\} \cap \{a^* bc\}$. + +% Пусть есть граф $\mathcal{G}$: +% \begin{center} +% \input{figures/multi/graph0.tex} +% \end{center} +% Применяя алгоритм, получим, что существует путь из вершины 0 в вершину 4, выводимый из нетерминала $S$. Однако очевидно, что в графе такого пути нет. +% Такое поведение алгоритма наблюдается из-за того, что существует путь ``abcc'', соответствующий $L(AB) = \{abc^*\}$ и путь ``aabc'', соответствующий $L(DC) = \{a^{*}bc\}$, но они различны. Однако алгоритм не может это проверить, так как оперирует понятием достижимости между вершинами, а не наличием различных путей. Более того, в общем случае для конъюнктивных грамматик такую проверку реалиховать нельзя. Поэтому для классической семантики достидимости с ограничениями в терминах конъюнктивных грамматик результат работы алгоритма является оценкой сверху. + +% Существует альтернативная семантика, когда мы трактуем конъюнкцию в правой части правил как конъюнкцию в Datalog (подробнее о Datalog в параграфе~\ref{Subsection Datalog}). Т.е если есть правило $S \to AB \& DC$, то должен быть путь принадлежащий языку $L(AB)$ и путь принадлежащий языку $L(DC)$. В такой семантике алгоритм дает точный ответ. +% \end{example} + +% Подробнее алгоритм описан в статье Рустама Азимова и Семёна Григорьева~\cite{565CECD7E8F5C6063935B41DB41797AA37D53B04}. Стоит также отметить, что обобщения данного алгоритма для булевых грамматик не существует, хотя и существует частное решение для случая, когда граф не содержит циклов (является DAG-ом), предложенное Екатериной Шеметовой~\cite{Shemetova2019}. \section{Особенности реализации} diff --git a/tex/RegularLanguages.tex b/tex/RegularLanguages.tex index ccf39ac..572d324 100644 --- a/tex/RegularLanguages.tex +++ b/tex/RegularLanguages.tex @@ -1,53 +1,62 @@ +\setchapterpreamble[u]{\margintoc} \chapter{Регулярные языки} +\tikzsetfigurename{RegularLanguages_} - -В данном разделе мы обсудим регулярные языки --- класс, лежащий на самом нижнем уровне иерархии Хомского. -Будут рассмотрены основные способы задания таких языков: \textit{регулярные выражения}, \textit{конечные автоматы}, \textit{лево(право)линейные грамматики}. +В данном разделе мы обсудим регулярные языки~--- класс, лежащий на самом нижнем уровне иерархии Хомского. +Будут рассмотрены основные способы задания таких языков: \emph{регулярные выражения}, \emph{конечные автоматы}, \emph{лево(право)линейные грамматики}. Обсудим основные свойства регулярных языков, такие как замкнутость относительно различных операций, а также различные свойства соответствующих автоматов и грамматик. - \section{Регулярные выражения} -Регулярные выражения --- один из классических способов задать регулярный язык\footnote{Замечание для программистов. Важно понимать, что речь идёт о формальной конструкции, а не о том, что называется регулярными выражениями в различных языках программирования или библиотеках, где под названием <<регулярные выражения>> могут скрываться конструкции, существенно более выразительные, чем обсуждаемые здесь.}. -Основывается этот способ на предложении синтаксиса для описания \textit{регулярных множеств}\footnote{Помним, что язык --- это множество слов.}. +Регулярные выражения~--- один из классических способов задать регулярный язык% +\sidenote{ + Замечание для программистов. + Важно понимать, что речь идёт о формальной конструкции, а не о том, что называется регулярными выражениями в различных языках программирования или библиотеках, где под названием \enquote{регулярные выражения} могут скрываться конструкции, существенно более выразительные, чем обсуждаемые здесь. +}. +Основывается этот способ на предложении синтаксиса для описания \emph{регулярных множеств}% +\sidenote{Помним, что язык~--- это множество слов.}. -\begin{definition} +\begin{definition}[Регулярное множество] Регулярное множество (над алфавитом $\Sigma$) это: \begin{itemize} - \item $\varnothing$ - \item $\{\varepsilon\}$ - \item $\{t\}$, $t \in \Sigma$ - \item $R_1 \cup R_2$, где $R_1$ и $R_2$ --- регулярные множества - \item $R_1 \cdot R_2$, где $R_1$ и $R_2$ --- регулярные множества - \item $R^*$, где $R$ --- регулярное множество + \item $\varnothing$; + \item $\{\varepsilon\}$; + \item $\{t\}$, $t \in \Sigma$; + \item $R_1 \cup R_2$, где $R_1$ и $R_2$~--- регулярные множества; + \item $R_1 \cdot R_2$, где $R_1$ и $R_2$~--- регулярные множества; + \item $R^*$, где $R$~--- регулярное множество. \end{itemize} \end{definition} -Для того, чтобы описывать такие множества, удобно пользоваться \textit{регулярными выражениями}. +Для того, чтобы описывать такие множества, удобно пользоваться \emph{регулярными выражениями}. -\begin{definition} +\begin{definition}[Регулярное выражение] Регулярное выражение (над алфавитом $\Sigma$) это: \begin{itemize} - \item $\varnothing$ - \item $\varepsilon$ - \item $t$, $t \in \Sigma$ - \item $R_1 \mid R_2$, где $R_1$ и $R_2$ --- регулярные выражения - \item $R_1 \cdot R_2$, где $R_1$ и $R_2$ --- регулярные выражения - \item $R^*$, где $R$ --- регулярное выражение - \item $(R)$, где $R$ --- регулярное выражение + \item $\varnothing$; + \item $\varepsilon$; + \item $t$, $t \in \Sigma$; + \item $R_1 \mid R_2$, где $R_1$ и $R_2$~--- регулярные выражения; + \item $R_1 \cdot R_2$, где $R_1$ и $R_2$~--- регулярные выражения; + \item $R^*$, где $R$~--- регулярное выражение; + \item $(R)$, где $R$~--- регулярное выражение. \end{itemize} \end{definition} Отметим несколько важных с прикладной точки зрения моментов. Во-первых, часто используется расширенный синтаксис, в который добавляются конструкции не увеличивающие выразительную силу, но упрощающие запись. -Например, встречаются следующие расширения\footnote{Существуют и другие, однако их мы не будем использовать и, соответственно, рассматривать. Читатель может вспомнить, что называется регулярными выражениями в его любимом языке программирования и попробовать самостоятельно выразить имеющиеся там конструкции через базовые.}. +Например, встречаются следующие расширения% +\sidenote{ + Существуют и другие, однако их мы не будем использовать и, соответственно, рассматривать. + Читатель может вспомнить, что называется регулярными выражениями в его любимом языке программирования и попробовать самостоятельно выразить имеющиеся там конструкции через базовые.}. \begin{itemize} - \item $R? = R \mid \varepsilon$, где $R$ --- регулярное выражение. - \item $R^+ = R \cdot R^*$, где $R$ --- регулярное выражение. + \item $R? = R \mid \varepsilon$, где $R$~--- регулярное выражение. + \item $R^+ = R \cdot R^*$, где $R$~--- регулярное выражение. \end{itemize} Во-вторых, конструкции $\varnothing$ и $\varepsilon$ используются крайне редко, особенно в случае расширенного синтаксиса, так как часто выражение, эквивалентное использующему данные конструкции, часто более компактно записывается с использованием расширенного синтаксиса. -В-третьих, оператор конкатенации часто опускается\footnote{Как и знак умножения во многих математических записях.}. +В-третьих, оператор конкатенации часто опускается% +\sidenote{Как и знак умножения во многих математических записях.}. Рассмотрим несколько примеров регулярных выражений. \begin{example} @@ -55,7 +64,7 @@ \section{Регулярные выражения} \end{example} \begin{example} - Регулярное выражение $ab$ задаёт регулярное множество $\{ab\}$ и, соответственно, язык из единственного слова $ab$. + Регулярное выражение $ab$ задаёт регулярное множество $\{ab\}$ и, соответственно, язык из единственного слова $ab$. \end{example} @@ -78,41 +87,43 @@ \section{Регулярные выражения} \section{Конечные автоматы} -\textit{Конечный автомат} --- вычислительная машина, которая имеет конечный набор состояний и может совершать переходы между ними, читая входные данные. -Важно отметить, что ни какой дополнительной памяти классический конечный автомат не имеет\footnote{Существуют автоматы с константной памятью, регистрами} и не производит дополнительных действий\footnote{Автоматы с записью на ленту, и т.д.}. +\emph{Конечный автомат}~--- вычислительная машина, которая имеет конечный набор состояний и может совершать переходы между ними, читая входные данные. +Важно отметить, что ни какой дополнительной памяти классический конечный автомат не имеет% +\sidenote{Существуют автоматы с константной памятью, регистрами} и не производит дополнительных действий% +\sidenote{Автоматы с записью на ленту, и т.д.}. -\begin{definition}\label{def:NondeterminicticFiniteAutomata} - \textit{Недетерминированный конечный автомат, НКА} --- это пятёрка $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$, где +\begin{definition}[Недетерминированный конечный автомат] + \label{def:NondeterminicticFiniteAutomata} + \emph{Недетерминированный конечный автомат} (НКА)~--- это пятёрка $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$, где \begin{itemize} - \item $Q$ --- конечное множество состояний - \item $Q_S \in Q$ --- множество стартовых состояний - \item $Q_F \subseteq Q$ --- множество финальных состояний - \item $\delta \subseteq Q \times (\Sigma \cup \varepsilon) \times 2^Q$ --- функция переходов, а $\varepsilon \notin \Sigma$ - \item $\Sigma$ --- конечный алфавит + \item $Q$~--- конечное множество состояний; + \item $Q_S \subseteq= Q$~--- множество стартовых состояний; + \item $Q_F \subseteq Q$~--- множество финальных состояний; + \item $\delta \subseteq Q \times (\Sigma \cup \varepsilon) \times 2^Q$~--- функция переходов, а $\varepsilon \notin \Sigma$; + \item $\Sigma$~--- конечный алфавит. \end{itemize} \end{definition} Так как нас интересуют конечные автоматы в контексте языков, то будем говорить, что на ленте автомата записано какое-то слово (или строка). Иными словами, будем говорить, что автомат принимает на вход слово или строку. +Процесс вычислений, проделываемых конечным автоматом, удобно описывать в терминах переходов между \emph{конфигурациями}. -Процесс вычислений, проделываемых конечным автоматом, удобно описывать в терминах переходов между \textit{конфигурациями}. - -\begin{definition} - Конфигурация $c$ конечного автомата $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$ --- это пара $(q,w)$, где $q\in Q$ --- это текущее состояние автомата, а $w \in \Sigma^*$ --- непросмотренная часть входной строки. +\begin{definition}[Конфигурация] + Конфигурация $c$ конечного автомата $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$~--- это пара $(q, w)$, где $q\in Q$~--- это текущее состояние автомата, а $w \in \Sigma^*$~--- непросмотренная часть входной строки. \end{definition} -\begin{definition} - Будем говорить, что автомат $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$ может перейти из конфигурации $c_1 = (q_1,w_1)$ в конфигурацию $c_2 = (q_2,w_2)$, если - - $$c_2 \in \{(q_2,w_2) \mid w_1 = aw_2, (q_1,a, q_2) \in \delta\} \cup \{(q_2,w_1) \mid (q_1, \varepsilon, q_2) \in \delta\}.$$ - +\begin{definition}[Переход в НКА] + Будем говорить, что автомат $M = \langle Q, Q_S, Q_F, \delta, \Sigma \rangle$ может перейти из конфигурации $c_1 = (q_1, w_1)$ в конфигурацию $c_2 = (q_2, w_2)$, если + \[c_2 \in \{(q_2,w_2) \mid w_1 = aw_2, (q_1,a, q_2) \in \delta\} \cup \{(q_2,w_1) \mid (q_1, \varepsilon, q_2) \in \delta\}.\] Обозначать этот факт будем как $c_1 \to c_2$. \end{definition} +\marginnote{TODO: Без идей что тут написано, но жирная стрелочка для перехода выглядит естественнее} $$С_2 = \{(q_2,w_2) \mid w_1 = aw_2, (q_1,a, q_2) \in \delta\} \cup \{(q_2,w_1) \mid (q_1, \varepsilon, q_2) \in \delta\}.$$ $$ c_1 \Rightarrow C_2 $$ + Стартовая конфигурация. Финальная конфигурация. @@ -122,40 +133,37 @@ \section{Конечные автоматы} \begin{example} Пример интерпретации конечного автомата. \end{example} - -\begin{definition}\label{def:DeterminicticFiniteAutomata} - \textit{Детерминированный конечный автомат (ДКА, Deterministic Finite Automata, DFA)} --- это пятёрка $M = \langle Q, q_S, Q_F, \delta, \Sigma \rangle$, где +\begin{definition}[Детерминированный конечный автомат] + \label{def:DeterminicticFiniteAutomata} + \emph{Детерминированный конечный автомат} (ДКА, Deterministic Finite Automata, DFA)~--- это пятёрка $M = \langle Q, q_S, Q_F, \delta, \Sigma \rangle$, где \begin{itemize} - \item $Q$ --- конечное множество состояний - \item $q_S \in Q$ --- стартовое состояние - \item $Q_F \subseteq Q$ --- множество финальных состояний - \item $\delta \subseteq Q \times \Sigma \times Q$ --- функция переходов - \item $\Sigma$ --- конечный алфавит + \item $Q$~--- конечное множество состояний; + \item $q_S \in Q$~--- стартовое состояние; + \item $Q_F \subseteq Q$~--- множество финальных состояний; + \item $\delta \subseteq Q \times \Sigma \times Q$~--- функция переходов; + \item $\Sigma$~--- конечный алфавит. \end{itemize} \end{definition} - -Заметим, что функцию переходов можно представить разными способами В зависимости от того, как именно представлена функция переходов: список троек, матрица, граф. +Заметим, что функцию переходов можно представить разными способами в зависимости от того, как именно представлена функция переходов: список троек, матрица, граф. \begin{example} - Пример КА. - \begin{tikzpicture} - - \end{tikzpicture} -\end{example} - + Пример КА. + % \begin{tikzpicture} + % \end{tikzpicture} +\end{example} \begin{example} -Пример интерпретации конечного автомата. + Пример интерпретации конечного автомата. \end{example} Построение КА по регулярному выражению и регулярному выражению по КА. На производных. Построение регулярного выражения по КА. -Алгоритмы: проверка пустоты ... +Алгоритмы: проверка пустоты ... Примеры. @@ -164,17 +172,19 @@ \section{Лево(право)линейные грамматики} Наложив некоторые ограничения на внешний вид правил грамматики можно получить грамматики, задающие регулярные языки. -\begin{definition} - Грамматика $G=\langle \Sigma, N, P, S \rangle$ называется леволиненйной, если все её правила имеют вид $$N_i \to \alpha w $$, где $N_i \in N, \alpha \in \{\varepsilon\} \cup N, w \in \Sigma ^*$. +\begin{definition}[Леволинейная грамматика] + Грамматика $G=\langle \Sigma, N, P, S \rangle$ называется леволиненйной, если все её правила имеют вид + \[N_i \to \alpha w,\] + где $N_i \in N$, $\alpha \in \{\varepsilon\} \cup N$, $w \in \Sigma ^*$. \end{definition} -\begin{definition} - Грамматика $G=\langle \Sigma, N, P, S \rangle$ называется праволиненйной, если все её правила имеют вид $$N_i \to w \alpha$$, где $N_i \in N, \alpha \in \{\varepsilon\} \cup N, w \in \Sigma ^*$. +\begin{definition}[Праволинейная грамматика] + Грамматика $G=\langle \Sigma, N, P, S \rangle$ называется праволиненйной, если все её правила имеют вид + \[N_i \to w \alpha,\] + где $N_i \in N$, $\alpha \in \{\varepsilon\} \cup N$, $w \in \Sigma ^*$. \end{definition} - - -Ноам Хомский и Джордж Миллер в работе~\cite{chomsky1958finite} показали, что лево(право)линейные грамматики задают регулярные языки. +Ноам Хомский и Джордж Миллер в работе~\sidecite{chomsky1958finite} показали, что лево(право)линейные грамматики задают регулярные языки. Приведём процедуры построения автомата по грамматике и наоборот, грамматики по автомату. Пусть дан конечный автомат $M = \langle \Sigma, Q, q_s, Q_f, \delta \rangle$. По нему можно построить праволинейную грамматику $G=\langle \Sigma, N, S, P \rangle$, где @@ -186,43 +196,47 @@ \section{Лево(право)линейные грамматики} Аналогичным образом строится автомат по праволинейной грамматике. Упростить процедуру можно если заранее привести правила к виду $N_i \to tN_j$, где $t\in \Sigma$, добавив необходимое количество новых нетерминалов: -правило вида $N_i \to twN_k$ преобразуется в два правила +правило вида $N_i \to twN_k$ преобразуется в два правила \begin{align*} - N_i& \to tN_l\\ - N_l& \to wN_k \\ + N_i & \to tN_l \\ + N_l & \to wN_k, \end{align*} -, после чего аналогично преобразуется правило для $N_l$. +после чего аналогично преобразуется правило для $N_l$. Пример построения грамматики по автомату. -Автомат по грамматике. +Автомат по грамматике. \section{Лемма о накачке} Лемма о накачке для регулярных языков позволяет проверить, что заданный язык не является регулярным. \begin{lemma} - Пусть $L$ --- регулярный язык над алфавитом $\Sigma$, тогда существует такое $n$, что для любого слова $\omega \in L$, $|\omega| \geq n$ найдутся слова $x,y,z\in \Sigma^*$, для которых верно: $xyz = \omega, y\neq \varepsilon,|xy|\leq n$ и для любого $k \geq 0$ $xy^kz \in L$. + Пусть $L$~--- регулярный язык над алфавитом $\Sigma$, тогда существует такое $n$, что для любого слова $\omega \in L$, $|\omega| \geq n$ найдутся слова $x,y,z\in \Sigma^*$, для которых верно: $xyz = \omega, y\neq \varepsilon,|xy|\leq n$ и для любого $k \geq 0$ $xy^kz \in L$. \end{lemma} -Идея доказательства леммы о накачке. - -\begin{enumerate} - \item Так как язык регулярный, то для него можно построить конечный автомат $M = \langle Q, q_s,Q_f, \delta, \Sigma \rangle$. В том числе, минимальный по количеству состояний. - \item В качестве $n$ возьмём $|Q| + 1$. - \item Легко заметить, что для любой цепочки $w \in L, |w| > n$ путь в автомате, соответствующий принятию данной цепочки, будет содержать хотя бы один цикл. - Действительно, в ориентированном графе с $k$ вершинами (а именно таким является автомат по построению) максимальная длина пути без повторных посещений вершин (соответственно, без циклов) не больше $k - 1$. - \item Выберем любой цикл. Он будет задавать искомые цепочки $x, y$ и $z$ так, как представлено на рисунке~\ref{fig:reg_lang_pumping_lemma}. - Заметим, что вход в цикл и выход из него в общем случае могут не совпадать, что даёт несколько вариантов разбиения пути на части, и на рисунке представлен лишь один из возможных. -\end{enumerate} +\begin{proofSketch} + \begin{enumerate} + \item Так как язык регулярный, то для него можно построить конечный автомат $M = \langle Q, q_s,Q_f, \delta, \Sigma \rangle$. + В том числе, минимальный по количеству состояний. + \item В качестве $n$ возьмём $|Q| + 1$. + \item Легко заметить, что для любой цепочки $w \in L, |w| > n$ путь в автомате, соответствующий принятию данной цепочки, будет содержать хотя бы один цикл. + Действительно, в ориентированном графе с $k$ вершинами (а именно таким является автомат по построению) максимальная длина пути без повторных посещений вершин (соответственно, без циклов) не больше $k - 1$. + \item Выберем любой цикл. Он будет задавать искомые цепочки $x, y$ и $z$ так, как представлено на рисунке~\ref{fig:reg_lang_pumping_lemma}. + Заметим, что вход в цикл и выход из него в общем случае могут не совпадать, что даёт несколько вариантов разбиения пути на части, и на рисунке представлен лишь один из возможных. + \qedhere + \end{enumerate} +\end{proofSketch} \begin{figure} + \caption{Иллюстрация идеи доказательства леммы о накачке для регулярных языков: любой путь в графе, длина которого достаточно большая, может быть разбит на три части из леммы ($x$~--- красный подпуть, $y$~--- синий, $z$~--- зелёный), а многократный проход по циклу $y$ позволяет \enquote{накачать} слово.} + \label{fig:reg_lang_pumping_lemma} \begin{center} \begin{tikzpicture}[->] \node[state, initial] (q1) {$q_1$}; - \node[state, right of=q1] (q2) {$q_2$}; - \node[state, accepting, right of=q2] (q3) {$q_3$}; - \node[state, above of=q2] (q4) {$q_4$}; + \node[state, right = 2 of q1] (q2) {$q_2$}; + \node[state, accepting, right = 2 of q2] (q3) {$q_3$}; + \node[state, above = 2 of q2] (q4) {$q_4$}; \draw (q1) edge[above, snake it] node{} (q2) (q2) edge[bend right, snake it, side by side={red}{blue}] node{} (q4) (q4) edge[bend right, snake it, color=blue] node[left]{$y$} (q2) @@ -231,8 +245,7 @@ \section{Лемма о накачке} ; \end{tikzpicture} \end{center} - \caption{Иллюстрация идеи доказательства леммы о накачке для регулярных языков: любой путь в графе, длина которого достаточно большая, может быть разбит на три части из леммы ($x$--- красный подпуть, $y$ --- синий, $z$ --- зелёный), а многократный проход по циклу $y$ позволяет ``накачать'' слово} - \label{fig:reg_lang_pumping_lemma} + \end{figure} @@ -260,4 +273,4 @@ \section{Замкнутость регулярных языков относит % %Построить базу. % -%Научиться выполнять запросы через линейку. \ No newline at end of file +%Научиться выполнять запросы через линейку. diff --git a/tex/TensorProduct.tex b/tex/TensorProduct.tex index 28a2ef8..8e13e86 100644 --- a/tex/TensorProduct.tex +++ b/tex/TensorProduct.tex @@ -1,1366 +1,1366 @@ -\chapter{КС достижимость через тензорное произведение} - -Предыдущий подход позволяет выразить задачу поиска путей с ограничениями в терминах формальных языков через набор матричных операций. -Это позволяет использовать высокопроизводительные библиотеки, массовопараллельные архитектуры и другие готовые решения для линейной алгебры. -Однако, такой подход требует, чтобы грамматика находилась в ослабленной нормальной форме Хомского, что приводит к её разрастанию. -Можно ли как-то избежать этого? - -В данном разделе мы предложим альтернативное сведение задачи поиска путей к матричным операциям. -В результате мы сможем избежать преобразования грамматики в ОНФХ, однако, матрицы, с которыми нам предётся работать, будут существенно б\'{о}льшего размера. - -В основе подхода лежит использование рекурсивных сетей или рекурсивных автоматов в качестве представления контекстно-свободных грамматик и использование тензорного (прямого) произведения для нахождения пересечения автоматов. - - - -\section{Тензорное произведение} -\label{section2} - -Теперь перейдём к графам. -Сперва дадим классическое определение тензорного произведения двух неориентированных графов. - -\begin{definition} -Пусть даны два графа: $\mathcal{G}_1 = \langle V_1, E_1\rangle$ и $\mathcal{G}_2 = \langle V_2, E_2\rangle$. -Тензорным произведением этих графов будем называть граф $\mathcal{G}_3 = \langle V_3, E_3\rangle$, где $V_3 = V_1 \times V_2$, $E_3 = \{ ((v_1,v_2),(u_1,u_2)) \mid (v_1,u_1) \in E_1 \text{ и } (v_2,u_2) \in E_2 \}$. -\end{definition} - -Иными словами, тензорным произведением двух графов является граф, такой что: -\begin{enumerate} - \item множество вершин --- это прямое произведение множеств вершин исходных графов; - \item ребро между вершинами $v=(v_1,v_2)$ и $u=(u_1,u_2)$ существует тогда и только тогда, когда существуют рёбра между парами вершин $v_1$, $u_1$ и $v_2$, $u_2$ в соответствующих графах. -\end{enumerate} - -Для того, чтобы построить тензорное произведение ориентированных графов, необходимо в предыдущем определении, в условии существования ребра в результирующем графе, дополнительно потребовать, чтобы направления рёбер совпадали. -Данное требование получается естественным образом, если считать, что пары вершин, задающие ребро, упорядочены, поэтому формальное определение отличаться не будет. - -Осталось добавить метки к рёбрам. -Это приведёт к логичному усилению требования к существованию ребра: метки рёбер в исходных графах должны совпадать. -Таким образом, мы получаем следующее определение тензорного произведения ориентированных графов с метками на рёбрах. - -\begin{definition} -Пусть даны два ориентированных графа с метками на рёбрах: $\mathcal{G}_1 = \langle V_1, E_1, L_1 \rangle$ и $\mathcal{G}_2 = \langle V_2, E_2, L_2 \rangle$. -Тензорным произведением этих графов будем называть граф $\mathcal{G}_3 = \langle V_3, E_3, L_3\rangle$, где $V_3 = V_1 \times V_2$, $E_3 = \{ ((v_1,v_2),l,(u_1,u_2)) \mid (v_1,l,u_1) \in E_1 \text{ и } (v_2,l,u_2) \in E_2 \}$, $L_3=L_1 \cap L_2$. -\end{definition} - -Нетрудно заметить, что матрица смежности графа $\mathcal{G}_3$ равна тензорному произведению матриц смежностей исходных графов $\mathcal{G}_1$ и $\mathcal{G}_2$. - -\begin{example} -Рассмотрим пример. -В качестве одного из графов возьмём рекурсивный автомат, построенный ранее (изображение~\ref{input1}). -Его матрица смежности выглядит следующим образом. -\[ M_1 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\] - -\begin{align} -\label{input2} - \input{figures/graph/graph0.tex} -\end{align} - -Второй граф представлен на изображении~\ref{input2}. -Его матрица смежности имеет следующий вид. -\[ M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [a] & . \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -\] - -Теперь вычислим $M_1 \otimes M_2$. -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [a] & . \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -=\notag\\ -&= -\label{eq:graph_tm} -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -\end{example} - -\section{Алгоритм} - -Идея алгоритма основана на обобщении пересечения двух конечных автоматов до пересечения рекурсивного автомата, построенного по грамматике, со входным графом. - -Пересечение двух конечных автоматов --- тензорное произведение соответствующих графов. -Пересечение языков коммутативно, тензорное произведение нет, но, как было сказано в замечании~\ref{note:KronIsNotCommutative}, существует решение этой проблемы. - -Будем рассматривать два конечных автомата: одни получен из входного графа, второй из грамматики. -Можно найти их пересечение, вычислив тензорное произведение матриц смежности соответствующих графов. -Однако, одной такой итерации не достаточно для решения исходной задачи. За первую итерацию мы найдём только те пути, которые выводятся в грамматике за одни шаг. После этого необходимо добавить соответствующие рёбра во входной граф и повторить операцию: так мы найдём пути, выводимые за два шага. Данные действия надо повторять до тех пор, пока не перестанут находиться новые пары достижимых вершин. -Псевдокод, описывающий данные действия, представлен в листинге~\ref{lst:algo1}. - -\begin{algorithm} - \floatname{algorithm}{Listing} -\begin{algorithmic}[1] -\caption{Поиск путей через тензорное произведение} -\label{lst:algo1} -\Function{contextFreePathQueryingTP}{G, $\mathcal{G}$} - \State{$R \gets$ рекурсивный автомат для $G$} - \State{$N \gets$ нетерминальный алфавит для $R$} - \State{$S \gets$ стартовые состояния для $R$} - \State{$F \gets$ конечные состояния для $R$} - \State{$M_1 \gets$ матрица смежности $R$} - \State{$M_2 \gets$ матрица смежности $\mathcal{G}$} - \For{$N_i \in N$} - \If{$N_i \xrightarrow{*} \varepsilon$} - \State{for all $j \in \mathcal{G}.V: M_2[j,j] \gets M_2[j,j] \cup \{N_i\}$} - \Comment{Добавим петли для нетерминалов, выводящих $\varepsilon$} - \EndIf - \EndFor - \While{матрица $M_2$ изменяется} - \State{$M_3 \gets M_1 \otimes M_2$} - \Comment{Пересечение графов} - \State{$tC_3 \gets \textit{transitiveClosure}(M_3)$} - \State{$n \gets$ количество строк и столбцов матрицы $M_3$} - \Comment{размер матрицы $M_3$ = $n \times n$} - \For{$i \in 0..n$} - \For{$j \in 0..n$} - \If{$tC_3[i,j]$} - \State{$s \gets$ стартовая вершина ребра $tC_3[i,j]$} - \State{$f \gets$ конечная вершина ребра $tC_3[i,j]$} - \If{$s \in S$ and $f \in F$ } - \State{$x, y \gets$ $getCoordinates(i,j)$} - \State{$M_2[x,y] \gets M_2[x,y] \cup \{getNonterminals(s,f)\}$} - \EndIf - \EndIf - \EndFor - \EndFor - \EndWhile -\State \Return $M_2$ -\EndFunction -\end{algorithmic} -\end{algorithm} - - -Алгоритм исполняется до тех пор, пока матрица смежности $M_2$ изменяется. -На каждой итерации цикла алгоритм последовательно проделывает следующие команды: пересечение двух автоматов через тензорное произведение, транзитивное замыкание результата тензорного произведения и итерация по всем ячейкам получившейся после транзитивного замыкания матрицы, что необходимо для поиска новых пар достижимых вершин. -Во время итерации по ячейкам матрицы транзитивного замыкания алгоритм сначала проверяет наличие ребра в данной ячейке, а затем --- принадлежность стартовой и конечной вершин ребра к стартовому и конечному состоянию входного рекурсивного автомата. -При удовлетворении этих условий алгоритм добавляет нетерминал (или нетерминалы), соответствующие стартовой и конечной вершинам ребра, в ячейку матрицы $M_2$, полученной при помощи функции $getCoordinates(i,j)$. - -Представленный алгоритм не требует преобразования грамматики в ОНФХ, более того, рекурсивный автомат может быть минимизирован. Однако, результатом тензорного рпоизведения является матрица существенно б\'{о}льшего размера, чем в алгоритме, основанном на матричном рпоизведении. -Кроме этого, необходимо искать транзитивное замыкание этой матрицы. - -Ещё одним важным свойством представленного алгоритма является его оптимальность при обработке регулярных запросов. -Так как по контекстно свободной грамматике мы не можем определить, задаёт ли она регулярный язык, то при добавлении в язык запросов возможности задавать контекстно-свободные ограничения, возникает проблема: мы не можем в общем случае отличить регулярный запрос от контекстно-свободного. Следовательно, мы вынуждены применять наиболее общий механизм выполнения заросов, что может приводить к существенным накладным расходам при выполнении регулярного запроса. -Данный же алгоритм не выполнит лишних действий, так как сразу выполнит классическое пересечение двух автоматов и получит результат. - -\section{Примеры} - -Рассмотрим подробно ряд примеров работы описанного алгоритма. -Будем для каждой итерации внешнего цикла выписывать результаты основных операций: тензорного произведения, транзитивного замыкания, обновления матрицы смежности входного графа. -Новые, по сравнению с предыдущим состоянием, элементы матриц будем выделять. - -\begin{example} -\label{algorithm_example} -Теоретически худший случай. -Такой же как и для матричного. - -\textbf{Итерация 1 (конец).} Начало в разделе~\ref{section2}, где мы вычислили тензорное произведение матриц смежности. -Теперь нам осталось только вычислить транзитивное замыкание полученной матрицы: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & .\\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & \bfgray{[ab]} \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right). -\end{scaledalign} - -Мы видим, что в результате транзитивного замыкания появилось новое ребро с меткой $ab$ из вершины $(0,1)$ в вершину $(3,3)$. -Так как вершина 0 является стартовой в рекурсивном автомате, а 3 является финальной, то слово вдоль пути из вершины 1 в вершину 3 во входном графе выводимо из нетерминала $S$. -Это означает, что в графе должно быть добавлено ребро из $0$ в $3$ с меткой $S$, после чего граф будет выглядеть следующим образом: - -\begin{center} - \input{figures/tensor/graph0.tex} -\end{center} - -Матрица смежности обновлённого графа: -\[ M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [a] & \textbf{[S]} \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -\] - -Итерация закончена. -Возвращаемся к началу цикла и вновь вычисляем тензорное произведение. - -\textbf{Итерация 2.} -Вычисляем тензорное произведение матриц смежности. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [a] & [S] \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Вычисляем транзитивное замыкание полученной матрицы: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & [ab] \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & \bfgray{[Sb]} & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -В транзитивном замыкании появилось три новых ребра, однако только одно из них соединяет вершины, соответствующие стартовому и конечному состоянию входного рекурсивного автомата. -Таким образом только это ребро должно быть добавлено во входной граф. -В итоге, обновлённый граф: -\begin{center} -\input{figures/tensor/graph1.tex} -\end{center} - -И его матрица смежности: -\[ M_2 = -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a] & [S] \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -\] -\textbf{Итерация 3.} -Снова начинаем с тензорного произведения. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a] & [S] \\ -[a] & . & . & [b] \\ -. & . & [b] & . -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Затем вычисляем транзитивное замыкание: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & [aSb] & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & [ab] \\ -. & . & . & . & [a] & . & . & . & . & . & \bfgray{[aS]} & . & . & . & . & \bfgray{[aSb]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & \bfgray{[Sb]} \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -И наконец обновляем граф: -\begin{center} -\input{figures/tensor/graph2.tex} -\end{center} - -Матрица смежности обновлённого графа: -\[ M_2 = -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a] & [S] \\ -[a] & . & . & [b, \textbf{S}] \\ -. & . & [b] & . -\end{pmatrix} -\] -Уже можно заметить закономерность: на каждой итерации мы добавляем ровно одно новое ребро во входной граф, ровно как и в алгоритме, основанном на матричном произведении, и как в алгоритме Хеллингса. -То есть находим ровно одну новую пару вершин, между которыми существует интересующий нас путь. -Попробуйте спрогнозировать, сколько итераций нам ещё осталось сделать. - -\textbf{Итерауия 4}. -Продолжаем. Вычисляем тензорное произведение. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a] & [S] \\ -[a] & . & . & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Затем транзитивное замыкание: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & [aSb] & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & [ab] \\ -. & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & . & . & [aSb] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & [Sb] \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & \bfgray{[Sb]} & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -И снова обновляем граф, так как в транзитивном замыкании появился один (и снова ровно один) новый элемент, соответствующий принимающему пути в автомате. -\begin{center} -\input{figures/tensor/graph3.tex} -\end{center} - - -Матрица смежности обновлённого графа: -\[ M_2 = -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a, \textbf{S}] & [S] \\ -[a] & . & . & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -\] -\textbf{Итерация 5.} -Приступаем к выполнению следующей итерации основного цикла. -Вычисляем тензорное произведение. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & [S] & . \\ -. & . & [a,S] & [S] \\ -[a] & . & . & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Затем вычисляем транзитивное замыкание: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & \bfgray{[aS]} & [aS] & . & . & [aSb] & \bfgray{[aSb]} \\ -. & . & . & . & . & . & [a] & . & . & . & . & [aS] & . & . & [aSb] & [ab] \\ -. & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & . & . & [aSb] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & [Sb] \\ -. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & [Sb] & \bfgray{[Sb]} \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Обновляем граф: -\begin{center} - \input{figures/tensor/graph4.tex} -\end{center} - - -Матрица смежности обновлённого графа: -\[ M_2 = -\begin{pmatrix} -. & [a] & [S] & \textbf{[S]} \\ -. & . & [a, S] & [S] \\ -[a] & . & . & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -\] -\textbf{Итерация 6.} -И наконец последняя содержательная итерация основного цикла. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . \\ -. & . & [S] & [b] \\ -. & . & . & [b] \\ -. & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -. & [a] & [S] & [S] \\ -. & . & [a,S] & [S] \\ -[a] & . & . & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -=\\ -&= -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & \bfgray{[S]} & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Транзитивное замыкание: - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -tc(M_3) = -\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } -. & . & . & . & . & [a] & . & . & . & . & [aS] & [aS] & . & . & [aSb] & [aSb] \\ -. & . & . & . & . & . & [a] & . & . & . & . & [aS] & . & . & [aSb] & [ab] \\ -. & . & . & . & [a] & . & . & . & . & . & [aS] & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & [aSb] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & [S] & \bfgray{[S]} & . & . & \bfgray{[Sb]} & [Sb] \\ -. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & [Sb] & [Sb] \\ -. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Обновлённый граф: -\begin{center} -\input{figures/tensor/graph5.tex} -\end{center} - - -И матрица смежности: -\[ M_2 = -\begin{pmatrix} -. & [a] & [S] & [S] \\ -. & . & [a, S] & [S] \\ -[a] & . & \textbf{[S]} & [b,S] \\ -. & . & [b] & . -\end{pmatrix} -\] -Следующая итерация не приведёт к изменению графа. -Читатель может убедиться в этом самостоятельно. -Соответственно, алгоритм можно завершать. -Нам потребовалось семь итераций (шесть содержательных и одна проверочная), на каждой из которых вычисляются тензорное произведение двух матриц смежности и транзитивное замыкание результата. - -Матрица смежности получилась такая же, как и раньше, ответ правильный. -Мы видим, что количество итераций внешнего цикла такое же как и у алгоритма CYK (пример~\ref{CYK_algorithm_ex}). - -\end{example} - - -\begin{example} - -В данном примере мы увидим, как структура грамматики и, соответственно, рекурсивного автомата, влияет на процесс вычислений. - -Интуитивно понятно, что чем меньше состояний в рекурсивной сети, тем лучше. -То есть желательно получить как можно более компактное описание контекстно-свободного языка. - -Для примера возьмём в качестве КС языка язык Дика на одном типе скобок и опишем его двумя различными грамматиками. -Первая грамматика классическая: -\[ -G_1 = \langle \{a,\ b\}, \{ S \}, \{S \to a \ S \ b \ S \mid \varepsilon \} \rangle -\] -Во второй грамматике мы будем использовать конструкции регулярных выражений в правой части правил. -То есть вторая грамматика находится в EBNF (Расширенная форма Бэкуса-Наура~\cite{Hemerik2009, Wirth1977}). -\[ -G_2 = \langle \{a, \ b\}, \{S\}, \{S \to (a \ S \ b)^{*}\} \rangle -\] -Построим рекурсивные автоматы $N_1$ и $N_2$ и их матрицы смежности для этих грамматик. - -Рекурсивный автомат $N_1$ для грамматики $G_1$: -\begin{center} -\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state, initial, accepting] (q_0) {$0$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \node[state, accepting] (q_4) [right=of q_3] {$4$}; - \path[->] - (q_0) edge node {a} (q_1) - (q_1) edge node {S} (q_2) - (q_2) edge node {b} (q_3) - (q_3) edge node {S} (q_4); -\end{tikzpicture} -\end{center} - -Матрица смежности $N_1$: -\[ -M_1^1 = -\begin{pmatrix} -. & [a] & . & . & . \\ -. & . & [S] & . & . \\ -. & . & . & [b] & . \\ -. & . & . & . & [S] \\ -. & . & . & . & . -\end{pmatrix} -\] -Рекурсивный автомат $N_2$ для грамматики $G_2$: -\begin{center} - \input{figures/tensor/recursive.tex} -\end{center} - -Матрица смежности $N_2$: -\[ -M_1^2 = -\begin{pmatrix} -. & [a] & . \\ -. & . & [S] \\ -[b] & . & . -\end{pmatrix} -\] -Первое очевидное наблюдение --- количество состояний в $N_2$ меньше, чем в $N_1$. -Это значит, что матрица смежности, а значит, и результат тензорного произведения будут меньше, следовательно, вычисления будут производиться быстрее. - -Выполним пошагово алгоритм для двух заданных рекурсивных сетей на линейном входе: -\begin{center} -\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state] (q_0) {$0$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \node[state] (q_4) [right=of q_3] {$4$}; - \node[state] (q_5) [right=of q_4] {$5$}; - \node[state] (q_6) [right=of q_5] {$6$}; - \path[->] - (q_0) edge node {a} (q_1) - (q_1) edge node {b} (q_2) - (q_2) edge node {a} (q_3) - (q_3) edge node {b} (q_4) - (q_4) edge node {a} (q_5) - (q_5) edge node {b} (q_6); -\end{tikzpicture} -\end{center} - - -Сразу дополним матрицу смежности нетерминалами, выводящими пустую строку, и получим следующую матрицу: -\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} -M_2 = -\begin{pmatrix} -[S] & [a] & . & . & . & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & . & . & . \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & . \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -\end{scaledalign} - -Сперва запустим алгоритм на данном входе и $N_2$. -Первый шаг первой итерации --- вычисление тензорного произведения $M_1^2 \otimes M_2$. - -\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} -M_3 &= M_1^2 \otimes M_2 = -\begin{pmatrix} -. & [a] & . \\ -. & . & [S] \\ -[b] & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -[S] & [a] & . & . & . & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & . & . & . \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & . \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c } -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - - -\newcommand{\tinybf}[1]{\cellcolor{lightgray}\textbf{\tiny{[#1]}}} -\newcommand{\tntm}[1]{\text{\tiny{#1}}} - -Опустим промежуточные шаги вычисления транзитивного замыкания $M_3$ и сразу представим конечный результат: -\begin{scaledalign}{\footnotesize}{0.5pt}{0.5}{\notag} -&tc(M_3)= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c } -. & . & \tinybf{aSb} & . & \tinybf{aSbaSb} & . & \tinybf{aSbaSbaSb} & . & [a] & . & \tinybf{aSba} & . & \tinybf{aSbaSba} & . & . & \tinybf{aS} & . & \tinybf{aSbaS} & . & \tinybf{aSbaSbaS} & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & \tinybf{aSb} & . & \tinybf{aSbaSb} & . & . & . & [a] & . & \tinybf{aSba} & . & . & . & . & \tinybf{aS} & . & \tinybf{aSbaS} & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -В результате вычисления транзитивного замыкания появилось большое количество новых рёбер, однако нас будут интересовать только те, информация о которых храниться в левом верхнем блоке. -Остальные рёбра не соответствуют принимающим путям в рекурсивном автомате (убедитесь в этом самостоятельно). - -После добавления соответствующих рёбер, мы получим следующий граф: -\begin{center} -\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state] (q_0) {$0$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \node[state] (q_4) [right=of q_3] {$4$}; - \node[state] (q_5) [right=of q_4] {$5$}; - \node[state] (q_6) [right=of q_5] {$6$}; - \path[->] - (q_0) edge node {a} (q_1) - (q_0) edge[bend left, above] node {\textbf{S}} (q_2) - (q_0) edge[bend right, above] node {\textbf{S}} (q_4) - (q_0) edge[bend right, above] node {\textbf{S}} (q_6) - (q_1) edge node {b} (q_2) - (q_2) edge node {a} (q_3) - (q_2) edge[bend left, above] node {\textbf{S}} (q_4) - (q_2) edge[bend right, above] node {\textbf{S}} (q_6) - (q_3) edge node {b} (q_4) - (q_4) edge node {a} (q_5) - (q_4) edge[bend left, above] node {\textbf{S}} (q_6) - (q_5) edge node {b} (q_6); -\end{tikzpicture} -\end{center} - - -Его матрица смежности: - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} -M_2 = -\begin{pmatrix} -[S] & [a] & \bfgray{[S]} & . & \bfgray{[S]} & . & \bfgray{[S]} \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & \bfgray{[S]} & . & \bfgray{[S]} \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & \bfgray{[S]} \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -\end{scaledalign} - -Таким образом видно, что для выбранных входных данных алгоритму достаточно двух итераций основного цикла: первая содержательная, вторая, как обычно, проверочная. -Читателю предлагается самостоятельно выяснить, сколько умножений матриц потребуется, чтобы вычислить транзитивное замыкание на первой итерации. - -Теперь запустим алгоритм на второй грамматике и том же входе. - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} -&M_3 = M_1^1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . & . \\ -. & . & [S] & . & . \\ -. & . & . & [b] & . \\ -. & . & . & . & [S] \\ -. & . & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -[S] & [a] & . & . & . & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & . & . & . \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & . \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Уже сейчас можно заметить, что размер матриц, с которыми нам придётся работать, существенно увеличился, по сравнению с предыдущим вариантом. -Это, конечно, закономерно, ведь в рекурсивном автомате для предыдущего варианта меньше состояний, а значит и матрица смежности имеет меньший размер. - -Транзитивное замыкание: -\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} -&tc(M_3)= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Обновлённый граф: -\begin{center} -\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state] (q_0) {$0$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \node[state] (q_4) [right=of q_3] {$4$}; - \node[state] (q_5) [right=of q_4] {$5$}; - \node[state] (q_6) [right=of q_5] {$6$}; - \path[->] - (q_0) edge node {a} (q_1) - (q_0) edge[bend left, above] node {\textbf{S}} (q_2) - (q_1) edge node {b} (q_2) - (q_2) edge node {a} (q_3) - (q_2) edge[bend left, above] node {\textbf{S}} (q_4) - (q_3) edge node {b} (q_4) - (q_4) edge node {a} (q_5) - (q_4) edge[bend left, above] node {\textbf{S}} (q_6) - (q_5) edge node {b} (q_6); -\end{tikzpicture} -\end{center} - - -Его матрица смежности: - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} -M_2 = -\begin{pmatrix} -[S] & [a] & \bfgray{[S]} & . & . & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & \bfgray{[S]} & . & . \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & \bfgray{[S]} \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -\end{scaledalign} - -Потребуется ещё одна итерация. - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} -&M_3 = M_1^1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . & . \\ -. & . & [S] & . & . \\ -. & . & . & [b] & . \\ -. & . & . & . & [S] \\ -. & . & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -[S] & [a] & [S] & . & . & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & [S] & . & . \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & [S] \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Транзитивное замыкание: -\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} -&tc(M_3)= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & . & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & . & . & \tntm{[aSbS]} & . & \tinybf{aSbS} & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & . & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & . & . & \tntm{[aSbS]} & . & \tinybf{aSbS} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & . & . & . & . & . & . & \tntm{[aSb]} & . & . & . & . & . & . & \tntm{[aSbS]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Обновлённый граф: -\begin{center} -\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state] (q_0) {$0$}; - \node[state] (q_1) [right=of q_0] {$1$}; - \node[state] (q_2) [right=of q_1] {$2$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \node[state] (q_4) [right=of q_3] {$4$}; - \node[state] (q_5) [right=of q_4] {$5$}; - \node[state] (q_6) [right=of q_5] {$6$}; - \path[->] - (q_0) edge node {a} (q_1) - (q_0) edge[bend left, above] node {S} (q_2) - (q_0) edge[bend right, above] node {\textbf{S}} (q_4) - (q_1) edge node {b} (q_2) - (q_2) edge node {a} (q_3) - (q_2) edge[bend left, above] node {S} (q_4) - (q_2) edge[bend right, above] node {\textbf{S}} (q_6) - (q_3) edge node {b} (q_4) - (q_4) edge node {a} (q_5) - (q_4) edge[bend left, above] node {S} (q_6) - (q_5) edge node {b} (q_6); -\end{tikzpicture} -\end{center} - -На этом шаге мы смогли ``склеить'' из подстрок, выводимых из $S$, более длинные пути. -Однако, согласно правилам грамматики, мы смогли ``склеить'' только две подстроки в единое целое. - -Матрица смежности обновлённого графа: - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} -M_2 = -\begin{pmatrix} -[S] & [a] & [S] & . & \bfgray{[S]} & . & \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & [S] & . & \bfgray{[S]} \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & [S] \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -\end{scaledalign} - -И, наконец, последняя содержательная итерация. - -\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} -&M_3 = M_1^1 \otimes M_2 = -\begin{pmatrix} -. & [a] & . & . & . \\ -. & . & [S] & . & . \\ -. & . & . & [b] & . \\ -. & . & . & . & [S] \\ -. & . & . & . & . -\end{pmatrix} -\otimes -\begin{pmatrix} -[S] & [a] & [S] & . & [S] & . & . \\ -. & [S] & [b] & . & . & . & . \\ -. & . & [S] & [a] & [S] & . & [S] \\ -. & . & . & [S] & [b] & . & . \\ -. & . & . & . & [S] & [a] & [S] \\ -. & . & . & . & . & [S] & [b] \\ -. & . & . & . & . & . & [S] -\end{pmatrix} -=\notag\\ -&= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - -Транзитивное замыкание: -\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} -&tc(M_3)= -\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} -. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & \tntm{[aSb]} & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & \tntm{[aSbS]} & . & \tntm{[aSbS]} & . & \tinybf{aSbS} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tntm{[aS]} & . & . & . & . & . & \tntm{[aSb]} & . & \tntm{[aSb]} & . & . & . & . & \tntm{[aSbS]} & . & \tntm{[aSbS]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & . & . & . & . & . & . & \tntm{[aSb]} & . & . & . & . & . & . & \tntm{[aSbS]} \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ -\hline -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ -. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . -\end{array}\right) -\end{scaledalign} - - -В конечном итоге мы получаем такой же результат, как и при первом запуске. -Однако нам потребовалось выполнить существенно больше итераций внешнего цикла, а именно четыре (три содержательных и одна проверочная). -При этом, в ходе работы нам пришлось оперировать существенно б\'{о}льшими матрицами: $35 \times 35$ против $21 \times 21$. - -Таким образом, видно, что минимизация представления запроса, в частности, минимизация рекурсивного автомата как конечного автомата над смешанным алфавитом может улучшить производительность выполнения запросов. -\end{example} - -\section{Особенности реализации} - -Как и алгоритмы, представленные в разделе~\ref{chpt:MatrixBasedAlgos}, представленный здесь алгоритм оперирует разреженными матрицами, поэтому, к нему применимы все те же соображения, что и к алгоритмам, основанным на произведении матриц. Более того, так как результат тензорного произведения является блочной матрицей, то могут оказаться полезными различные форматы для хранения блочно-разреженных матриц. Вместе с этим, в некоторых случаях матрицу смежности рекурсивного автомата удобнее представлять в классическом, плотном, виде, так как для некоторых запросов её размер мал и накладные расходы на представление в разреженном формате и работе с ним будут больше, чем выигрыш от его использования. - - -Также заметим, что блочная структура матриц даёт хорошую основу для распределённого умножения матриц при построении транзитивного замыкания. - -Вместо того, чтобы перезаписывать каждый раз матрицу смежности входного графа $M_2$ можно вычислять только разницу с предыдущим шагом. -Для этого, правда, потребуется хранить в памяти ещё одну матрицу. -Поэтому нужно проверять, что вычислительно дешевле: поддерживать разницу и потом каждый раз поэлементно складывать две матрицы или каждый раз вычислять полностью произведение. - -Заметим, что для решения задачи достижимости нам не нужно накапливать пути вдоль рёбер, как мы это делали в примерах, соответственно, во-первых, можно переопределить тензорное произведение так, чтобы его результатом являлась булева матрица, во-вторых, как следствие первого изменеия, транзитивное замыкание для булевой матрицы можно искать с применением соответствующих оптимизаций. - -%\section{Вопросы и задачи} -% -%\begin{enumerate} -% \item Оценить пространсвенную сложность алгоритма. -% \item Оценить временную сложность алгоритма. -% \item Найти библиотеку для тензорного произведения. Реализовать алгоритм. Можно предпологать, что запросы содержат ограниченное число терминалов и нетерминалов. Провести замеры. Сравнить с матричным. -% \item Реализовать распределённое решение. -%См. блочную структуру -%\end{enumerate} +\chapter{КС достижимость через тензорное произведение} + +Предыдущий подход позволяет выразить задачу поиска путей с ограничениями в терминах формальных языков через набор матричных операций. +Это позволяет использовать высокопроизводительные библиотеки, массовопараллельные архитектуры и другие готовые решения для линейной алгебры. +Однако, такой подход требует, чтобы грамматика находилась в ослабленной нормальной форме Хомского, что приводит к её разрастанию. +Можно ли как-то избежать этого? + +В данном разделе мы предложим альтернативное сведение задачи поиска путей к матричным операциям. +В результате мы сможем избежать преобразования грамматики в ОНФХ, однако, матрицы, с которыми нам предётся работать, будут существенно б\'{о}льшего размера. + +В основе подхода лежит использование рекурсивных сетей или рекурсивных автоматов в качестве представления контекстно-свободных грамматик и использование тензорного (прямого) произведения для нахождения пересечения автоматов. + + + +\section{Тензорное произведение} +\label{section2} + +Теперь перейдём к графам. +Сперва дадим классическое определение тензорного произведения двух неориентированных графов. + +\begin{definition} +Пусть даны два графа: $\mathcal{G}_1 = \langle V_1, E_1\rangle$ и $\mathcal{G}_2 = \langle V_2, E_2\rangle$. +Тензорным произведением этих графов будем называть граф $\mathcal{G}_3 = \langle V_3, E_3\rangle$, где $V_3 = V_1 \times V_2$, $E_3 = \{ ((v_1,v_2),(u_1,u_2)) \mid (v_1,u_1) \in E_1 \text{ и } (v_2,u_2) \in E_2 \}$. +\end{definition} + +Иными словами, тензорным произведением двух графов является граф, такой что: +\begin{enumerate} + \item множество вершин --- это прямое произведение множеств вершин исходных графов; + \item ребро между вершинами $v=(v_1,v_2)$ и $u=(u_1,u_2)$ существует тогда и только тогда, когда существуют рёбра между парами вершин $v_1$, $u_1$ и $v_2$, $u_2$ в соответствующих графах. +\end{enumerate} + +Для того, чтобы построить тензорное произведение ориентированных графов, необходимо в предыдущем определении, в условии существования ребра в результирующем графе, дополнительно потребовать, чтобы направления рёбер совпадали. +Данное требование получается естественным образом, если считать, что пары вершин, задающие ребро, упорядочены, поэтому формальное определение отличаться не будет. + +Осталось добавить метки к рёбрам. +Это приведёт к логичному усилению требования к существованию ребра: метки рёбер в исходных графах должны совпадать. +Таким образом, мы получаем следующее определение тензорного произведения ориентированных графов с метками на рёбрах. + +\begin{definition} +Пусть даны два ориентированных графа с метками на рёбрах: $\mathcal{G}_1 = \langle V_1, E_1, L_1 \rangle$ и $\mathcal{G}_2 = \langle V_2, E_2, L_2 \rangle$. +Тензорным произведением этих графов будем называть граф $\mathcal{G}_3 = \langle V_3, E_3, L_3\rangle$, где $V_3 = V_1 \times V_2$, $E_3 = \{ ((v_1,v_2),l,(u_1,u_2)) \mid (v_1,l,u_1) \in E_1 \text{ и } (v_2,l,u_2) \in E_2 \}$, $L_3=L_1 \cap L_2$. +\end{definition} + +Нетрудно заметить, что матрица смежности графа $\mathcal{G}_3$ равна тензорному произведению матриц смежностей исходных графов $\mathcal{G}_1$ и $\mathcal{G}_2$. + +\begin{example} +Рассмотрим пример. +В качестве одного из графов возьмём рекурсивный автомат, построенный ранее (изображение~\ref{input1}). +Его матрица смежности выглядит следующим образом. +\[ M_1 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\] + +\begin{align} +\label{input2} + \input{figures/graph/graph0.tex} +\end{align} + +Второй граф представлен на изображении~\ref{input2}. +Его матрица смежности имеет следующий вид. +\[ M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [a] & . \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +\] + +Теперь вычислим $M_1 \otimes M_2$. +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [a] & . \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +=\notag\\ +&= +\label{eq:graph_tm} +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +\end{example} + +\section{Алгоритм} + +Идея алгоритма основана на обобщении пересечения двух конечных автоматов до пересечения рекурсивного автомата, построенного по грамматике, со входным графом. + +Пересечение двух конечных автоматов --- тензорное произведение соответствующих графов. +Пересечение языков коммутативно, тензорное произведение нет, но, как было сказано в замечании~\ref{note:KronIsNotCommutative}, существует решение этой проблемы. + +Будем рассматривать два конечных автомата: одни получен из входного графа, второй из грамматики. +Можно найти их пересечение, вычислив тензорное произведение матриц смежности соответствующих графов. +Однако, одной такой итерации не достаточно для решения исходной задачи. За первую итерацию мы найдём только те пути, которые выводятся в грамматике за одни шаг. После этого необходимо добавить соответствующие рёбра во входной граф и повторить операцию: так мы найдём пути, выводимые за два шага. Данные действия надо повторять до тех пор, пока не перестанут находиться новые пары достижимых вершин. +Псевдокод, описывающий данные действия, представлен в листинге~\ref{lst:algo1}. + +\begin{algorithm} + \floatname{algorithm}{Listing} +\begin{algorithmic}[1] +\caption{Поиск путей через тензорное произведение} +\label{lst:algo1} +\Function{contextFreePathQueryingTP}{G, $\mathcal{G}$} + \State{$R \gets$ рекурсивный автомат для $G$} + \State{$N \gets$ нетерминальный алфавит для $R$} + \State{$S \gets$ стартовые состояния для $R$} + \State{$F \gets$ конечные состояния для $R$} + \State{$M_1 \gets$ матрица смежности $R$} + \State{$M_2 \gets$ матрица смежности $\mathcal{G}$} + \For{$N_i \in N$} + \If{$N_i \xrightarrow{*} \varepsilon$} + \State{for all $j \in \mathcal{G}.V: M_2[j,j] \gets M_2[j,j] \cup \{N_i\}$} + \Comment{Добавим петли для нетерминалов, выводящих $\varepsilon$} + \EndIf + \EndFor + \While{матрица $M_2$ изменяется} + \State{$M_3 \gets M_1 \otimes M_2$} + \Comment{Пересечение графов} + \State{$tC_3 \gets \textit{transitiveClosure}(M_3)$} + \State{$n \gets$ количество строк и столбцов матрицы $M_3$} + \Comment{размер матрицы $M_3$ = $n \times n$} + \For{$i \in 0..n$} + \For{$j \in 0..n$} + \If{$tC_3[i,j]$} + \State{$s \gets$ стартовая вершина ребра $tC_3[i,j]$} + \State{$f \gets$ конечная вершина ребра $tC_3[i,j]$} + \If{$s \in S$ and $f \in F$ } + \State{$x, y \gets$ $getCoordinates(i,j)$} + \State{$M_2[x,y] \gets M_2[x,y] \cup \{getNonterminals(s,f)\}$} + \EndIf + \EndIf + \EndFor + \EndFor + \EndWhile +\State \Return $M_2$ +\EndFunction +\end{algorithmic} +\end{algorithm} + + +Алгоритм исполняется до тех пор, пока матрица смежности $M_2$ изменяется. +На каждой итерации цикла алгоритм последовательно проделывает следующие команды: пересечение двух автоматов через тензорное произведение, транзитивное замыкание результата тензорного произведения и итерация по всем ячейкам получившейся после транзитивного замыкания матрицы, что необходимо для поиска новых пар достижимых вершин. +Во время итерации по ячейкам матрицы транзитивного замыкания алгоритм сначала проверяет наличие ребра в данной ячейке, а затем --- принадлежность стартовой и конечной вершин ребра к стартовому и конечному состоянию входного рекурсивного автомата. +При удовлетворении этих условий алгоритм добавляет нетерминал (или нетерминалы), соответствующие стартовой и конечной вершинам ребра, в ячейку матрицы $M_2$, полученной при помощи функции $getCoordinates(i,j)$. + +Представленный алгоритм не требует преобразования грамматики в ОНФХ, более того, рекурсивный автомат может быть минимизирован. Однако, результатом тензорного рпоизведения является матрица существенно б\'{о}льшего размера, чем в алгоритме, основанном на матричном рпоизведении. +Кроме этого, необходимо искать транзитивное замыкание этой матрицы. + +Ещё одним важным свойством представленного алгоритма является его оптимальность при обработке регулярных запросов. +Так как по контекстно свободной грамматике мы не можем определить, задаёт ли она регулярный язык, то при добавлении в язык запросов возможности задавать контекстно-свободные ограничения, возникает проблема: мы не можем в общем случае отличить регулярный запрос от контекстно-свободного. Следовательно, мы вынуждены применять наиболее общий механизм выполнения заросов, что может приводить к существенным накладным расходам при выполнении регулярного запроса. +Данный же алгоритм не выполнит лишних действий, так как сразу выполнит классическое пересечение двух автоматов и получит результат. + +\section{Примеры} + +Рассмотрим подробно ряд примеров работы описанного алгоритма. +Будем для каждой итерации внешнего цикла выписывать результаты основных операций: тензорного произведения, транзитивного замыкания, обновления матрицы смежности входного графа. +Новые, по сравнению с предыдущим состоянием, элементы матриц будем выделять. + +\begin{example} +\label{algorithm_example} +Теоретически худший случай. +Такой же как и для матричного. + +\textbf{Итерация 1 (конец).} Начало в разделе~\ref{section2}, где мы вычислили тензорное произведение матриц смежности. +Теперь нам осталось только вычислить транзитивное замыкание полученной матрицы: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & .\\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & \bfgray{[ab]} \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right). +\end{scaledalign} + +Мы видим, что в результате транзитивного замыкания появилось новое ребро с меткой $ab$ из вершины $(0,1)$ в вершину $(3,3)$. +Так как вершина 0 является стартовой в рекурсивном автомате, а 3 является финальной, то слово вдоль пути из вершины 1 в вершину 3 во входном графе выводимо из нетерминала $S$. +Это означает, что в графе должно быть добавлено ребро из $0$ в $3$ с меткой $S$, после чего граф будет выглядеть следующим образом: + +\begin{center} + \input{figures/tensor/graph0.tex} +\end{center} + +Матрица смежности обновлённого графа: +\[ M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [a] & \textbf{[S]} \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +\] + +Итерация закончена. +Возвращаемся к началу цикла и вновь вычисляем тензорное произведение. + +\textbf{Итерация 2.} +Вычисляем тензорное произведение матриц смежности. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [a] & [S] \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Вычисляем транзитивное замыкание полученной матрицы: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & [ab] \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & \bfgray{[Sb]} & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +В транзитивном замыкании появилось три новых ребра, однако только одно из них соединяет вершины, соответствующие стартовому и конечному состоянию входного рекурсивного автомата. +Таким образом только это ребро должно быть добавлено во входной граф. +В итоге, обновлённый граф: +\begin{center} +\input{figures/tensor/graph1.tex} +\end{center} + +И его матрица смежности: +\[ M_2 = +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a] & [S] \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +\] +\textbf{Итерация 3.} +Снова начинаем с тензорного произведения. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a] & [S] \\ +[a] & . & . & [b] \\ +. & . & [b] & . +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Затем вычисляем транзитивное замыкание: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & [aSb] & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & [ab] \\ +. & . & . & . & [a] & . & . & . & . & . & \bfgray{[aS]} & . & . & . & . & \bfgray{[aSb]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & \bfgray{[Sb]} \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +И наконец обновляем граф: +\begin{center} +\input{figures/tensor/graph2.tex} +\end{center} + +Матрица смежности обновлённого графа: +\[ M_2 = +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a] & [S] \\ +[a] & . & . & [b, \textbf{S}] \\ +. & . & [b] & . +\end{pmatrix} +\] +Уже можно заметить закономерность: на каждой итерации мы добавляем ровно одно новое ребро во входной граф, ровно как и в алгоритме, основанном на матричном произведении, и как в алгоритме Хеллингса. +То есть находим ровно одну новую пару вершин, между которыми существует интересующий нас путь. +Попробуйте спрогнозировать, сколько итераций нам ещё осталось сделать. + +\textbf{Итерауия 4}. +Продолжаем. Вычисляем тензорное произведение. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a] & [S] \\ +[a] & . & . & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Затем транзитивное замыкание: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & [aSb] & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & [ab] \\ +. & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & . & . & [aSb] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & [Sb] \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & \bfgray{[Sb]} & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +И снова обновляем граф, так как в транзитивном замыкании появился один (и снова ровно один) новый элемент, соответствующий принимающему пути в автомате. +\begin{center} +\input{figures/tensor/graph3.tex} +\end{center} + + +Матрица смежности обновлённого графа: +\[ M_2 = +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a, \textbf{S}] & [S] \\ +[a] & . & . & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +\] +\textbf{Итерация 5.} +Приступаем к выполнению следующей итерации основного цикла. +Вычисляем тензорное произведение. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & [S] & . \\ +. & . & [a,S] & [S] \\ +[a] & . & . & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & \bfgray{[S]} & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Затем вычисляем транзитивное замыкание: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & \bfgray{[aS]} & [aS] & . & . & [aSb] & \bfgray{[aSb]} \\ +. & . & . & . & . & . & [a] & . & . & . & . & [aS] & . & . & [aSb] & [ab] \\ +. & . & . & . & [a] & . & . & . & . & . & [aS] & . & . & . & . & [aSb] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & [Sb] \\ +. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & [Sb] & \bfgray{[Sb]} \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Обновляем граф: +\begin{center} + \input{figures/tensor/graph4.tex} +\end{center} + + +Матрица смежности обновлённого графа: +\[ M_2 = +\begin{pmatrix} +. & [a] & [S] & \textbf{[S]} \\ +. & . & [a, S] & [S] \\ +[a] & . & . & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +\] +\textbf{Итерация 6.} +И наконец последняя содержательная итерация основного цикла. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . \\ +. & . & [S] & [b] \\ +. & . & . & [b] \\ +. & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +. & [a] & [S] & [S] \\ +. & . & [a,S] & [S] \\ +[a] & . & . & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +=\\ +&= +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & \bfgray{[S]} & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Транзитивное замыкание: + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +tc(M_3) = +\left(\begin{array}{c c c c | c c c c | c c c c | c c c c } +. & . & . & . & . & [a] & . & . & . & . & [aS] & [aS] & . & . & [aSb] & [aSb] \\ +. & . & . & . & . & . & [a] & . & . & . & . & [aS] & . & . & [aSb] & [ab] \\ +. & . & . & . & [a] & . & . & . & . & . & [aS] & \bfgray{[aS]} & . & . & \bfgray{[aSb]} & [aSb] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & [S] & \bfgray{[S]} & . & . & \bfgray{[Sb]} & [Sb] \\ +. & . & . & . & . & . & . & . & . & . & [S] & [S] & . & . & [Sb] & [Sb] \\ +. & . & . & . & . & . & . & . & . & . & . & [S] & . & . & [Sb] & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Обновлённый граф: +\begin{center} +\input{figures/tensor/graph5.tex} +\end{center} + + +И матрица смежности: +\[ M_2 = +\begin{pmatrix} +. & [a] & [S] & [S] \\ +. & . & [a, S] & [S] \\ +[a] & . & \textbf{[S]} & [b,S] \\ +. & . & [b] & . +\end{pmatrix} +\] +Следующая итерация не приведёт к изменению графа. +Читатель может убедиться в этом самостоятельно. +Соответственно, алгоритм можно завершать. +Нам потребовалось семь итераций (шесть содержательных и одна проверочная), на каждой из которых вычисляются тензорное произведение двух матриц смежности и транзитивное замыкание результата. + +Матрица смежности получилась такая же, как и раньше, ответ правильный. +Мы видим, что количество итераций внешнего цикла такое же как и у алгоритма CYK (пример~\ref{CYK_algorithm_ex}). + +\end{example} + + +\begin{example} + +В данном примере мы увидим, как структура грамматики и, соответственно, рекурсивного автомата, влияет на процесс вычислений. + +Интуитивно понятно, что чем меньше состояний в рекурсивной сети, тем лучше. +То есть желательно получить как можно более компактное описание контекстно-свободного языка. + +Для примера возьмём в качестве КС языка язык Дика на одном типе скобок и опишем его двумя различными грамматиками. +Первая грамматика классическая: +\[ +G_1 = \langle \{a,\ b\}, \{ S \}, \{S \to a \ S \ b \ S \mid \varepsilon \} \rangle +\] +Во второй грамматике мы будем использовать конструкции регулярных выражений в правой части правил. +То есть вторая грамматика находится в EBNF (Расширенная форма Бэкуса-Наура~\cite{Hemerik2009, Wirth1977}). +\[ +G_2 = \langle \{a, \ b\}, \{S\}, \{S \to (a \ S \ b)^{*}\} \rangle +\] +Построим рекурсивные автоматы $N_1$ и $N_2$ и их матрицы смежности для этих грамматик. + +Рекурсивный автомат $N_1$ для грамматики $G_1$: +\begin{center} +\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] + \node[state, initial, accepting] (q_0) {$0$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state] (q_3) [right=of q_2] {$3$}; + \node[state, accepting] (q_4) [right=of q_3] {$4$}; + \path[->] + (q_0) edge node {a} (q_1) + (q_1) edge node {S} (q_2) + (q_2) edge node {b} (q_3) + (q_3) edge node {S} (q_4); +\end{tikzpicture} +\end{center} + +Матрица смежности $N_1$: +\[ +M_1^1 = +\begin{pmatrix} +. & [a] & . & . & . \\ +. & . & [S] & . & . \\ +. & . & . & [b] & . \\ +. & . & . & . & [S] \\ +. & . & . & . & . +\end{pmatrix} +\] +Рекурсивный автомат $N_2$ для грамматики $G_2$: +\begin{center} + \input{figures/tensor/recursive.tex} +\end{center} + +Матрица смежности $N_2$: +\[ +M_1^2 = +\begin{pmatrix} +. & [a] & . \\ +. & . & [S] \\ +[b] & . & . +\end{pmatrix} +\] +Первое очевидное наблюдение --- количество состояний в $N_2$ меньше, чем в $N_1$. +Это значит, что матрица смежности, а значит, и результат тензорного произведения будут меньше, следовательно, вычисления будут производиться быстрее. + +Выполним пошагово алгоритм для двух заданных рекурсивных сетей на линейном входе: +\begin{center} +\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] + \node[state] (q_0) {$0$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state] (q_3) [right=of q_2] {$3$}; + \node[state] (q_4) [right=of q_3] {$4$}; + \node[state] (q_5) [right=of q_4] {$5$}; + \node[state] (q_6) [right=of q_5] {$6$}; + \path[->] + (q_0) edge node {a} (q_1) + (q_1) edge node {b} (q_2) + (q_2) edge node {a} (q_3) + (q_3) edge node {b} (q_4) + (q_4) edge node {a} (q_5) + (q_5) edge node {b} (q_6); +\end{tikzpicture} +\end{center} + + +Сразу дополним матрицу смежности нетерминалами, выводящими пустую строку, и получим следующую матрицу: +\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} +M_2 = +\begin{pmatrix} +[S] & [a] & . & . & . & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & . & . & . \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & . \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +\end{scaledalign} + +Сперва запустим алгоритм на данном входе и $N_2$. +Первый шаг первой итерации --- вычисление тензорного произведения $M_1^2 \otimes M_2$. + +\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag} +M_3 &= M_1^2 \otimes M_2 = +\begin{pmatrix} +. & [a] & . \\ +. & . & [S] \\ +[b] & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +[S] & [a] & . & . & . & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & . & . & . \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & . \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c } +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + + +\newcommand{\tinybf}[1]{\cellcolor{lightgray}\textbf{\tiny{[#1]}}} +\newcommand{\tntm}[1]{\text{\tiny{#1}}} + +Опустим промежуточные шаги вычисления транзитивного замыкания $M_3$ и сразу представим конечный результат: +\begin{scaledalign}{\footnotesize}{0.5pt}{0.5}{\notag} +&tc(M_3)= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c } +. & . & \tinybf{aSb} & . & \tinybf{aSbaSb} & . & \tinybf{aSbaSbaSb} & . & [a] & . & \tinybf{aSba} & . & \tinybf{aSbaSba} & . & . & \tinybf{aS} & . & \tinybf{aSbaS} & . & \tinybf{aSbaSbaS} & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & \tinybf{aSb} & . & \tinybf{aSbaSb} & . & . & . & [a] & . & \tinybf{aSba} & . & . & . & . & \tinybf{aS} & . & \tinybf{aSbaS} & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +В результате вычисления транзитивного замыкания появилось большое количество новых рёбер, однако нас будут интересовать только те, информация о которых храниться в левом верхнем блоке. +Остальные рёбра не соответствуют принимающим путям в рекурсивном автомате (убедитесь в этом самостоятельно). + +После добавления соответствующих рёбер, мы получим следующий граф: +\begin{center} +\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] + \node[state] (q_0) {$0$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state] (q_3) [right=of q_2] {$3$}; + \node[state] (q_4) [right=of q_3] {$4$}; + \node[state] (q_5) [right=of q_4] {$5$}; + \node[state] (q_6) [right=of q_5] {$6$}; + \path[->] + (q_0) edge node {a} (q_1) + (q_0) edge[bend left, above] node {\textbf{S}} (q_2) + (q_0) edge[bend right, above] node {\textbf{S}} (q_4) + (q_0) edge[bend right, above] node {\textbf{S}} (q_6) + (q_1) edge node {b} (q_2) + (q_2) edge node {a} (q_3) + (q_2) edge[bend left, above] node {\textbf{S}} (q_4) + (q_2) edge[bend right, above] node {\textbf{S}} (q_6) + (q_3) edge node {b} (q_4) + (q_4) edge node {a} (q_5) + (q_4) edge[bend left, above] node {\textbf{S}} (q_6) + (q_5) edge node {b} (q_6); +\end{tikzpicture} +\end{center} + + +Его матрица смежности: + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} +M_2 = +\begin{pmatrix} +[S] & [a] & \bfgray{[S]} & . & \bfgray{[S]} & . & \bfgray{[S]} \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & \bfgray{[S]} & . & \bfgray{[S]} \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & \bfgray{[S]} \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +\end{scaledalign} + +Таким образом видно, что для выбранных входных данных алгоритму достаточно двух итераций основного цикла: первая содержательная, вторая, как обычно, проверочная. +Читателю предлагается самостоятельно выяснить, сколько умножений матриц потребуется, чтобы вычислить транзитивное замыкание на первой итерации. + +Теперь запустим алгоритм на второй грамматике и том же входе. + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} +&M_3 = M_1^1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . & . \\ +. & . & [S] & . & . \\ +. & . & . & [b] & . \\ +. & . & . & . & [S] \\ +. & . & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +[S] & [a] & . & . & . & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & . & . & . \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & . \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Уже сейчас можно заметить, что размер матриц, с которыми нам придётся работать, существенно увеличился, по сравнению с предыдущим вариантом. +Это, конечно, закономерно, ведь в рекурсивном автомате для предыдущего варианта меньше состояний, а значит и матрица смежности имеет меньший размер. + +Транзитивное замыкание: +\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} +&tc(M_3)= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tinybf{aS} & . & . & . & . & . & . & . & \tinybf{aSb} & . & . & . & . & . & . & \tinybf{aSbS} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Обновлённый граф: +\begin{center} +\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] + \node[state] (q_0) {$0$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state] (q_3) [right=of q_2] {$3$}; + \node[state] (q_4) [right=of q_3] {$4$}; + \node[state] (q_5) [right=of q_4] {$5$}; + \node[state] (q_6) [right=of q_5] {$6$}; + \path[->] + (q_0) edge node {a} (q_1) + (q_0) edge[bend left, above] node {\textbf{S}} (q_2) + (q_1) edge node {b} (q_2) + (q_2) edge node {a} (q_3) + (q_2) edge[bend left, above] node {\textbf{S}} (q_4) + (q_3) edge node {b} (q_4) + (q_4) edge node {a} (q_5) + (q_4) edge[bend left, above] node {\textbf{S}} (q_6) + (q_5) edge node {b} (q_6); +\end{tikzpicture} +\end{center} + + +Его матрица смежности: + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} +M_2 = +\begin{pmatrix} +[S] & [a] & \bfgray{[S]} & . & . & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & \bfgray{[S]} & . & . \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & \bfgray{[S]} \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +\end{scaledalign} + +Потребуется ещё одна итерация. + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} +&M_3 = M_1^1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . & . \\ +. & . & [S] & . & . \\ +. & . & . & [b] & . \\ +. & . & . & . & [S] \\ +. & . & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +[S] & [a] & [S] & . & . & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & [S] & . & . \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & [S] \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & \bfgray{[S]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Транзитивное замыкание: +\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} +&tc(M_3)= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & . & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & . & . & \tntm{[aSbS]} & . & \tinybf{aSbS} & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & . & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & . & . & \tntm{[aSbS]} & . & \tinybf{aSbS} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & . & . & . & . & . & . & \tntm{[aSb]} & . & . & . & . & . & . & \tntm{[aSbS]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Обновлённый граф: +\begin{center} +\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] + \node[state] (q_0) {$0$}; + \node[state] (q_1) [right=of q_0] {$1$}; + \node[state] (q_2) [right=of q_1] {$2$}; + \node[state] (q_3) [right=of q_2] {$3$}; + \node[state] (q_4) [right=of q_3] {$4$}; + \node[state] (q_5) [right=of q_4] {$5$}; + \node[state] (q_6) [right=of q_5] {$6$}; + \path[->] + (q_0) edge node {a} (q_1) + (q_0) edge[bend left, above] node {S} (q_2) + (q_0) edge[bend right, above] node {\textbf{S}} (q_4) + (q_1) edge node {b} (q_2) + (q_2) edge node {a} (q_3) + (q_2) edge[bend left, above] node {S} (q_4) + (q_2) edge[bend right, above] node {\textbf{S}} (q_6) + (q_3) edge node {b} (q_4) + (q_4) edge node {a} (q_5) + (q_4) edge[bend left, above] node {S} (q_6) + (q_5) edge node {b} (q_6); +\end{tikzpicture} +\end{center} + +На этом шаге мы смогли ``склеить'' из подстрок, выводимых из $S$, более длинные пути. +Однако, согласно правилам грамматики, мы смогли ``склеить'' только две подстроки в единое целое. + +Матрица смежности обновлённого графа: + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.9}{\notag} +M_2 = +\begin{pmatrix} +[S] & [a] & [S] & . & \bfgray{[S]} & . & \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & [S] & . & \bfgray{[S]} \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & [S] \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +\end{scaledalign} + +И, наконец, последняя содержательная итерация. + +\begin{scaledalign}{\footnotesize}{0.5pt}{0.8}{\notag} +&M_3 = M_1^1 \otimes M_2 = +\begin{pmatrix} +. & [a] & . & . & . \\ +. & . & [S] & . & . \\ +. & . & . & [b] & . \\ +. & . & . & . & [S] \\ +. & . & . & . & . +\end{pmatrix} +\otimes +\begin{pmatrix} +[S] & [a] & [S] & . & [S] & . & . \\ +. & [S] & [b] & . & . & . & . \\ +. & . & [S] & [a] & [S] & . & [S] \\ +. & . & . & [S] & [b] & . & . \\ +. & . & . & . & [S] & [a] & [S] \\ +. & . & . & . & . & [S] & [b] \\ +. & . & . & . & . & . & [S] +\end{pmatrix} +=\notag\\ +&= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & \bfgray{[S]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + +Транзитивное замыкание: +\begin{scaledalign}{\footnotesize}{0.3pt}{0.5}{\notag} +&tc(M_3)= +\left(\begin{array}{c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c | c c c c c c c} +. & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tntm{[aS]} & . & \tinybf{aS} & . & . & . & \tntm{[aSb]} & . & \tntm{[aSb]} & . & \tinybf{aSb} & . & . & \tntm{[aSbS]} & . & \tntm{[aSbS]} & . & \tinybf{aSbS} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & \tntm{[aS]} & . & . & . & . & . & \tntm{[aSb]} & . & \tntm{[aSb]} & . & . & . & . & \tntm{[aSbS]} & . & \tntm{[aSbS]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & [a] & . & . & . & . & . & . & \tntm{[aS]} & . & . & . & . & . & . & . & \tntm{[aSb]} & . & . & . & . & . & . & \tntm{[aSbS]} \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [b] & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] & . & [S] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . & [S] \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & [S] \\ +\hline +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . \\ +. & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . & . +\end{array}\right) +\end{scaledalign} + + +В конечном итоге мы получаем такой же результат, как и при первом запуске. +Однако нам потребовалось выполнить существенно больше итераций внешнего цикла, а именно четыре (три содержательных и одна проверочная). +При этом, в ходе работы нам пришлось оперировать существенно б\'{о}льшими матрицами: $35 \times 35$ против $21 \times 21$. + +Таким образом, видно, что минимизация представления запроса, в частности, минимизация рекурсивного автомата как конечного автомата над смешанным алфавитом может улучшить производительность выполнения запросов. +\end{example} + +\section{Особенности реализации} + +Как и алгоритмы, представленные в разделе~\ref{chpt:MatrixBasedAlgos}, представленный здесь алгоритм оперирует разреженными матрицами, поэтому, к нему применимы все те же соображения, что и к алгоритмам, основанным на произведении матриц. Более того, так как результат тензорного произведения является блочной матрицей, то могут оказаться полезными различные форматы для хранения блочно-разреженных матриц. Вместе с этим, в некоторых случаях матрицу смежности рекурсивного автомата удобнее представлять в классическом, плотном, виде, так как для некоторых запросов её размер мал и накладные расходы на представление в разреженном формате и работе с ним будут больше, чем выигрыш от его использования. + + +Также заметим, что блочная структура матриц даёт хорошую основу для распределённого умножения матриц при построении транзитивного замыкания. + +Вместо того, чтобы перезаписывать каждый раз матрицу смежности входного графа $M_2$ можно вычислять только разницу с предыдущим шагом. +Для этого, правда, потребуется хранить в памяти ещё одну матрицу. +Поэтому нужно проверять, что вычислительно дешевле: поддерживать разницу и потом каждый раз поэлементно складывать две матрицы или каждый раз вычислять полностью произведение. + +Заметим, что для решения задачи достижимости нам не нужно накапливать пути вдоль рёбер, как мы это делали в примерах, соответственно, во-первых, можно переопределить тензорное произведение так, чтобы его результатом являлась булева матрица, во-вторых, как следствие первого изменеия, транзитивное замыкание для булевой матрицы можно искать с применением соответствующих оптимизаций. + +%\section{Вопросы и задачи} +% +%\begin{enumerate} +% \item Оценить пространсвенную сложность алгоритма. +% \item Оценить временную сложность алгоритма. +% \item Найти библиотеку для тензорного произведения. Реализовать алгоритм. Можно предпологать, что запросы содержат ограниченное число терминалов и нетерминалов. Провести замеры. Сравнить с матричным. +% \item Реализовать распределённое решение. +%См. блочную структуру +%\end{enumerate} diff --git a/tex/Project.tex b/tex/figures/externalized/.gitkeep similarity index 100% rename from tex/Project.tex rename to tex/figures/externalized/.gitkeep diff --git a/tex/figures/graph/graph0.tex b/tex/figures/graph/graph0.tex index 421e512..f305249 100644 --- a/tex/figures/graph/graph0.tex +++ b/tex/figures/graph/graph0.tex @@ -1,19 +1,19 @@ \begin{tikzpicture}[] % Apex angle 60 degrees \node[isosceles triangle, - isosceles triangle apex angle=60, - draw=none,fill=none, - minimum size=2cm] (T60) at (3,0){}; + isosceles triangle apex angle=60, + draw=none,fill=none, + minimum size=2cm] (T60) at (3,0){}; \node[state] (q_0) at (T60.right corner) {$0$}; \node[state] (q_1) at (T60.left corner) {$1$}; \node[state] (q_2) at (T60.apex) {$2$}; - \node[state] (q_3) [right=1.5cm of q_2] {$3$}; + \node[state] (q_3) [right=1.5 of q_2] {$3$}; \path[->] - (q_0) edge[left] node {a} (q_1) - (q_1) edge[above] node {a} (q_2) - (q_2) edge[below] node {a} (q_0) - (q_2) edge[bend left, above] node {b} (q_3) - (q_3) edge[bend left, below] node {b} (q_2); -\end{tikzpicture} \ No newline at end of file + (q_0) edge[left] node {a} (q_1) + (q_1) edge[above] node {a} (q_2) + (q_2) edge[below] node {a} (q_0) + (q_2) edge[bend left, above] node {b} (q_3) + (q_3) edge[bend left, below] node {b} (q_2); +\end{tikzpicture} diff --git a/tex/figures/graph/path0.tex b/tex/figures/graph/path0.tex index 0d7b638..3e46fb2 100644 --- a/tex/figures/graph/path0.tex +++ b/tex/figures/graph/path0.tex @@ -1,6 +1,6 @@ \begin{tikzpicture}[on grid, auto] \node[state] (v_0) {$v_0$}; - \node[state] (v_n) [right=2.0cm of v_0] {$v_n$}; - \path[->] - (v_0) edge [out=45] node {$\pi$} (v_n); -\end{tikzpicture} \ No newline at end of file + \node[state] (v_n) [right=2 of v_0] {$v_n$}; + \path[->] + (v_0) edge [out=45] node {$\pi$} (v_n); +\end{tikzpicture} diff --git a/tex/kao.sty b/tex/kao.sty new file mode 100644 index 0000000..290be85 --- /dev/null +++ b/tex/kao.sty @@ -0,0 +1,1429 @@ +\ProvidesPackage{kao} + +%---------------------------------------------------------------------------------------- +% DECLARE KAO +%---------------------------------------------------------------------------------------- + +\DefineFamily{kao}% Define the family name +\DefineFamilyMember{kao}% Add a member to the family +\DefineFamilyKey{kao}{secnumdepth}[1]{\setcounter{secnumdepth}{#1}\FamilyKeyStateProcessed}% Define a key and a default value +\FamilyProcessOptions{kao}% Process the options + +%---------------------------------------------------------------------------------------- +% USEFUL PACKAGES AND COMMANDS +%---------------------------------------------------------------------------------------- + +\RequirePackage{kvoptions} % Handle package options +\RequirePackage{etoolbox} % Easy programming to modify TeX stuff +\RequirePackage{calc} % Make calculations +\RequirePackage[usenames,dvipsnames,table]{xcolor} % Colours +\RequirePackage{iftex} % Check whether XeTeX is being used +\RequirePackage{xifthen} % Easy conditionals +\RequirePackage{options} % Manage class options +\RequirePackage{xparse} % Parse arguments for macros +\RequirePackage{xpatch} % Patch LaTeX code in external packages +\RequirePackage{xstring} % Parse strings +\RequirePackage{afterpage} % Run commands after specific pages +\RequirePackage{imakeidx} % For the index; must be loaded before the 'caption' and 'hyperref' packages +\RequirePackage{varioref} % For the cross-references; must be loaded before the 'hyperref' and 'cleveref' packages +\AtEndPreamble{\RequirePackage{scrhack}} % Make some packages compatible with KOMAScript + +% Define \Ifthispageodd (with a capital 'i') to make kaobook compatible with older KOMAScript versions +\@ifpackagelater{scrbase}{2019/12/22}{% +}{% + \let\Ifthispageodd\ifthispageodd% +} + +\RequirePackage{mathtools} % Superior to amsmath, but must be loaded before unicode-math + +%---------------------------------------------------------------------------------------- +% KAO-SPECIFIC OPTIONS +%---------------------------------------------------------------------------------------- + +% Set up the package options +\SetupKeyvalOptions{ + family = kao, + prefix = kao@ +} + +% https://tex.stackexchange.com/questions/47576/combining-ifxetex-and-ifluatex-with-the-logical-or-operation +% Introduce a command to find out whether the compiler is XeTeX or LuaTeX +\newif\ifxetexorluatex +\ifxetex + \xetexorluatextrue +\else + \ifluatex + \xetexorluatextrue + \else + \xetexorluatexfalse + \fi +\fi + +\ifxetexorluatex + \newcommand{\kao@defaultfontmethod}{modern} +\else + \newcommand{\kao@defaultfontmethod}{tex} +\fi + +% Set default based on rendering engine +\DeclareStringOption[\kao@defaultfontmethod]{fontmethod} + +\ProcessKeyvalOptions{kao} + +%---------------------------------------------------------------------------------------- +% TITLE AND AUTHOR MACROS +%---------------------------------------------------------------------------------------- + +% Provide an optional argument to the \title command in which to store a plain text title, without any formatting +% Usage: \title[Plain Title]{Actual Title} +\newcommand{\@plaintitle}{} +\renewcommand{\title}[2][]{% + \gdef\@title{#2} % Store the full title in @title + \ifthenelse{\isempty{#1}}{ % If there is no plain title + \renewcommand{\@plaintitle}{\@title} % Use full title + }{ % If there is a plain title + \renewcommand{\@plaintitle}{#1} % Use provided plain-text title + }% + \hypersetup{pdftitle={\@plaintitle}} % Set the PDF metadata title +} + +% Provide an optional argument to the \author command in which to store a plain text author, without any formatting +% Usage: \author[Plain Author]{Actual Author} +\newcommand{\@plainauthor}{} +\renewcommand{\author}[2][]{% + \gdef\@author{#2} % Store the full author in @author + \ifthenelse{\isempty{#1}}{ % If there is no plain author + \renewcommand{\@plainauthor}{\@author}% Use full author + }{ % If there is a plain author + \renewcommand{\@plainauthor}{#1}% Use provided plain-text author + }% + \hypersetup{pdfauthor={\@plainauthor}} % Set the PDF metadata author +} + +% Make a bookmark to the title page +\pretocmd{\maketitle}{\pdfbookmark[1]{\@plaintitle}{title}}{}{}% + +%---------------------------------------------------------------------------------------- +% PAGE LAYOUT +%---------------------------------------------------------------------------------------- + +% Define lengths to set the scale of the document. Changing these +% lengths should affect all the other pagesize-dependent elements in the +% layout, such as the geometry of the page, the spacing between +% paragraphs, and so on. (As of now, not all the elements rely on hscale +% and vscale; future work will address this shortcoming.) +\newlength{\hscale} +\newlength{\vscale} + +% By default, the scales are set to work for a4paper +\setlength{\hscale}{1mm} +\setlength{\vscale}{1mm} + +% Define hscale and vscale for all types of paper +\@ifclasswith{\@baseclass}{a0paper}{\setlength{\hscale}{4mm}\setlength{\vscale}{4mm}}{} +\@ifclasswith{\@baseclass}{a1paper}{\setlength{\hscale}{2.828mm}\setlength{\vscale}{2.828mm}}{} +\@ifclasswith{\@baseclass}{a2paper}{\setlength{\hscale}{2mm}\setlength{\vscale}{2mm}}{} +\@ifclasswith{\@baseclass}{a3paper}{\setlength{\hscale}{1.414mm}\setlength{\vscale}{1.414mm}}{} +\@ifclasswith{\@baseclass}{a4paper}{\setlength{\hscale}{1mm}\setlength{\vscale}{1mm}}{} +\@ifclasswith{\@baseclass}{a5paper}{\setlength{\hscale}{0.704mm}\setlength{\vscale}{0.704mm}}{} +\@ifclasswith{\@baseclass}{a6paper}{\setlength{\hscale}{0.5mm}\setlength{\vscale}{0.5mm}}{} +\@ifclasswith{\@baseclass}{b0paper}{\setlength{\hscale}{4.761mm}\setlength{\vscale}{4.761mm}}{} +\@ifclasswith{\@baseclass}{b1paper}{\setlength{\hscale}{3.367mm}\setlength{\vscale}{3.367mm}}{} +\@ifclasswith{\@baseclass}{b2paper}{\setlength{\hscale}{2.380mm}\setlength{\vscale}{2.380mm}}{} +\@ifclasswith{\@baseclass}{b3paper}{\setlength{\hscale}{1.681mm}\setlength{\vscale}{1.681mm}}{} +\@ifclasswith{\@baseclass}{b4paper}{\setlength{\hscale}{1.190mm}\setlength{\vscale}{1.190mm}}{} +\@ifclasswith{\@baseclass}{b5paper}{\setlength{\hscale}{0.837mm}\setlength{\vscale}{0.837mm}}{} +\@ifclasswith{\@baseclass}{b6paper}{\setlength{\hscale}{0.570mm}\setlength{\vscale}{0.570mm}}{} +\@ifclasswith{\@baseclass}{c0paper}{\setlength{\hscale}{4.367mm}\setlength{\vscale}{4.367mm}}{} +\@ifclasswith{\@baseclass}{c1paper}{\setlength{\hscale}{3.085mm}\setlength{\vscale}{3.085mm}}{} +\@ifclasswith{\@baseclass}{c2paper}{\setlength{\hscale}{2.180mm}\setlength{\vscale}{2.180mm}}{} +\@ifclasswith{\@baseclass}{c3paper}{\setlength{\hscale}{1.542mm}\setlength{\vscale}{1.542mm}}{} +\@ifclasswith{\@baseclass}{c4paper}{\setlength{\hscale}{1.090mm}\setlength{\vscale}{1.090mm}}{} +\@ifclasswith{\@baseclass}{c5paper}{\setlength{\hscale}{0.771mm}\setlength{\vscale}{0.771mm}}{} +\@ifclasswith{\@baseclass}{c6paper}{\setlength{\hscale}{0.542mm}\setlength{\vscale}{0.542mm}}{} +\@ifclasswith{\@baseclass}{b0j}{\setlength{\hscale}{4.904mm}\setlength{\vscale}{4.904mm}}{} +\@ifclasswith{\@baseclass}{b1j}{\setlength{\hscale}{3.467mm}\setlength{\vscale}{3.467mm}}{} +\@ifclasswith{\@baseclass}{b2j}{\setlength{\hscale}{2.452mm}\setlength{\vscale}{2.452mm}}{} +\@ifclasswith{\@baseclass}{b3j}{\setlength{\hscale}{1.733mm}\setlength{\vscale}{1.733mm}}{} +\@ifclasswith{\@baseclass}{b4j}{\setlength{\hscale}{1.226mm}\setlength{\vscale}{1.226mm}}{} +\@ifclasswith{\@baseclass}{b5j}{\setlength{\hscale}{0.867mm}\setlength{\vscale}{0.867mm}}{} +\@ifclasswith{\@baseclass}{b6j}{\setlength{\hscale}{0.613mm}\setlength{\vscale}{0.613mm}}{} +\@ifclasswith{\@baseclass}{ansiapaper}{\setlength{\hscale}{1.028mm}\setlength{\vscale}{0.939mm}}{} +\@ifclasswith{\@baseclass}{ansibpaper}{\setlength{\hscale}{1.328mm}\setlength{\vscale}{1.454mm}}{} +\@ifclasswith{\@baseclass}{ansicpaper}{\setlength{\hscale}{2.057mm}\setlength{\vscale}{1.882mm}}{} +\@ifclasswith{\@baseclass}{ansidpaper}{\setlength{\hscale}{2.662mm}\setlength{\vscale}{2.909mm}}{} +\@ifclasswith{\@baseclass}{ansiepaper}{\setlength{\hscale}{4.114mm}\setlength{\vscale}{3.764mm}}{} +\@ifclasswith{\@baseclass}{letterpaper}{\setlength{\hscale}{1.028mm}\setlength{\vscale}{0.939mm}}{} +\@ifclasswith{\@baseclass}{executivepaper}{\setlength{\hscale}{0.876mm}\setlength{\vscale}{0.898mm}}{} +\@ifclasswith{\@baseclass}{legalpaper}{\setlength{\hscale}{1.028mm}\setlength{\vscale}{1.198mm}}{} +\@ifclasswith{\@baseclass}{smallpocketpaper}{\setlength{\hscale}{0.571mm}\setlength{\vscale}{0.639mm}}{} +\@ifclasswith{\@baseclass}{pocketpaper}{\setlength{\hscale}{0.642mm}\setlength{\vscale}{0.723mm}}{} +\@ifclasswith{\@baseclass}{juvenilepaper}{\setlength{\hscale}{0.738mm}\setlength{\vscale}{0.740mm}}{} +\@ifclasswith{\@baseclass}{smallphotopaper}{\setlength{\hscale}{0.809mm}\setlength{\vscale}{0.572mm}}{} +\@ifclasswith{\@baseclass}{photopaper}{\setlength{\hscale}{1.00mm}\setlength{\vscale}{0.707mm}}{} +\@ifclasswith{\@baseclass}{appendixpaper}{\setlength{\hscale}{1.000mm}\setlength{\vscale}{0.505mm}}{} +\@ifclasswith{\@baseclass}{cookpaper}{\setlength{\hscale}{0.809mm}\setlength{\vscale}{0.740mm}}{} +\@ifclasswith{\@baseclass}{illustratedpaper}{\setlength{\hscale}{0.905mm}\setlength{\vscale}{0.909mm}}{} +\@ifclasswith{\@baseclass}{f24paper}{\setlength{\hscale}{0.762mm}\setlength{\vscale}{0.808mm}}{} +\@ifclasswith{\@baseclass}{a4paperlandscape}{\setlength{\hscale}{1.414mm}\setlength{\vscale}{0.707mm}}{} +\@ifclasswith{\@baseclass}{169paperlandscape}{\setlength{\hscale}{1.414mm}\setlength{\vscale}{0.562mm}}{} + +% Set the default page layout +\RequirePackage[ + paperwidth=210\hscale, + paperheight=297\vscale, +]{geometry} + +% Command to choose among the three possible layouts +\DeclareDocumentCommand{\pagelayout}{m}{% + \ifthenelse{\equal{margin}{#1}}{\marginlayout\marginfloatsetup}{}% + \ifthenelse{\equal{wide}{#1}}{\widelayout\widefloatsetup}{}% + \ifthenelse{\equal{fullwidth}{#1}}{\fullwidthlayout\widefloatsetup}{}% +} + +\newif\ifwidelayout% +\def\IfWideLayout{% + \ifwidelayout% + \expandafter\@firstoftwo% + \else% + \expandafter\@secondoftwo% + \fi% +} + +% Layout #1: large margins +\newcommand{\marginlayout}{% + \newgeometry{ + top=27.4\vscale, + bottom=27.4\vscale, + inner=24.8\hscale, + textwidth=107\hscale, + marginparsep=6.2\hscale, + marginparwidth=47.7\hscale, + }% + \recalchead% + \widelayoutfalse% +} + +% Layout #2: small, symmetric margins +\newcommand{\widelayout}{% + \newgeometry{ + top=27.4\vscale, + bottom=27.4\vscale, + inner=24.8\hscale, + outer=24.8\hscale, + marginparsep=0mm, + marginparwidth=0mm, + }% + \recalchead% + \widelayouttrue% +} + +% Layout #3: no margins and no space above or below the body +\newcommand{\fullwidthpage}{% + \newgeometry{ + top=0mm, + bottom=0mm, + inner=0mm, + outer=0mm, + marginparwidth=0mm, + marginparsep=0mm, + }% + \recalchead% + \widelayouttrue% +} + +% Set the default page layout +\AtBeginDocument{\pagelayout{margin}} + +%---------------------------------------------------------------------------------------- +% HEADERS AND FOOTERS +%---------------------------------------------------------------------------------------- + +\RequirePackage{scrlayer-scrpage} % Customise head and foot regions + +% Set the header height to prevent a warning +%\setlength{\headheight}{27.4\vscale} +% Increase the space between header and text +\setlength{\headsep}{11\vscale} + +% Define some LaTeX lengths used in the page headers +\newlength{\headtextwidth} % This is the width of the text +\newlength{\headmarginparsep} % This is the width of the whitespace between text and margin +\newlength{\headmarginparwidth} % This is the width of the margin +\newlength{\headtotal} % This is the total width of the header +\newlength{\contentwidth} % An alias for \headtotal +\newcommand{\recalchead}{% Command to recalculate the header-related length when needed + \setlength{\headtextwidth}{\textwidth}% + \setlength{\headmarginparsep}{\marginparsep}% + \setlength{\headmarginparwidth}{\marginparwidth}% + \setlength{\headtotal}{\headtextwidth+\headmarginparsep+\headmarginparwidth}% + \setlength{\contentwidth}{\headtotal}% +} + +\AtBeginDocument{% Recalculate the header-related lengths + \recalchead% +} + +% Header style with chapter number, chapter title, and page in the header (used throughout the document) +\renewpagestyle{scrheadings}{% + {\smash{\hspace{-\headmarginparwidth}\hspace{-\headmarginparsep}\makebox[\headtotal][l]{% + \makebox[7\hscale][r]{\thepage}% + \makebox[3\hscale]{}\rule[-1mm]{0.5pt}{19\vscale-1mm}\makebox[3\hscale]{}% + \makebox[\headtextwidth][l]{\leftmark}}}}% + {\smash{\makebox[0pt][l]{\makebox[\headtotal][r]{% + \makebox[\headtextwidth][r]{\hfill\rightmark}% + \makebox[3\hscale]{}\rule[-1mm]{0.5pt}{19\vscale-1mm}\makebox[3\hscale]{}% + \makebox[7\hscale][l]{\thepage}}}}}% + {\smash{\makebox[0pt][l]{\makebox[\headtotal][r]{% + \makebox[\headtextwidth][r]{\hfill\rightmark}% + \makebox[3\hscale]{}\rule[-1mm]{0.5pt}{19\vscale-1mm}\makebox[3\hscale]{}% + \makebox[7\hscale][l]{\thepage}}}}}% +}{% + {}% + {}% + {}% +} + +% Header style with neither header nor footer (used for special pages) +\renewpagestyle{plain.scrheadings}{% + {}% + {}% + {}% +}{% + {}% + {}% + {}% +} + +% Header style with an empty header and the page number in the footer +\newpagestyle{pagenum.scrheadings}{% + {}% + {}% + {}% +}{% + {\makebox[\textwidth][r]{\thepage}}% + {\makebox[\textwidth][l]{\thepage}}% + {\makebox[\textwidth][l]{\thepage}}% +} + +% Header style with an empty header and the page number in the footer +\newpagestyle{centeredpagenum.scrheadings}{% + {}% + {}% + {}% +}{% + {\hspace{-\headmarginparwidth}\hspace{-\headmarginparsep}\makebox[\headtotal][l]{\hfill\thepage\hfill}} + {\makebox[0pt][l]{\makebox[\headtotal][r]{\hfill\thepage\hfill}}}% + {\makebox[0pt][l]{\makebox[\headtotal][r]{\hfill\thepage\hfill}}}% +} + +% Command to print a blank page +\newcommand\blankpage{% + \null% + \thispagestyle{empty}% + \newpage% +} + +% Set the default page style +\pagestyle{plain.scrheadings} + +%---------------------------------------------------------------------------------------- +% PARAGRAPH FORMATTING +%---------------------------------------------------------------------------------------- + +\RequirePackage{ragged2e} % Required to achieve better ragged paragraphs +\RequirePackage{setspace} % Required to easily set the space between lines +\RequirePackage{hyphenat} % Hyphenation for special fonts +\RequirePackage{microtype} % Improves character and word spacing +\RequirePackage{needspace} % Required to prevent page break right after a sectioning command +\RequirePackage{xspace} % Better print trailing whitespace + +% TODO: recognize space/indent justified/raggedright class options + +% Settings for a normal paragraph +\newcommand{\@body@par}{% + \justifying% Justify text + \singlespacing% Set the interline space to a single line + \frenchspacing% No additional space after periods + \normalfont% Use the default font + \normalsize% Use the default size +} + +% Settings for paragraphs in the margins +\newcommand{\@margin@par}{% + \justifying% justify text + \setlength{\RaggedRightParindent}{0em}% Suppress indentation + \setlength{\parindent}{0em}% Suppress indentation + \setlength{\parskip}{0.5pc}% Set the space between paragraphs + %\singlespacing% Set the space between lines + \frenchspacing% No additional space after periods + \normalfont% Use the default font + \footnotesize% Use a smaller size +} + +% By default, use @body@par settings +\@body@par + +%---------------------------------------------------------------------------------------- +% WIDE PARAGRAPHS +%---------------------------------------------------------------------------------------- + +% Environment for a wide paragraph +\NewDocumentEnvironment{widepar}{}{% + \if@twoside% + \Ifthispageodd{% + \begin{addmargin}[0cm]{-\marginparwidth-\marginparsep}% + }{% + \begin{addmargin}[-\marginparwidth-\marginparsep]{0cm}% + }% + \else% + \begin{addmargin}[0cm]{-\marginparwidth-\marginparsep}% + \fi% +}{% + \end{addmargin}% +} + +% Environment for a full width paragraph +\NewDocumentEnvironment{fullwidthpar}{}{% + \if@twoside% + \Ifthispageodd{% + \begin{addmargin}[-1in-\hoffset-\oddsidemargin]{-\paperwidth+1in+\hoffset+\oddsidemargin+\textwidth}% + }{% + \begin{addmargin}[-\paperwidth+1in+\hoffset+\oddsidemargin+\textwidth]{-\paperwidth+1in+\hoffset+\oddsidemargin+\marginparsep+\marginparwidth+\textwidth}% + }% + \else% + \begin{addmargin}[-1in-\hoffset-\oddsidemargin]{-\paperwidth+1in+\hoffset+\oddsidemargin+\textwidth}% + \fi% +}{% + \end{addmargin}% +} + +% Environment for a wide equation +\NewDocumentEnvironment{wideequation}{}{% + \begin{widepar}% + \begin{equation}% +}{% + \end{equation}% + \end{widepar}% +} + +%---------------------------------------------------------------------------------------- +% FOOTNOTES, MARGINNOTES AND SIDENOTES +%---------------------------------------------------------------------------------------- + +\RequirePackage[section]{placeins} % Prevent floats to cross sections +\extrafloats{100} % Require more floats + +\RequirePackage{marginnote} % Provides options for margin notes +%\RequirePackage{marginfix} % Make marginpars float freely; it should not be loaded as it prevents the marginnotes to stay aligned with the main text +\RequirePackage{sidenotes} % Use sidenotes +\RequirePackage{chngcntr} % Reset counters at sections + +% TODO: see also page 440 of the KOMA-script guide +\RequirePackage[ + bottom, + symbol*, + hang, + flushmargin, + % perpage, + stable, +]{footmisc} % Required to set up the footnotes +\RequirePackage{footnotebackref} % Creates back references from footnotes to text + +% Fix the color of the footnote marker when back-referenced +\patchcmd{\footref}{\ref}{\hypersetup{colorlinks=black}\ref}{}{}% +% Workaround to fix back references +\edef\BackrefFootnoteTag{bhfn:\theBackrefHyperFootnoteCounter}% + +% FIXME: I am not able to choose the paragraph layout of footnotes, probably the footnotes package conflicts with scrbook. +%\renewcommand{\footnotelayout}{\@margin@par} + +%---------------------------------------------------------------------------------------- + +% Justify and format margin notes +\renewcommand*{\raggedleftmarginnote}{} % Suppress left margin +\renewcommand*{\raggedrightmarginnote}{} % Suppress right margin +\renewcommand*{\marginfont}{\@margin@par} % Format marginnotes according to \@marginpar (see above) +\renewcommand{\marginnotevadjust}{0.8\vscale} % Bring all marginnotes downwards a bit +%\marginposadjustment=1\vscale % Bring downwards also the marginpars +%\marginheightadjustment=10cm % Adjust the height of the margins for each page +%\RequirePackage[marginnote=true]{snotez} % Provides options for sidenotes + +% Copied from snotez's \sidenote +\def\kao@if@nblskip#1{% + \expandafter\ifx\@car#1\@nil*% + \expandafter\@firstoftwo% + \else% + \expandafter\@secondoftwo% + \fi% +} + +% Command to detect whether we are inside a tcolorbox environment +\newif\ifinfloat % First, set this flag whenever we are in a tcolorbox environment... +\AtBeginEnvironment{tcolorbox}{\infloattrue\renewcommand{\marginnotevadjust}{-1.4\vscale}} +\AtBeginEnvironment{minipage}{\infloattrue} + +\def\IfInFloatingEnvir{% ...Then, detect the flag + \ifinfloat% + \expandafter\@firstoftwo% + \else% + \expandafter\@secondoftwo% + \fi% +} + + +% Redefine the command to print marginnotes: +% (a) the optional offset argument goes at the first position +% (b) the offset can also be a multiple of baselineskip, like for snotez's \sidenote +% Usage: \marginnote[]{Text of the note.} +\let\oldmarginnote\marginnote% +\RenewDocumentCommand\marginnote{ o m }{% + \IfNoValueOrEmptyTF{#1}{% + \IfInFloatingEnvir{% + \oldmarginnote{#2}% + }{% + \marginpar{\@margin@par#2}% + }% + }{% + \oldmarginnote{#2}[\kao@if@nblskip{#1}{\@cdr#1\@nil\baselineskip}{#1}]% + }% +} + +% Initially set the sidenote counter to zero instead of 1, and update it before printing the sidenote. +\setcounter{sidenote}{0}% +\RenewDocumentCommand\sidenote{ o o +m }{% + \IfNoValueOrEmptyTF{#1}{% + \refstepcounter{sidenote}% This command has been moved here + }{% + }% + \sidenotemark[#1]% + \sidenotetext[#1][#2]{#3}% + \@sidenotes@multimarker% +} + +% Formatting sidenote markers +\RenewDocumentCommand\@sidenotes@thesidenotemark{ m }{% Format the marker + \leavevmode% + \ifhmode% + \edef\@x@sf{\the\spacefactor}% + \nobreak% + \fi% + \hbox{\@textsuperscript{\normalfont#1}}% + \ifhmode% + \spacefactor\@x@sf% + \fi% + \relax% +}% + +% Formatting the sidenote text +\RenewDocumentCommand\sidenotetext{ o o +m }{% number, offset, text + \IfNoValueOrEmptyTF{#1}{% + \marginnote[#2]{\thesidenote:\enskip#3}% + }{% + \marginnote[#2]{#1:\enskip#3}% + }% +} + +%---------------------------------------------------------------------------------------- +% FIGURES, TABLES, LISTINGS AND CAPTIONS +%---------------------------------------------------------------------------------------- + +\RequirePackage{graphicx} % Include figures +\setkeys{Gin}{width=\linewidth,totalheight=\textheight,keepaspectratio} % Improves figure scaling +\RequirePackage{tikz} % Allows to draw custom shapes +\RequirePackage{tikzpagenodes} % Allows to anchor tikz nodes to page elements +\RequirePackage{booktabs} % Nicer tables +\RequirePackage{multirow} % Cells occupying multiple rows in tables +\RequirePackage{multicol} % Multiple columns in dictionary +\RequirePackage{rotating} % Allows tables and figures to be rotated +\RequirePackage{listings} % Print code listings +%\RequirePackage{minted} +\RequirePackage[hypcap=true]{caption} % Correctly placed anchors for hyperlinks +% \RequirePackage{atbegshi} +% \RequirePackage{perpage} +\let\c@abspage\relax +% \newcommand{\pp@g@sidenote}{} +\RequirePackage{floatrow} % Set up captions of floats +%\RequirePackage{dblfloatfix} % Better positioning of wide figures and tables + +% Improve the figure placing (see https://www.overleaf.com/learn/latex/Tips) +\def\topfraction{.9}% +\def\textfraction{0.35}% +\def\floatpagefraction{0.8}% + +% Set the space between floats and main text +\renewcommand\FBaskip{.4\topskip}% +\renewcommand\FBbskip{\FBaskip}% + +% Tighten up space between displays (e.g., equations) and make symmetric (from tufte-latex) +\setlength\abovedisplayskip{6pt plus 2pt minus 4pt}% +\setlength\belowdisplayskip{6pt plus 2pt minus 4pt}% +\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@% +\abovedisplayshortskip \z@ \@plus3\p@% +\belowdisplayskip \abovedisplayskip% +\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@% + +\setlength\columnseprule{.4pt} % Set the width of vertical rules in tables + +% The marginfix package prevents the margin notes to stay aligned with the main text, so it cannot be used. However, we define the \marginskip command, which is the only command we need from that package. +\newcommand\marginskip[1]{% + \marginpar{\@margin@par\vspace{#1 - \baselineskip}}% We subtract the \baselineskip that we have in margin pars. +} + +\newlength{\kaomarginskipabove} % Specify the space above a marginfigure, margintable or marginlisting +\newlength{\kaomarginskipbelow} % Specify the space below a marginfigure, margintable or marginlisting +\setlength{\kaomarginskipabove}{3mm plus 2pt minus 2pt} +\setlength{\kaomarginskipbelow}{3mm plus 2pt minus 2pt} + +% Environment to hold a margin figure (from the sidenotes package) +% We redefine it here because we want to use our own caption formatting. +\RenewDocumentEnvironment{marginfigure}{o}{% + \FloatBarrier% + \marginskip{\kaomarginskipabove}% + \begin{lrbox}{\@sidenotes@marginfigurebox}% + \begin{minipage}{\marginparwidth}% + \captionsetup{type=figure}% +}{% + \end{minipage}% + \end{lrbox}% + \marginnote[#1]{\usebox{\@sidenotes@marginfigurebox}}% + \marginskip{\kaomarginskipbelow}% +} + +% Environment to hold a margin table (from the sidenotes package) +\RenewDocumentEnvironment{margintable}{o}{% + \FloatBarrier% + \marginskip{\kaomarginskipabove}% + \begin{lrbox}{\@sidenotes@margintablebox}% + \begin{minipage}{\marginparwidth}% + \captionsetup{type=table}% +}{% + \end{minipage}% + \end{lrbox}% + \marginnote[#1]{\usebox{\@sidenotes@margintablebox}}% + \marginskip{\kaomarginskipbelow}% +} + +% Environment to hold a margin listing +\newsavebox{\@sidenotes@marginlistingbox}% +\NewDocumentEnvironment{marginlisting}{o}{% The optional parameter is the vertical offset + \FloatBarrier% + \marginskip{\kaomarginskipabove}% + \begin{lrbox}{\@sidenotes@marginlistingbox}% + \begin{minipage}{\marginparwidth}% + \captionsetup{type=lstlisting}% +}{% + \end{minipage}% + \end{lrbox}% + \marginnote[#1]{\usebox{\@sidenotes@marginlistingbox}}% + \marginskip{\kaomarginskipbelow}% +} + +% Change the position of the captions +\DeclareFloatSeparators{marginparsep}{\hskip\marginparsep}% + +% Detect whether there is a caption in the current environment by switching the kaocaption toggle when \caption is called. If there is no caption, reset the floatsetup. Without this fix, the floatrow package will align the environment to the main text if there is a caption, but to the margin if there is no caption. +\newtoggle{kaocaption} +\AtBeginEnvironment{figure}{% + \let\oldcaption\caption% + \RenewDocumentCommand{\caption}{s o m}{% + \IfBooleanTF{#1}{% + \oldcaption*{#3}% + }{% + \IfValueTF{#2}{% + \oldcaption[#2]{#3}% + }{% + \oldcaption{#3}% + }% + }% + \toggletrue{kaocaption}% + }% +} +\AtEndEnvironment{figure}{% + \iftoggle{kaocaption}{% + }{% + \RawFloats% + \centering% + }% + \togglefalse{kaocaption}% +} +\AtBeginEnvironment{table}{% + \let\oldcaption\caption% + \RenewDocumentCommand{\caption}{s o m}{% + \IfBooleanTF{#1}{% + \oldcaption*{#3}% + }{% + \IfValueTF{#2}{% + \oldcaption[#2]{#3}% + }{% + \oldcaption{#3}% + }% + }% + \toggletrue{kaocaption}% + }% +} +\AtEndEnvironment{table}{% + \iftoggle{kaocaption}{% + }{% + \RawFloats% + \centering% + }% + \togglefalse{kaocaption}% +} + +% Change the formatting of the captions +\addtokomafont{captionlabel}{\bfseries} % Bold font for the figure label +% Declare a new style to format the caption according to \@margin@par (see above) +\DeclareCaptionFormat{margin}{\@margin@par #1#2#3} +% Declare a new caption style for lstlistings +\newsavebox\mycap +\DeclareCaptionFormat{llap}{% + \begin{lrbox}{\mycap}% + \begin{minipage}{\marginparwidth}% + \@margin@par #1:#2#3% + \end{minipage}% + \end{lrbox}% + \marginnote[0.2cm]{\usebox\mycap}% +} +% Set the global caption style +\captionsetup{ + format=margin, % Use the style previously declared + strut=no,% + %hypcap=true, % Links point to the top of the figure + singlelinecheck=false,% + %width=\marginparwidth, + indention=0pt, % Suppress indentation + parindent=0pt, % Suppress space between paragraphs + aboveskip=6pt, % Increase the space between the figure and the caption + belowskip=6pt, % Increase the space between the caption and the table +} + +% Needed to have continued figures and tables (https://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions#Figures_in_multiple_parts) +\DeclareCaptionLabelFormat{cont}{#1~#2\alph{ContinuedFloat}} +\captionsetup[ContinuedFloat]{labelformat=cont} + +% Captions for the 'margin' layout +\NewDocumentCommand{\marginfloatsetup}{}{% +\if@twoside% + \floatsetup[figure]{% Captions for figures + margins=hangoutside,% Put captions in the margins + facing=yes,% + capposition=beside,% + capbesideposition={bottom,outside},% + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[widefigure]{% Captions for wide figures + margins=hangoutside,% Put captions below the figure + facing=yes,% + capposition=bottom% + }% + \floatsetup[table]{% Captions for tables + margins=hangoutside,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,outside},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[widetable]{% Captions for wide tables + margins=hangoutside,% Put captions above the table + facing=yes,% + capposition=above% + }% + \floatsetup[longtable]{% Captions for longtables + margins=raggedright,% Overwrite the hangright setting from the `table' environment + %LTcapwidth=table,% Set the width of the caption equal to the table's + }% + \floatsetup[lstlisting]{% Captions for lstlistings + margins=hangoutside,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,outside},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[listing]{% Captions for listings (minted package) + margins=hangoutside,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,outside},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,%Width of the figure equal to the width of the text + }% + \captionsetup*[lstlisting]{% + format=llap,% + labelsep=space,% + singlelinecheck=no,% + belowskip=-0.6cm,% + }% +\else% + \floatsetup[figure]{% Captions for figures + margins=hangright,% Put captions in the margins + facing=yes,% + capposition=beside,% + capbesideposition={bottom,right},% + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[widefigure]{% Captions for wide figures + margins=hangright,% Put captions below the figure + facing=no,% + capposition=bottom% + }% + \floatsetup[table]{% Captions for tables + margins=hangright,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,right},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[widetable]{% Captions for wide tables + margins=hangright,% Put captions above the table + facing=no,% + capposition=above% + }% + \floatsetup[longtable]{% Captions for longtables + margins=raggedright,% Overwrite the hangright setting from the `table' environment + %LTcapwidth=table,% Set the width of the caption equal to the table's + }% + \floatsetup[lstlisting]{% Captions for lstlisting + margins=hangright,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,right},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \floatsetup[listing]{% Captions for listing (minted package) + margins=hangright,% Put captions in the margin + facing=yes,% + capposition=beside,% + capbesideposition={top,right},% + %capbesideposition=outside, + capbesideframe=yes,% + capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin + capbesidesep=marginparsep,% + floatwidth=\textwidth,% Width of the figure equal to the width of the text + }% + \captionsetup*[lstlisting]{% + format=llap,% + labelsep=space,% + singlelinecheck=no,% + belowskip=-0.6cm,% + }% +\fi% +} + +% Captions for the 'wide' layout +\NewDocumentCommand{\widefloatsetup}{}{% + \floatsetup[figure]{ % Captions for figures + capposition=bottom,% + margins=centering,% + floatwidth=\textwidth% + } + \floatsetup[widefigure]{ % Captions for wide figures + margins=hangoutside, % Put captions below the figure + facing=yes,% + capposition=bottom% + } + \floatsetup[table]{ % Captions for tables + capposition=above,% + margins=centering,% + floatwidth=\textwidth% + } + \floatsetup[widetable]{ % Captions for wide tables + margins=hangoutside, % Put captions above the table + facing=yes,% + capposition=above% + } + \floatsetup[lstlisting]{ % Captions for lstlistings + capposition=above,% + margins=centering,% + floatwidth=\textwidth% + } + \floatsetup[listing]{ % Captions for listings (minted package) + capposition=above,% + margins=centering,% + floatwidth=\textwidth% + } + \captionsetup*[lstlisting]{% Captions style for lstlistings + %format=margin,% + labelsep=colon,% + strut=no,% + singlelinecheck=false,% + indention=0pt,% + parindent=0pt,% + aboveskip=6pt,% + belowskip=6pt,% + belowskip=-0.1cm% + } +} + +%---------------------------------------------------------------------------------------- +% TOC, LOF & LOT +%---------------------------------------------------------------------------------------- + +\RequirePackage{tocbasic} % Required to customise the TOC + +% Show an entry for the TOC in the TOC +\setuptoc{toc}{totoc} + +% Choose the levels in table of contents +\setcounter{tocdepth}{\subsectiontocdepth} + +% Customise the list of listings +\renewcommand{\lstlistlistingname}{List of Listings}% Change the title +\newcommand{\lstlistingtocdepth}{\sectiontocdepth}% Set the depth +\newcommand{\listoflistings}{\lstlistoflistings}% Provide the alias \listoflistings +\newcommand{\listoflstlistings}{\lstlistoflistings}% Provide the alias \listoflstlistings + +% Define the style for toc entries +\@ifpackagelater{scrbase}{2019/10/11}{% + \DeclareTOCStyleEntries[indent=0em,numwidth=2em,dynnumwidth=yes,pagenumberwidth=2.1em]{tocline}{figure,table,lstlisting}% + \DeclareTOCStyleEntries[dynnumwidth=yes]{tocline}{subsubsection,subsection,section,chapter,part}% + \DeclareTOCStyleEntries[pagenumberwidth=2.5em]{tocline}{chapter,part}% + \DeclareTOCStyleEntries[pagenumberwidth=2.1em]{tocline}{subsubsection,subsection,section}% +}{% + \DeclareTOCStyleEntries[indent=0em,numwidth=2em,dynnumwidth=yes]{tocline}{figure,table,lstlisting}% + \DeclareTOCStyleEntries[dynnumwidth=yes]{tocline}{subsubsection,subsection,section,chapter,part}% +} + +% Define the names for the headings +% \renewcaptionname{english}{\contentsname}{Detailed Contents} +% \renewcaptionname{english}{\listfigurename}{Figures} +% \renewcaptionname{english}{\listtablename}{Tables} +% \newcaptionname{english}{\listtheoremname}{Theorems} + +%---------------------------------------------------------------------------------------- +% MARGIN TOC +%---------------------------------------------------------------------------------------- + +\RequirePackage{etoc} % Required to insert local tables of contents + +\newcounter{margintocdepth} % Set the depth of the margintoc +\setcounter{margintocdepth}{\subsectiontocdepth} % By default to subsections + +\newlength{\mtocshift} % Length of the vertical offset used for margin tocs +\setlength{\mtocshift}{1\vscale}% \mtocshift is overridden by \setchapterstyle + +% Optional title for margintoc (by hCarlFelix, +% https://github.com/fmarotta/kaobook/issues/101) +% We want to create an additional entries in the toc which is to be used for the margintoc +% We define these as mtocsection and mtocsubsection for section and subsection` +\newcommand{\mtocsection}[1]{ + \etoctoccontentsline{mtocsection}{% + \ifnum\value{secnumdepth}>0 \protect\numberline{\thesection}% + \else \protect\nonumberline% + \fi #1}% +} +\newcommand{\mtocsubsection}[1]{ + \etoctoccontentsline{mtocsubsection}{% + \ifnum\value{secnumdepth}>1 \protect\numberline{\thesubsection}% + \else \protect\nonumberline% + \fi #1}% +} + +% Next, we redefine \section and \subsection so that they accept an additional parameter +% \section[alternative-title-for-toc]{title-as-written-in-text}[alternative-title-for-margintoc] + +% Adapted from Frank Mittelbach's answer at Stackexchange +% https://tex.stackexchange.com/a/109560/226693 +\let\oldsection\section % save the old command +\let\oldsubsection\subsection % save the old command + +\RenewDocumentCommand\section{s o m o}{% + \IfBooleanTF{#1}{% + \oldsection*{#3} + \IfNoValueF{#2}{% if TOC arg is given create a TOC entry + \addxcontentsline{toc}{section}[\thesection]{#2}% + }% + }{% no star given + \IfNoValueTF{#2}{% + \oldsection{#3}% + }{% no TOC arg + \oldsection[#2]{#3}% + }% + \IfNoValueTF{#4}{% optional label given, if not we do nothing + % \mtocsection{#3}% + \IfNoValueTF{#2}{% + \mtocsection{#3}% when no optional toc title, use main title + }{% no TOC arg + \mtocsection{#2}% when toc optional title is given, use it + }% + }{% + \mtocsection{#4}% + }% + }% +} + +\RenewDocumentCommand\subsection{s o m o}{% + \IfBooleanTF{#1}{% + \oldsubsection*{#3}% + \IfNoValueF{#2}{% if TOC arg is given create a TOC entry + \addxcontentsline{toc}{subsection}[\thesubsection]{#2}% + }% + }{% no star given + \IfNoValueTF{#2}{% + \oldsubsection{#3}% + }{% no TOC arg + \oldsubsection[#2]{#3}% + }% + \IfNoValueTF{#4}{% optional label given, if not we do nothing + \IfNoValueTF{#2}{% + \mtocsubsection{#3}% when no optional toc title, use main title + }{% no TOC arg + \mtocsubsection{#2}% when toc optional title is given, use it + }% + }{% + \mtocsubsection{#4}% + }% + }% +} + +\etocsetlevel{mtocsection}{6}% dummy sectioning level +\etocsetlevel{mtocsubsection}{6}% dummy sectioning level + +% Command to print a table of contents in the margin +\NewDocumentCommand{\margintoc}{O{\mtocshift}}{ % The first parameter is the vertical offset; by default it is \mtocshift + \begingroup% + % Move regular section and subsection to level 6 so that they won't be included and instead set let the mtoc versions take their place. + % Adapted from https://tex.stackexchange.com/a/133559/226693 + \etocsetlevel{section}{6} + \etocsetlevel{subsection}{6} + \etocsetlevel{mtocsection}{1} + \etocsetlevel{mtocsubsection}{2} + + % Define default widths + \def\margintocnumwidth{-.8mm}% + \def\margintocpagenumwidth{8pt}% + \setlength{\RaggedRightParfillskip}{0pt} + + % Dry run to get the needed widths + \etocsetstyle{mtocsection}% + {}% + {\setbox0\hbox{{\usekomafont{section}\small\etocthenumber\kern.8mm}}%% + \setbox1\hbox{{\usekomafont{section}\small\etocthepage}}}% + {\ifdim\wd0>\margintocnumwidth \edef\margintocnumwidth{\the\wd0} \fi%% + \ifdim\wd1>\margintocpagenumwidth \edef\margintocpagenumwidth{\the\wd1} \fi}% + {}% + \etocsetstyle{mtocsubsection}% + {}% + {\setbox0\hbox{{\usekomafont{section}\small\mdseries\etocthenumber\kern.8mm}}% + \setbox1\hbox{{\usekomafont{section}\small\mdseries\etocthepage}}}% + {\ifdim\wd0>\margintocnumwidth \edef\margintocnumwidth{\the\wd0} \fi% + \ifdim\wd1>\margintocpagenumwidth \edef\margintocpagenumwidth{\the\wd1} \fi}% + {}% + \etocsetstyle{subsubsection}% + {}% + {}% + {}% + {}% + \etocsetstyle{paragraph}% + {}% + {}% + {}% + {}% + \etocsettocstyle{}{% + \global\let\margintocnumwidth\margintocnumwidth% + \global\let\margintocpagenumwidth\margintocpagenumwidth% + }% + \localtableofcontents% + + % Set the style for section entries + \etocsetstyle{mtocsection}% + {\parindent 0pt \parskip 2.5pt \parfillskip 0pt \RaggedRight}% + {\leftskip \margintocnumwidth \rightskip \margintocpagenumwidth}% + {\makebox[0pt][r]{\makebox[\margintocnumwidth][l]{\etocnumber}}\etocname\nobreak\leaders\hbox{\hbox to 1.5ex {\hss.\hss}}\hfill\rlap{\makebox[\margintocpagenumwidth][r]{\etocpage}}\par}% + {}% + % Set the style for subsection entries + \etocsetstyle{mtocsubsection}% + {\parindent 0pt \parskip 0pt \parfillskip 0pt \RaggedRight}% + {\leftskip \margintocnumwidth \rightskip \margintocpagenumwidth}% + {\makebox[0pt][r]{\makebox[\margintocnumwidth][l]{\mdseries\etocnumber}}{\mdseries\etocname\nobreak\leaders\hbox{\hbox to 1.5ex {\hss.\hss}}\hfill\rlap{\makebox[\margintocpagenumwidth][r]{\mdseries\etocpage}}}\par}% + {\parskip 2.5pt}% + % Set the global style of the toc + \etocsettocstyle{\usekomafont{section}\small}{}% + \etocsetnexttocdepth{\themargintocdepth}% + % Print the table of contents in the margin + \marginnote[#1]{\localtableofcontents}% + \FloatBarrier% + \endgroup% +} + +%---------------------------------------------------------------------------------------- +% ENCODING AND FONTS +%---------------------------------------------------------------------------------------- + +\newcommand{\kao@fontmethodModern}{% + \RequirePackage{amssymb} % Must be loaded before unicode-math + \RequirePackage[force]{filehook} % Fixes an error + \RequirePackage{unicode-math} % Math fonts in xetexorluatex + \setromanfont[ % Libertinus Serif font + Scale=1.04 + ]{Libertinus Serif} + \setsansfont[ % Libertinus Sans font + Scale=1 + ]{Libertinus Sans} + \setmonofont[ % Libertinus Mono font + Scale=.89 + ]{Liberation Mono} + \setmathfont{Libertinus Math} % Libertinus Math font + \ifluatex + \else + \RequirePackage{morewrites} % Fix some errors related to floats (not necessary with LuaLaTeX + \fi% +} +\newcommand{\kao@fontmethodTex}{% + \RequirePackage[utf8]{inputenc} % utf8 encoding in the input (.tex) file + \RequirePackage[T1]{fontenc} % utf8 encoding in the output (.pdf) file + + \RequirePackage{amssymb} % Math symbols, including \blacktriangleright, used for bullets + \RequirePackage[scaled=.97,helvratio=.93,p,theoremfont]{newpxtext} % Serif palatino font + \RequirePackage[vvarbb,smallerops,bigdelims]{newpxmath} % Math palatino font + \RequirePackage[scaled=.85]{beramono} % Monospace font + \RequirePackage[scr=rsfso,cal=boondoxo]{mathalfa} % Mathcal from STIX, unslanted a bit + \RequirePackage{morewrites} % Fix some errors related to floats +} + +\ifthenelse% + {\equal{modern}{\kao@fontmethod}}{\kao@fontmethodModern}% +{\ifthenelse% + {\equal{tex}{\kao@fontmethod}}{\kao@fontmethodTex}% +{ + \PackageError{kao}{% + Invalid fontmethod choice \kao@fontmethod.% + }{% + Should be one of "modern" or "tex"% + } +}} + +% When using the Palatino (newpxtext) font, it is better to use a +% slightly larger stretch. +%\setstretch{1.10} +\linespread{1.07} % Give Palatino more leading (space between lines) + +% Fix for the subequation environment (https://tex.stackexchange.com/questions/27053/too-much-space-between-full-paragraph-and-subequations-env) +\preto\subequations{\ifhmode\unskip\fi} + +%---------------------------------------------------------------------------------------- +% HYPERREFERENCES +%---------------------------------------------------------------------------------------- + +\RequirePackage{hyperref} % Required for hyperlinks +\RequirePackage{bookmark} % Required for pdf bookmarks + +\PassOptionsToPackage{hyphens}{url} % Break long URLs and use hyphens to separate the pieces + +% Color settings should be done in the next \hypersetup +\hypersetup{ % Set up hyperref options + unicode, % Use unicode for links + pdfborder={0 0 0}, % Suppress border around pdf + %xetex, + %pagebackref=true, + %hyperfootnotes=false, % We already use footmisc + bookmarksdepth=section, + bookmarksopen=true, % Expand the bookmarks as soon as the pdf file is opened + %bookmarksopenlevel=4, + linktoc=all, % Toc entries and numbers links to pages + breaklinks=true, + colorlinks=true, +} + +% Define a new color for the footnote marks +\def\@footnotecolor{black} +\define@key{Hyp}{footnotecolor}{% + \HyColor@HyperrefColor{#1}\@footnotecolor% +} +\def\@footnotemark{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \stepcounter{Hfootnote}% + \global\let\Hy@saved@currentHref\@currentHref + \hyper@makecurrent{Hfootnote}% + \global\let\Hy@footnote@currentHref\@currentHref + \global\let\@currentHref\Hy@saved@currentHref + \hyper@linkstart{footnote}{\Hy@footnote@currentHref}% + \@makefnmark + \hyper@linkend + \ifhmode\spacefactor\@x@sf\fi + \relax +} + +% Redefine the \thanks command to allow users to use \label within \thanks without getting warnings +\let\oldthanks\thanks +\renewcommand\thanks[1]{% + \label{bhfn:0}% + \oldthanks{#1}% +} + +% Adjust the colour of the footnotes marks using the colour defined above +\renewcommand\@makefntext[1]{% + \renewcommand\@makefnmark{% + \mbox{\textsuperscript{\normalfont% + \hyperref[\BackrefFootnoteTag]{% + \color{\@footnotecolor}{\@thefnmark}% + }}\,% + }% + }% + \BHFN@OldMakefntext{#1}% +} + +%---------------------------------------------------------------------------------------- +% COLOURS +%---------------------------------------------------------------------------------------- + +% Uncomment to have coloured headings +%\addtokomafont{title}{\color{Maroon}} +%\addtokomafont{part}{\color{Maroon}} +%\addtokomafont{chapter}{\color{Maroon}} +%\addtokomafont{section}{\color{Maroon}} +%\addtokomafont{subsection}{\color{Maroon}} +%\addtokomafont{subsubsection}{\color{Maroon}} +%\addtokomafont{paragraph}{\color{Maroon}} +%\addtokomafont{captionlabel}{\color{Blue}} +%\addtokomafont{pagenumber}{\color{Maroon}} + +% Choose the default colors +\hypersetup{ + %allcolors=DarkGreen, + %anchorcolor=Red, + %citecolor=DarkOrange!70!black, + citecolor=OliveGreen, + filecolor=OliveGreen, + %linkcolor=Blue, + linkcolor=Black, + %pagecolor = Blue, + %menucolor=Red, + %runcolor=Red, + urlcolor=OliveGreen, +} + +%---------------------------------------------------------------------------------------- +% ITEMS +%---------------------------------------------------------------------------------------- + +\renewcommand{\labelitemi}{\small$\blacktriangleright$} % Use a black triangle for the first level of \item's +\renewcommand{\labelitemii}{\textbullet} % Use a bullet for the second level of \item's +\RequirePackage[inline]{enumitem} % Used to customise lists (in particular, we don't want to put whitespace between items) +\setlist[itemize]{noitemsep} +\setlist[enumerate]{noitemsep} +\setlist[description]{noitemsep} + +%---------------------------------------------------------------------------------------- +% SIMPLE BOXED ENVIRONMENT +%---------------------------------------------------------------------------------------- + +% kaobox +\RequirePackage[most]{tcolorbox} + +% Define a new environment using the style created above +\newtcolorbox{kaobox}[1][]{ + breakable, + before skip=1.5\topskip, + after skip=1.5\topskip, + left skip=0pt, + right skip=0pt, + left=4pt, + right=4pt, + top=2pt, + bottom=2pt, + lefttitle=4pt, + righttitle=4pt, + toptitle=2pt, + bottomtitle=2pt, + sharp corners, + boxrule=0pt, + titlerule=.4pt, + colback=RoyalBlue!25!White, + colbacktitle=RoyalBlue!25!White, + coltitle=black, + colframe=black, + fonttitle=\bfseries, + #1 +} + +%---------------------------------------------------------------------------------------- +% ENVIRONMENT WITH A COUNTER +%---------------------------------------------------------------------------------------- + +% Define an environment titled 'Comment' and numbered incrementally +\newenvironment{kaocounter}{ + \refstepcounter{kaocounter} + \begin{kaobox}[title=Comment~\thekaocounter\autodot] +}{ + \end{kaobox} +} + +% Define the commands to manage the counter for the 'kaocounter' environment +\newcounter{kaocounter} +\counterwithin{kaocounter}{section} +\newcommand*{\kaocounterformat}{% Format for the caption + Comment~\thekaocounter\csname autodot\endcsname} +\newcommand*{\fnum@kaocounter}{\kaocounterformat} + + +%---------------------------------------------------------------------------------------- +% FLOATING ENVIRONMENT WITH TOC ENTRIES +%---------------------------------------------------------------------------------------- + +% Define a floating environment +\newenvironment{kaofloating}{% + \@float{kaofloating}% +}{% + \end@float% +} + +% Configure the 'kaofloating' environment +\newcommand*{\fps@floatingbox}{tbph}% Allowed positions for the environment (top, bottom, own page, here) +\newcommand*{\ftype@floatingbox}{5}% Set the type of float (floats of the same type cannot change their order; figures and tables are type 1 and 2 respectively) +\newcommand*{\floatingboxformat}{% Set a title of the environment + Insight~\thefloatingbox\csname autodot\endcsname} +\newcommand*{\fnum@floatingbox}{\floatingboxformat}% Use the environment title +\newcommand*{\ext@floatingbox}{loi}% Choose the extension of the auxiliary file for this environment + +\addtotoclist[float]{loi}% Keep track of 'kaofloating' environments for a "List of Insights" +\newcommand*{\listofloiname}{List of Insights}% Choose the title for the "List of Insights" +\newcommand*{\l@floatingbox}{\l@figure}% Format the LOI +\newcommand*{\listofinsights}{\listoftoc{loi}}% User-friendly command to print the LOI + +%---------------------------------------------------------------------------------------- +% ADDITIONAL PACKAGES +%---------------------------------------------------------------------------------------- + +% Productivity +\RequirePackage{pdfpages} % Insert PDF pages +\RequirePackage{subfiles} % Adopt a modular structure +\RequirePackage{todonotes} % Add useful notes in the margins + +% Listings code +\RequirePackage{listings} % Code +%\RequirePackage{minted} (must be loaded before scrhack) + +% Configure the listings +\definecolor{listingkeywords}{rgb}{0.0, 0.5, 0.0} +\definecolor{listingidentifiers}{rgb}{0, 0, 0} +\definecolor{listingcomments}{rgb}{0.25, 0.5, 0.5} +\definecolor{listingstrings}{rgb}{0.73, 0.13, 0.13} +\definecolor{listingnumbers}{rgb}{0.25, 0.25, 0.25} +% Define a fancy style +\lstdefinestyle{kaolst}{ + aboveskip=0.7\topskip, + belowskip=0.1\topskip, + basicstyle=\small\ttfamily, + commentstyle=\color{listingcomments}\itshape, + keywordstyle=\color{listingkeywords}\bfseries, + numberstyle=\scriptsize\color{listingnumbers}\ttfamily, + stringstyle=\color{listingstrings}, + identifierstyle=\color{listingidentifiers}, + backgroundcolor=\color{White}, + breakatwhitespace=false, + breaklines=true, + captionpos=t, + keepspaces=true, + showspaces=false, + showstringspaces=false, + showtabs=false, + numbers=left, + numbersep=1em, + %frame=lines, + frame=l, + framerule=.7pt, + tabsize=4, + defaultdialect=[LaTeX]Tex, +} +% Define a plain style as well +\lstdefinestyle{kaolstplain}{ + aboveskip=0.6\topskip, + belowskip=-0.1\topskip, + basicstyle=\small\ttfamily, + commentstyle=\color{listingcomments}\itshape, + keywordstyle=\color{listingkeywords}\bfseries, + numberstyle=\scriptsize\color{listingnumbers}\ttfamily, + stringstyle=\color{listingstrings}, + identifierstyle=\color{listingidentifiers}, + backgroundcolor=\color{White}, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + showspaces=false, + showstringspaces=false, + showtabs=false, + numbers=none, + frame=none, + tabsize=4, + defaultdialect=[LaTeX]Tex, +} +\lstset{style=kaolst}% Use the fancy style + +% Verbatim +%\RequirePackage{fancyvrb} % Customization of verbatim environments +%\fvset{fontsize=\normalsize} % Change here the font size of all +%verbatim \preto{\@verbatim}{\topsep=0pt \partopsep=0pt } + +% Algorithms +% \RequirePackage[linesnumbered, ruled, vlined]{algorithm2e} % Algorithms + +% Special gliphs +\RequirePackage{ccicons} % Creative Commons icons + +% Index, glossary and nomenclature +\RequirePackage{imakeidx} +\RequirePackage[xindy,toc,numberedsection=nameref]{glossaries} +\RequirePackage[intoc]{nomencl} + +% Commands to print specific words always in the same way +% TODO: in \Command, automatically escape braces {} and replace backslashes with \textbackslash +\newcommand{\Class}[1]{\texttt{#1}} +\newcommand{\Package}[1]{\texttt{#1}} +\newcommand{\Option}[1]{\texttt{#1}} +\newcommand{\Command}[1]{\texttt{\textbackslash#1}} +\newcommand{\Environment}[1]{\texttt{#1}} +\newcommand{\Path}[1]{\texttt{#1}} + +% Print latin words in italics (The xspace package is required but we already loaded it in the class) +\newcommand{\hairsp}{\hspace{1pt}} % Command to print a very short space +\newcommand{\invitro}{\textit{in vitro}\xspace} +\newcommand{\invivo}{\textit{in vivo}\xspace} +\newcommand{\cis}{\textit{cis}\xspace} +\newcommand{\trans}{\textit{trans}\xspace} +\newcommand{\etal}{\textit{et al.}\xspace} +\newcommand{\denovo}{\textit{de novo}\xspace} +\newcommand{\adhoc}{\textit{ad hoc}\xspace} +\newcommand{\etcetera}{\textit{et cetera}\xspace} +\newcommand{\etc}{\textit{etc.}\xspace} +\newcommand{\ie}{\textit{i.\nobreak\hairsp{}e.}\xspace} +\newcommand{\eg}{\textit{e.\nobreak\hairsp{}g.}\xspace} +\newcommand{\vs}{\textit{vs}\xspace} +\newcommand{\cfr}{\textit{cfr.}\xspace} + +% Tables +\newcommand{\na}{\quad--} % Used in tables for N/A cells +\newcommand{\hangp}[1]{\makebox[0pt][r]{(}#1\makebox[0pt][l]{)}} % Create parentheses around text in tables which take up no horizontal space - this improves column spacing +\newcommand{\hangstar}{\makebox[0pt][l]{*}} % Create asterisks in tables which take up no horizontal space - this improves column spacing + +% A command to print the current month and year (from tufte-latex) +\newcommand{\monthyear}{\ifcase\month\or January\or February\or March\or +April\or May\or June\or July\or August\or September\or October\or +November\or December\fi\space\number\year} diff --git a/tex/kaobiblio.sty b/tex/kaobiblio.sty new file mode 100644 index 0000000..7ab8e50 --- /dev/null +++ b/tex/kaobiblio.sty @@ -0,0 +1,426 @@ +\ProvidesPackage{kaobiblio} + +%---------------------------------------------------------------------------------------- +% PACKAGE OPTIONS AND DEPENDENCIES +%---------------------------------------------------------------------------------------- + +\RequirePackage{etoolbox} % Easy programming to modify TeX stuff +\RequirePackage{perpage} % Reset counters +\RequirePackage{iflang} % Check the document language +\RequirePackage{xparse} % Parse arguments for macros +\RequirePackage{xstring} % Parse strings +\RequirePackage{hyperref} % Required for hyperlinks +\RequirePackage{kvoptions} % Handle package options + +% Set up the package options +\SetupKeyvalOptions{ + family = kaobiblio, + prefix = kaobiblio@ +} + +\DeclareBoolOption{addspace}% If true, automatically add a space before printing the citation marker +\DeclareBoolOption{linkeverything}% If true, the author name is a hyperlink in citation styles that support it + +% Choose the default options, which will be overwritten by the options +% passed to this package. +\PassOptionsToPackage{ + %style=numeric-comp, + %citestyle=authortitle-icomp, + citestyle=numeric-comp, + %bibstyle=authoryear, + bibstyle=numeric, + sorting=none, + %sorting=nyt, + %sortcites=true, + %autocite=footnote, + backend=biber, % Compile the bibliography with biber + hyperref=true, + backref=true, + citecounter=true, + pagetracker=true, + citetracker=true, + ibidtracker=context, + autopunct=true, + autocite=plain, +}{biblatex} + +% Pass the unknown options to biblatex, overwriting the previous settings. Avoid passing the kao-specific options. +\DeclareDefaultOption{% + \IfBeginWith{\CurrentOption}{addspace}{}{% + \IfBeginWith{\CurrentOption}{linkeverything}{}{% + \PassOptionsToPackage{\CurrentOption}{biblatex}% + }}% +} + +% Process the options +\ProcessKeyvalOptions{kaobiblio} + +% Load biblatex +\RequirePackage{biblatex} + +% Remove some unwanted entries from the bibliography +\AtEveryBibitem{ + \clearfield{issn} + \clearfield{isbn} + \clearfield{archivePrefix} + \clearfield{arxivId} + \clearfield{pmid} + \clearfield{eprint} + \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}} + \ifentrytype{book}{\clearfield{doi}}{} +} + +% Convert months to integers +\DeclareSourcemap{ + \maps[datatype=bibtex]{ + \map[overwrite]{ + \step[fieldsource=month, match={jan}, replace=${1}] + \step[fieldsource=month, match={feb}, replace=${2}] + \step[fieldsource=month, match={mar}, replace=${3}] + \step[fieldsource=month, match={apr}, replace=${4}] + \step[fieldsource=month, match={may}, replace=${5}] + \step[fieldsource=month, match={jun}, replace=${6}] + \step[fieldsource=month, match={jul}, replace=${7}] + \step[fieldsource=month, match={aug}, replace=${8}] + \step[fieldsource=month, match={sep}, replace=${9}] + \step[fieldsource=month, match={oct}, replace=${10}] + \step[fieldsource=month, match={nov}, replace=${11}] + \step[fieldsource=month, match={dec}, replace=${12}] + } + } +} + +%---------------------------------------------------------------------------------------- +% BACK REFERENCES +%---------------------------------------------------------------------------------------- + +% Check if a string is in a comma-separated list +\newcommand\IfStringInList[2]{\IfSubStr{,#2,}{,#1,}} + +% Set the language-specific back reference strings +% #LANGUAGE +\@ifpackageloaded{polyglossia}{% + \IfLanguageName{danish}{% + \DefineBibliographyStrings{danish}{% + backrefpage = {citeret på side}, + backrefpages = {citeret på sider}, + } + }{} + \IfLanguageName{english}{% + \DefineBibliographyStrings{english}{% + backrefpage = {cited on page}, + backrefpages = {cited on pages}, + } + }{} + \IfLanguageName{italian}{% + \DefineBibliographyStrings{italian}{% + backrefpage = {citato a pag.}, + backrefpages = {citato a pagg.}, + } + }{} +}{ + \@ifpackageloaded{babel}{% + \IfStringInList{danish}{\bbl@loaded}{% + \DefineBibliographyStrings{danish}{% + backrefpage = {citeret på side}, + backrefpages = {citeret på sider}, + } + }{} + \IfStringInList{english}{\bbl@loaded}{% + \DefineBibliographyStrings{english}{% + backrefpage = {cited on page}, + backrefpages = {cited on pages}, + } + }{} + \IfStringInList{italian}{\bbl@loaded}{% + \DefineBibliographyStrings{italian}{% + backrefpage = {citato a pag.}, + backrefpages = {citato a pagg.}, + } + }{} + }{} +} + +%---------------------------------------------------------------------------------------- +% CITATION COMMANDS +%---------------------------------------------------------------------------------------- + +% Command to format the marginnote created for cited items +\NewDocumentCommand{\formatmargincitation}{m}{% The parameter is a single citation key + \parencite{#1}: \citeauthor*{#1} (\iffieldundef{year}{\bibsstring{nodate}}{\printfield{year}}), \citefield{#1}[emph]{title}% +} + +% Command to format the marginnote created for supercited items +\NewDocumentCommand{\formatmarginsupercitation}{m}{% The parameter is a single citation key + \supercite{#1} \citeauthor*{#1} (\iffieldundef{year}{\bibsstring{nodate}}{\printfield{year}})% +} + +% The following command needs to be redefined every time \sidecite is called in order for \DeclareCiteCommand's wrapper to work correctly +\NewDocumentCommand{\kaobiblio@marginnote}{m}{% + \marginnote{#1}% +} + +% biblatex-like commands that also print a citation in the margin +% Usage: + % First optional argument is always vertical shift and must be given as an (empty) argument when using following a postnote and/or prenote + % Second optional argument is always the postnote if the third argument isn't specified or is the prenote if the third argument is specified (same pattern as the biblatex commands) + % Third optional argument is always the postnote + % Mandatory argument is always the citation key(s) + +% Command to \cite and print a citation in the margin +% First optional argument: vertical shift +% Second optional argument: postnote if the third argument isn't specified; prenote if the third argument is specified (same pattern as the \textcite command) +% Third optional argument: postnote +% Mandatory argument: citation key +\NewDocumentCommand{\sidecite}{o o o m}{% + \RenewDocumentCommand{\kaobiblio@marginnote}{m}{% + \marginnote[#1]{##1}% + }% + \DeclareCiteCommand{\kaobiblio@sidecite}[\kaobiblio@marginnote]{% + }{% + \formatmargincitation{\thefield{entrykey}}% + }{% + \\% separator between multiple citations + }{% + }% + % With this we print the marker in the text and add the item to the bibliography at the end + \IfNoValueOrEmptyTF{#2}% + {\def\@tempa{\cite{#4}\kaobiblio@sidecite{#4}}}% + {\IfNoValueOrEmptyTF{#3}% + {\IfNoValueTF{#3}% + {\def\@tempa{\cite[#2]{#4}\kaobiblio@sidecite{#4}}}% + {\def\@tempa{\cite[#2][]{#4}\kaobiblio@sidecite{#4}}}% postnote is empty, so pass empty postnote + }% + {\def\@tempa{\cite[#2][#3]{#4}\kaobiblio@sidecite{#4}}}% + }% + \ifkaobiblio@addspace% + \unskip~\@tempa% + \else% + \@tempa% + \fi% +} + +% Command to \supercite and print a citation in the margin +% First optional argument: vertical shift +% Second optional argument: postnote if the third argument isn't specified; prenote if the third argument is specified (same pattern as the \textcite command) +% Third optional argument: postnote +% Mandatory argument: citation key +\NewDocumentCommand{\sidesupercite}{o o o m}{% + \RenewDocumentCommand{\kaobiblio@marginnote}{m}{% + \marginnote[#1]{##1}% + }% + \DeclareCiteCommand{\kaobiblio@sidesupercite}[\kaobiblio@marginnote]{% + }{% + \formatmarginsupercitation{\thefield{entrykey}}% + }{% + \\% separator between multiple citations + }{% + }% + % With this we print the marker in the text and add the item to the bibliography at the end + \IfNoValueOrEmptyTF{#2}% + {\def\@tempa{\supercite{#4}\kaobiblio@sidesupercite{#4}}}% + {\IfNoValueOrEmptyTF{#3}% + {\IfNoValueTF{#3}% + {\def\@tempa{\supercite[#2]{#4}\kaobiblio@sidesupercite{#4}}}% + {\def\@tempa{\supercite[#2][]{#4}\kaobook@sidesupercite{#4}}}% postnote is empty, so pass empty postnote + }% + {\def\@tempa{\supercite[#2][#3]{#4}\kaobiblio@sidesupercite{#4}}}% + }% + \@tempa% +} + +% Command to \textcite and print a citation in the margin +% First optional argument: vertical shift +% Second optional argument: postnote if the third argument isn't specified; prenote if the third argument is specified (same pattern as the \textcite command) +% Third optional argument: postnote +% Mandatory argument: citation key +\NewDocumentCommand{\sidetextcite}{o o o m}{% + \RenewDocumentCommand{\kaobiblio@marginnote}{m}{% + \marginnote[#1]{##1}% + }% + \DeclareCiteCommand{\kaobiblio@sidecite}[\kaobiblio@marginnote]{% + }{% + \formatmargincitation{\thefield{entrykey}}% + }{% + \\% separator between multiple citations + }{% + }% + % With this we print the marker in the text and add the item to the bibliography at the end + \IfNoValueOrEmptyTF{#2}% + {\def\@tempa{\textcite{#4}\kaobiblio@sidecite{#4}}}% + {\IfNoValueOrEmptyTF{#3}% + {\IfNoValueTF{#3}% + {\def\@tempa{\textcite[#2]{#4}\kaobiblio@sidecite{#4}}}% + {\def\@tempa{\textcite[#2][]{#4}\kaobook@sidecite{#4}}}% postnote is empty, so pass empty postnote + }% + {\def\@tempa{\textcite[#2][#3]{#4}\kaobiblio@sidecite{#4}}}% + }% + \ifkaobiblio@addspace% + \unskip~\@tempa% + \else% + \@tempa% + \fi% +} + +% Command to \parencite or \parencite* and print a citation in the margin +% First optional (star) argument: use \parencite* if included; otherwise use \parencite +% Second optional argument: vertical shift +% Third optional argument: postnote if the fourth argument isn't specified; prenote if the fourth argument is specified (same pattern as the \parencite command) +% Fourth optional argument: postnote +% Mandatory argument: citation key +\NewDocumentCommand{\sideparencite}{s o o o m}{% + \RenewDocumentCommand{\kaobiblio@marginnote}{m}{% + \marginnote[#2]{##1}% + }% + \DeclareCiteCommand{\kaobiblio@sidecite}[\kaobiblio@marginnote]{% + }{% + \formatmargincitation{\thefield{entrykey}}% + }{% + \\% separator between multiple citations + }{% + }% + % With this we print the marker in the text and add the item to the bibliography at the end + \IfBooleanTF#1% + {\IfNoValueOrEmptyTF{#3}% + {\parencite*{#5}\kaobiblio@sidecite{#5}}% + {\IfNoValueOrEmptyTF{#4}% + {\IfNoValueTF{#4}% + {\def\@tempa{\parencite*[#3]{#5}\kaobiblio@sidecite{#5}}}% + {\def\@tempa{\parencite*[#3][]{#5}\kaobiblio@sidecite{#5}}}% postnote is empty, so pass empty postnote + }% + {\def\@tempa{\parencite*[#3][#4]{#5}\kaobiblio@sidecite{#5}}}% + }% + }% + {\IfNoValueOrEmptyTF{#3}% + {\def\@tempa{\parencite{#5}\kaobiblio@sidecite{#5}}}% + {\IfNoValueOrEmptyTF{#4}% + {\IfNoValueTF{#4}% + {\def\@tempa{\parencite[#3]{#5}\kaobiblio@sidecite{#5}}}% + {\def\@tempa{\parencite[#3][]{#5}\kaobiblio@sidecite{#5}}}% postnote is empty, so pass empty postnote + }% + {\def\@tempa{\parencite[#3][#4]{#5}\kaobiblio@sidecite{#5}}}% + }% + }% + \ifkaobiblio@addspace% + \unskip~\@tempa% + \else% + \@tempa% + \fi% +} + + +%---------------------------------------------------------------------------------------- +% LINKING THE AUTHOR'S NAME +%---------------------------------------------------------------------------------------- + +% In biblatex, when citing with the style authoryear or using \textcite, only the year is linked to the reference in the bibliography. Despite the arguments of one of the mantainers of the biblatex package (https://github.com/plk/biblatex/issues/428), some users think that in the author* style the author name should be a link as well. The `linkeverything' option provides an easy way to activate this behaviour. + +\ifkaobiblio@linkeverything + \xpatchbibmacro{cite} + {\usebibmacro{cite:label}% + \setunit{\printdelim{nonameyeardelim}}% + \usebibmacro{cite:labeldate+extradate}} + {\printtext[bibhyperref]{% + \DeclareFieldAlias{bibhyperref}{default}% + \usebibmacro{cite:label}% + \setunit{\printdelim{nonameyeardelim}}% + \usebibmacro{cite:labeldate+extradate}}} + {} + {\PackageWarning{biblatex-patch} + {Failed to patch cite bibmacro}} + + % Include labelname in labelyear link + \xpatchbibmacro{cite} + {\printnames{labelname}% + \setunit{\printdelim{nameyeardelim}}% + \usebibmacro{cite:labeldate+extradate}} + {\printtext[bibhyperref]{% + \DeclareFieldAlias{bibhyperref}{default}% + \printnames{labelname}% + \setunit{\printdelim{nameyeardelim}}% + \usebibmacro{cite:labeldate+extradate}}} + {} + {\PackageWarning{biblatex-patch} + {Failed to patch cite bibmacro}} + + % Access hyperref's citation link start/end commands + \makeatletter + \protected\def\blx@imc@biblinkstart{% + \@ifnextchar[%] + {\blx@biblinkstart} + {\blx@biblinkstart[\abx@field@entrykey]}} + \def\blx@biblinkstart[#1]{% + \blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest} + \protected\def\blx@imc@biblinkend{% + \blx@sfsave\hyper@natlinkend\blx@sfrest} + \blx@regimcs{\biblinkstart \biblinkend} + \makeatother + + \newbool{cbx:link} + + % Include parentheses around labelyear in \textcite only in + % single citations without pre- and postnotes + \def\iflinkparens{% + \ifboolexpr{ test {\ifnumequal{\value{multicitetotal}}{0}} and + test {\ifnumequal{\value{citetotal}}{1}} and + test {\iffieldundef{prenote}} and + test {\iffieldundef{postnote}} }} + + \xpatchbibmacro{textcite} + {\printnames{labelname}} + {\iflinkparens + {\DeclareFieldAlias{bibhyperref}{default}% + \global\booltrue{cbx:link}\biblinkstart% + \printnames{labelname}} + {\printtext[bibhyperref]{\printnames{labelname}}}} + {} + {\PackageWarning{biblatex-patch} + {Failed to patch textcite bibmacro}} + + \xpatchbibmacro{textcite} + {\usebibmacro{cite:label}} + {\iflinkparens + {\DeclareFieldAlias{bibhyperref}{default}% + \global\booltrue{cbx:link}\biblinkstart% + \usebibmacro{cite:label}} + {\usebibmacro{cite:label}}} + {} + {\PackageWarning{biblatex-patch} + {Failed to patch textcite bibmacro}} + + \xpretobibmacro{textcite:postnote} + {\ifbool{cbx:link} + {\ifbool{cbx:parens} + {\bibcloseparen\global\boolfalse{cbx:parens}} + {}% + \biblinkend\global\boolfalse{cbx:link}} + {}} + {} + {\PackageWarning{biblatex-patch} + {Failed to patch textcite:postnote bibmacro}} +\else +\fi + +%---------------------------------------------------------------------------------------- +% CITATION ENVIRONMENTS +%---------------------------------------------------------------------------------------- + +% TODO: create a fancy environment for this. Perhaps printing also the +% abstract. + +% Cite commands (assuming biblatex is loaded) +\DeclareCiteCommand{\fullcite}{% + \defcounter{maxnames}{99}% + \usebibmacro{prenote}} + {\clearfield{url}% + \clearfield{pages}% + \clearfield{pagetotal}% + \clearfield{edition}% + \clearfield{issn}% + \clearfield{doi}% + \usedriver + {\DeclareNameAlias{sortname}{default}} + {\thefield{entrytype}} +} +{\multicitedelim} +{\usebibmacro{postnote}} diff --git a/tex/kaobook.cls b/tex/kaobook.cls new file mode 100644 index 0000000..1563434 --- /dev/null +++ b/tex/kaobook.cls @@ -0,0 +1,282 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% kaobook +% LaTeX Class +% Version 0.9.8 (2021/08/23) +% +% This template originates from: +% https://www.LaTeXTemplates.com +% +% For the latest template development version and to make contributions: +% https://github.com/fmarotta/kaobook +% +% Authors: +% Federico Marotta (federicomarotta@mail.com) +% Based on the doctoral thesis of Ken Arroyo Ohori (https://3d.bk.tudelft.nl/ken/en) +% and on the Tufte-LaTeX class. +% Modified for LaTeX Templates by Vel (vel@latextemplates.com) +% +% License: +% LPPL (see included MANIFEST.md file) +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%---------------------------------------------------------------------------------------- +% CLASS CONFIGURATION +%---------------------------------------------------------------------------------------- + +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{kaobook}[2021/08/23 v0.9.8 kaobook] +\newcommand{\@baseclass}{scrbook} % Base class name + +% Set the default options +\PassOptionsToClass{a4paper}{\@baseclass} +\PassOptionsToClass{fontsize=10pt}{\@baseclass} +\PassOptionsToClass{parskip=half}{\@baseclass} +\PassOptionsToClass{headings=optiontoheadandtoc}{\@baseclass} + +% Pass through any other options to the base class +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\@baseclass}} + +\ProcessOptions\relax % Process the options + +\LoadClass{\@baseclass} % Load the base class + +\RequirePackage{kao} % Load the code common to all classes + +%---------------------------------------------------------------------------------------- +% FRONT-, MAIN-, BACK- MATTERS BEHAVIOUR +%---------------------------------------------------------------------------------------- + +% Front matter +\let\oldfrontmatter\frontmatter % Store the old command +\renewcommand{\frontmatter}{% + \oldfrontmatter% First of all, call the old command + \pagestyle{plain.scrheadings}% Use a plain style for the header and the footer + \pagelayout{wide}% Use a wide page layout + \setchapterstyle{plain} % Choose the default chapter heading style + % \sloppy % Required to better break long lines +} + +%------------------------------------------------ + +% Main matter +\let\oldmainmatter\mainmatter % Store the old command +\renewcommand{\mainmatter}{% + \oldmainmatter% Call the old command + \pagestyle{scrheadings}% Use a fancy style for the header and the footer + \pagelayout{margin}% Use a 1.5 column layout + \setchapterstyle{kao} % Choose the default chapter heading style +} + +%------------------------------------------------ + +% Appendix +\let\oldappendix\appendix% Store the old command +\renewcommand{\appendix}{% + \oldappendix% Call the old command + \bookmarksetup{startatroot}% Reset the bookmark depth +} + +%------------------------------------------------ + +% Back matter +\let\oldbackmatter\backmatter% Store the old command +\renewcommand{\backmatter}{% + \oldbackmatter% Call the old command + \bookmarksetup{startatroot}% Reset the bookmark depth + \pagestyle{plain.scrheadings}% Use a plain style for the header and the footer + \pagelayout{wide}% Use a wide page layout + \setchapterstyle{plain} % Choose the default chapter heading style +} + +%---------------------------------------------------------------------------------------- +% CHAPTER HEADING STYLES +%---------------------------------------------------------------------------------------- + +% Command to easily switch between chapter styles +\DeclareDocumentCommand{\setchapterstyle}{m}{% + \ifthenelse{\equal{plain}{#1}}{\chapterstyleplain}{} + \ifthenelse{\equal{bar}{#1}}{\chapterstylebar}{} + \ifthenelse{\equal{lines}{#1}}{\chapterstylelines}{} + \ifthenelse{\equal{kao}{#1}}{\chapterstylekao}{} +} + +% The default definition in KOMA script +\DeclareDocumentCommand{\chapterstyleplain}{}{% + \renewcommand{\chapterlinesformat}[3]{% + \@hangfrom{##2}{##3}} + \renewcommand*{\chapterformat}{% + \mbox{\chapappifchapterprefix{\nobreakspace}\thechapter% + \autodot\IfUsePrefixLine{}{\enskip}}} + \RedeclareSectionCommand[beforeskip=0cm,afterskip=10\vscale]{chapter} + \setlength{\mtocshift}{-1\vscale} +} + +% Gray bar +\DeclareDocumentCommand{\chapterstylebar}{}{% + \renewcommand*{\chapterformat}{% + \mbox{\chapappifchapterprefix{\nobreakspace}\thechapter% + \autodot\IfUsePrefixLine{}{\enskip}}% + } + \renewcommand{\chapterlinesformat}[3]{% + \begin{tikzpicture}[remember picture, overlay] + \node[ + anchor=south west, + xshift=\dimexpr - \hoffset - \oddsidemargin - 1in -1mm,%-30\hscale, + yshift=4.3mm, + rectangle, + fill=gray!20!white, + fill opacity=0.8, + inner ysep=5\vscale, + inner xsep=\dimexpr \hoffset + \oddsidemargin + 1in,%30\hscale, + text opacity=1, + text width=\paperwidth-40\hscale, + ]{\@hangfrom{##2}{##3}}; + \end{tikzpicture} + } + \RedeclareSectionCommand[beforeskip=-55\vscale,afterskip=6\vscale]{chapter} + \setlength{\mtocshift}{-1\vscale} +} + +% Lines +\renewcommand{\hrulefill}[1][0.4pt]{% + \leavevmode\leaders\hrule height #1\hfill\kern\z@% +} +\DeclareDocumentCommand{\chapterstylelines}{}{% + \renewcommand*{\chapterformat}{% + \chapappifchapterprefix{\nobreakspace}\scalebox{3.5}{\thechapter\autodot}% + }% + \renewcommand\chapterlinesformat[3]{% + %\vspace*{-1cm}% + \leavevmode% + \makebox[0pt][l]{% + \makebox[\textwidth][l]{\hrulefill[1pt]##2}%\hfill%\par%\bigskip + \makebox[\marginparsep][l]{}% + \makebox[\marginparwidth][l]{}% + }\\ + %\vspace{.5cm} + \makebox[0pt][l]{% + \makebox[\textwidth][l]{##3}% + \makebox[\marginparsep][l]{}% + \makebox[\marginparwidth][l]{}% + }\\ + \makebox[0pt][l]{% + \makebox[\textwidth+\marginparsep+\marginparwidth][l]{\hrulefill[1.1pt]}% + }% + }% + \RedeclareSectionCommand[beforeskip=0cm,afterskip=10\vscale]{chapter} + \setlength{\mtocshift}{-1\vscale}% +} + +% The Kao style +\DeclareDocumentCommand{\chapterstylekao}{}{% + \IfWideLayout{% + \renewcommand*{\chapterformat}{% + \mbox{\chapappifchapterprefix{\nobreakspace}\scalebox{2.85}{\thechapter\autodot}}% + }% + \renewcommand\chapterlinesformat[3]{% + \vspace{3.5\vscale}% + \if@twoside% + \Ifthispageodd{% + \smash{\makebox[0pt][l]{% + \parbox[b]{\textwidth - 6.2\hscale}{\flushright{##3}}% + \makebox[6.2\hscale][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\marginparwidth}{##2}% + }}% + }{ + \smash{\makebox[\textwidth + 6.2\hscale][r]{% + \parbox[b]{47.7\hscale + 6.2\hscale}{\flushright{##2}}% + \makebox[6.2\hscale][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\textwidth}{\flushleft{##3}}% + }}% + } + \else% + \smash{\makebox[0pt][l]{% + \parbox[b]{\textwidth - 6.2\hscale}{\flushright{##3}}% + \makebox[6.2\hscale][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\marginparwidth}{##2}% + }}% + \fi% + }% + }{% + \renewcommand*{\chapterformat}{% + \mbox{\chapappifchapterprefix{\nobreakspace}\scalebox{2.85}{\thechapter\autodot}}% + }% + \renewcommand\chapterlinesformat[3]{% + \vspace{3.5\vscale}% + \if@twoside% + \Ifthispageodd{% + \smash{\makebox[0pt][l]{% + \parbox[b]{\textwidth}{\flushright{##3}}% + \makebox[\marginparsep][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\marginparwidth}{##2}% + }}% + }{ + \smash{\makebox[\textwidth][r]{% + \parbox[b]{\marginparwidth}{\flushright{##2}}% + \makebox[\marginparsep][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\textwidth}{\flushleft{##3}}% + }}% + } + \else% + \smash{\makebox[0pt][l]{% + \parbox[b]{\textwidth}{\flushright{##3}}% + \makebox[\marginparsep][c]{\rule[-2\vscale]{1pt}{27.4\vscale+\f@size mm}}% + \parbox[b]{\marginparwidth}{##2}% + }}% + \fi% + }% + }% + \RedeclareSectionCommand[beforeskip=0cm,afterskip=10\vscale]{chapter}% + \setlength{\mtocshift}{-3.5\vscale}% +} + +% Takes as input the image path and optionally the "beforeskip" +\DeclareDocumentCommand{\setchapterimage}{O{55\vscale} m}{% + \setchapterpreamble[o]{% + \vspace*{-27\vscale}\hspace*{\dimexpr - \hoffset - \oddsidemargin - 1in}% + \includegraphics[width=\paperwidth,height=#1+27\vscale,keepaspectratio=false]{#2}% + }% + \chapterstylebar% + % beforeskip=-(figure_height-top_margin) + \RedeclareSectionCommand[beforeskip=-#1, afterskip=6\vscale]{chapter}% + \setlength{\mtocshift}{0cm}% +} + +% By default start with the plain style +\chapterstyleplain + +%---------------------------------------------------------------------------------------- +% FONTS AND STYLES +%---------------------------------------------------------------------------------------- + +% Set KOMA fonts for book-specific elements +\addtokomafont{part}{\normalfont\scshape\bfseries} +\addtokomafont{partentry}{\normalfont\scshape\bfseries} +\addtokomafont{chapter}{\normalfont\bfseries} +\addtokomafont{chapterentry}{\normalfont\bfseries} + +% Set KOMA fonts for elements common to all classes +\addtokomafont{section}{\normalfont\bfseries} +\addtokomafont{subsection}{\normalfont\bfseries} +\addtokomafont{subsubsection}{\normalfont\bfseries} +\addtokomafont{paragraph}{\normalfont\bfseries} +\setkomafont{descriptionlabel}{\normalfont\bfseries} + +%---------------------------------------------------------------------------------------- +% TOC, LOF & LOT +%---------------------------------------------------------------------------------------- + +% Set default options regarding the table of contents +\PassOptionsToClass{toc=listof}{\@baseclass} +\PassOptionsToClass{toc=index}{\@baseclass} +\PassOptionsToClass{toc=bibliography}{\@baseclass} + +%---------------------------------------------------------------------------------------- +% NUMBERING +%---------------------------------------------------------------------------------------- + +%\setcounter{secnumdepth}{\kao@secnumdepth} % Set section numbering depth + +\counterwithin*{sidenote}{chapter} % Uncomment to reset the sidenote counter at each chapter +%\counterwithout{sidenote}{chapter} % Uncomment to have one sidenote counter for the whole document diff --git a/tex/makefile b/tex/makefile deleted file mode 100644 index d3704b4..0000000 --- a/tex/makefile +++ /dev/null @@ -1,9 +0,0 @@ -main=FormalLanguageConstrainedReachabilityLectureNotes - -all: - pdflatex $(main).tex - bibtex $(main).aux - pdflatex $(main).tex - pdflatex $(main).tex -clean: - rm -f $(main).pdf *.log *.aux *.bbl *.blg *.out *.toc *~ diff --git a/tex/old_FormalLanguageConstrainedReachabilityLectureNotes.tex b/tex/old_FormalLanguageConstrainedReachabilityLectureNotes.tex new file mode 100644 index 0000000..ec17188 --- /dev/null +++ b/tex/old_FormalLanguageConstrainedReachabilityLectureNotes.tex @@ -0,0 +1,204 @@ +%\documentclass[a4paper,12pt]{article} % standard LaTeX, 12 point type +\documentclass[12pt, a4paper, table]{book} + +\usepackage{algpseudocode} +\usepackage{algorithm} +\usepackage{algorithmicx} + +\usepackage{geometry} +\usepackage{amsfonts,latexsym} +\usepackage{amsthm, amsmath} +\usepackage{amssymb} +\usepackage[utf8]{inputenc} % Кодировка +\usepackage[english,russian]{babel} % Многоязычность +\usepackage{mathtools} +\usepackage{hyperref} +\usepackage[dvipsnames]{xcolor} +\usepackage{tikz} +\usepackage{dsfont} +\usepackage{multicol} +\usepackage[bb=boondox]{mathalfa} +\usepackage{subcaption} +\usepackage{fontawesome} + +\usetikzlibrary{fit,calc,automata,positioning} +\usetikzlibrary{shapes.geometric} +\usetikzlibrary{decorations.pathmorphing} + +\theoremstyle{definition} +\newtheorem{definition}{Определение}[section] +\newtheorem{example}{Пример}[section] +\newtheorem{theorem}{Теорема}[section] +\newtheorem{proposition}[theorem]{Proposition} +\newtheorem{lemma}[theorem]{Лемма} +\newtheorem{corollary}[theorem]{Corollary} +\newtheorem{conjecture}[theorem]{Conjecture} +\newtheorem{note}[theorem]{Утверждение} + + +% unnumbered environments: + +\theoremstyle{remark} +\newtheorem*{remark}{Remark} +%\newtheorem*{notation}{Notation} + +\setlength{\parskip}{5pt plus 2pt minus 1pt} +%\setlength{\parindent}{0pt} + +\tikzset{snake it/.style={decorate, decoration=snake}} +\tikzset{ + side by side/.style 2 args={ + line width=2pt, + #1, + postaction={ + clip,postaction={draw,#2} + } + } +} + +\algtext*{EndWhile}% Remove "end while" text +\algtext*{EndIf}% Remove "end if" text +\algtext*{EndFor}% Remove "end for" text +\algtext*{EndFunction}% Remove "end function" text + + +% \usepackage{color} +\usepackage{listings} +\usepackage{caption} +\usepackage{graphicx} +\usepackage{ucs} + +% \graphicspath{{pics/}} + +%\geometry{left=2cm} +%\geometry{right=1.5cm} +%\geometry{top=2cm} +%\geometry{bottom=2cm} + + + + +%\lstnewenvironment{algorithm}[1][] +%{ +% \lstset{ +% frame=tB, +% numbers=left, +% mathescape=true, +% numberstyle=\small, +% basicstyle=\small, +% inputencoding=utf8, +% extendedchars=\true, +% keywordstyle=\color{black}\bfseries, +% keywords={,function, procedure, return, datatype, function, in, if, else, for, foreach, while, denote, do, and, then, assert,} +% numbers=left, +% xleftmargin=.04\textwidth, +% #1 % this is to add specific settings to an usage of this environment (for instnce, the caption and referable label) +% } +%} +%{} + +\newcommand{\tab}[1][0.3cm]{\ensuremath{\hspace*{#1}}} + +\newcommand{\rvline}{\hspace*{-\arraycolsep}\vline\hspace*{-\arraycolsep}} + +\newcommand{\derives}[1][*]{\xRightarrow[]{#1}} +\newcommand{\first}[1][1]{\textsc{first}_{#1}} +\newcommand{\follow}[1][1]{\textsc{follow}_{#1}} + +\newcommand{\highlight}[2][yellow]{\mathchoice% + {\colorbox{#1}{$\displaystyle#2$}}% + {\colorbox{#1}{$\textstyle#2$}}% + {\colorbox{#1}{$\scriptstyle#2$}}% + {\colorbox{#1}{$\scriptscriptstyle#2$}}}% + +\setcounter{MaxMatrixCols}{20} + + +\tikzset{ +%->, % makes the edges directed +%>=stealth’, % makes the arrow heads bold +node distance=4cm, % specifies the minimum distance between two nodes. Change if necessary. +%every state/.style={thick, fill=gray!10}, % sets the properties for each ’state’ node +initial text=$ $, % sets the text that appears on the start arrow +} + +\tikzstyle{symbol_node} = [shape=rectangle, rounded corners, draw, align=center] + +\tikzstyle{r_state} = [shape=rectangle, draw, minimum size=0.2cm] + +\tikzstyle{num_state} = [draw=none, fill=none, anchor=south west, red] + +\tikzstyle{prod_node} = [shape=rectangle, draw, align=center] + +\tikzset{ + between/.style args={#1 and #2}{ + at = ($(#1)!0.5!(#2)$) + }, + >= stealth, + every state/.style={minimum size=1pt} +} + +%every node/.style = {shape=rectangle, rounded corners, +% draw, align=center, +% top color=white, bottom color=blue!20} + +\newcommand{\bfgray}[1]{\cellcolor{lightgray}\textbf{#1}} + +\newenvironment{scaledalign}[4] + { + \begingroup + #1 + \setlength\arraycolsep{#2} + \renewcommand{\arraystretch}{#3} + \begin{center} + \begin{equation} + \begin{aligned} + #4 + } + { + \end{aligned} + \end{equation} + \end{center} + \endgroup + } + +\title{О достижимости с ограничениями в терминах формальных языков} +\author{Семён Григорьев} +\date{\today} + +\begin{document} +\maketitle +\newpage +\tableofcontents +\newpage + + +\input{List_of_contributors} +\input{Introduction} +\input{LinearAlgebra} +\input{GraphTheoryIntro} +\input{FormalLanguageTheoryIntro} +\input{RegularLanguages} +\input{Context-Free_Languages} +\input{Multiple_Context-Free_Languages} +%\input{ConjunctiveAndBooleanLanguages} +\input{FLPQ} +\input{RPQ} +%\input{CFPQ} +\input{CYK_for_CFPQ} +\input{Matrix-based_CFPQ} +\input{TensorProduct} +\input{SPPF} +\input{GLL-based_CFPQ} +\input{GLR-based_CFPQ} +%\input{CombinatorsForCFPQ} +\input{Multiple_Context-Free_Language_Reachability} +%\input{DerivativesForCFPQ} +%\input{CFPQ_to_Datalog} +\input{Conclusion} + +\bibliographystyle{abbrv} +\bibliography{FormalLanguageConstrainedReachabilityLectureNotes} + + +\end{document} diff --git a/tex/styles/language.tex b/tex/styles/language.tex new file mode 100644 index 0000000..2017ed0 --- /dev/null +++ b/tex/styles/language.tex @@ -0,0 +1,5 @@ +\usepackage{polyglossia} % Локализация документа --- переносы и всё такое +\setmainlanguage{russian} +\setotherlanguage{english} + +\usepackage[autostyle]{csquotes} % Правильные кавычки в зависимости от языка diff --git a/tex/styles/math.tex b/tex/styles/math.tex new file mode 100644 index 0000000..8db8bad --- /dev/null +++ b/tex/styles/math.tex @@ -0,0 +1,5 @@ +\usepackage{amsthm} +\usepackage{nicematrix} + +% \setmathfont[range={\doubleplus}, Scale=MatchLowercase]{Asana Math} +\NewDocumentCommand{\derives}{O{*}}{\xRightarrow[]{#1}} diff --git a/tex/styles/theorems.tex b/tex/styles/theorems.tex new file mode 100644 index 0000000..c7eccf6 --- /dev/null +++ b/tex/styles/theorems.tex @@ -0,0 +1,68 @@ + +\usepackage{thmtools} + +%%% theorem-like envs +\theoremstyle{definition} + +\declaretheoremstyle[spaceabove=0.5\topsep, + spacebelow=0.5\topsep, + headfont=\bfseries\sffamily, + bodyfont=\normalfont, + headpunct=., + postheadspace=5pt plus 1pt minus 1pt]{myStyle} +\declaretheoremstyle[spacebelow=\topsep, + headfont=\bfseries\sffamily, + bodyfont=\normalfont, + headpunct=., + postheadspace=5pt plus 1pt minus 1pt,]{myStyleWithFrame} +\declaretheoremstyle[spacebelow=\topsep, + headfont=\itshape\sffamily, + bodyfont=\normalfont, + headpunct=., + postheadspace=5pt plus 1pt minus 1pt, + qed=\blacksquare]{myProofStyleWithFrame} + +\tcbuselibrary{breakable, skins} +\tcbset{shield externalize} +\tcbset{boxrule=0pt, + sharp corners, + borderline west={0.3mm}{0pt}{black}, + frame hidden, + enhanced, + interior hidden, + left=2mm, + top = 1mm, + bottom = 1mm, + right = 0.5mm +} + +\tcolorboxenvironment{theorem}{} +% \tcolorboxenvironment{theorem*}{} +% \tcolorboxenvironment{axiom}{} +% \tcolorboxenvironment{assertion}{} +\tcolorboxenvironment{lemma}{} +% \tcolorboxenvironment{proposition}{} +% \tcolorboxenvironment{corollary}{} +\tcolorboxenvironment{definition}{} +% \tcolorboxenvironment{proofReplace}{toprule=0mm,bottomrule=0mm,rightrule=0mm, colback=white, breakable } + +\declaretheorem[name=Теорема, numberwithin=chapter, style=myStyleWithFrame]{theorem} +% \declaretheorem[name=Теорема, numbered=no, style=myStyleWithFrame]{theorem*} +% \declaretheorem[name=Аксиома, sibling=theorem, style=myStyleWithFrame]{axiom} +% \declaretheorem[name=Преположение, sibling=theorem, style=myStyleWithFrame]{assertion} +\declaretheorem[name=Лемма, sibling=theorem, style=myStyleWithFrame]{lemma} +% \declaretheorem[name=Предложение, sibling=theorem, style=myStyleWithFrame]{proposition} +% \declaretheorem[name=Следствие, numberwithin=theorem, style=myStyleWithFrame]{corollary} + +\declaretheorem[name=Определение, numberwithin=chapter, style=myStyleWithFrame]{definition} +% \declaretheorem[name=Свойство, numberwithin=chapter, style=myStyle]{property} +% \declaretheorem[name=Свойства, numbered=no, style=myStyle]{propertylist} + +\declaretheorem[name=Пример, numberwithin=chapter, style=myStyle]{example} +\declaretheorem[name=Замечание, numbered=no, style=myStyle]{remark} + +\declaretheorem[name=Доказательство, numbered=no, style=myProofStyleWithFrame]{proofReplace} +\renewenvironment{proof}[1][\proofname]{\begin{proofReplace}}{\end{proofReplace}} +% \declaretheorem[name=Доказательство, numbered=no, style=myProofStyleWithFrame]{longProof} + +\declaretheorem[name={Набросок доказательства}, numbered=no, style=myProofStyleWithFrame]{proofSketch} diff --git a/tex/styles/tikz.tex b/tex/styles/tikz.tex new file mode 100644 index 0000000..e91a454 --- /dev/null +++ b/tex/styles/tikz.tex @@ -0,0 +1,23 @@ +\usepackage{tikz} +\usetikzlibrary{arrows.meta} +\usetikzlibrary{external} +\usetikzlibrary{positioning} +\usetikzlibrary{shapes.geometric} +\usetikzlibrary{automata} +\usetikzlibrary{decorations.pathmorphing} + +\tikzsetexternalprefix{figures/externalized/} + +% Required in RegularLanguages +\tikzset{snake it/.style={decorate, decoration=snake}} +\tikzset{ + side by side/.style 2 args={ + line width=2pt, + #1, + postaction={ + clip,postaction={draw,#2} + } + } +} + +% \usetikzlibrary{fit, calc} diff --git a/tex/styles/utils.tex b/tex/styles/utils.tex new file mode 100644 index 0000000..e633c9d --- /dev/null +++ b/tex/styles/utils.tex @@ -0,0 +1,13 @@ +\usepackage{xurl} % Разрешить переносить URL на любой букве +\usepackage[noheader]{gitver} +\usepackage{subcaption} + +\NewDocumentCommand{\email}{m}{\href{mailto:#1}{#1}} % Кликабельный email + +%% : с чуть более узки расстоянием по бокам. +%% Определено в pseudo, потому пока что закомментировано +% \NewDocumentCommand \rng { } { +% \nolinebreak +% \mathinner { : } +% \nolinebreak +% }