Удаление цепных правил из грамматики — различия между версиями
(→Пример) |
|||
Строка 1: | Строка 1: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | '''Цепное правило''' — правило вида <tex>A\rightarrow B</tex>, где <tex>A</tex> и <tex>B</tex> — нетерминалы. | + | '''Цепное правило''' (''unit rule'') — правило вида <tex>A\rightarrow B</tex>, где <tex>A</tex> и <tex>B</tex> — нетерминалы. |
}} | }} | ||
Строка 11: | Строка 11: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | '''Цепная пара''' — упорядоченная пара <tex>(A,B)</tex>, в которой <tex>A\Rightarrow ^* B</tex>, используя только цепные правила. | + | '''Цепная пара''' (''unit pair'') — упорядоченная пара <tex>(A,B)</tex>, в которой <tex>A\Rightarrow ^* B</tex>, используя только цепные правила. |
}} | }} | ||
Строка 40: | Строка 40: | ||
}} | }} | ||
+ | |||
+ | === Время работы алгоритма === | ||
+ | Данный алгоритм работает за <tex>O(\left| \Gamma \right| ^ 2)</tex>. | ||
=== Пример === | === Пример === | ||
Строка 48: | Строка 51: | ||
B\rightarrow C|b\\ | B\rightarrow C|b\\ | ||
C\rightarrow DD|c | C\rightarrow DD|c | ||
− | \end{array}</tex> | + | \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>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>(A, B)</tex> и <tex>(B, C)</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), ( | + | # Повторим второй пункт для правила <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>\Gamma'</tex> новые правила: | ||
#* <tex>A\rightarrow b</tex> для <tex>(A, B)</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>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> | #* <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] | ||
==Литература== | ==Литература== |
Версия 13:18, 17 ноября 2013
Определение: |
Цепное правило (unit rule) — правило вида | , где и — нетерминалы.
Содержание
Постановка задачи
Пусть контекстно-свободная грамматика, содержащая цепные правила. Требуется построить эквивалентную грамматику , не содержащую цепных правил.
Задача удаления цепных правил из грамматики возникает при попытке её приведения к нормальной форме Хомского.
Алгоритм
Определение: |
Цепная пара (unit pair) — упорядоченная пара | , в которой , используя только цепные правила.
Алгоритм удаления цепных правил из грамматики:
- Найти все цепные пары в грамматике .
- Для каждой цепной пары добавить в грамматику все правила вида , где — нецепное правило из .
- Удалить все цепные правила
Найти все цепные пары можно по индукции:
Базис.
— цепная пара для любого нетерминала, так как за ноль шагов.Индукция. Если пара
— цепная, и есть правило , то — цепная пара.Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики
, и только их.Корректность алгоритма
Теорема: |
Пусть контекстно-свободная грамматика. — грамматика, полученная в результате применения алгоритма к . Тогда — |
Доказательство: |
|
Время работы алгоритма
Данный алгоритм работает за
.Пример
Рассмотрим грамматику:
, в которой есть два цепных правила и .- Для каждого нетерминала создадим цепную пару. Теперь множество цепных пар будет состоять из , , и .
- Рассмотрим цепное правило
добавим в множество пару , у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.
. Так как существует цепная пара , второй элемент которой совпадает с левым нетерминалом из правила, - Повторим второй пункт для правила и пары . Теперь множество цепных пар будет состоять из , , , , и .
- Повторим второй пункт для правила и пары , и получим множество .
- Для каждой пары добавим в
- для
- и для
- и для
- Оставшиеся цепные пары новых правил не добавят.
новые правила:
См. также
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)