Замкнутость разрешимых и перечислимых языков относительно теоретико-множественных и алгебраических операций — различия между версиями
Строка 7: | Строка 7: | ||
|proof= | |proof= | ||
Пусть <tex>p_1</tex> и <tex>p_2</tex> — разрешающие программы для языков | Пусть <tex>p_1</tex> и <tex>p_2</tex> — разрешающие программы для языков | ||
− | <tex>L_1</tex> и <tex>L_2</tex> соответственно. Для доказательства достаточно написать разрешающую программу ( | + | <tex>L_1</tex> и <tex>L_2</tex> соответственно. Для доказательства достаточно написать разрешающую программу (разрешатель) для каждого случая. |
Разрешающая программа для языка <tex> L_1 \cup L_2 :</tex> | Разрешающая программа для языка <tex> L_1 \cup L_2 :</tex> | ||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''return''' <tex>(p_1(x) == 1) \ | + | '''return''' <tex>(p_1(x) == 1) \lor (p_2(x) == 1)</tex> |
Строка 18: | Строка 18: | ||
<tex>p(x)</tex> | <tex>p(x)</tex> | ||
− | '''return''' <tex>(p_1(x) == 1) \ | + | '''return''' <tex>(p_1(x) == 1) \land (p_2(x) == 1)</tex> |
Строка 58: | Строка 58: | ||
'''return''' 0 | '''return''' 0 | ||
− | + | Разрешатель будет перебирать все возможные разбиения на два слова и проверять принадлежность первого слова <tex> L_1 </tex> и второго слова <tex> L_2 </tex>. Если хотя бы для одного разбиения оба разрешателя вернут 1, то слово принадлежит <tex> L_1 L_2 </tex>, иначе — не принадлежит. | |
}} | }} | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
− | <tex> L_1, L_2 </tex> –- перечислимы, тогда | + | Языки <tex> L_1, L_2 </tex> –- перечислимы, тогда языки |
+ | |||
+ | |||
+ | <tex>\left. \begin{array}{lll} L_1 \cup L_2 \\ L_1 \cap L_2 \\ L_1 \times L_2\\ L_1^* \\ L_1 L_2 \end{array} \right\} </tex> тоже перечислимы. | ||
+ | |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 \cup L_2 :</tex> | ||
+ | |||
+ | полуразрешающая программа: | ||
+ | |||
+ | <tex>p(x)</tex> | ||
+ | '''for''' <tex>k = 1\ .. \ \infty </tex> | ||
+ | '''if''' <tex> (p_1|_k(x) == 1) \lor (p_2|_k(x) == 1) </tex> | ||
+ | '''then return 1''' | ||
+ | |||
+ | Перечислитель же для этого языка будет по очереди на один шаг запускать перечислители для <tex>L_1</tex> и <tex>L_2</tex> и выдавать по очереди слова из <tex>L_1</tex> и <tex>L_2</tex> соответственно. | ||
+ | |||
+ | |||
+ | Для языка <tex> L_1 \cap L_2 :</tex> | ||
+ | |||
+ | полуразрешающая программа: | ||
+ | |||
+ | <tex>p(x)</tex> | ||
+ | '''for''' <tex>k = 1\ .. \ \infty </tex> | ||
+ | '''if''' <tex> (p_1|_k(x) == 1) \land (p_2|_k(x) == 1) </tex> | ||
+ | '''then return 1''' | ||
+ | |||
+ | |||
+ | Для языка <tex> L_1 \times L_2 :</tex> | ||
+ | |||
+ | полуразрешающая программа: | ||
+ | |||
+ | <tex>p(\langle x, y \rangle)</tex> | ||
+ | '''for''' <tex>k = 1\ .. \ \infty </tex> | ||
+ | '''if''' <tex> (p_1|_k(x) == 1) \land (p_2|_k(y) == 1) </tex> | ||
+ | '''then return 1''' | ||
+ | |||
+ | |||
+ | Для языка <tex> L_1^* :</tex> | ||
+ | |||
+ | полуразрешающая программа (по аналогии с <tex>L_1^*</tex> для разрешимого <tex>L_1</tex>): | ||
+ | |||
+ | <tex>p(x)</tex> | ||
+ | '''for''' <tex>x_i :</tex> разбиение <tex>x</tex> | ||
+ | '''if''' <tex>(p_1(x_i) == 1)</tex> | ||
+ | '''then return''' 1 | ||
+ | |||
+ | Перечислитель строится следующим образом: запускаем перечислитель для <tex> L_1 </tex> в цикле по тайм-лимиту и запоминаем выданные им слова. При выдаче каждого нового слова перебираем все возможные перестановки уже выданных слов и выдаем их. | ||
+ | |||
+ | |||
+ | Для языка <tex> L_1 L_2 : </tex> | ||
+ | |||
+ | полуразрешающая программа: | ||
+ | |||
+ | <tex>p(x)</tex> | ||
+ | '''for''' <tex>x_1, x_2 :</tex> разбиение <tex>x</tex> | ||
+ | '''if''' <tex>(p_1(x_1) == 1 \land p_2(x_2) == 1)</tex> | ||
+ | '''then return''' 1 | ||
+ | |||
+ | |||
+ | Перечислитель для <tex> L_1 L_2 </tex> строим следующим образом: запускаем одновременно перечислители для <tex> L_1 </tex> и <tex> L_2 </tex>, запоминая все выданные слова. При выдаче новых слов перебираем все возможные пары из запомненных слов и выдаем их конкатенацию. | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{Теорема | ||
+ | |statement= | ||
+ | Языки <tex> L_1, L_2 </tex> –- перечислимы, тогда языки | ||
+ | |||
+ | <tex>\left. \begin{array}{lll} \overline{L_1} \\ L_1 \backslash L_2 \end{array} \right\} </tex> могут быть не перечислимы. | ||
− | |||
− | |||
|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> 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> также не всегда перечислим. | |
}} | }} |
Версия 08:47, 18 декабря 2011
Теорема: |
Языки –- разрешимы, тогда языки
|
Доказательство: |
Пусть и — разрешающие программы для языков и соответственно. Для доказательства достаточно написать разрешающую программу (разрешатель) для каждого случая.Разрешающая программа для языка return
return
return
return
return
for разбиение if then return 1 return 0 Разрешатель будет перебирать все возможные разбиения данного ему слова на подслова, и для каждого проверять принадлежность . Если хотя бы в одном разбиении все подслова будут принадлежать , то все слово принадлежит , иначе — не принадлежит.
Разрешатель будет перебирать все возможные разбиения на два слова и проверять принадлежность первого слова for разбиение if then return 1 return 0 и второго слова . Если хотя бы для одного разбиения оба разрешателя вернут 1, то слово принадлежит , иначе — не принадлежит. |
Теорема: |
Языки –- перечислимы, тогда языки
|
Доказательство: |
Пусть и — полуразрешающие программы для языков и соответственно. Для доказательства достаточно написать полуразрешающую или перечисляющую программу для каждого случая. Заметим, что и могут зависнуть при использовании в полуразрешающей программе для соответствующего языка, но это допустимо.Для языка полуразрешающая программа: for if then return 1 Перечислитель же для этого языка будет по очереди на один шаг запускать перечислители для и и выдавать по очереди слова из и соответственно.
полуразрешающая программа: for if then return 1
полуразрешающая программа: for if then return 1
полуразрешающая программа (по аналогии с для разрешимого ):for разбиение if then return 1 Перечислитель строится следующим образом: запускаем перечислитель для в цикле по тайм-лимиту и запоминаем выданные им слова. При выдаче каждого нового слова перебираем все возможные перестановки уже выданных слов и выдаем их.
полуразрешающая программа: Перечислитель для for разбиение if then return 1 строим следующим образом: запускаем одновременно перечислители для и , запоминая все выданные слова. При выдаче новых слов перебираем все возможные пары из запомненных слов и выдаем их конкатенацию. |
Теорема: |
Языки –- перечислимы, тогда языки
|
Доказательство: |
Рассмотрим язык Теперь рассмотрим . Предположим, что он перечислим. Тогда имея какое-либо слово, мы можем одновременно запустить перечислители для и . В какой-то момент времени слово появится либо в выводе перечислителя для , либо в выводе перечислителя для . Тогда получится что разрешим, так как про любое слово мы можем узнать принадлежит оно или не принадлежит. Но мы знаем, что существуют перечислимые, но не разрешимые языки, следовательно, язык может быть не перечислим. . В качестве возьмем язык, состоящий из всех слов. Тогда получится, что язык это . Про язык мы знаем, что он перечислим не всегда, следовательно и язык также не всегда перечислим. |