Разрешимые (рекурсивные) языки — различия между версиями
(→Примеры неразрешимых множества) |
ExileHell (обсуждение | вклад) (→Примеры неразрешимых множеств) |
||
Строка 122: | Строка 122: | ||
Универсальный язык неразрешим. | Универсальный язык неразрешим. | ||
|proof= | |proof= | ||
− | + | По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию <tex> \mathrm{getSrc()} </tex>, которая вернёт строку {{---}} исходный код программы. | |
+ | Допустим, что он разрешим. Тогда напишем такую программу: | ||
+ | <code> | ||
+ | p(x): | ||
+ | '''if''' u(getSrc(), x) | ||
+ | '''while''' ''true'' | ||
+ | '''else''' | ||
+ | '''return''' 1 | ||
+ | </code> | ||
− | + | Если <tex> u(p, x) = 1 </tex>, тогда программа <tex> p </tex> на входе <tex> x </tex> должна вернуть <tex> 1 </tex>, но по условию <tex> if </tex> она зависает, а следовательно, не принадлежит универсальному языку. | |
− | <tex>u( | + | Если же <tex> u(p, x) \neq 1 </tex>, то мы пойдём во вторую ветку условного оператора и вернём <tex> 1 </tex>, значит, пара <tex> |
− | + | \langle p, x \rangle </tex> принадлежит универсальному языку, но <tex> u(p, x) \neq 1 </tex>, значит, пара не принадлежит. Опять получили противоречие. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}} | }} | ||
Версия 22:22, 25 декабря 2016
Содержание
Основные определения
Определение: |
Рекурсивный язык (англ. recursive language) | — язык, для которого существует программа
Определение: |
Язык вычислимая функция . | называется разрешимым, если существует такая
Если мы рассматриваем язык
как проблему, то проблема называется разрешимой, если язык рекурсивный. В противном случае проблема называется неразрешимой. Но часто данные понятия просто отождествляются.
Определение: |
Класс всех разрешимых (рекурсивных) языков (англ. Class of decidable (recursive) languages) часто обозначается буквой | .
Определение: |
Универсальный язык (англ. universal language) | .
Другими словами, универсальный язык — это язык всех таких пар "программа и её вход", что программа на входе возвращает .
Рассмотрим данное определение более детально, для чего докажем вспомогательную лемму:
Лемма: |
Существует биекция между строками и натуральными числами. |
Доказательство: |
Приведем пример такой биекции: занумеруем подряд все строки длины | , затем все строки длины и так далее — нумерация названий столбцов в , таким образом, каждому натуральному числу соответствует некоторая строка и наоборот.
Биекция между строками и натуральными числами нам нужна, чтобы передавать пары "текст программы, текст входных данных" в качестве аргументов функций. Передавать можно в следующем виде:
, где — есть натуральные числа, соответствующие тексту программы и тексту входных данных соответственно.
Далее считаем, что входные данные программы и сама программа расположены над одним алфавитом
.Примеры разрешимых множеств
Утверждение: |
Язык чётных чисел разрешим. |
Приведём программу, разрешающую язык чётных чисел: Заметим, что программа нигде не может зависнуть. if return 1 else return 0 |
Утверждение: |
Множество всех рациональных чисел, меньших числа (основания натуральных логарифмов) или , разрешимо. |
Для чисел [1], таким образом, возможно получить необходимый знак чисел за конечное время. существуют различные техники нахождения их точного представления, одна их которых описана в статьеДесятичное представление рационального числа может быть получено с любой точностью.Приведем программу, разрешающую данную проблему для числа :Так как число if ( < 2) return 1 if ( > 3) return 0 for (i = 1 .. ) if (getDigit( , i) > getDigit( , i)) // getDigit — функция, которая получает i-ую цифру вещественной части переданного числа return 1 if (getDigit( , i) < getDigit( , i)) return 0 иррационально, то ответ будет найден за конечное время. |
Утверждение: |
Множество тех , для которых в числе есть не менее девяток подряд, разрешимо. |
Предположим, что в числе встречается девяток подряд, тогда, логично, что встречается и любое число девяток меньших . Рассмотрим все программы семейства:
return 1
if return 1 else return 0 if return 1 else return 0
if return 1 else return 0 По доказанному выше, какая-то программа из этого семейства будет разрешителем для искомого множества. Значит, искомое множество разрешимо. |
Примеры неразрешимых множеств
Утверждение: |
Универсальный язык неразрешим. |
По теореме о рекурсии, программа может знать свой исходный код. Значит, в неё можно написать функцию , которая вернёт строку — исходный код программы.
Допустим, что он разрешим. Тогда напишем такую программу:
p(x): if u(getSrc(), x) while true else return 1
Если Если же , тогда программа на входе должна вернуть , но по условию она зависает, а следовательно, не принадлежит универсальному языку. , то мы пойдём во вторую ветку условного оператора и вернём , значит, пара принадлежит универсальному языку, но , значит, пара не принадлежит. Опять получили противоречие. |
Примечания
Источники информации
- Н. К. Верещагин, А. Шень. Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции. — М.: МЦНМО, 1999. С. 134. ISBN 5-900916-36-7
- Wikipedia — Recursive language
- Википедия — Рекурсивный язык