Участник:Shersh/Теорема о рекурсии — различия между версиями
Shersh (обсуждение | вклад) (busy beaver) |
Shersh (обсуждение | вклад) (успенский и райс) |
||
| Строка 21: | Строка 21: | ||
<tex> A </tex> {{---}} разрешимое семейство языков. | <tex> A </tex> {{---}} разрешимое семейство языков. | ||
| − | <tex> L_A </tex> {{---}} | + | <tex> L_A </tex> {{---}} множество программ, удовлетворяющих св-ву <tex> A </tex>. |
| + | |||
| + | Допустим, что пустой язык <tex> \varnothing </tex> принадлежит семейству <tex> A </tex>. Если это не так, то мы можем перейти к рассмотрению дополнения семейства: к <tex> \overline{A} </tex>. К тому же, так как свойство <tex> A </tex> нетривиальное, то его дополнение содержит какой-то перечислимый язык. Пусть <tex> q </tex> {{---}} полуразрешитель какого-то фиксированного непустого языка из <tex> \overline{A} </tex>, то есть <tex> q \notin L_A </tex>. Тогда напишем такую программу: | ||
<code> | <code> | ||
p(x): | p(x): | ||
| − | '''if''' p <tex> \in ~ L_A </tex> | + | '''if''' p <tex> \in ~ L_A </tex> // можем так написать, потому что по предположению <tex> L_A </tex> {{---}} разрешимый |
| − | '''return''' | + | '''return''' q(x) |
'''else''' | '''else''' | ||
'''while''' ''true'' | '''while''' ''true'' | ||
</code> | </code> | ||
| + | |||
| + | Если <tex> p </tex> не удовлетворяет свойству <tex> A </tex>, тогда будет выполняться всегда вторая ветка, и <tex> p \equiv \varnothing </tex>. Но пустой язык принадлежит <tex> A </tex>. Получили противоречие. | ||
| + | |||
| + | Если <tex> p </tex> удовлетворяет свойству <tex> A </tex>, то <tex> L(p) = L(q) </tex>, а <tex> q \notin A </tex>. Опять получили противоречие. | ||
== Колмогоровская сложность == | == Колмогоровская сложность == | ||
{{Определение | {{Определение | ||
Версия 16:35, 9 января 2014
Содержание
Неразрешимость универсального языка
| Утверждение: |
Универсальный язык неразрешим |
|
Напишем такую программу:
p(x):
if u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код
return 0
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
|
Аналог II теоремы Гёделя о неполноте
Теорема о неподвижной точке
Зафиксируем главную нумерацию . Обозначим за множество слов, допускаемых программой с номером .
| Утверждение: |
|
Напишем такую программу:
p(q):
if p == q // сравниваем как строки; так можно сделать, потому что программа знает свой код по теореме о рекурсии
print number(p)
else
while true
Программа знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер. |