Регулярная аппроксимация КС-языков — различия между версиями
(→Источники) |
(→MT аппроксимация) |
||
| Строка 116: | Строка 116: | ||
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык. | В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык. | ||
==== Пример ==== | ==== Пример ==== | ||
| − | <tex> G = \left\{\begin{matrix} A \rightarrow \alpha | + | <tex> G = \left\{\begin{matrix} A \rightarrow \alpha B \alpha |
\\ B \rightarrow \beta A | \beta | \\ B \rightarrow \beta A | \beta | ||
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B | \end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B | ||
| Строка 123: | Строка 123: | ||
\\ B^* \rightarrow \alpha A^* | \varepsilon | \\ B^* \rightarrow \alpha A^* | \varepsilon | ||
\end{matrix}\right.</tex> | \end{matrix}\right.</tex> | ||
| + | <br/>Исходная грамматика <tex> G </tex> генерирует язык: <tex> \{(ab)^n a^n | n > 0\}</tex>. Результирущая грамматика <tex> G^*</tex> генирирует регулярный язык: <tex> (ab)^+ a^*</tex>. <br/><br/> | ||
| + | Ясно, что язык генерируемый апрокисимируещей граматикой содержит в себе язык генерируемый исходнодй грамматикой. <br/> | ||
| + | Также, привлекателным свойством такой аппроксимации, то, что она можеть быть применима к большим грамматикам: для каждого нетерминала грамматике <tex> G</tex>, добавляется не более одного нового нетерминала в <tex> G^*</tex> и размер результирующий грамматики максимум в 2 раза больше, чем размер исходной.<br/> | ||
== Источники == | == Источники == | ||
Версия 12:29, 21 января 2014
Содержание
Определения
| Определение: |
| Контекстно-свободная грамматика называется самоприменимой (англ. self-embeded), если , . |
| Определение: |
| Нетерминал в грамматике называется рекурсивным (англ. recursive), если . |
| Определение: |
| Нетерминалы в грамматике называются взаимно рекурсивными (англ. mutual recursive), если . |
Алгоритм преобразования грамматики в конечный автомат
| Лемма: |
Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык. |
| Доказательство: |
| В качестве конструктивного доказательства, мы приведем алгоритм построения конечного автомата по грамматике. Для желающих, приведем ссылку на формальное доказательство. |
Идея алгоритма
Пусть, множество рекурсивных терминалов из . Пусть, разбиение на дизъюнктных множеств взаимно рекурсивных терминалов, . Введем функцию :
function IsLeftType() return function IsRightType() return
function getTheTypeOfMutualRecursiveSet (): if !IsLeftType() && IsRightType() return left; if IsLeftType() && !IsRightType() return right; if (IsLeftType() && IsRightType() return self; if !IsLeftType() && !IsRightType() return cyclic;
Заметим, что , т.к в противном случае грамматика будет самоприменима.
В основе алгоритма будет рекурсивный обход грамматики. Спускаемся по грамматике до тех пор не приходим в нетерминал или символ алфавита:
- символ алфавит или — добавляем новое правило в автомат
- нерекурсивный нетерминал — запускаемся от всех правых частей правил, который терминал порождает
- рекурсивный нетерминал — в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)
Псевдокод
— множество состояний ДКА. — множество переходов ДКА. — множество допускающих состояний.
function createFA(G) // s = createState f = createState return makeFA (s,S,f) function makeFA (q0,a,q1) if a == || a // пришли в лист дерева разбора return if a == where q = createState makeFA () makeFA () return if exist where foreach b in = createState if getTheTypeOfMutualRecursiveSet() == left foreach C in where makeFA () foreach C,D in where makeFA () else // рекурсивный нетерминал rihgt или cyclic foreach C in where makeFA () foreach C,D in where makeFA () return foreach p in where p == makeFA ()
Аппроксимации самоприменимой грамматики
В данном разделе покажем методы апроксимации самоприменимой свободно-контекстной грамматики к регулярной грамматике. Для удобства будем считать, что грамматика представлена в НФХ.
RTN аппроксимация
Построим, по данной грамматике аппроксимирующий ее конечный автомат.
- Для каждого нетерминала в грамматике, создадим новый конечный автомат , добавим в него два состояния и .
- Для каждого правила грамматике , введм новые состояния в автомат этого нетерминала , а также добавим новые правила перехода в : .
- Таким образом мы построили множество конечных автоматов = для каждого нетерминала . Теперь объединим все в один автомат. Объединим все состоянии автоматов из в множество . Скопируем все переходы каждого автомата из в . Далее для каждого перехода вида , вместо него добавим два новых перехода: .
MT аппроксимация
Построим, по данной самоприменимой кс грамматике , регулярную грамматику .
- Для каждого нетерминала из , добавим нетерминалы и в .
- Для каждого правила , где . Добавим в нетерминалы и следуюшие правила: .
(Если , тогда добавим правило ).
В итоге — правоконтекстная грамматика, эквивалентная конечному автомату, который задает регулярный язык.
Пример
Исходная грамматика генерирует язык: . Результирущая грамматика генирирует регулярный язык: .
Ясно, что язык генерируемый апрокисимируещей граматикой содержит в себе язык генерируемый исходнодй грамматикой.
Также, привлекателным свойством такой аппроксимации, то, что она можеть быть применима к большим грамматикам: для каждого нетерминала грамматике , добавляется не более одного нового нетерминала в и размер результирующий грамматики максимум в 2 раза больше, чем размер исходной.