ДМП-автоматы и неоднознчность — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Теоремы)
(Теоремы)
Строка 3: Строка 3:
 
{{Теорема
 
{{Теорема
 
|id=t01
 
|id=t01
|about=0.0
+
|about=5.14
 
|statement=Пусть <tex>G = (V, T, P, S)</tex> — КС-грамматика. Предположим, что существует дерево разбора с корнем, отмеченным <tex>A</tex>, и кроной <tex>w</tex>, где <tex>w \in T^{*}</tex>. Тогда в грамматике <tex>G</tex> существует левое порождение <tex>A \Rightarrow^{*}_{lm} w</tex>
 
|statement=Пусть <tex>G = (V, T, P, S)</tex> — КС-грамматика. Предположим, что существует дерево разбора с корнем, отмеченным <tex>A</tex>, и кроной <tex>w</tex>, где <tex>w \in T^{*}</tex>. Тогда в грамматике <tex>G</tex> существует левое порождение <tex>A \Rightarrow^{*}_{lm} w</tex>
 
|proof=
 
|proof=

Версия 00:48, 5 января 2015

Эта статья находится в разработке!

Теоремы

Теорема (5.14):
Пусть [math]G = (V, T, P, S)[/math] — КС-грамматика. Предположим, что существует дерево разбора с корнем, отмеченным [math]A[/math], и кроной [math]w[/math], где [math]w \in T^{*}[/math]. Тогда в грамматике [math]G[/math] существует левое порождение [math]A \Rightarrow^{*}_{lm} w[/math]
Доказательство:
[math]\triangleright[/math]

Используем индукцию по высоте дерева.

Базис. Базисом является высота [math]1[/math], наименьшая из возможных для дерева разбора с терминальной кроной. Дерево должно выглядеть, как на рис. 5.8, с корнем, отмеченным [math]A[/math], и сыновьями, образующими цепочку [math]w[/math]. Поскольку это дерево является деревом разбора, [math]A \rightarrow w[/math] должно быть продукцией. Таким образом, [math]A \Rightarrow_{lm} w[/math] есть одношаговое левое порождение [math]w[/math] из [math]A[/math].

Индукция. Если высота дерева равна [math]n[/math], где [math]n \gt 1[/math], то оно должно иметь вид, как на рис. 5.9. Таким образом, существует корень с отметкой [math]A[/math] и сыновьями, отмеченными слева направо [math]X_1X_2...X_k[/math]. Символы [math]X[/math] могут быть как терминалами, так и переменными.

  1. Если [math]X_i[/math] — терминал, то определим [math]w_i[/math] как цепочку, состоящую из одного [math]X_i[/math].
  2. Если [math]X_i[/math] — переменная, то она должна быть корнем некоторого поддерева с терминальной кроной, которую обозначим [math]w_i[/math]. Заметим, что в этом случае высота поддерева меньше [math]n[/math], поэтому к нему применимо предположение индукции. Следовательно, существует левое порождение [math]X_i \Rightarrow^{*}_{lm} wi[/math].

Заметим, что [math]w = w_1w_2...w_k[/math]. Построим левое порождение цепочки [math]w[/math] следующим образом. Начнем с шага [math]A \Rightarrow_{lm} X_1X_2...X_k[/math]. Затем для [math]i = 1, 2, ..., k[/math] покажем, что имеет место следующее порождение.

[math]A \Rightarrow^{*}_{lm} w_1w_2...w_iX_{i+1}X_{i+2}...X_k[/math]

Данное доказательство использует в действительности еще одну индукцию, на этот раз по [math]i[/math]. Для базиса [math]i = 0[/math] мы уже знаем, что [math]A \Rightarrow_{lm} X_1X_2...X_k[/math]. Для индукции предположим, что существует следующее порождение.

[math]A \Rightarrow^{*}_{lm} w_1w_2...w_{i–1}X_iX_{i+1}...X_k[/math]

  1. Если [math]X_i[/math] — терминал, то не делаем ничего, но в дальнейшем рассматриваем [math]X_i[/math] как терминальную цепочку [math]w_i[/math]. Таким образом, приходим к существованию следующего порождения.
    [math]A \Rightarrow^{*}_{lm} w_1w_2...w_iX_{i+1}X_{i+2}...X_k[/math]
  2. Если [math]X_i[/math] является переменной, то продолжаем порождением [math]w_i[/math] из [math]X_i[/math] в контексте уже

построенного порождения. Таким образом, если этим порождением является

[math]X_i \Rightarrow_{lm} \alpha_1 \Rightarrow_{lm} \alpha_2... \Rightarrow_{lm} w_i[/math],

то продолжаем следующими порождениями.

[math]w_1w_2...w_{i–1}X_iX_{i+1}...X_k \Rightarrow_{lm}[/math]

[math]w_1w_2...w_{i–1}\alpha_1X_{i+1}...X_k \Rightarrow_{lm}[/math]

[math]w_1w_2...w_{i–1}\alpha_2X_{i+1}...X_k \Rightarrow_{lm}[/math]

[math]...[/math]

[math]w_1w_2...w_iX_{i+1}X_{i+2}...X_k[/math]

Результатом является порождение [math]A \Rightarrow^{*}_{lm} w_1w_2...w_iX_{i+1}X_{i+2}...X_k[/math].

Когда [math]i = k[/math], результат представляет собой левое порождение [math]w[/math] из [math]A[/math].
[math]\triangleleft[/math]
Теорема (0.1):
Для каждой грамматики [math]G = (V, T, P, S)[/math] и [math]w[/math] из [math]T^{*}[/math] цепочка [math]w[/math] имеет два разных дерева разбора тогда и только тогда, когда [math]w[/math] имеет два разных левых порождения из [math]S[/math].
Доказательство:
[math]\triangleright[/math]

(Необходимость) Внимательно рассмотрим построение левого порождения по дереву разбора в доказательстве теоремы (5.14). В любом случае, если у двух деревьев разбора впервые появляется узел, в котором применяются различные продукции, левые порождения, которые строятся, также используют разные продукции и, следовательно, являются различными.

(Достаточность) Хотя мы предварительно не описали непосредственное построение дерева разбора по левому порождению, идея его проста. Начнем построение дерева с корня, отмеченного стартовым символом. Рассмотрим порождение пошагово. На каждом шаге заменяется переменная, и эта переменная будет соответствовать построенному крайнему слева узлу дерева, не имеющему сыновей, но отмеченному этой переменной. По продукции, использованной на этом шаге левого порождения, определим, какие сыновья должны быть у этого узла. Если существуют два разных порождения, то на первом шаге, где они различаются, построенные узлы получат разные списки сыновей, что гарантирует различие деревьев разбора.
[math]\triangleleft[/math]


Теорема (1):
Если [math]L=N(P)[/math] для некоторого ДМП автомата [math]P[/math], то [math]L[/math] имеет однозначную КС-грамматику
Доказательство:
[math]\triangleright[/math]

Утверждаем, что конструкция теоремы порождает однозначную КС-грамматику [math]G[/math], когда МП-автомат, к которому она применяется, детерминирован. Вначале вспомним (см. теорему 5.29), что для однозначности грамматики [math]G[/math] достаточно показать, что она имеет уникальные левые порождения.

Предположим, [math]P[/math] допускает [math]w[/math] по пустому магазину. Тогда он делает это с помощью одной-единственной последовательности переходов, поскольку он детерминирован и не может работать после опустошения магазина. Зная эту последовательность переходов, мы можем однозначно определить выбор каждой продукции в левом порождении [math]w[/math] в [math]G[/math]. Правило автомата [math]P[/math], на основании которого применяется продукция, всегда одно. Но правило, скажем, [math]\delta(q, a, X) = \{(r, Y_1Y_2...Y_k)\}[/math], может порождать много продукций грамматики [math]G[/math], с различными состояниями в позициях, отражающих состояния [math]P[/math] после удаления каждого из [math]Y_1[/math], [math]Y_2[/math], ..., [math]Y_k[/math]. Однако, поскольку [math]P[/math] детерминирован, осуществляется только одна из этих последовательностей переходов, поэтому только одна из этих продукций в действительности ведет к порождению [math]w[/math].
[math]\triangleleft[/math]
Теорема (2):
Если [math]L=L(P)[/math] для некоторого ДМП-автомата [math]P[/math], то [math]L[/math] имеет однозначную КС-грамматику
Доказательство:
[math]\triangleright[/math]

Пусть [math]\$[/math] будет “концевым маркером”, отсутствующим в цепочках языка [math]L[/math], и пусть [math]L` = L\$[/math]. Таким образом, цепочки языка [math]L`[/math] представляют собой цепочки из [math]L[/math], к которым дописан символ [math]\$[/math]. Тогда [math]L`[/math] имеет префиксное свойство, и [math]L` = N(P`)[/math] для некоторого ДМП-автомата [math]P`[/math]. По теореме 1 существует однозначная грамматика [math]G`[/math], порождающая язык [math]N(P`)[/math], т.е. [math]L`[/math].

Теперь по грамматике [math]G`[/math] построим [math]G[/math], для которой [math]L(G) = L[/math]. Для этого нужно лишь избавиться от маркера [math]\$[/math] в цепочках. Будем рассматривать [math]\$[/math] как переменную грамматики [math]G[/math] и введем продукцию [math]\$ \rightarrow \epsilon[/math]; остальные продукции [math]G[/math] и [math]G`[/math] одинаковы. Поскольку [math]L(G`) = L`[/math], получаем, что [math]L(G) = L[/math].

Утверждаем, что [math]G[/math] однозначна. Действительно, левые порождения в [math]G[/math] совпадают с левыми порождениями в [math]G`[/math], за исключением последнего шага в [math]G[/math] — изменения [math]\$[/math] на [math]\epsilon[/math]. Таким образом, если бы терминальная цепочка [math]w[/math] имела два левых порождения в [math]G[/math], то [math]w\$[/math] имела бы два порождения в [math]G`[/math]. Поскольку [math]G`[/math] однозначна, [math]G[/math] также однозначна.
[math]\triangleleft[/math]

Источники информации