Удаление цепных правил из грамматики — различия между версиями
(→Алгоритм) |
|||
Строка 40: | Строка 40: | ||
}} | }} | ||
+ | |||
+ | === Пример === | ||
+ | Рассмотрим грамматику: | ||
+ | <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>. Для каждого такого правила создадим цепную пару.<br>Теперь множество цепных пар будет состоять из <tex>(A, A)</tex> и <tex>(B, 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>(A, B)</tex>, и получем множество <tex>\lbrace (A, A), (A, B), (A, C), (B, B), (B, C) \rbrace</tex>. | ||
+ | # Для каждой пары добавим в <tex>\Gamma'</tex> новые правила: | ||
+ | #* <tex>A\rightarrow a</tex> для <tex>(A, A)</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 b</tex> для <tex>(B, B)</tex> | ||
+ | #* <tex>B\rightarrow c</tex> и <tex>B\rightarrow DD</tex> для <tex>(B, C)</tex> | ||
+ | #* <tex>C\rightarrow c</tex> и <tex>C\rightarrow DD</tex> для <tex>(C, C)</tex> | ||
==Литература== | ==Литература== |
Версия 21:24, 30 октября 2013
Определение: |
Цепное правило — правило вида | , где и — нетерминалы.
Постановка задачи
Пусть контекстно-свободная грамматика, содержащая цепные правила. Требуется построить эквивалентную грамматику , не содержащую цепных правил.
Задача удаления цепных правил из грамматики возникает при попытке её приведения к нормальной форме Хомского.
Алгоритм
Определение: |
Цепная пара — упорядоченная пара | , в которой , используя только цепные правила.
Алгоритм удаления цепных правил из грамматики:
- Найти все цепные пары в грамматике .
- Для каждой цепной пары добавить в грамматику все правила вида , где — нецепное правило из .
- Удалить все цепные правила
Найти все цепные пары можно по индукции:
Базис.
— цепная пара для любого нетерминала, так как за ноль шагов.Индукция. Если пара
— цепная, и есть правило , то — цепная пара.Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики
, и только их.Корректность алгоритма
Теорема: |
Пусть контекстно-свободная грамматика. — грамматика, полученная в результате применения алгоритма к . Тогда — |
Доказательство: |
|
Пример
Рассмотрим грамматику:
- В этой грамматике два цепных правила
Теперь множество цепных пар будет состоять из и .
и . Для каждого такого правила создадим цепную пару. - Рассмотрим цепное правило
добавим в множество пару , у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.
. Так как существует цепная пара , второй элемент которой совпадает с левым нетерминалом из правила, - Повторим второй пункт для правила и пары . Теперь множество цепных пар будет состоять из , , и .
- Повторим второй пункт для правила и пары , и получем множество .
- Для каждой пары добавим в
- для
- для
- и для
- для
- и для
- и для
новые правила:
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)