Регулярная аппроксимация КС-языков — различия между версиями
Ateuhh (обсуждение | вклад) м (→Идея алгоритма) |
Ateuhh (обсуждение | вклад) (→Псевдокод) |
||
Строка 59: | Строка 59: | ||
f = createState | f = createState | ||
<tex>F \leftarrow \{f\} </tex> | <tex>F \leftarrow \{f\} </tex> | ||
− | '''return''' makeFA (s,S,f) | + | '''return''' makeFA(s,S,f) |
− | '''function''' makeFA (q0,a,q1): | + | '''function''' makeFA(q0,a,q1): |
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font> | '''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font> | ||
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex> | <tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex> | ||
Строка 67: | Строка 67: | ||
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> | '''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> | ||
q = createState | q = createState | ||
− | makeFA (<tex>q_0,X,q_1</tex>) | + | makeFA(<tex>q_0,X,q_1</tex>) |
− | makeFA (<tex>q, \beta, q_1 </tex>) | + | makeFA(<tex>q, \beta, q_1 </tex>) |
'''return''' | '''return''' | ||
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> | '''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> | ||
Строка 75: | Строка 75: | ||
'''if getTheTypeOfMutualRecursiveSet'''(<tex> N_i </tex>) == '''left''' | '''if getTheTypeOfMutualRecursiveSet'''(<tex> N_i </tex>) == '''left''' | ||
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | '''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | ||
− | makeFA (<tex>q_0, X_1 \ldots X_m, q_C</tex>) | + | makeFA(<tex>q_0, X_1 \ldots X_m, q_C</tex>) |
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | '''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | ||
− | makeFA (<tex>q_D, X_1 \ldots X_m, q_C</tex>) | + | makeFA(<tex>q_D, X_1 \ldots X_m, q_C</tex>) |
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex> | <tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex> | ||
'''else''' <font color=green>// рекурсивный нетерминал right или cyclic</font> | '''else''' <font color=green>// рекурсивный нетерминал right или cyclic</font> | ||
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | '''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | ||
− | makeFA (<tex>q_C, X_1 \ldots X_m, q_1</tex>) | + | makeFA(<tex>q_C, X_1 \ldots X_m, q_1</tex>) |
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | '''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1 \ldots X_m \land X_1, \ldots X_m \neq N_i </tex> | ||
− | makeFA (<tex>q_D, X_1 \ldots X_m, q_C</tex>) | + | makeFA(<tex>q_D, X_1 \ldots X_m, q_C</tex>) |
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> | <tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> | ||
'''return''' | '''return''' | ||
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex> | '''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex> | ||
− | makeFA (<tex> q_0, \beta, q_1 </tex>) | + | makeFA(<tex> q_0, \beta, q_1 </tex>) |
== Аппроксимации самоприменимой грамматики == | == Аппроксимации самоприменимой грамматики == |
Версия 12:35, 18 декабря 2016
Содержание
Определения
Определение: |
Контекстно-свободная грамматика называется самоприменимой (англ. 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 // рекурсивный нетерминал right или cyclic foreach C in where makeFA( ) foreach C,D in where makeFA( ) return foreach p in where p == makeFA( )
Аппроксимации самоприменимой грамматики
В данном разделе покажем методы апроксимации: RTN (recursive transition network) аппроксимацию и MN (Mohri and Nederhof's) аппроксимацию — самоприменимой контекстно-свободной грамматики НФХ.
к регулярной грамматике. Для удобства будем считать, что грамматика представлена вRTN аппроксимация
Построим, по данной грамматике аппроксимирующий ее конечный автомат.
- Для каждого нетерминала в грамматике, создадим новый конечный автомат , добавим в него два состояния и .
- Для каждого правила грамматике , введм новые состояния в автомат этого нетерминала , а также добавим новые правила перехода в : .
- Таким образом мы построили множество конечных автоматов = для каждого нетерминала . Теперь объединим все в один автомат. Объединим все состоянии автоматов из в множество . Скопируем все переходы каждого автомата из в . Далее для каждого перехода вида , вместо него добавим два новых перехода: .
MN аппроксимация
Построим по данной самоприменимой контекстно-свободной грамматике
регулярную грамматику .- Для каждого нетерминала из , добавим нетерминалы и в .
- Для каждого правила
(Если , тогда добавим правило ). , где . Добавим в нетерминалы и следуюшие правила: .
В итоге правоконтекстная грамматика, эквивалентная конечному автомату, который задает регулярный язык.
—Пример
Исходная грамматика генерирует язык: . Результирущая грамматика генирирует регулярный язык: .
Сравнение двух методов
Ясно, что оба языка, генерируемых конечным автомат для первого метода и апрокисимируещей граматикой для второго метода, содержат в себе язык генерируемый исходной грамматикой.
Привлекателным свойством MN аппроксимации по сравнению с RTN, то, что она можеть быть применима к большим грамматикам: для каждого нетерминала грамматике , добавляется не более одного нового нетерминала в и размер результирующий грамматики максимум в раза больше, чем размер исходной. Так как для RTN апроксимации грамматики , количество состаяний апроксимируещего автомата в худшем случаи может составлять , что может быть критично для аппроксимации больших грамматик.
Также,еще несколько эффекивных методов аппрокимации можно найти в статьях, приведенных в ссылках.
Источники информации
- Jean-Claude Junqua,Gertjan van Noord — Robustness in Language and Speech Technology — Kluwer Academic Publishers, 2001 — ISBN 0-7923-6790-1
- Strongly Regular Grammars and Regular Approximation of Contex-Free Languages
- Willem J. M. Levelt — An Introduction to the Theory of Formal Languages and Automata — John Benjamin B.V., 2008 — ISBN 978-90-272-3250-2