Регулярная аппроксимация КС-языков — различия между версиями
Danek g30 (обсуждение | вклад) (→Апроксимации самоприменимой грамматики) |
Danek g30 (обсуждение | вклад) (→MT апраксимация) |
||
| Строка 112: | Строка 112: | ||
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. | #Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. | ||
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>. | #Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>. | ||
| + | (Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>). | ||
Версия 19:29, 19 января 2014
Содержание
Определения
| Определение: |
| Контекстно-свободная грамматика называется самоприменимой, если , . |
| Определение: |
| Нетерминал в грамматике называется рекурсивным, если . |
| Определение: |
| Нетерминалы в грамматике называются взаимно рекурсивными, если . |
Алгоритм преобразования грамматики в конечный автомат
| Лемма: |
Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык. |
| Доказательство: |
| В качестве конструктивного доказательства, мы приведем алгоритм построения конечного автомата по грамматике. |
Идея алгоритма
Пусть, множество рекурсивных терминалов из . Пусть, разбиение на дизъюнктных множеств взаимно рекурсивных терминалов, . Ввведем функцию :
function IsLeftType() return function IsRightType() return
function recursive (): if !IsLeftType() && IsRihtType() return left; if IsLeftType() && !IsRihtType() return right; if (IsLeftType() && IsRihtType() return self; if !IsLeftType() && !IsRihtType() 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 recursive() == left foreach C in where makeFA () foreach C,D in where makeFA () else // рекурсивный нетерминал rihgt или self foreach C in where makeFA () foreach C,D in where makeFA () return foreach p in where p == makeFA ()
Апроксимации самоприменимой грамматики
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики к регулярной грамматике. Для удобства будем считать, что грамматика представлена в НФХ.
RTN апраксимация
Построим, по данной грамматике аппроксимирующий ее конечный автомат.
- Для каждого нетерминала в грамматике, создадим новый конечный автомат , добавим два состояния в : .
- Для каждого правила грамматике , введм новые состояния в автомат этого нетерминала , а также добавим новые правила перехода в : .
- Таким образом мы построили множество конечных автоматов = для каждого нетерминала . Теперь объединим все в один автомат. Объединим все состоянии автоматов из в множество . Скопируем все переходы каждого автомата из в . Далее для каждого перехода вида , вместо него добавим два новых перехода: .
MT апраксимация
Построим, по данной самоприменимой кс грамматике , регулярную грамматику .
- Для каждого нетерминала из , добавим нетерминалы и в .
- Для каждого правила , где . Добавим в нетерминалы и следуюшие правила: .
(Если , тогда добавим правило ).