Участник:Shersh/Теорема о рекурсии — различия между версиями
(→Busy beaver) |
Shersh (обсуждение | вклад) (универсальный язык: пофиксено доказательство) |
||
Строка 2: | Строка 2: | ||
{{Утверждение | {{Утверждение | ||
|id=proposalU. | |id=proposalU. | ||
− | |statement=Универсальный язык неразрешим | + | |statement=[[Разрешимые (рекурсивные) языки#Пример неразрешимого множества | Универсальный язык]] неразрешим |
|proof= | |proof= | ||
Напишем такую программу: | Напишем такую программу: | ||
Строка 8: | Строка 8: | ||
p(x): | p(x): | ||
'''if''' u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код | '''if''' u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код | ||
− | ''' | + | '''while''' ''true'' |
'''else''' | '''else''' | ||
'''return''' 1 | '''return''' 1 | ||
</code> | </code> | ||
− | Если <tex> u(p, x) = 1 </tex>, тогда программа <tex> p </tex> на входе <tex> x </tex> | + | Если <tex> u(p, x) = 1 </tex>, тогда программа <tex> p </tex> на входе <tex> x </tex> должна вернуть <tex> 1 </tex>, но по условию <tex> if </tex> она зависает, а следовательно, не принадлежит универсальному языку. |
− | Если же <tex> u(p, x) | + | Если же <tex> u(p, x) \neq 1 </tex>, то мы пойдём во вторую ветку условного оператора и вернём <tex> 1 </tex>, значит, пара <tex> |
+ | \langle p, x \rangle </tex> принадлежит универсальному языку, но <tex> u(p, x) \neq 1 </tex>, значит, пара не принадлежит. Опять получили противоречие. | ||
}} | }} | ||
Версия 13:29, 12 января 2014
Содержание
Неразрешимость универсального языка
Утверждение: |
Универсальный язык неразрешим |
Напишем такую программу:
p(x): if u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код while true else return 1
Если Если же , тогда программа на входе должна вернуть , но по условию она зависает, а следовательно, не принадлежит универсальному языку. , то мы пойдём во вторую ветку условного оператора и вернём , значит, пара принадлежит универсальному языку, но , значит, пара не принадлежит. Опять получили противоречие. |
Теорема Успенского-Райса
— разрешимое семейство языков.
— множество программ, удовлетворяющих св-ву .
Допустим, что пустой язык
принадлежит семейству . Если это не так, то мы можем перейти к рассмотрению дополнения семейства: к . К тому же, так как свойство нетривиальное, то его дополнение содержит какой-то перечислимый язык. Пусть — полуразрешитель какого-то фиксированного непустого языка из , то есть . Тогда напишем такую программу:
p(x): if p// можем так написать, потому что по предположению — разрешимый return q(x) else while true
Если
не удовлетворяет свойству , тогда будет выполняться всегда вторая ветка, и . Но пустой язык принадлежит . Получили противоречие.Если
удовлетворяет свойству , то , а . Опять получили противоречие.Колмогоровская сложность
Определение: |
Колмогоровской сложностью строки | называется функция , которая равна минимальной длине программы .
Сложность считается в каком-то фиксированном языке программирования. Так, например, у языков C++ и Python будет разная колмогоровская сложность одной программы.
Пример
Колмогоровская сложность программы, выводящей
():
for i = 1..n
print(0)
Теорема (Невычислимость Колмогоровской сложности): |
Колмогоровская сложность — невычислимая функция. |
Доказательство: |
, если только или — невычислима. Допустим, что p(): foreach x // перебираем слова по возрастанию длины if // теорема о рекурсии используется здесь print(x) exit Начиная с , . |
Busy beaver
Утверждение: |
Функция Busy beaver невычислима. |
Предположим, что это не так. Тогда напишем такую программу
p(): for i = 1..BB(p) + 1 do smth Такая программа всегда совершает больше шагов, чем функция от этой программы. А это невозможно, так равна максимальному числу шагов как раз этой программы. Получили противоречие. |
Аналог I теоремы Гёделя о неполноте
Теорема: |
В любой "достаточно богатой системе" существует истинное недоказуемое утверждение. |
Доказательство: |
Поясним, что это значит. Так как любой язык программирования эквивалентен машине Тьюринга, то всё связанное с ним кодируется в логике первого порядка с аксиомами Пеано (для этого достаточно, чтобы программа умела прибавлять к числу единицу и вызывать подпрограммы), поэтому можно в терминах программ получать утверждения, эквивалентные тем, что строил Гёдель. Можно переформулировать теорему следующим образом: невозможно доказать, что .Тогда напишем такую программу:
p(x):
foreach q
if q proves "p(x) зависает"
exit
|
Теорема о неподвижной точке
Зафиксируем главную нумерацию
. Обозначим за множество слов, допускаемых программой с номером .Утверждение: |
Напишем такую программу:
p(q): if p == q // сравниваем как строки; так можно сделать, потому что программа знает свой код по теореме о рекурсии print number(p) else while true Программа знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер. |