Удаление цепных правил из грамматики — различия между версиями
Bloof (обсуждение | вклад) |
Bloof (обсуждение | вклад) (→Корректность алгоритма) |
||
Строка 28: | Строка 28: | ||
==Корректность алгоритма== | ==Корректность алгоритма== | ||
{{Теорема | {{Теорема | ||
− | |statement=Для любой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматики]] | + | |statement=Для любой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматики]] существует эквивалентная ей [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматика]] без цепных правил. |
|proof= | |proof= | ||
Версия 04:26, 7 ноября 2011
Определение: |
Цепное правило — правило вида | , где и — нетерминалы.
Наличие цепных правил в грамматике может усложнять доказательства теорем и давать излишние шаги в выводах слов. Научимся удалять цепные правила из грамматики.
Алгоритм
Определение: |
Цепная пара — упорядоченная пара | , в которой , используя только цепные правила.
Алгоритм удаления цепных правил из грамматики:
1) Найти все цепные пары
.2) Для каждой цепной пары
добавить к правилам все правила вида , где — нецепное правило из .Найти все цепные пары можно по индукции:
Базис.
— цепная пара для любого нетерминала, так как за ноль шагов.Индукция. Если пара
— цепная, и есть правило , то — цепная пара.Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики
, и только их.Корректность алгоритма
Теорема: |
Для любой КС-грамматики существует эквивалентная ей КС-грамматика без цепных правил. |
Доказательство: |
Докажем, что, если грамматика построена по грамматике с помощью описанного выше алгоритма, то , то есть тогда и только тогда, когда .Достаточность. Предположим, Необходимость. Предположим, что . Так как каждое правило эквивалентно последовательности из нуля или нескольких цепных правил , за которой следует нецепное правило из , то из следует . Таким образом, каждый шаг порождения в может быть заменен одним или несколькими шагами в . Собрав эти последовательности шагов, получим, что . . Тогда имеет левое порождение . Где бы в левом порождении ни использовалось цепное правило, нетерминал в правой части становится крайним слева в выводимой цепочке и сразу же заменяется. Таким образом, левое порождение в можно разбить на последовательность "шагов", в которых ноль или несколько цепных правил сопровождаются нецепным. Заметим, что любое нецепное правило, перед которым нет цепных, образует такой "шаг". Но по построению каждый из этих шагов может быть выполнен одним ее правилом. Таким образом, . |
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)