Изменения

Перейти к: навигация, поиск

Перечислимые языки

7235 байт добавлено, 19:22, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Основные определения ==
{{Определение
|definition =
Перечисляющая '''Полуразрешимый язык''' (англ. ''semi-decidable language'') {{---}} язык, для которого существует программа для языка <tex>p</tex> такая, что* <tex>\forall x \in L\Leftrightarrow p(x)=1</tex> - программа, по очереди выводящая все слова языка * <tex>\forall x \notin L\Leftrightarrow p(x)=0</tex>. Если слово принадлежит языку, то программа за конечное время выдаст его на выходе. Слова, не принадлежащие языку, программа выводить не будетили зависнет.
}}
{{Определение
|definition =
Полуразрешающая '''Перечислимый язык''' (англ. ''recursively enumerable language'') {{---}} язык, для которого существует программа для языка <tex>g</tex> такая, что <tex>g(i) = x_i, L = \{x_1, x_2, .., x_n, ..\}</tex>. Язык <tex>L</tex> называется '''коперечислимым''' (англ. ''co- программаenumerable''), которая при подаче на вход слова из языка за конечное время завершится и вернет 1если <tex>\overline L</tex> {{---}} перечислимый. Класс всех перечислимых языков называется <tex> \mathrm{RE} </tex>, а при подаче на вход слова не из языка может за конечное время вернуть 0, а может и зависнутьвсех коперечислимих <tex> \mathrm{co}</tex>-<tex>\mathrm{RE}</tex> .
}}
{{Определение
|definition =
Перечислимый язык Пусть имеется некоторая программа <tex>p</tex>, которая может либо завершиться за конечное время и что- языкто вернуть, для которого существует перечисляющая либо зависнуть. Запуск программы <tex>p</tex> с '''тайм-лимитом''' (англ. ''time limit'') <tex>TL</tex> будем обозначать как <tex>p|_{TL}</tex> и иметь в виду следующее: если за <tex>TL</tex> операций программа<tex>p</tex> корректно завершилась и что-то вернула, то <tex>p|_{TL}</tex> вернёт то же самое; если же за <tex>TL</tex> операций программа <tex>p</tex> не успела завершиться, то <tex>p|_{TL}</tex> вернёт <tex>\bot</tex> (символ зависания).
}}
{{ОпределениеТеорема|definition id=th1Перечислимый |statement=<tex>L</tex> {{---}} перечислимый <tex>\Leftrightarrow L</tex> {{---}} полуразрешимый.|proof=<tex> \Longrightarrow </tex> : Пусть <tex>L</tex> {{---}} перечислимый язык . Тогда для него существует программа <tex>g</tex>, которая по номеру <tex>i</tex> выводит слово из <tex>L</tex>. Значит, для всех <tex>x</tex> из <tex>L</tex> путем перебора значений функции <tex>g</tex> мы можем найти такое <tex>i</tex>, что <tex> g(i) = x</tex>. Следовательно, существует программа <tex>p</tex>, такая, что <tex>\forall x: x \in L \Leftrightarrow p(x)=1</tex>. Тогда <tex>L</tex> является полуразрешимым языком.  '''function''' p(x: '''int'''): '''int''' '''for''' i = 1 '''to''' <tex>\infty</tex> '''if''' g(i) == x '''return''' 1 <tex> \Longleftarrow </tex>:Пусть <tex>L</tex> {{- --}} полуразрешимый язык. Тогда для него существует программа <tex>p</tex>, результат которой равен <tex>1</tex> для которого любого слова из <tex>L</tex>. Чтобы программа <tex>p</tex> не зависала на словах, которые не принадлежат <tex>L</tex>, будем запускать ее с тайм-лимитом. Для поиска <tex>i</tex>-го слова из языка <tex>L</tex> будем перебирать <tex>k</tex> {{---}} тайм-лимит с которым будем запускать программу <tex>p</tex>. Таким образом существует полуразрешающая программа<tex>g_0</tex>, которая выводит <tex>i</tex> слово языка <tex>L</tex> с повторениями. Для того, чтобы выводить слова без повторений, заведем множество <tex>U</tex>, в котором будем хранить уже выведенные слова. Программа <tex>g</tex> доказывает, что <tex>L</tex> является перечислимым языком.: '''function''' <tex>g_0</tex>(i: '''int'''): '''int''' cnt = 0 '''for''' k = 1 '''to''' <tex> \infty</tex> '''for''' x <tex>\in \{x_1, x_2, .., x_k\}</tex> '''if''' <tex> p|_k</tex>(x) == 1 cnt++ '''if''' cnt == i '''return''' x  '''function''' <tex>g</tex>(i: '''int'''): '''int''' <tex>U = \emptyset</tex> '''for''' j = 1 '''to''' <tex>\infty</tex> x = <tex> g_0</tex>(j) '''if''' x <tex>\notin</tex> <tex>U</tex> cnt++ '''if''' cnt == i '''return''' x U.insert(x)'''''}} {{Теорема|id=th2|statement=Любой [[Разрешимые_(рекурсивные)_языки | разрешимый язык]] <tex>L</tex> является перечислимым.|proof= Любой разрешимый язык <tex>L</tex> является полуразрешимым. Так как любой полуразрешимый язык является перечислимым, то <tex>L</tex> является перечислимым.
}}
{{Теорема
|id=th1
|statement=
Два определения перечислимого языка эквивалентны<tex>L</tex> {{---}} перечислим и коперечислим <tex>\Rightarrow</tex> <tex>L</tex> {{---}} [[Разрешимые_(рекурсивные)_языки|разрешим]].|proof=Рассмотрим полуразрешители для <tex>L</tex> и <tex>\overline L</tex> и одновременно запустим их для одного и того же элемента <tex>x</tex>. <tex>x</tex> принадлежит либо <tex> L </tex>, либо <tex>\overline{L}</tex>, поэтому один из полуразрешителей успешно отработает и не зависнет. Значит, мы за конечное время узнаем, лежит ли <tex>x</tex> в <tex>L</tex> или нет. Таким образом, мы построили разрешитель для <tex>L</tex>, то есть <tex>L</tex> {{---}} разрешимый.}} == Примеры перечислимых языков == {{Утверждение|id=st1|statement=Язык натуральных чисел перечислим.|proof=Приведём программу, перечисляющую язык натуральных чисел:  '''function''' p(i: '''int'''): '''int''' '''return''' i'''''}} {{Утверждение|id=st2|statement=Язык чётных неотрицательных чисел перечислим.|proof=Приведём программу, перечисляющую язык чётных неотрицательных чисел:  '''function''' p(i: '''int'''): '''int''' '''return''' i * 2'''''}} == Примеры коперечислимых языков == {{Утверждение|id=st2|statement=Язык нечётных неотрицательных чисел коперечислим.|proof=<tex>\overline L</tex> {{---}} язык чётных неотрицательных чисел. Так как язык чётных неотрицательных чисел перечислим, то и язык нечётных неотрицательных чисел тоже перечислим. }}{{Утверждение|id=st2|statement=Язык простых чисел коперечислим.
|proof=
Пусть имеется перечисляющая программа для языка<tex>L</tex> {{---}} язык простых чисел, построим полуразрешающую. Сделаем это следующим образом. Получаем на вход некоторое слово тогда <tex>w\overline L</tex>{{---}} язык, запускаем перечисляющую программусостоящий из составных чисел и единицы. Если в процессе вывода слов встретится Покажем, что <tex>w\overline L</tex>полуразрешим, то завершаем работуа, следовательно, вернув 1. Таким образом при подаче на вход слова из языка построенная программа вернет 1 и завершится. Если же мы подадим на вход слово не из языкаперечислим согласно теореме, то построенная программа будет работать бесконечно долго, что вполне устраивает. Таким образом полуразрешающая программа построенаприведённой выше.
Теперь пусть имеется полуразрешающая программа для языкаПостроим простой полуразрешитель:  '''function''' p(n: '''int'''): '''int''' '''for''' i = 2 '''to''' <tex>\lceil \sqrt{n} \rceil</tex> '''if''' n mod i == 0 '''return''' 0 '''return''' 1'''''}} == Примеры неперечислимых языков == {{Утверждение|id=st2|statement=Язык пар <tex>\langle n, построим перечисляющуюbb(n)\rangle</tex> неперечислим.|proof=Функция [[Busy_beaver | busy beaver]] <tex>bb(n)</tex> {{---}} невычислима, следовательно такой язык неперечислим.
}}
 
== См. также ==
 
* [[Разрешимые (рекурсивные) языки]]
* [[Замкнутость разрешимых и перечислимых языков относительно теоретико-множественных и алгебраических операций]]
 
== Источники информации ==
* Н. К. Верещагин, А. Шень. Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции. {{---}} М.: МЦНМО, 1999. С. 134. ISBN 5-900916-36-7
* [http://en.wikipedia.org/wiki/Recursively_enumerable_language Wikipedia {{---}} Recursively enumerable language]
* [http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE_%D0%BF%D0%B5%D1%80%D0%B5%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D0%BC%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA Википедия {{---}} Рекурсивно перечислимый язык]
 
[[Категория: Теория формальных языков]]
[[Категория: Теория вычислимости]]
[[Категория: Разрешимые и перечислимые языки]]
1632
правки

Навигация