Замкнутость разрешимых и перечислимых языков относительно теоретико-множественных и алгебраических операций — различия между версиями
м |
|||
Строка 43: | Строка 43: | ||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''forall''' <tex> | + | '''forall''' <tex>d_i :</tex> все возможные разбиения |
− | '''if''' <tex>(p_1( | + | <tex>x_{d_1}x_{d_2} \ .. \ x_{d_n} :</tex> текущее разбиение <tex>x</tex> |
− | + | '''if''' <tex>(p_1(x_{d_1}) == 1) \land (p_1(x_{d_2}) == 1) \land \ ... \ \land (p_1(x_{d_n}) == 1)</tex> | |
+ | '''return''' 1 | ||
'''return''' 0 | '''return''' 0 | ||
Строка 53: | Строка 54: | ||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''forall''' <tex> | + | '''forall''' <tex>d_{1,2} :</tex> все возможные разбиения на две части |
− | '''if''' <tex>(p_1( | + | <tex>x_{d_1}x_{d_2} :</tex> текущее разбиение <tex>x</tex> |
− | + | '''if''' <tex>(p_1(x_{d_1}) == 1 \land p_2(x_{d_2}) == 1)</tex> | |
+ | '''return''' 1 | ||
'''return''' 0 | '''return''' 0 | ||
Строка 73: | Строка 75: | ||
|proof= | |proof= | ||
− | Пусть <tex>p_1</tex> и <tex>p_2</tex> — полуразрешающие программы для языков <tex>L_1</tex> и <tex>L_2</tex> соответственно. Для доказательства достаточно написать полуразрешающую | + | Пусть <tex>p_1</tex> и <tex>p_2</tex> — полуразрешающие программы для языков <tex>L_1</tex> и <tex>L_2</tex> соответственно. Для доказательства достаточно написать полуразрешающую программу для каждого случая. Заметим, что <tex>p_1</tex> и <tex>p_2</tex> могут зависнуть при использовании в полуразрешающей программе для соответствующего языка, но это допустимо. |
* Для языка <tex> L_1 \cup L_2 :</tex> | * Для языка <tex> L_1 \cup L_2 :</tex> | ||
− | |||
− | |||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | + | '''for''' <tex>k = 1 \ .. \ \infty</tex> | |
− | + | '''if''' <tex> (p_1(x)|_k == 1) \lor (p_2(x)|_k == 1) </tex> | |
− | + | '''return 1''' | |
− | |||
* Для языка <tex> L_1 \cap L_2 :</tex> | * Для языка <tex> L_1 \cap L_2 :</tex> | ||
− | |||
− | |||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
Строка 94: | Строка 91: | ||
* Для языка <tex> L_1 \times L_2 :</tex> | * Для языка <tex> L_1 \times L_2 :</tex> | ||
− | |||
− | |||
<tex>p(\langle x, y \rangle)</tex> | <tex>p(\langle x, y \rangle)</tex> | ||
Строка 102: | Строка 97: | ||
* Для языка <tex> L_1^* :</tex> | * Для языка <tex> L_1^* :</tex> | ||
− | |||
− | |||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''forall''' <tex> | + | '''forall''' <tex>d_i :</tex> все возможные разбиения |
− | '''if''' <tex>(p_1( | + | <tex>x_{d_1}x_{d_2} \ .. \ x_{d_n} :</tex> текущее разбиение <tex>x</tex> |
− | + | '''if''' <tex>(p_1(x_{d_1}) == 1) \land (p_1(x_{d_2}) == 1) \land \ ... \ \land (p_1(x_{d_n}) == 1)</tex> | |
− | + | '''return 1''' | |
− | |||
* Для языка <tex> L_1 L_2 : </tex> | * Для языка <tex> L_1 L_2 : </tex> | ||
− | |||
− | |||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''forall''' <tex> | + | '''forall''' <tex>d_{1,2} :</tex> все возможные разбиения на две части |
− | '''if''' <tex>(p_1( | + | <tex>x_{d_1}x_{d_2} :</tex> текущее разбиение <tex>x</tex> |
− | + | '''if''' <tex>(p_1(x_{d_1}) == 1 \land p_2(x_{d_2}) == 1)</tex> | |
− | + | '''return 1''' | |
− | + | | |
− | |||
}} | }} | ||
Строка 135: | Строка 124: | ||
|proof= | |proof= | ||
− | Рассмотрим язык <tex> \overline{L_1} </tex>. Предположим, что он перечислим. Тогда имея какое-либо слово, мы можем одновременно запустить перечислители для <tex> L_1 </tex> и <tex> \overline{L_1} </tex>. В какой-то момент времени слово появится либо в выводе перечислителя для <tex> L_1 </tex>, либо в выводе перечислителя для <tex> \overline{L_1} </tex>. Тогда получится что <tex> L_1 </tex> разрешим, так как про любое слово мы можем узнать принадлежит оно <tex> L_1 </tex> или не принадлежит. Но мы знаем, что существуют перечислимые, но не разрешимые языки, следовательно, язык <tex> \overline{L_1} </tex> может быть не перечислим. | + | Рассмотрим язык <tex> \overline{L_1} </tex>. Предположим, что он перечислим. Тогда, имея какое-либо слово, мы можем одновременно запустить перечислители для <tex> L_1 </tex> и <tex> \overline{L_1} </tex>. В какой-то момент времени слово появится либо в выводе перечислителя для <tex> L_1 </tex>, либо в выводе перечислителя для <tex> \overline{L_1} </tex>. Тогда получится что <tex> L_1 </tex> разрешим, так как про любое слово мы можем узнать принадлежит оно <tex> L_1 </tex> или не принадлежит. Но мы знаем, что [[Разрешимые (рекурсивные) языки#Пример неразрешимого множества|существуют перечислимые, но не разрешимые языки]], следовательно, язык <tex> \overline{L_1} </tex> может быть не перечислим. |
Теперь рассмотрим <tex> L_1 \backslash L_2 </tex>. В качестве <tex> L_1 </tex> возьмем язык, состоящий из всех слов. Тогда получится, что язык <tex> L_1 \backslash L_2 </tex> это <tex> \overline{L_2} </tex>. Про язык <tex> \overline{L_2} </tex> мы знаем, что он перечислим не всегда, следовательно и язык <tex> L_1 \backslash L_2 </tex> также не всегда перечислим. | Теперь рассмотрим <tex> L_1 \backslash L_2 </tex>. В качестве <tex> L_1 </tex> возьмем язык, состоящий из всех слов. Тогда получится, что язык <tex> L_1 \backslash L_2 </tex> это <tex> \overline{L_2} </tex>. Про язык <tex> \overline{L_2} </tex> мы знаем, что он перечислим не всегда, следовательно и язык <tex> L_1 \backslash L_2 </tex> также не всегда перечислим. |
Версия 09:37, 20 декабря 2011
Теорема: |
Языки –- разрешимы, тогда следующие языки разрешимы:
|
Доказательство: |
Пусть и — разрешающие программы для языков и соответственно. Для доказательства достаточно написать разрешающую программу (разрешитель) для каждого случая.
return
return
return
return
return
forall все возможные разбиения текущее разбиение if return 1 return 0 Разрешитель будет перебирать все возможные разбиения данного ему слова на подслова, и для каждого проверять принадлежность . Если хотя бы в одном разбиении все подслова будут принадлежать , то все слово принадлежит , иначе — не принадлежит.
Разрешитель будет перебирать все возможные разбиения на два слова и проверять принадлежность первого слова forall все возможные разбиения на две части текущее разбиение if return 1 return 0 и второго слова . Если хотя бы для одного разбиения оба разрешителя вернут 1, то слово принадлежит , иначе — не принадлежит. |
Теорема: |
Языки –- перечислимы, тогда следующие языки перечислимы:
|
Доказательство: |
Пусть и — полуразрешающие программы для языков и соответственно. Для доказательства достаточно написать полуразрешающую программу для каждого случая. Заметим, что и могут зависнуть при использовании в полуразрешающей программе для соответствующего языка, но это допустимо.
for if return 1
if return 1
if return 1
forall все возможные разбиения текущее разбиение if return 1
forall все возможные разбиения на две части текущее разбиение if return 1 |
Теорема: |
Языки –- перечислимы, тогда следующие языки могут быть не перечислимы:
|
Доказательство: |
Рассмотрим язык существуют перечислимые, но не разрешимые языки, следовательно, язык может быть не перечислим. Теперь рассмотрим . Предположим, что он перечислим. Тогда, имея какое-либо слово, мы можем одновременно запустить перечислители для и . В какой-то момент времени слово появится либо в выводе перечислителя для , либо в выводе перечислителя для . Тогда получится что разрешим, так как про любое слово мы можем узнать принадлежит оно или не принадлежит. Но мы знаем, что . В качестве возьмем язык, состоящий из всех слов. Тогда получится, что язык это . Про язык мы знаем, что он перечислим не всегда, следовательно и язык также не всегда перечислим. |
Литература
- Верещагин Н. К., Шень А. Лекции по математической логике и теории алгоритов. Часть 3. Вычислимые функции — М.: МЦНМО, 1999