Изменения

Перейти к: навигация, поиск
Нет описания правки
[[Файл:table.jpg|300px|thumb|right|Таблица разбора алгоритма для цепочки из шести символов. В клетку <tex>t_{34}</tex> должны быть помещены нетерминалы, из которых выводится фрагмент входной строки длиной четыре символа, начинающийся с <tex>a_{3}</tex>, т.е. это цепочка <tex>a_{3}a_{4}a_{5}a_{6}</tex>. Этот фрагмент тремя способами можно разбить на пары непустых соседних фрагментов: (1) <tex>a_{3}</tex> и <tex>a_{4}a_{5}a_{6}</tex>, (2): <tex>a_{3}a_{4}</tex> и <tex>a_{5}a_{6}</tex>, (3): <tex>a_{3}a_{4}a_{5}</tex> и <tex>a_{6}</tex>. Этим трем парам фрагментов соответствуют пары клеток, в которых могут стоять нетерминалы, из которых эти фрагменты выводятся: (1) <tex>t_{31}</tex> и <tex>t_{43}</tex>, (2): <tex>t_{32}</tex> и <tex>t_{52}</tex>, (3): <tex>t_{33}</tex> и <tex>t_{61}</tex>. Если в этих клетках находятся соответственно нетерминалы B и C и существует правило A&rarr;BC, то A заносится в <tex>t_{34}</tex>]]
 
= Формальная грамматика =
 
'''Формальная грамматика''' - способ описания формального языка, то есть некоторого подмножества слов данного конечного алфавита. Выделяют ''порождающие'' грамматики, состоящие из следующих компонентов:
 
* 1) Множество '''терминальных символов''' ('''терминалов''') - символов алфавита, слова над которым определяет грамматика, то есть символов, непосредственно присутствующих в словах языка.
* 2) Множество '''нетерминальных символов''' ('''нетерминалов''') - объектов, выражающих некоторые структурные части языка, не имеющие конкретного представления как слова над алфавитом (таких, как формула или часть программы).
* 3) Множество '''правил вывода''' ('''продукций''') - правил вида L &rarr; R, где:
** L - непустая последовательность терминальных и нетерминальных символов, содержищий по крайней мере один нетерминал.
** R - любая (возможно, пустая) последовательность терминальных и нетерминальных символов.
* 4) S - стартовый нетерминал.
 
'''Выводом''' называется последовательность строк из терминалов и нетерминалов, такая, что:
* Первая строка состоит из стартового нетерминала
* Каждая следующая строка получена из предыдущей путем замена некоторой подстроки по некоторому правилу
* Последняя строка состоит только из терминалов (и, следовательно, не может быть преобразована по правилу грамматики).
 
Существование в грамматике вывода для получения конкретного слова - критерий принадлежности слова языку, определяемому грамматикой.
 
=== Пример ===
 
Терминалы: a, b. Нетерминалы: S, A, B. Продукции:
* S &rarr; AB
* A &rarr; AB
* AB &rarr; ba
* A &rarr; a
* B &rarr; b
 
Слова, выводимые в данной грамматике: ab, ba, abb, bab, abbb, babb, ...
 
Слова, невыводимые в данной грамматике: a, b, baa, baba, ...
 
= Контекстно-свободная грамматика =
'''Контекстно-свободная грамматика ''' ('''КС-грамматика''', '''бесконтекстная грамматика''') — частный случай формальной грамматики, у которой левые части всех правил являются одиночными нетерминалами, то есть все её продукции имеют вид L &rarr; R, где L - нетерминал, а R - последовательность терминалов и нетерминалов.Для того=== Пример === Терминалы: (, чтобы определить контекстно-свободную грамматику, необходимо). Нетерминалы: S. Продукции:* 1) Задать конечное множество A - алфавитS &rarr; егоSSэлементы называют символами, а конечные последовательности симво-лов называют словами * S &rarr; (в данном алфавите);* 2S &rarr; (S) Разделить все символы алфавита A на две группы: терми-нальные Очевидно, что данная грамматика задает язык правильных скобочных последовательностей. Например, последовательность (("окончательные") и нетерминальные ("промежуточные"());) может быть выведена следующим образом:* 3S &rarr; (S) Выбрать один из нетерминальных символов, который будет считаться начальным&rarr; (SS) &rarr;* 4(() Указать конечное число правил грамматики(продукцийS)) вида: K &rarr; Xгде K - некоторый нетерминальный символ, а X - слово, которое может состоять как из терминальных, так и не из терминальных символов.Выводом в контекстно-свободной грамматике называется последовательность слов X[0], X[1], ... ,X[n], где X[0] состоит только из начального символа, а каждое слово X[i+1] получается из X[i] заменой какого-либо нетерминального символа на слово по одному из правил грамматики.(()(()))
==Пример=Нормальная форма Хомского =
Пусть алфавит состоит из символов a, b и S, при этом S '''Нормальная форма Хомского''' - нормальная форма КС- стартовый символграмматик, а и b - терминальные. Пусть в этой грамматике определены следующие правилакоторой все продукции имеют вид:* S A &rarr; SS;a, где ''A'' - нетерминал, а ''a'' - терминал* S A &rarr; ab;BC, где ''A'', ''B'', ''C'' - нетерминалы, причем ''B'' и ''C'' не являются начальными нетерминалами* S &rarr; aSb;Тогда в ней можно вывести слово ababab следующим образом: ε, где S &rarr; SS &rarr; Sab &rarr; SSab &rarr; abSab &rarr; abababПри этом, например- начальный нетерминал и ε - пустая строка (данная продукция необходима, слово bab невозможно вывести если в этой грамматике.языке присуствует пустая строка)
= Задача о выводе = Задача вывода в контекстноПокажем, что любую КС-свободной грамматике состоит в том, чтобы выяснить, грамматику можно ли вывести данное слово в привести к нормальной форме Хомского. Рассмотрим продукцию этой КСграмматики: <tex>A \Rightarrow A_1 A_2 A_3 ... A_n</tex>, где <tex>A_i</tex> -терминалы или нетерминалы. Добавим к грамматике, тнетерминалы <tex>B_1 .е. выяснить принадлежность этого слова определяемому грамматикой языку. Для решения этой задачи существуют несколько способовB_n</tex>, <tex>C_k</tex> для таких k, напримерчто <tex>A_k</tex> - нетерминал, нисходящий анализ методом линейного спуска. Также применяется восходящий алгоритм синтаксического анализа Кока и продукции вида* <tex>A \Rightarrow B_1</tex>* <tex>B_i \Rightarrow A_i B_{i+1}</tex> если <tex>A_i</tex> - Янгера нетерминал* <tex>B_i \Rightarrow C_i B_{i+1}</tex> и <tex>C_i \Rightarrow A_i</tex>, если <tex>A_i</tex> - Касами.терминал
= Алгоритм Кока-Янгера-Касами =
'''Алгоритм является универсальным для всех Кока-Янгера-Касами''' (''Cocke — Younger — Kasami algorithm'', '''CYK - алгоритм''') - универсальный алгоритм, позволяющий по слову узнать, выводимо ли оно в заданной КС-грамматик, которые должны быть приведены грамматике в нормальную форму нормальной форме Хомского без &epsilon;-правил. Правила такой  Пусть дана строка <tex>a_1 a_2 ... a_n</tex>. Заведем трехмерный массив d, состоящий из логических значений, и <tex>d[A][i,j] = true</tex> тогда и только тогда, когда из нетерминала <tex>A</tex> правилами грамматики имеют вид либо А&rarr;аможно вывести подстроку <tex>a_i a_{i+1} ... a_j</tex>. Тогда:* <tex>d[A][i,i] = true</tex>, если в грамматике присутствует правило <tex>A \Rightarrow a_i</tex>, иначе <tex>false</tex>* Остальные элементы массива заполняются динамически: <tex>d[A][i, либо А&rarr;j] = \bigvee\limits_{A \Rightarrow BC}\bigvee\limits_{k = i}^{j-1} d[B][i, где a - терминалk] \wedge d[C][k+1,j]</tex>. То есть, подстроку <tex>a_i...a_j</tex> можно вывести из нетерминала <tex>A</tex>, B если существует продукция <tex>A \Rightarrow BC</tex> и C нетерминалы такое <tex>k</tex>,не являющиеся начальнымичто подстрока <tex>a_i... Алгоритм использует только квадратную матрицуa_k</tex> выводима из <tex>B</tex>, та подстрока <tex>a_{k+1}.е. .a_j</tex> - из <tex>C</tex>. Значение <tex>d[S][1,n]</tex> содержит ответ на вопрос, выводима ли данная строка в данной грамматике. Очевидно, что алгоритм работает за время <tex>O(n^3)</tex> (где <tex>n</tex> - длина строки) и требует <tex>O(n^2)</tex> памяти(обе оценки с точностью до константных множителей, зависящих от конкретной грамматики). В алгоритме осуществляется для каждой ячейки перебор по всем разделениям фрагмента строки Заметим, выводимого из нетерминалов в этой ячейкечто если массив будет хранить целые числа, и по всем элементам алфавита, поэтому сложность можно оценить как а формулу динамики заменить на <tex>O(nd[A][i,j] = \sum\limits_{A \Rightarrow BC}\sum\limits_{k = i}^3 {j-1} d[B][i,k] \cdot |G|)d[C][k+1,j]</tex>, где G то <tex>d[A][i,j]</tex> - алфавитколичество способов получить подстроку <tex>a_i...a_j</tex> из нетерминала <tex>A</tex>.
Сам алгоритм состоит в построении треугольной матрицы разбора T по заданной входной строке '''Пусть <tex>a_1, a_2, P_{A \ldots, a_n</tex>'''. В каждый элемент этой матрицы <tex>t_{ikRightarrow BC}</tex> помещаются все нетерминалы, из которых можно вывести отрезок входной строки длины k, начинающийся i-ым символом: ''стоимость''вывода по правилу <tex>a_i, A \ldots, a_{i+k-1}Rightarrow BC</tex>'''.Элементы матрицы вычисляются следующим образом::: Тогда, если использовать формулу <tex>\forall</tex>i <tex>t_{i1}</tex> = { A | d[A &rarr; <tex>a_i</tex>};:: <tex>\forall</tex>][i < ,j <tex>t_{ij}</tex> ] = \min\limits_{A | A&rarr;\Rightarrow BC и <tex>1 } \leqslant k < j : B min\in t_limits_{ikk = i}, C \in t_^{j-1} ( d[B][i,k] +d[C][k+1, j-k}</tex>}.Действительно, в каждый элемент <tex>t_] + P_{i1A \Rightarrow BC}</tex> (в данном случае удобнее рассматривать первой нижнюю строку) помещаются все нетерминалы, для которых существует правило A &rarr; <tex>a_i</tex> Пусть теперь заполнены все строки до j-1-й включительно. Рассмотрим элемент <tex>t_{ij}</tex>, соответствующий фрагменту &lt;то <tex>a_1d[A][i,\ldots, a_j j]</tex>&gt; входной строки. Разобьём его всеми способами на пары соседних строк &lt;- минимальная стоимость вывода подстроки <tex>a_i</tex>&gt; и &lt;<tex>a_{i+1}...a_j</tex>&gt;; &lt;<tex>a_ia_{i+1}</tex>&gt; и &lt;<tex>a_{i+2} ...a_j</tex>&gt;, и т.д. Каждому варианту разбиения соответствует пара элементов матрицы, в которых стоят нетерминалы, из которых могут быть выведены соответствующие строки. Пусть эта пара элементов – (t',t"). В рассматриваемый элемент нетерминала <tex>t_{ij}A</tex> помещаем нетерминал А, если среди правил грамматики есть правило А&rarr;ВС, и нетерминал В входит в элемент t', а С – входит в элемент t".
Входная строка принадлежит языкуТаким образом, порождаемому грамматикой, если задача о выводе в КС-грамматике в элементе <tex>t_{1n}</tex> встретится начальный нетерминалнормальной форме Хомского является обобщением задачи динамического программирования на подотрезке.
=ЛитератураСсылки =
* [http://www.intuit.ru/department/algorithms/mathformlang/7/]
* [http://en.wikipedia.org/wiki/CYK_algorithm Википедия - CYK algorithm]
* [http://www.ctc.msiu.ru/program/t-system/diploma/node39.html Алгоритм Кока-Янгера-Касами]
54
правки

Навигация