Участник:Shersh/Теорема о рекурсии — различия между версиями
Shersh (обсуждение | вклад) (→Неразрешимость универсального языка) |
Shersh (обсуждение | вклад) (→Колмогоровская сложность) |
||
| Строка 35: | Строка 35: | ||
|definition='''Колмогоровской сложностью''' строки <tex> x </tex> называется функция <tex> K(x) </tex>, которая равна минимальной длине программы <tex> p : p(\varepsilon) = x </tex>. | |definition='''Колмогоровской сложностью''' строки <tex> x </tex> называется функция <tex> K(x) </tex>, которая равна минимальной длине программы <tex> p : p(\varepsilon) = x </tex>. | ||
}} | }} | ||
| + | Сложность считается в каком-то фиксированном языке программирования. Так, например, у языков C++ и Python будет разная колмогоровская сложность одной программы. | ||
| + | |||
=== Пример === | === Пример === | ||
Колмогоровская сложность программы, выводящей <tex> n </tex> нулей <tex> K(0^n) \leqslant n + c </tex>. Просто программа, в которой записано <tex> n </tex> нулей. Но можно записать и более короткую программу для больших <tex> n </tex> со сложностью <tex> K(0^n) \leqslant \log{n} + c </tex>, например вот такую: | Колмогоровская сложность программы, выводящей <tex> n </tex> нулей <tex> K(0^n) \leqslant n + c </tex>. Просто программа, в которой записано <tex> n </tex> нулей. Но можно записать и более короткую программу для больших <tex> n </tex> со сложностью <tex> K(0^n) \leqslant \log{n} + c </tex>, например вот такую: | ||
Версия 15:53, 9 января 2014
Содержание
Неразрешимость универсального языка
| Утверждение: |
Универсальный язык неразрешим |
|
Напишем такую программу:
p(x):
if u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код
return 0
else
return 1
Если , тогда программа на входе возвращает , но по условию она должна вернуть , а следовательно, не принадлежит универсальному языку. Если же , то мы пойдём во вторую ветку условного оператора и вернём , значит, пара принадлежит универсальному языку, но , значит, пара не принадлежит. Опять получили противоречие. |
Теорема Успенского-Райса
— разрешимое семейство языков.
— язык свойства языков. Допустим, что он разрешим. Тогда напишем такую программу
p(x):
if p
return z(x)
else
while true
Колмогоровская сложность
| Определение: |
| Колмогоровской сложностью строки называется функция , которая равна минимальной длине программы . |
Сложность считается в каком-то фиксированном языке программирования. Так, например, у языков C++ и Python будет разная колмогоровская сложность одной программы.
Пример
Колмогоровская сложность программы, выводящей нулей . Просто программа, в которой записано нулей. Но можно записать и более короткую программу для больших со сложностью , например вот такую:
():
for i = 1..n
print(0)
| Теорема (Невычислимость Колмогоровской сложности): |
Колмогоровская сложность — невычислимая функция. |
| Доказательство: |
|
, если только или — невычислима. Допустим, что вычислима, тогда напишем такую программу:
p(): foreach x // перебираем слова по возрастанию длины if // теорема о рекурсии используется здесь print(x) exit Начиная с , . |
Busy beaver
Аналог I теоремы Гёделя о неполноте
| Теорема: |
В любой "достаточно богатой системе" существует истинное недоказуемое утверждение. |
| Доказательство: |
|
Можно переформулировать теорему следующим образом: невозможно доказать, что . Тогда напишем такую программу:
p(x):
foreach q
if q proves "p(x) зависает"
exit
|
Аналог II теоремы Гёделя о неполноте
Теорема о неподвижной точке
Зафиксируем главную нумерацию . Обозначим за множество слов, допускаемых программой с номером .
| Утверждение: |
|
Напишем такую программу:
p(q):
if p == q // сравниваем как строки; так можно сделать, потому что программа знает свой код по теореме о рекурсии
print number(p)
else
while true
Программа знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер. |