Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ — различия между версиями
Kabanov (обсуждение | вклад) (→Пример работы) |
Kabanov (обсуждение | вклад) |
||
| Строка 14: | Строка 14: | ||
* <tex>P</tex> {{---}} набор правил вывода (англ. ''production rules'' или ''productions'') вида <tex>A \rightarrow B_1 B_2 ... B_n</tex>, где <tex>A \in N</tex>, <tex>B_i \in \Sigma \cup N</tex>, то есть у которых левые части {{---}} одиночные нетерминалы, а правые - последовательности терминалов и нетерминалов. | * <tex>P</tex> {{---}} набор правил вывода (англ. ''production rules'' или ''productions'') вида <tex>A \rightarrow B_1 B_2 ... B_n</tex>, где <tex>A \in N</tex>, <tex>B_i \in \Sigma \cup N</tex>, то есть у которых левые части {{---}} одиночные нетерминалы, а правые - последовательности терминалов и нетерминалов. | ||
}} | }} | ||
| − | |||
=== Пример === | === Пример === | ||
| Строка 35: | Строка 34: | ||
== Нормальная форма Хомского == | == Нормальная форма Хомского == | ||
| − | '''[[Нормальная форма Хомского]]''' - нормальная форма КС-грамматик, в которой все продукции имеют вид: | + | '''[[Нормальная форма Хомского]]''' {{---}} нормальная форма КС-грамматик, в которой все продукции имеют вид: |
| − | * A | + | * <tex>A \rightarrow a</tex>, где <tex>A</tex> {{---}} нетерминал, а <tex>a</tex> {{---}} терминал |
| − | * A | + | * <tex>A \rightarrow BC</tex>, где <tex>A</tex>, <tex>B</tex>, <tex>C</tex> {{---}} нетерминалы, причем <tex>B</tex> и <tex>C</tex> не являются начальными нетерминалами |
| − | * S | + | * <tex>S \rightarrow \varepsilon</tex>, где <tex>S</tex> {{---}} начальный нетерминал и <tex>\varepsilon</tex> {{---}} пустая строка (данная продукция необходима, если в языке присуствует пустая строка) |
| − | [[Нормальная форма Хомского|Можно показать]], что любую КС-грамматику можно привести к нормальной форме Хомского | + | [[Нормальная форма Хомского|Можно показать]], что любую КС-грамматику можно привести к нормальной форме Хомского. |
== Алгоритм == | == Алгоритм == | ||
| − | '''Алгоритм Кока-Янгера-Касами''' (англ. ''Cocke-Younger-Kasami algorithm'', англ. ''CYK-алгоритм'') {{---}} | + | '''Алгоритм Кока-Янгера-Касами''' (англ. ''Cocke-Younger-Kasami algorithm'', англ. ''CYK-алгоритм'') {{---}} алгоритм, позволяющий по слову узнать, выводимо ли оно в заданной КС-грамматике в нормальной форме Хомского. Так как любую КС-грамматику можно привести к НФХ, то алгоритм является универсальным для любой КС-грамматики. |
| + | |||
Будем решать задачу [[Динамическое_программирование|динамическим программированием]]. Дана строка <tex>w</tex> размером <tex>n</tex>. Заведем для неё трехмерный массив <tex>d</tex> размером <tex>|N| \times n \times n</tex>, состоящий из логических значений, и <tex>d[A][i][j] = true</tex> тогда и только тогда, когда из нетерминала <tex>A</tex> правилами грамматики можно вывести подстроку <tex>w[i \dots j]</tex>. | Будем решать задачу [[Динамическое_программирование|динамическим программированием]]. Дана строка <tex>w</tex> размером <tex>n</tex>. Заведем для неё трехмерный массив <tex>d</tex> размером <tex>|N| \times n \times n</tex>, состоящий из логических значений, и <tex>d[A][i][j] = true</tex> тогда и только тогда, когда из нетерминала <tex>A</tex> правилами грамматики можно вывести подстроку <tex>w[i \dots j]</tex>. | ||
| Строка 76: | Строка 76: | ||
<tex>\begin{array}{l l} | <tex>\begin{array}{l l} | ||
| − | A \rightarrow \varepsilon | BB | CD\\ | + | A \rightarrow \varepsilon\ |\ BB\ |\ CD\\ |
| − | B \rightarrow BB | CD\\ | + | B \rightarrow BB\ |\ CD\\ |
C \rightarrow (\\ | C \rightarrow (\\ | ||
| − | D \rightarrow BE | )\\ | + | D \rightarrow BE\ |\ )\\ |
E \rightarrow )\\ | E \rightarrow )\\ | ||
\end{array}</tex> | \end{array}</tex> | ||
Версия 21:04, 5 ноября 2014
| Задача: |
| Пусть дана контекстно-свободная грамматика в нормальной форме Хомского и слово . Требуется выяснить, выводится ли это слово в данной грамматике. |
Содержание
Контекстно-свободная грамматика
| Определение: |
| Контекстно-свободная грамматика (КС-грамматика, бесконтекстная грамматика) — способ описания формального языка, представляющий собой четверку
, где:
|
Пример
Терминалы .
Нетерминалы .
Правила вывода :
Данная грамматика задает язык правильных скобочных последовательностей. Например, последовательность может быть выведена следующим образом:
Нормальная форма Хомского
Нормальная форма Хомского — нормальная форма КС-грамматик, в которой все продукции имеют вид:
- , где — нетерминал, а — терминал
- , где , , — нетерминалы, причем и не являются начальными нетерминалами
- , где — начальный нетерминал и — пустая строка (данная продукция необходима, если в языке присуствует пустая строка)
Можно показать, что любую КС-грамматику можно привести к нормальной форме Хомского.
Алгоритм
Алгоритм Кока-Янгера-Касами (англ. Cocke-Younger-Kasami algorithm, англ. CYK-алгоритм) — алгоритм, позволяющий по слову узнать, выводимо ли оно в заданной КС-грамматике в нормальной форме Хомского. Так как любую КС-грамматику можно привести к НФХ, то алгоритм является универсальным для любой КС-грамматики.
Будем решать задачу динамическим программированием. Дана строка размером . Заведем для неё трехмерный массив размером , состоящий из логических значений, и тогда и только тогда, когда из нетерминала правилами грамматики можно вывести подстроку .
Рассмотрим все пары , где — константа и .
- . Инициализируем массив для всех нетерминалов, из которых выводится какой-либо символ строки . В таком случае , если в грамматике присутствует правило . Иначе .
- . Значения для всех нетерминалов и пар уже вычислены, поэтому . То есть, подстроку можно вывести из нетерминала , если существует продукция вида и такое , что подстрока выводима из , а подстрока выводится из .
После окончания работы значение содержит ответ на вопрос, выводима ли данная строка в данной грамматике, где — начальный символ грамматики.
Модификации
Количество способов вывести слово
Если массив будет хранить целые числа, а формулу заменить на , то — количество способов получить подстроку из нетерминала .
Минимальная стоимость вывода слова
Пусть — стоимость вывода по правилу . Тогда, если использовать формулу , то — минимальная стоимость вывода подстроки из нетерминала .
Таким образом, задача о выводе в КС-грамматике в нормальной форме Хомского является частным случаем задачи динамического программирования на подотрезке.
Асимптотика
Обработка правил вида выполняется за .
Проход по всем подстрокам выполняется за . В обработке одной подстроки присутствует цикл по всем правилам вывода и по всем разбиениям на две подстроки, следовательно обработка работает за . В итоге получаем конечную сложность .
Следовательно, общее время работы алгоритма — . Кроме того, алгоритму требуется память на массив объемом , где — количество нетерминалов грамматики.
Пример работы
Дана грамматика правильных скобочных последовательностей в нормальной форме Хомского.
Дано слово .
Инициализация массива .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ||||||
| 3 | ||||||
| 4 | ||||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ||||||
| 3 | ||||||
| 4 | ||||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
Заполнение массива .
Итерация .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
Итерация .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
Итерация .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
Итерация .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||
Итерация .
| A | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | ● | ||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| B | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | ● | ||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| C | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ● | |||||
| 2 | ||||||
| 3 | ● | |||||
| 4 | ● | |||||
| 5 | ||||||
| 6 | ||||||
| D | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ● | |||||
| 5 | ● | |||||
| 6 | ● | |||||
| E | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | ||||||
| 2 | ● | |||||
| 3 | ||||||
| 4 | ||||||
| 5 | ● | |||||
| 6 | ● | |||||