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