Изменения

Перейти к: навигация, поиск
Обычный вариант
}}
Отметим, что длина построенного таким образом регулярного выражения обычно заметно короче, чем если бы мы строили его по [[Теорема Клини (совпадение классов автоматных и регулярных языков) | теореме Клини]]. Кроме того, построение регулярного выражения таким образом обычно гораздо проще (выполняется за меньшее количество шагов).
== Пример ==
=== Система уравнений ===[[fileФайл:Автомат2at_least_one_zero.png|450px|right]]Найдем регулярное выражение для языка двоичных представлений чисел кратных трем, в которых есть хотя бы один ноль. Для этого составим уравнение, добавляя соответствующие переменные в правую часть при наличии перехода по символу, а так же <tex>\varepsilon</tex> для терминального состояния, как это указано в доказательстве.
<tex>
\begin{cases}
L_0 L_1 = 0L_0+1L_1+\varepsilon \\L_1 L_2 = 1L_00L_1 +0L_2 \\L_2 = 0L_1+1L_2+ \varepsilon
\end{cases}
</tex>
Выразим <tex>L_2</tex> из третьего уравнения, подставив Найдем <tex> L_1 </tex> из второго:
<tex>L_2 L_1 = (00 + 1)L_2+01L_01L_1</tex>.
Так как <tex> \varepsilon \notin (00 + 1) </tex>, то <tex>L_2 L_1 = (00+1)^*01L_0</tex>.
Подставим Выразим <tex>L_2</tex> во второе уравнение, а потом получившееся выражение подставим в первое, чтобы найти через <tex>L_0L_1 </tex>:
<tex>L_0 L_2 = 0L_0 0L_1 + 11L_0 0L_2 + 10(00+1)^*01L_0 1L_2 + \varepsilon </tex>.
Решив уравнениеОткуда <tex>L_2 = 01^* (0 + 1)^*</tex>. === Обычный вариант === Теперь найдем регулярное выражение для этого же автомата с помощью теоремы Клини (обычный вариант).Для начала построим таблицу, согласно [[Теорема_Клини_(совпадение_классов_автоматных_и_регулярных_языков) | теореме]] по шагам: {| border="1" class="wikitable" style="width: 250px; height: 250px; float: left;"!style="background:#41aef0"|Выражение!style="background:#41aef0"|Значения|-|<tex>R_{11}^{(0)}</tex>|<tex>\varepsilon + 1</tex>|-|<tex>R_{12}^{(0)}</tex>|<tex>0</tex>|-|<tex>R_{21}^{(0)}</tex>|<tex>\varnothing</tex>|-|<tex>R_{22}^{(0)}</tex>|<tex>(\varepsilon + 0 + 1)</tex>|}<div style="clear:both;"></div> Например, в выражении <tex>R_{11}^{(0)}</tex> присутствует член <tex>\varepsilon</tex>, получим потому что и начальным, и конечным является состояние <tex>1</tex>. Это выражение включает также <tex>1</tex>, поскольку существует путьиз состояния <tex>1</tex> в состояние <tex>1</tex> по входу <tex>1</tex>. Выражение <tex>R_{12}^{(0)}</tex> равно <tex>0</tex>, потому что есть дуга сметкой <tex>0</tex>, ведущая из состояния <tex>1</tex> в состояние <tex>2</tex>. Здесь нет члена <tex>\varepsilon</tex>, поскольку начальноеи конечное состояния различаются. И, наконец, <tex>R_{21}^{(0 )} = \varnothing</tex>, так как нет путей, ведущих изсостояния <tex>2</tex> в состояние <tex>1</tex>.Теперь применим индукцию для построения более сложных выражений.  Правило для вычисления выражения <tex>R_{ij}^{(1)}</tex> представляет собой пример общего правила из части теоремы Клини: <tex>R_{ij}^{(1)} = R_{ij}^{(0)} + R_{i1}^{(0)} (R_{11 }^{(0)})^* R_{1j}^{(0)}</tex> {| border="1" class="wikitable" style="width: 300px; height: 250px; float: left;"!style="background:#41aef0"|Выражение!style="background:#41aef0"|Прямая подстановка!style="background:#41aef0"|Упрощенное выражение|-|<tex>R_{11}^{(1)}</tex>|<tex>\varepsilon + 1 + (\varepsilon + 1)(\varepsilon + 101)^*(00\varepsilon +1)</tex>|<tex>1^*01</tex>|-|<tex>R_{12}^{(1)}</tex>|<tex>0 + (\varepsilon + 1)(\varepsilon + 1)^*0</tex>|<tex>1^*0</tex>|-|<tex>R_{21}^{(1)}</tex>|<tex>\varnothing + \varnothing(\varepsilon + 1)^*(\varepsilon + 1)</tex>|<tex>\varnothing</tex>|-|<tex>R_{22}^{(1)}</tex>|<tex>\varepsilon + 0 + 1 + \varnothing(\varepsilon + 1)^*0</tex>|<tex>(\varepsilon + 0 + 1)</tex> |}<div style="clear:both;"></div> И, наконец, последний шаг индукции {| border="1" class="wikitable" style="width: 300px; height: 250px; float: left;"!style="background:#41aef0"|Выражение !style="background:#41aef0"|Упрощенное выражение (после подстановки)|-|<tex>R_{11}^{(1)}</tex>|<tex>1^*</tex>|-|<tex>R_{12}^{(1)}</tex>|<tex>1^*0(0 + 1)^*</tex>|-|<tex>R_{21}^{(1)}</tex>|<tex>\varnothing</tex>|-|<tex>R_{22}^{(1)} </tex>|<tex>(0 + 1)^*</tex>|}<div style="clear:both;"></div> Окончательное регулярное выражение, порождающее искомый языкэквивалентное автомату, строится путем объединения всех тех выражений, для которых первое состояниеявляется начальным, а второе {{---}} заключительным. В нашем примере <tex>1</tex> {{---}} начальное состояние, а <tex>2</tex> {{---}} заключительное, поэтому нам нужно лишь выражение <tex>R_{12}^{(1)}</tex>, равное <tex>1^*0(0 + 1)^*</tex> Отметим, что первый вариант значительно короче. Для решения системы уравнений необходимо выполнить <tex>O(n)</tex> итераций, где <tex>n</tex> {{---}} число вершин. В каждом уравнении в худшем случае может быть <tex>|\Gamma| \cdot (n - 1)</tex> переменных в правой части {{---}} все возможные переходы по всем возможным состояниям. Теперь, для решения вторым вариантом, нам во-первых надо построить массив размера <tex>|\Gamma| \cdot n</tex> для всех переходов из всех состояний и выполнить столько же итераций, поскольку самый длинный путь в худшем случае будет проходить по всем переходам из всех вершин с возвращением в исходную, которая и будет являться терминальной, то есть в итоге сложность <tex>O((|\Gamma| \cdot n)^2)</tex>. Кроме того, в алгоритме на каждом шаге мы упрощали выражение, чтобы оно было более коротким. В общем случае длина выражения перед упрощением трудно поддается оценке, однако не стоит забывать про этот факт. В случае, если выражение не будет упрощаться, то по приведенной выше формуле итерации, оно, очевидно, с каждой итерацией будет значительно (степенная зависимость) расти.
== См. также ==
== Источники информации==
* [http://mathhelpplanet.com/static.php?p=teorema-klini Mathhelpplanet {{---}} Теорема Клини]* [https://drona.csa.iisc.ernet.in/~deepakd/atc-2011/regular-exp.pdf Deepak D’Souza {{---}} Regular Expressions ]* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. {{---}} Deepak D’Souza]М.: Издательский дом «Вильямс», 2008. {{---}} С. 112 {{---}} ISBN 978-5-8459-1347-0  
[[Категория: Теория формальных языков]]
[[Категория: Автоматы и регулярные языки]]
317
правок

Навигация