Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами — различия между версиями
Lis (обсуждение | вклад) |
Lis (обсуждение | вклад) |
||
Строка 5: | Строка 5: | ||
== Формальная грамматика == | == Формальная грамматика == | ||
− | '''Формальная грамматика''' - способ описания формального языка, то есть некоторого подмножества слов данного конечного алфавита. Выделяют ''порождающие'' грамматики, состоящие из следующих компонентов: | + | '''[[Формальные грамматики|Формальная грамматика]]''' - способ описания формального языка, то есть некоторого подмножества слов данного конечного алфавита. Выделяют ''порождающие'' грамматики, состоящие из следующих компонентов: |
# Множество '''терминальных символов''' ('''терминалов''') - символов алфавита, слова над которым определяет грамматика, то есть символов, непосредственно присутствующих в словах языка. | # Множество '''терминальных символов''' ('''терминалов''') - символов алфавита, слова над которым определяет грамматика, то есть символов, непосредственно присутствующих в словах языка. | ||
Строка 36: | Строка 36: | ||
== Контекстно-свободная грамматика == | == Контекстно-свободная грамматика == | ||
− | '''Контекстно-свободная грамматика''' ('''КС-грамматика''', '''бесконтекстная грамматика''') — частный случай формальной грамматики, у которой левые части всех правил являются одиночными нетерминалами, то есть все её продукции имеют вид L → R, где L - нетерминал, а R - последовательность терминалов и нетерминалов. | + | '''[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная грамматика]]''' ('''КС-грамматика''', '''бесконтекстная грамматика''') — частный случай формальной грамматики, у которой левые части всех правил являются одиночными нетерминалами, то есть все её продукции имеют вид L → R, где L - нетерминал, а R - последовательность терминалов и нетерминалов. |
=== Пример === | === Пример === | ||
Строка 50: | Строка 50: | ||
== Нормальная форма Хомского == | == Нормальная форма Хомского == | ||
− | '''Нормальная форма Хомского''' - нормальная форма КС-грамматик, в которой все продукции имеют вид: | + | '''[[Нормальная форма Хомского]]''' - нормальная форма КС-грамматик, в которой все продукции имеют вид: |
* A → a, где ''A'' - нетерминал, а ''a'' - терминал | * A → a, где ''A'' - нетерминал, а ''a'' - терминал | ||
* A → BC, где ''A'', ''B'', ''C'' - нетерминалы, причем ''B'' и ''C'' не являются начальными нетерминалами | * A → BC, где ''A'', ''B'', ''C'' - нетерминалы, причем ''B'' и ''C'' не являются начальными нетерминалами |
Версия 08:45, 16 декабря 2011
Задача о выводе в контекстно-свободной грамматике - задача о том, выводимо ли данное слово в данной контекстно-свободной грамматике. Алгоритм Кока-Янгера-Касами - алгоритм, решающий данную задачу.
Содержание
Определения
Формальная грамматика
Формальная грамматика - способ описания формального языка, то есть некоторого подмножества слов данного конечного алфавита. Выделяют порождающие грамматики, состоящие из следующих компонентов:
- Множество терминальных символов (терминалов) - символов алфавита, слова над которым определяет грамматика, то есть символов, непосредственно присутствующих в словах языка.
- Множество нетерминальных символов (нетерминалов) - объектов, выражающих некоторые структурные части языка, не имеющие конкретного представления как слова над алфавитом (таких, как формула или часть программы).
- Множество правил вывода (продукций) - правил вида L → R, где:
- L - непустая последовательность терминальных и нетерминальных символов, содержищий по крайней мере один нетерминал.
- R - любая (возможно, пустая) последовательность терминальных и нетерминальных символов.
- S - стартовый нетерминал.
Выводом называется последовательность строк из терминалов и нетерминалов, такая, что:
- Первая строка состоит из стартового нетерминала
- Каждая следующая строка получена из предыдущей путем замена некоторой подстроки по некоторому правилу
- Последняя строка состоит только из терминалов (и, следовательно, не может быть преобразована по правилу грамматики).
Существование в грамматике вывода для получения конкретного слова - критерий принадлежности слова языку, определяемому грамматикой.
Пример
Терминалы: {a, b}. Нетерминалы: {S, A, B}. Продукции:
- S → AB
- A → AB
- AB → ba
- A → a
- B → b
Слова, выводимые в данной грамматике: ab, ba, abb, bab, abbb, babb, ...
Слова, невыводимые в данной грамматике: a, b, baa, baba, ...
Контекстно-свободная грамматика
Контекстно-свободная грамматика (КС-грамматика, бесконтекстная грамматика) — частный случай формальной грамматики, у которой левые части всех правил являются одиночными нетерминалами, то есть все её продукции имеют вид L → R, где L - нетерминал, а R - последовательность терминалов и нетерминалов.
Пример
Терминалы: {(, )}. Нетерминалы: {S}. Продукции:
- S → SS
- S → ()
- S → (S)
Очевидно, что данная грамматика задает язык правильных скобочных последовательностей. Например, последовательность (()(())) может быть выведена следующим образом:
- S → (S) → (SS) → (()(S)) → (()(()))
Нормальная форма Хомского
Нормальная форма Хомского - нормальная форма КС-грамматик, в которой все продукции имеют вид:
- A → a, где A - нетерминал, а a - терминал
- A → BC, где A, B, C - нетерминалы, причем B и C не являются начальными нетерминалами
- S → ε, где S - начальный нетерминал и ε - пустая строка (данная продукция необходима, если в языке присуствует пустая строка)
Можно показать, что любую КС-грамматику можно привести к нормальной форме Хомского.
Алгоритм Кока-Янгера-Касами
Алгоритм Кока-Янгера-Касами (Cocke — Younger — Kasami algorithm, CYK - алгоритм) - универсальный алгоритм, позволяющий по слову узнать, выводимо ли оно в заданной КС-грамматике в нормальной форме Хомского.
Пусть дана строка
. Заведем трехмерный массив d, состоящий из логических значений, и тогда и только тогда, когда из нетерминала правилами грамматики можно вывести подстроку . Тогда:- , если в грамматике присутствует правило , иначе
- Остальные элементы массива заполняются динамически: . То есть, подстроку можно вывести из нетерминала , если существует продукция и такое , что подстрока выводима из , а подстрока - из .
Значение
содержит ответ на вопрос, выводима ли данная строка в данной грамматике.Очевидно, что алгоритм работает за время
(где - длина строки) и требует памяти (обе оценки с точностью до константных множителей, зависящих от конкретной грамматики).Заметим, что если массив будет хранить целые числа, а формулу динамики заменить на
, то - количество способов получить подстроку из нетерминала .Пусть
- стоимость вывода по правилу . Тогда, если использовать формулу , то - минимальная стоимость вывода подстроки из нетерминала .Таким образом, задача о выводе в КС-грамматике в нормальной форме Хомского является обобщением задачи динамического программирования на подотрезке.
Псевдокод
- входная строка. - нетерминалы. если есть продукция . если есть продукция (где - терминал). - можно ли вывести из нетерминала подстроку .
for i = 1 to m for j = 1 to n d[i][j,j] = S(i,a[j])
for l = 2 to n for i = 1 to n+1-l for j = 1 to m d[j][i,i+l-1] = false for k = i to i+j-2 d[j][i,i+l-1] = d[j][i,i+l-1] or (d[j][i,k] and d[j][k+1,i+l-1])