Удаление eps-правил из грамматики — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Доказательство корректности)
м
Строка 42: Строка 42:
 
'''Предположение'''. Пусть из <tex>A \underset{G}{\Rightarrow}^*w \ne \varepsilon</tex> менее, чем за <tex>n</tex> шагов, следует, что <tex>A \underset{G'}{\Rightarrow}^*w </tex>.<br/>
 
'''Предположение'''. Пусть из <tex>A \underset{G}{\Rightarrow}^*w \ne \varepsilon</tex> менее, чем за <tex>n</tex> шагов, следует, что <tex>A \underset{G'}{\Rightarrow}^*w </tex>.<br/>
 
'''Переход'''. Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w</tex>, где <tex>Y_i \in N \cup \Sigma </tex>. Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex>Y_i \underset{G}{\Rightarrow}^*w_i</tex>.<br/>
 
'''Переход'''. Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w</tex>, где <tex>Y_i \in N \cup \Sigma </tex>. Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex>Y_i \underset{G}{\Rightarrow}^*w_i</tex>.<br/>
Пусть <tex>Y_{i_1}, Y_{i_2}, ..., Y_{i_p}</tex> — подпоследовательность, состоящая из всех элементов, таких, что <tex>w_{i_k} \ne \varepsilon</tex>, то есть <tex>Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w</tex>. <tex>p \ge 1</tex>, поскольку <tex>w \ne \varepsilon</tex>. Таким образом, <tex>A \rightarrow Y_{i_1}, Y_{i_2}, ..., Y_{i_p}</tex> является правилом в <tex>G'</tex> по построению <tex>G'</tex>.<br/>
+
Пусть <tex>Y_{i_1}, Y_{i_2}, ..., Y_{i_p}</tex> — подпоследовательность, состоящая из всех элементов, таких, что <tex>w_{i_k} \ne \varepsilon</tex>, то есть <tex>Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w</tex>. <tex>p \ge 1</tex>, поскольку <tex>w \ne \varepsilon</tex>. Значит, <tex>A \rightarrow Y_{i_1} Y_{i_2} ... Y_{i_p}</tex> является правилом в <tex>G'</tex> по построению <tex>G'</tex>.<br/>
 
Так как каждое из порождений <tex>Y_i \underset{G}{\Rightarrow}^*w_i</tex> содержит менее <tex>n</tex> шагов, к ним можно применить предположение индукции и заключить, что, если <tex>w_i \ne \varepsilon</tex>, то <tex>Y_i \underset{G'}{\Rightarrow}^*w_i</tex>.<br/>
 
Так как каждое из порождений <tex>Y_i \underset{G}{\Rightarrow}^*w_i</tex> содержит менее <tex>n</tex> шагов, к ним можно применить предположение индукции и заключить, что, если <tex>w_i \ne \varepsilon</tex>, то <tex>Y_i \underset{G'}{\Rightarrow}^*w_i</tex>.<br/>
Таким образом, <tex>A \underset{G'}{\Rightarrow} Y_{i_1}, Y_{i_2}, ..., Y_{i_p} \underset{G'}{\Rightarrow}^* w</tex>.
+
Таким образом, <tex>A \underset{G'}{\Rightarrow} Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G'}{\Rightarrow}^* w</tex>.
  
 
Подставив <tex>S</tex> вместо <tex>A</tex> в утверждение (*), видим, что <tex>w \in L(G)</tex> для <tex>w \ne \varepsilon</tex> тогда и только тогда, когда <tex>w \in L(G')</tex>. Так как после выполнения шага 5 алгоритма в <tex>G'</tex> могло добавиться только пустое слово <tex>\varepsilon</tex>, то язык, задаваемый КС грамматикой <tex>G'</tex>, совпадает с языком, задаваемым КС грамматикой <tex>G</tex>.
 
Подставив <tex>S</tex> вместо <tex>A</tex> в утверждение (*), видим, что <tex>w \in L(G)</tex> для <tex>w \ne \varepsilon</tex> тогда и только тогда, когда <tex>w \in L(G')</tex>. Так как после выполнения шага 5 алгоритма в <tex>G'</tex> могло добавиться только пустое слово <tex>\varepsilon</tex>, то язык, задаваемый КС грамматикой <tex>G'</tex>, совпадает с языком, задаваемым КС грамматикой <tex>G</tex>.

Версия 01:17, 12 декабря 2011

Используемые определения

Определение:
Правила вида Aε называются ε-правилами.


Определение:
Нетерминал A называется ε-порождающим, если Aε.


Алгоритм удаления ε-правил из грамматики

Вход: КС грамматика G=N,Σ,P,S.
Выход: КС грамматика G=N,Σ,P,S без ε-правил (может присутствовать правило Sε, но в этом случае S не встречается в правых частях правил). L(G)=L(G).

  1. Добавить все правила из P в P.
  2. Найти все ε-порождаюшие нетерминалы.
  3. Рассмотрим правила вида (*) Aα0B1α1B2α2...Bkαk, где αi — последовательности из терминалов и нетерминалов, Bjε-порождающие нетерминалы. Добавить все возможные правила вида (*) в P, в которых либо присутствует, либо отсутствует Bj(1jk).
  4. Удалить все ε-правила из P.
  5. Если в исходной грамматике G выводилось ε, то необходимо добавить новый нетерминал S, сделать его стартовым, добавить правила SS|ε.

Доказательство корректности

Теорема:
Если грамматика G была построена с помощью описанного выше алгоритма по грамматике G, то L(G)=L(G).
Доказательство:

Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика G:L(G)=L(G){ε}.
Для этого достаточно доказать, что AGw тогда и только тогда, когда AGw и wε (*).

)<br\> Пусть AGw  и  wε.
Докажем индукцией по длине порождения в грамматике G, что AGw.
База. AGw.
В этом случае в G есть правило Aw. По построению G в G есть правило Aα, причем α — цепочка w, элементы которой, возможно, перемежаются ε-порождающими нетерминалами. Тогда в G есть порождения AGαGw.
Предположение. Пусть из AGwε менее, чем за n шагов, следует, что AGw.
Переход. Пусть в порождении n шагов, n>1. Тогда оно имеет вид AGX1X2...XkGw, где XiNΣ. Первое использованное правило должно быть построено по правилу грамматики G AY1Y2...Ym, где последовательность Y1Y2...Ym совпадает с последовательностью X1X2...Xk, символы которой, возможно, перемежаются ε-порождающими нетерминалами.
Цепочку w можно разбить на w1w2...wk, где XiGwi. Если Xi — терминал, то wi=Xi, a если нетерминал, то порождение XiGwi содержит менее n шагов. По предположению XiGwi, значит AGY1Y2...YmGX1X2...XkGw1w2...wk=w.

)
Пусть AGw  и  wε.
Докажем индукцией по длине порождения в грамматике G, что AGw.
База. AGw.
Правило Aw присутствует в G. Поскольку wε, это же правило будет и в G, поэтому AGw.
Предположение. Пусть из AGwε менее, чем за n шагов, следует, что AGw.
Переход. Пусть в порождении n шагов, n>1. Тогда оно имеет вид AGY1Y2...YmGw, где YiNΣ. Цепочку w можно разбить на w1w2...wm, где YiGwi.
Пусть Yi1,Yi2,...,Yip — подпоследовательность, состоящая из всех элементов, таких, что wikε, то есть Yi1Yi2...YipGw. p1, поскольку wε. Значит, AYi1Yi2...Yip является правилом в G по построению G.
Так как каждое из порождений YiGwi содержит менее n шагов, к ним можно применить предположение индукции и заключить, что, если wiε, то YiGwi.
Таким образом, AGYi1Yi2...YipGw.

Подставив S вместо A в утверждение (*), видим, что wL(G) для wε тогда и только тогда, когда wL(G). Так как после выполнения шага 5 алгоритма в G могло добавиться только пустое слово ε, то язык, задаваемый КС грамматикой G, совпадает с языком, задаваемым КС грамматикой G.

Алгоритм поиска ε-порождающих нетерминалов

Вход: КС грамматика G=N,Σ,P,S.
Выход: множество ε-порождающих нетерминалов.

  1. Найти все ε-правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.
  2. Перебираем правила грамматики G. Если найдено правило AC1C2...Ck, для которого верно, что каждый Ci принадлежит множеству, то добавить A в множество.
  3. Если на шаге 2 множество изменилось, то повторить шаг 2.
Теорема:
Описанный выше алгоритм находит все ε-порождающие нетерминалы грамматики G.
Доказательство:

Для доказательства корректности алгоритма достаточно показать, что, если множество ε-порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все ε-порождающие нетерминалы.

Пусть после завершения алгоритма существуют нетерминалы такие, что они являются ε-порождающими, но не были найдены алгоритмом. Выберем из этих нетерминалов нетерминал B, из которого выводится ε за наименьшее число шагов. Тогда, в грамматике есть правило BC1C2...Ck, где каждый нетерминал Ciε-порождающий. Каждый Ci входит в множество ε-порождающих нетерминалов, так как иначе вместо B необходимо было взять Ci. Следовательно, на одной из итераций алгоритма B уже добавился в множество ε-порождающих нетерминалов. Противоречие. Следовательно, алгоритм находит все ε-порождающие нетерминалы.

Литература

  • Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 273: ISBN 5-8459-0261-4 (рус.)