Изменения
Нет описания правки
{{Определение
|definition=
'''Цепное правило ''' (''unit rule'') — правило вида <tex>A\rightarrow B</tex>, где <tex>A</tex> и <tex>B</tex> — нетерминалы.
}}
==Алгоритм==
{{Определение
|definition=
'''Цепная пара ''' (''unit pair'') — упорядоченная пара <tex>(A,B)</tex>, в которой <tex>A\Rightarrow ^* B</tex>, используя только цепные правила.
}}
Алгоритм удаления цепных правил из грамматики:
Найти все цепные пары можно по индукции:
'''Индукция.''' Если пара <tex>(A,B)</tex> {{---}} цепная, и есть правило <tex>B\rightarrow C</tex>, то <tex>(A,C)</tex> {{---}} цепная пара.
Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики <tex>G\Gamma</tex>, и только их.
<tex>\Leftarrow </tex> <br>Покажем, что <tex>L(\Gamma''Достаточность) \subseteq L(\Gamma)</tex>.<br>Пусть <tex>w\in L(\Gamma'' Предположим)</tex>, то есть <tex>S\overset{*}{\underset{\Gamma'}{\Rightarrow _{G_1}^* } w</tex>. Так как каждое правило <tex>G_1\Gamma'</tex> эквивалентно последовательности из нуля или нескольких цепных правил <tex>G\Gamma</tex>, за которой следует нецепное правило из <tex>G\Gamma</tex>, то из <tex>\alpha{\underset{\Gamma'}{\Rightarrow _{G_1}}\beta</tex> следует <tex>\alpha\overset{*}{\underset{\Gamma}{\Rightarrow _G^*}} \beta</tex>. Таким образом, каждый шаг порождения в <tex>G_1\Gamma'</tex> может быть заменен одним или несколькими шагами в <tex>G\Gamma</tex>. Собрав эти последовательности шагов, получим, что <tex>S\overset{*}{\underset{\Gamma}{\Rightarrow _G^* }} w</tex>, то есть <tex>w\in L(\Gamma)</tex>.
}}
=== Время работы алгоритма ===
Данный алгоритм работает за <tex>O(\left| \Gamma \right| ^ 2)</tex>.
=== Пример ===
Рассмотрим грамматику:
<tex>
\begin{array}{l l}
A\rightarrow B|a\\
B\rightarrow C|b\\
C\rightarrow DD|c
\end{array}</tex>, в которой есть два цепных правила <tex>A\rightarrow B</tex> и <tex>B\rightarrow C</tex>.
# Для каждого нетерминала создадим цепную пару. Теперь множество цепных пар будет состоять из <tex>(A, A)</tex>, <tex>(B, B)</tex>, <tex>(C, C)</tex> и <tex>(D, D)</tex>.
# Рассмотрим цепное правило <tex>A\rightarrow B</tex>. Так как существует цепная пара <tex>(A, A)</tex>, второй элемент которой совпадает с левым нетерминалом из правила,<br>добавим в множество пару <tex>(A, B)</tex>, у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.
# Повторим второй пункт для правила <tex>B\rightarrow C</tex> и пары <tex>(B, B)</tex>. Теперь множество цепных пар будет состоять из <tex>(A, A)</tex>, <tex>(B, B)</tex>, <tex>(C, C)</tex>, <tex>(D, D)</tex>, <tex>(A, B)</tex> и <tex>(B, C)</tex>.
# Повторим второй пункт для правила <tex>B\rightarrow C</tex> и пары <tex>(A, B)</tex>, и получим множество <tex>\lbrace (A, A), (B, B), (C, C), (D, D), (A, B), (B, C), (A, C)\rbrace</tex>.
# Для каждой пары добавим в <tex>\Gamma'</tex> новые правила:
#* <tex>A\rightarrow b</tex> для <tex>(A, B)</tex>
#* <tex>A\rightarrow c</tex> и <tex>A\rightarrow DD</tex> для <tex>(A, C)</tex>
#* <tex>B\rightarrow c</tex> и <tex>B\rightarrow DD</tex> для <tex>(B, C)</tex>
#* Оставшиеся цепные пары новых правил не добавят.
== См. также ==
* [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|Контекстно-свободные грамматики]]
* [[Нормальная_форма_Хомского|Нормальная форма Хомского]]
* [http://en.wikipedia.org/wiki/Chomsky_normal_form Chomsky normal form]
==Литература==
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)
[[Категория: Теория формальных языков]]
[[Категория: Контекстно-свободные грамматики]]