Замкнутость регулярных языков относительно различных операций — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Правки 192.168.0.2 (обсуждение) откачены к версии MikhailOK)
Строка 1: Строка 1:
==Основные операции==
+
{{Теорема
Пусть <tex>L_1, L_2</tex> - [[Регулярные языки: два определения и их эквивалентность|регулярные языки]] над одним алфавитом <tex>\Sigma</tex>. Тогда следующие языки также являются регулярными:
+
|statement=
#<tex>L_1 \cup L_2</tex>
+
Пусть <tex>L_1, L_2</tex> {{---}} [[Регулярные языки: два определения и их эквивалентность|регулярные языки]] над одним алфавитом <tex>\Sigma</tex>. Тогда следующие языки также являются регулярными:
#<tex>L_1 L_2</tex>
+
#Языки, полученные путём применения теоретико-множественных операций:
#<tex>L_1^*</tex>
+
#*<tex>L_1 \cup L_2</tex>,
#<tex>\overline{L_1}</tex>
+
#*<tex>\overline{L_1}</tex>,
#<tex>L_1 \cap L_2</tex>
+
#*<tex>L_1 \cap L_2</tex>,
#<tex>L_1 \setminus L_2</tex>
+
#*<tex>L_1 \setminus L_2</tex>;
#<tex>\overset{\leftarrow}{L_1}</tex>
+
#<tex>L_1^*</tex>;
===Доказательство===
+
#<tex>L_1 L_2</tex>;
Свойства 1,2,3 непосредственно следуют из определения [[Регулярные языки: два определения и их эквивалентность|регулярных языков]].
+
#<tex>\overset{\leftarrow}{L_1}</tex>.
 
+
|proof=
При доказательстве дальнейших свойств воспользуемся [[Теорема Клини (совпадение классов автоматных и регулярных языков|эквивалентностью регулярных и автоматных языков]]. Пусть языки <tex>L_1</tex> и <tex>L_2</tex> распознаются автоматами <br /> <tex>A_1 = \langle \Sigma , Q_1 , s_1 , T_1 , \delta_1 : Q_1 \times \Sigma \rightarrow 2^{Q_1} \rangle </tex> и <tex>A_2 = \langle \Sigma , Q_2 , s_2 , T_2 , \delta_2 : Q_2 \times \Sigma \rightarrow 2^{Q_2} \rangle </tex> соответственно.
+
Как известно, [[Теорема Клини (совпадение классов автоматных и регулярных языков|классы регулярных и автоматных языков совпадают]]. Пусть языки <tex>L_1</tex> и <tex>L_2</tex> распознаются автоматами <tex>A_1 = \langle \Sigma , Q_1 , s_1 , T_1 , \delta_1 : Q_1 \times \Sigma \rightarrow 2^{Q_1} \rangle </tex> и <tex>A_2 = \langle \Sigma , Q_2 , s_2 , T_2 , \delta_2 : Q_2 \times \Sigma \rightarrow 2^{Q_2} \rangle </tex> соответственно.
 
+
#
<ol start="4">
+
#*<tex>L_1 \cup L_2</tex> является регулярным по определению [[Регулярные языки: два определения и их эквивалентность|регулярных языков]].
<li><p>
+
#*Рассмотрим автомат <tex>A_1' = \langle \Sigma , Q_1 , s_1 , Q_1 \setminus T_1 , \delta_1 \rangle </tex>, то есть автомат <tex>A</tex>, в котором терминальные и нетерминальные состояния инвертированы. (При таком построении следует помнить, что если в исходном автомате было опущено дьявольское состояние, его нужно явно добавить и сделать допускающим.) Очевидно, он допускает те и только те слова, которые не допускает автомат <tex>A_1</tex>, а значит, задаёт язык <tex>\overline{L_1}</tex>. Таким образом, <tex>\overline{L_1}</tex> {{---}} регулярный.
Инвертируем множество допускающих состояний: рассмотрим автомат <tex>A_1' = \langle \Sigma , Q_1 , s_1 , Q_1 \setminus T_1 , \delta_1 \rangle </tex>. Очевидно, он допускает те и только те слова, которые не допускает автомат <tex>A_1</tex>.
+
#*Заметим, что <tex>L_1 \cap L_2 = \overline{\overline{L_1} \cup \overline{L_2}}</tex>. Тогда по уже доказанному <tex>L_1 \cap L_2</tex> {{---}} регулярный.
<br/>
+
#*<tex>L_1 \cap L_2 = \overline{\overline{L_1} \cup \overline{L_2}}</tex>. Тогда <tex>L_1 \cap L_2</tex> {{---}} регулярный.
При таком построении следует помнить, что если в исходном автомате было опущено дьявольское состояние, его нужно явно добавить и сделать допускающим.</p>
+
#*<tex>L_1 \setminus L_2 = L_1 \cap \overline{L_2}</tex>. Тогда <tex>L_1 \setminus L_2</tex> {{---}} регулярный.
</li>
+
#<tex>L_1^*</tex> является регулярным по определению [[Регулярные языки: два определения и их эквивалентность|регулярных языков]].
 
+
#<tex>L_1 L_2</tex> также является регулярным по определению [[Регулярные языки: два определения и их эквивалентность|регулярных языков]].
<li><p>
+
#Рассмотрим [[Автоматы_с_eps-переходами._Eps-замыкание|НКА c <tex>\varepsilon</tex>-переходами]] <tex>A_1' = \langle \Sigma, Q_1, s' , \lbrace s_1 \rbrace, \delta_1' \rangle </tex>, где <tex>\delta_1' (v,c) = \lbrace u | \delta_1(u,c) = v \rbrace </tex>; <tex>\delta_1'(s', \varepsilon) = T_1</tex>. Если в исходном автомате путь по <tex>\alpha</tex> из <tex>s_1</tex> приводил в терминальное состояние, то в новом автомате существует путь по <tex>\alpha</tex> из этого терминального состояния в <tex>s_1</tex> (и наоборот). Следовательно, этот автомат распознает в точности развернутые слова языка <tex>L_1</tex>. Тогда язык <tex>\overset{\leftarrow}{L_1}</tex> {{---}} регулярный.
Следует из пунктов 1 и 4, т.к. <tex>L_1 \cap L_2 = \overline{\overline{L_1} \cup \overline{L_2}}</tex>. <br/>
+
}}
 
 
Автомат для пересечения языков можно построить явно, используя конструкцию ''произведения автоматов'': </p><p>
 
 
 
<tex>A = \langle \Sigma , Q , s , T , \delta : Q \times \Sigma \rightarrow 2^{Q} \rangle </tex>, где <br/>
 
 
 
<tex>Q = \lbrace \langle q_1, q_2 \rangle | q_1 \in Q_1, q_2 \in Q_2 \rbrace</tex> <br/>
 
 
 
<tex>s = \langle s_1, s_2 \rangle</tex> <br/>
 
 
 
<tex>T = \lbrace \langle t_1, t_2 \rangle | t_1 \in T_1, t_2 \in T_2 \rbrace</tex> <br/>
 
 
 
<tex>\delta (\langle q_1,q_2 \rangle, c) = \langle \delta_1 (q_1, c),\delta_2 (q_2, c) \rangle</tex> </p>
 
</li>
 
<li><p>
 
<tex>L_1 \setminus L_2 = L_1 \cap \overline{L_2}</tex>.
 
 
 
Соответствующий автомат строится как произведение автоматов для языков <tex>L_1</tex> и <tex>\overline {L_2}</tex> </p>
 
</li>
 
<li><p>
 
Развернем все переходы назад и поменяем стартовое состояние с терминальными: рассмотрим [[Автоматы_с_eps-переходами._Eps-замыкание|НКА c <tex>\varepsilon</tex>-переходами]] <tex>A_1' = \langle \Sigma , Q_1 , s' , \lbrace s_1 \rbrace, \delta_1' \rangle </tex>, где <tex>\delta_1' (v,c) = \lbrace u | \delta_1(u,c) = v \rbrace </tex>; <tex>\delta_1'(s', \varepsilon) = T_1</tex>.<br/>
 
Если в исходном автомате путь по <tex>\alpha</tex> из <tex>s_1</tex> приводил в терминальное состояние, то в новом автомате существует путь по <tex>\alpha</tex> из этого терминального состояния в <tex>s_1</tex> (и наоборот). Следовательно, этот автомат распознает в точности развернутые слова языка <tex>L_1</tex>, и из [[Автоматы_с_eps-переходами._Eps-замыкание|эквивалентности <tex>\varepsilon</tex>-НКА и ДКА]] язык <tex>\overset{\leftarrow}{L_1}</tex> - регулярный.
 
</p>
 
</li>
 
</ol>
 
  
 
==Прямой и обратный гомоморфизмы==
 
==Прямой и обратный гомоморфизмы==
 
{{Определение
 
{{Определение
|definition=Отображение <tex>\varphi : \Sigma_1^* \to \Sigma_2^*</tex>, сохраняющее операцию конкатенации <tex>(\varphi(\alpha\beta) = \varphi(\alpha) \varphi(\beta))</tex>, называется гомоморфизмом.
+
|definition=Отображение <tex>\varphi : \Sigma_1^* \to \Sigma_2^*</tex>, сохраняющее операцию конкатенации <tex>(\varphi(\alpha\beta) = \varphi(\alpha) \varphi(\beta))</tex>, называется '''гомоморфизмом'''.
 
}}
 
}}
 
Гомоморфизм однозначно задается значениями на алфавите: <tex>\varphi(\overline{c_1 c_2 \ldots c_k}) = \varphi(c_1) \varphi(c_2)\ldots \varphi(c_k)</tex>.
 
Гомоморфизм однозначно задается значениями на алфавите: <tex>\varphi(\overline{c_1 c_2 \ldots c_k}) = \varphi(c_1) \varphi(c_2)\ldots \varphi(c_k)</tex>.
 +
 
{{Определение
 
{{Определение
|definition=Образом языка <tex>L \subset \Sigma_1^*</tex> при гомоморфизме <tex>\varphi: \Sigma_1^* \rightarrow \Sigma_2^*</tex> называется язык <tex>\varphi (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace \varphi (x) | x \in L \rbrace</tex>.
+
|definition='''Образом языка''' <tex>L \subset \Sigma_1^*</tex> при гомоморфизме <tex>\varphi: \Sigma_1^* \rightarrow \Sigma_2^*</tex> называется язык <tex>\varphi (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace \varphi (x) | x \in L \rbrace</tex>.
 
}}
 
}}
 
{{Определение
 
{{Определение
|definition=Прообразом языка <tex>L \subset \Sigma_2^*</tex> при гомоморфизме <tex>\varphi: \Sigma_1^* \rightarrow \Sigma_2^*</tex> называется язык <tex>\varphi^{-1} (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace x | \varphi (x) \in L \rbrace</tex>.
+
|definition='''Прообразом языка''' <tex>L \subset \Sigma_2^*</tex> при гомоморфизме <tex>\varphi: \Sigma_1^* \rightarrow \Sigma_2^*</tex> называется язык <tex>\varphi^{-1} (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace x | \varphi (x) \in L \rbrace</tex>.
 
}}
 
}}
  
Строка 62: Строка 39:
 
|id=st1
 
|id=st1
 
|statement=
 
|statement=
<tex>L \subset \Sigma_1^*</tex> регулярный , <tex>\varphi:\Sigma_1^* \rightarrow \Sigma_2^* </tex> гомоморфизм. Тогда  <tex>\varphi(L)</tex> регулярный.
+
<tex>L \subset \Sigma_1^*</tex> {{---}} регулярный , <tex>\varphi:\Sigma_1^* \rightarrow \Sigma_2^* </tex> {{---}} гомоморфизм. Тогда  <tex>\varphi(L)</tex> {{---}} регулярный.
 
|proof=
 
|proof=
 
Рассмотрим [[Детерминированные_конечные_автоматы|ДКА]], распознающий <tex>L</tex>. Заменим в нем все переходы по символам на переходы по их образам при гомоморфизме. Полученный автомат (с переходами по строкам) распознает в точности <tex>\varphi(L)</tex> и [[Автоматы_с_eps-переходами._Eps-замыкание|имеет эквивалентный ДКА]].
 
Рассмотрим [[Детерминированные_конечные_автоматы|ДКА]], распознающий <tex>L</tex>. Заменим в нем все переходы по символам на переходы по их образам при гомоморфизме. Полученный автомат (с переходами по строкам) распознает в точности <tex>\varphi(L)</tex> и [[Автоматы_с_eps-переходами._Eps-замыкание|имеет эквивалентный ДКА]].
Строка 70: Строка 47:
 
|id=st1
 
|id=st1
 
|statement=
 
|statement=
<tex>L \subset \Sigma_2^*</tex> регулярный , <tex>\varphi:\Sigma_1^* \rightarrow \Sigma_2^* </tex> гомоморфизм. Тогда  <tex>\varphi^{-1}(L)</tex> регулярный.
+
<tex>L \subset \Sigma_2^*</tex> {{---}} регулярный , <tex>\varphi:\Sigma_1^* \rightarrow \Sigma_2^* </tex> {{---}} гомоморфизм. Тогда  <tex>\varphi^{-1}(L)</tex> {{---}} регулярный.
 
|proof=
 
|proof=
 
Рассмотрим [[Детерминированные_конечные_автоматы|ДКА]], распознающий <tex>L</tex>. Отследим для каждого состояния <tex>u</tex> и символа <tex>c</tex> строку <tex>\varphi(c)</tex>: <tex> \langle u,\varphi(c) \rangle \vdash^* \langle v,\varepsilon \rangle</tex> и положим <tex>\delta (u,c) = v</tex> в новом автомате (на том же множестве состояний). Автомат с построенной таким образом функцией переходов, очевидно, распознает слова языка <tex>\varphi^{-1}(L)</tex> и только их.
 
Рассмотрим [[Детерминированные_конечные_автоматы|ДКА]], распознающий <tex>L</tex>. Отследим для каждого состояния <tex>u</tex> и символа <tex>c</tex> строку <tex>\varphi(c)</tex>: <tex> \langle u,\varphi(c) \rangle \vdash^* \langle v,\varepsilon \rangle</tex> и положим <tex>\delta (u,c) = v</tex> в новом автомате (на том же множестве состояний). Автомат с построенной таким образом функцией переходов, очевидно, распознает слова языка <tex>\varphi^{-1}(L)</tex> и только их.
 
}}
 
}}

Версия 06:46, 26 октября 2011

Теорема:
Пусть [math]L_1, L_2[/math]регулярные языки над одним алфавитом [math]\Sigma[/math]. Тогда следующие языки также являются регулярными:
  1. Языки, полученные путём применения теоретико-множественных операций:
    • [math]L_1 \cup L_2[/math],
    • [math]\overline{L_1}[/math],
    • [math]L_1 \cap L_2[/math],
    • [math]L_1 \setminus L_2[/math];
  2. [math]L_1^*[/math];
  3. [math]L_1 L_2[/math];
  4. [math]\overset{\leftarrow}{L_1}[/math].
Доказательство:
[math]\triangleright[/math]

Как известно, классы регулярных и автоматных языков совпадают. Пусть языки [math]L_1[/math] и [math]L_2[/math] распознаются автоматами [math]A_1 = \langle \Sigma , Q_1 , s_1 , T_1 , \delta_1 : Q_1 \times \Sigma \rightarrow 2^{Q_1} \rangle [/math] и [math]A_2 = \langle \Sigma , Q_2 , s_2 , T_2 , \delta_2 : Q_2 \times \Sigma \rightarrow 2^{Q_2} \rangle [/math] соответственно.

    • [math]L_1 \cup L_2[/math] является регулярным по определению регулярных языков.
    • Рассмотрим автомат [math]A_1' = \langle \Sigma , Q_1 , s_1 , Q_1 \setminus T_1 , \delta_1 \rangle [/math], то есть автомат [math]A[/math], в котором терминальные и нетерминальные состояния инвертированы. (При таком построении следует помнить, что если в исходном автомате было опущено дьявольское состояние, его нужно явно добавить и сделать допускающим.) Очевидно, он допускает те и только те слова, которые не допускает автомат [math]A_1[/math], а значит, задаёт язык [math]\overline{L_1}[/math]. Таким образом, [math]\overline{L_1}[/math] — регулярный.
    • Заметим, что [math]L_1 \cap L_2 = \overline{\overline{L_1} \cup \overline{L_2}}[/math]. Тогда по уже доказанному [math]L_1 \cap L_2[/math] — регулярный.
    • [math]L_1 \cap L_2 = \overline{\overline{L_1} \cup \overline{L_2}}[/math]. Тогда [math]L_1 \cap L_2[/math] — регулярный.
    • [math]L_1 \setminus L_2 = L_1 \cap \overline{L_2}[/math]. Тогда [math]L_1 \setminus L_2[/math] — регулярный.
  1. [math]L_1^*[/math] является регулярным по определению регулярных языков.
  2. [math]L_1 L_2[/math] также является регулярным по определению регулярных языков.
  3. Рассмотрим НКА c [math]\varepsilon[/math]-переходами [math]A_1' = \langle \Sigma, Q_1, s' , \lbrace s_1 \rbrace, \delta_1' \rangle [/math], где [math]\delta_1' (v,c) = \lbrace u | \delta_1(u,c) = v \rbrace [/math]; [math]\delta_1'(s', \varepsilon) = T_1[/math]. Если в исходном автомате путь по [math]\alpha[/math] из [math]s_1[/math] приводил в терминальное состояние, то в новом автомате существует путь по [math]\alpha[/math] из этого терминального состояния в [math]s_1[/math] (и наоборот). Следовательно, этот автомат распознает в точности развернутые слова языка [math]L_1[/math]. Тогда язык [math]\overset{\leftarrow}{L_1}[/math] — регулярный.
[math]\triangleleft[/math]

Прямой и обратный гомоморфизмы

Определение:
Отображение [math]\varphi : \Sigma_1^* \to \Sigma_2^*[/math], сохраняющее операцию конкатенации [math](\varphi(\alpha\beta) = \varphi(\alpha) \varphi(\beta))[/math], называется гомоморфизмом.

Гомоморфизм однозначно задается значениями на алфавите: [math]\varphi(\overline{c_1 c_2 \ldots c_k}) = \varphi(c_1) \varphi(c_2)\ldots \varphi(c_k)[/math].


Определение:
Образом языка [math]L \subset \Sigma_1^*[/math] при гомоморфизме [math]\varphi: \Sigma_1^* \rightarrow \Sigma_2^*[/math] называется язык [math]\varphi (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace \varphi (x) | x \in L \rbrace[/math].


Определение:
Прообразом языка [math]L \subset \Sigma_2^*[/math] при гомоморфизме [math]\varphi: \Sigma_1^* \rightarrow \Sigma_2^*[/math] называется язык [math]\varphi^{-1} (L) \overset{\underset{\mathrm{def}}{}}{=} \lbrace x | \varphi (x) \in L \rbrace[/math].


Утверждение:
[math]L \subset \Sigma_1^*[/math] — регулярный , [math]\varphi:\Sigma_1^* \rightarrow \Sigma_2^* [/math] — гомоморфизм. Тогда [math]\varphi(L)[/math] — регулярный.
[math]\triangleright[/math]
Рассмотрим ДКА, распознающий [math]L[/math]. Заменим в нем все переходы по символам на переходы по их образам при гомоморфизме. Полученный автомат (с переходами по строкам) распознает в точности [math]\varphi(L)[/math] и имеет эквивалентный ДКА.
[math]\triangleleft[/math]
Утверждение:
[math]L \subset \Sigma_2^*[/math] — регулярный , [math]\varphi:\Sigma_1^* \rightarrow \Sigma_2^* [/math] — гомоморфизм. Тогда [math]\varphi^{-1}(L)[/math] — регулярный.
[math]\triangleright[/math]
Рассмотрим ДКА, распознающий [math]L[/math]. Отследим для каждого состояния [math]u[/math] и символа [math]c[/math] строку [math]\varphi(c)[/math]: [math] \langle u,\varphi(c) \rangle \vdash^* \langle v,\varepsilon \rangle[/math] и положим [math]\delta (u,c) = v[/math] в новом автомате (на том же множестве состояний). Автомат с построенной таким образом функцией переходов, очевидно, распознает слова языка [math]\varphi^{-1}(L)[/math] и только их.
[math]\triangleleft[/math]