You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: tex/CYK_for_CFPQ.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -272,7 +272,7 @@ \section{Алгоритм для графов на основе CYK}
272
272
% \end{algorithmic}
273
273
% \end{algorithm}
274
274
275
-
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике.
275
+
После завершения алгоритма, если в некоторой ячейке результирующей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике.
276
276
Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики.
Copy file name to clipboardExpand all lines: tex/ConjunctiveAndBooleanLanguages.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -82,7 +82,7 @@ \chapter{Конъюнктивные и булевы грамматики}
82
82
Пусть $L = (L_1,\ldots,L_n) (L_i \subseteq\Sigma^*)$ вектор из $n$ языков над $\Sigma$, где $n \geqslant1$. Пусть $\phi_1,\ldots,\phi_m$ выражения над $\Sigma$, зависящее от переменных $X_1,\ldots,X_n$. Значение вектора выражений $P = (\phi_1,\ldots,\phi_m)$ на векторе $L$ --- это вектор языков $P(L) = (\phi_1(L),\ldots,\phi_m(L))$ над тем же алфавитом $\Sigma$.
83
83
\end{definition}
84
84
85
-
Зададим частичный порядок относительно включения $``\preccurlyeq"$ на множестве языков и расширим его на вектора языков длины $n$: $(L_1^{'},\ldots,L_n^{'})\preccurlyeq(L_1^{''},\ldots,L_n^{''})$если и только если$L_i^{'} \subseteq L_i^{''}$ для любого $1\leqslant i \leqslant n$
85
+
Зададим частичный порядок относительно включения $``\preccurlyeq''$ на множестве языков и расширим его на векторы языков длины $n$: $(L_1^{'},\ldots,L_n^{'})\preccurlyeq(L_1^{''},\ldots,L_n^{''})$тогда и только тогда, когда$L_i^{'} \subseteq L_i^{''}$ для любого $1\leqslant i \leqslant n$
$X = P(X)$ система уравнений над алфавитом $\Sigma$ и $X = \{X_1,\ldots,X_n\}$, где $P = (\phi_1,\ldots,\phi_n)$ вектор выражений над алфавитом $\Sigma$, зависящий от $X$.
Copy file name to clipboardExpand all lines: tex/DerivativesForCFPQ.tex
+6-6Lines changed: 6 additions & 6 deletions
Original file line number
Diff line number
Diff line change
@@ -85,16 +85,16 @@ \section{Задача достижимости}
85
85
\begin{enumerate}
86
86
\item При переходе по ребру дифференцируем запрос по метке на нём
87
87
\item Передаём эту производную вдоль ребра в следующую вершину
88
-
\item В этой следующей вершине производная запоминается, если ранее не встречалось регулярное выражение, которое порождается тот же язык (таким образом формируется набор регулярных выражений, порождающих языки, которые уже передовались на вершину). В противном случае -- терминируемся.
88
+
\item В этой следующей вершине производная запоминается, если ранее не встречалось регулярное выражение, которое порождает тот же язык (таким образом формируется набор регулярных выражений, порождающих языки, которые уже передавались на вершину). В противном случае -- терминируемся.
89
89
\end{enumerate}
90
90
91
-
После того, как вышеописанный алгоритм завершился для всех вершин, проходим по ним и ищем в их наборах Nullable регулярные выражения, которые и сигнализируют о том, что путь из стартовой веришны в данную вершину существует.
91
+
После того, как вышеописанный алгоритм завершился для всех вершин, проходим по ним и ищем в их наборах Nullable регулярные выражения, которые и сигнализируют о том, что путь из стартовой вершины в данную вершину существует.
92
92
93
93
Некоторые замечания:
94
94
95
95
\begin{itemize}
96
96
\item Если алгоритм запускается не на одной вершине, а сразу на нескольких, передаются вдоль рёбер не просто производные, а пары: (стартовая вершина, производная).
97
-
\item Что мы в общем случае делаем с циклами, чтобы задача считалась алгоритмически? Разбиваем граф на наибольшие по включению компоненты сильной связности с связями между ними, стягиваем компоненты. Тогда граф превращается в дек, в котором проблем с нетерминируемостью нет, а с компонентами сильной связности разбираемся отдельно. Для этого достаточно рассмотреть одну такую компоненту: если есть цикл, то по нему можно ходить, только если в запросе есть применение звезды Клини, и, как нам уже известно, производная запроса данной операции --- конечная конструкция. В итоге мы сможем, переходя по вершинами, прийти к моменту, когда внутри компоненты в наборах производных вершин новых элементов не будет прибавляться, а значит, мы можем закончить алгоритм.
97
+
\item Что мы в общем случае делаем с циклами, чтобы задача считалась алгоритмически? Разбиваем граф на наибольшие по включению компоненты сильной связности со связями между ними, стягиваем компоненты. Тогда граф превращается в дек, в котором проблем с терминируемостью нет, а с компонентами сильной связности разбираемся отдельно. Для этого достаточно рассмотреть одну такую компоненту: если есть цикл, то по нему можно ходить, только если в запросе есть применение звезды Клини, и, как нам уже известно, производная запроса данной операции --- конечная конструкция. В итоге мы сможем, переходя по вершинами, прийти к моменту, когда внутри компоненты в наборах производных вершин новых элементов не будет прибавляться, а значит, мы можем закончить алгоритм.
98
98
\end{itemize}
99
99
100
100
Рассмотрим решение задачи достижимости с помощью производных на конкретном примере:
Стартовая веришина --- вершина графа $\mathcal{G}$ с индексом 0. Хотим проверить существование путей из вершины 0 до других вершин графа по $R$. Заведем 4 множества, в которых будем хранить регулярные выражения, передаваемые в конкретную вершину: $M_{0}$ --- для вершины с индексом 0, $M_{1}$ --- для вершины с индексом 1 и так далее.
120
+
Стартовая вершина --- вершина графа $\mathcal{G}$ с индексом 0. Хотим проверить существование путей из вершины 0 до других вершин графа по $R$. Заведем 4 множества, в которых будем хранить регулярные выражения, передаваемые в конкретную вершину: $M_{0}$ --- для вершины с индексом 0, $M_{1}$ --- для вершины с индексом 1 и так далее.
121
121
122
122
\begin{enumerate}
123
123
\item Начинаем идти вдоль ребра с меткой $a$ из вершины 0 в 1. Дифференцируем наш запрос по данной метке: $\partial_{a}(R) = \partial_{a}(a^* \mid a^* \cdot b) = \partial_{a}(a^*) \mid\partial_{a}(a^* \cdot b) = \partial_{a}(a) \cdot a^* \mid\partial_{a}(a^*) \cdot b \mid\partial_{a}(b) = a^* \mid a^* \cdot b = R$. Запоминаем эту производную в $M_{1}$: $M_{1} = \{R\}$
124
124
\item Аналогично идём из вершины 1 в вершину 2 по $a$. В итоге в $M_{2}$ также будет находиться R.
125
125
\item В вершине 2 параллельно идём по метке $a$ в 0 и по метке $b$ в вершину с индексом 3.
126
126
\begin{enumerate}
127
127
\item В первом потоке при переходе по $a$ мы дифференцируем $R$ по a, получаем также $R$, кладем его в $M_{0}$. Пытаясь продолжить эти вычисления в данном потоке, мы обнаружим, что при переходе по $a$ из вершины 0 в вершину 1 наша производная будет снова R, но в множестве $M_{1}$$R$ уже находится, а значит, данная ветка вычислений терминируется.
128
-
\item При переходе по $b$ диффиринцируем переданную производную $R$: $\partial_{b}(R) = \partial_{b}(a^* \mid a^* \cdot b) = \partial_{b}(a^*) \mid \partial_{b}(a^* \cdot b) = \partial_{b}(a) \cdot a^* \mid \partial_{b}(a^*) \cdot b \mid \partial_{b}(b) = \partial_{b}(b) = \varepsilon$. Запоминаем производную в $M_{3}$: $M_{3} = \{\varepsilon\}$. Дифференцируем её по $b$ при переходе из 3 в 2. Кладём в $M_{2}$ $\partial_{b}(\varepsilon) = \emptyset$. Tаким oбразом, $M_{2} = \{R, \emptyset\}$. На данном этапе можно терминирироваться, т.к. для достижимости нам интересны регулярные выражения, порождающий $\varepsilon$, но дифференцируя $\emptyset$ по каким-либо меткам, мы снова получаем $\emptyset$. При "честном" вычислении, в нашем случае пустое множество будет добавлено во все множества $M_{i}$, и уже после этого вычисление завершится.
128
+
\item При переходе по $b$ дифференцируем переданную производную $R$: $\partial_{b}(R) = \partial_{b}(a^* \mid a^* \cdot b) = \partial_{b}(a^*) \mid \partial_{b}(a^* \cdot b) = \partial_{b}(a) \cdot a^* \mid \partial_{b}(a^*) \cdot b \mid \partial_{b}(b) = \partial_{b}(b) = \varepsilon$. Запоминаем производную в $M_{3}$: $M_{3} = \{\varepsilon\}$. Дифференцируем её по $b$ при переходе из 3 в 2. Кладём в $M_{2}$ $\partial_{b}(\varepsilon) = \emptyset$. Таким образом, $M_{2} = \{R, \emptyset\}$. На данном этапе можно терминироваться, т.к. для достижимости нам интересны регулярные выражения, порождающие $\varepsilon$, но дифференцируя $\emptyset$ по каким-либо меткам, мы снова получаем $\emptyset$. При "честном" вычислении, в нашем случае пустое множество будет добавлено во все множества $M_{i}$, и уже после этого вычисление завершится.
129
129
\end{enumerate}
130
-
\item Теперь у нас есть сформированные множества производных для всех вершин и мы можем говорить о достижимости до данных вершин из стартовой. Рассмотрим $M_{0}$, $M_{0} = \{R\}$. Содержит ли $R$$\varepsilon$? Посчитаем для этого нашу функцию Nullable: $N(R) = N(a^* \mid a^* \cdot b) = N(a^*) \mid N(a^* \cdot b) = true \mid N(a^* \cdot b) = true$. Из чего следует, что существует путь из вершины 0 в вершину 0. Аналогичным способом заключаем, что веришны 2 и 3 достижимы из вершины 0 (т.к. в их множества также содержится $R$). Рассмотрим $M_{3} = \{\varepsilon\}$. $N(\varepsilon) = true$, значит, вершина 3 тоже достижима из 0. Алгоритм завершён.
130
+
\item Теперь у нас есть сформированные множества производных для всех вершин и мы можем говорить о достижимости до данных вершин из стартовой. Рассмотрим $M_{0}$, $M_{0} = \{R\}$. Содержит ли $R$$\varepsilon$? Посчитаем для этого нашу функцию Nullable: $N(R) = N(a^* \mid a^* \cdot b) = N(a^*) \mid N(a^* \cdot b) = true \mid N(a^* \cdot b) = true$. Из чего следует, что существует путь из вершины 0 в вершину 0. Аналогичным способом заключаем, что вершины 2 и 3 достижимы из вершины 0 (т.к. в их множества также содержится $R$). Рассмотрим $M_{3} = \{\varepsilon\}$. $N(\varepsilon) = true$, значит, вершина 3 тоже достижима из 0. Алгоритм завершён.
131
131
\end{enumerate}
132
132
133
133
Таким образом, выполнив указанный выше алгоритм для данного примера, мы определили, что из стартовой вершины с индексом 0 достижимы все вершины графа $\mathcal{G}$.
0 commit comments