Участник:Shersh/Теорема о рекурсии — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Колмогоровская сложность)
(busy beaver)
Строка 65: Строка 65:
  
 
== Busy beaver ==
 
== Busy beaver ==
 +
{{Утверждение
 +
|id=proposalU.
 +
|statement=Функция [[Busy beaver]] невычислима.
 +
|proof= Предположим, что это так. Тогда напишем такую программу
 +
<code>
 +
  p():
 +
    '''for''' i = 1..BB(p) + 1
 +
      do smth
 +
</code>
 +
 +
Такая программа всегда совершает больше шагов, чем функция <tex> BB </tex> от этой программы. А это невозможно, так <tex> BB(p) </tex> равна максимальному числу шагов как раз этой программы. Получили противоречие.
 +
}}
 
== Аналог I теоремы Гёделя о неполноте ==
 
== Аналог I теоремы Гёделя о неполноте ==
 
{{Теорема
 
{{Теорема
Строка 97: Строка 109:
 
Программа <tex> p </tex> знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер.
 
Программа <tex> p </tex> знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер.
 
}}
 
}}
 +
 +
== Ссылки ==
 +
* [[wikipedia:Kolmogorov_complexity | Wikipedia {{---}} Kolmogorov_complexity]]
 +
* [http://people.cs.uchicago.edu/~fortnow/papers/kaikoura.pdf | Kolmogorov Complexity]
 +
 +
[[Категория: Теория формальных языков]]

Версия 16:18, 9 января 2014

Неразрешимость универсального языка

Утверждение:
Универсальный язык неразрешим
[math]\triangleright[/math]

Напишем такую программу:

 p(x):
   if u(p, x) // можем так написать, потому что по теореме о рекурсии программа может знать свой код
     return 0
   else
     return 1

Если [math] u(p, x) = 1 [/math], тогда программа [math] p [/math] на входе [math] x [/math] возвращает [math] 1 [/math], но по условию [math] if [/math] она должна вернуть [math]0[/math], а следовательно, не принадлежит универсальному языку.

Если же [math] u(p, x) = 0 [/math], то мы пойдём во вторую ветку условного оператора и вернём [math] 1 [/math], значит, пара [math] \lt p, x\gt [/math] принадлежит универсальному языку, но [math] u(p, x) = 0 [/math], значит, пара не принадлежит. Опять получили противоречие.
[math]\triangleleft[/math]

Теорема Успенского-Райса

[math] A [/math] — разрешимое семейство языков.

[math] L_A [/math] — язык свойства языков. Допустим, что он разрешим. Тогда напишем такую программу

 p(x):
   if p [math] \in ~ L_A [/math]
     return z(x)
   else
     while true

Колмогоровская сложность

Определение:
Колмогоровской сложностью строки [math] x [/math] называется функция [math] K(x) [/math], которая равна минимальной длине программы [math] p : p(\varepsilon) = x [/math].

Сложность считается в каком-то фиксированном языке программирования. Так, например, у языков C++ и Python будет разная колмогоровская сложность одной программы.

Пример

Колмогоровская сложность программы, выводящей [math] n [/math] нулей [math] K(0^n) \leqslant n + c [/math]. Просто программа, в которой записано [math] n [/math] нулей. Но можно записать и более короткую программу для больших [math] n [/math] со сложностью [math] K(0^n) \leqslant \log{n} + c [/math], например вот такую:

 [math]p_n[/math]():
   for i = 1..n
     print(0)

Теорема (Невычислимость Колмогоровской сложности):
Колмогоровская сложность — невычислимая функция.
Доказательство:
[math]\triangleright[/math]

[math] \forall x \gt x_0: K(x) \gt f(x)[/math], если только [math]f \leqslant const [/math] или [math] f [/math] — невычислима.

Допустим, что [math] K [/math] вычислима, тогда напишем такую программу:

 p([math]\varepsilon[/math]):
   foreach x [math]\in ~ \Sigma^* [/math] // перебираем слова по возрастанию длины
     if [math] K(x) \gt  |p|[/math] // теорема о рекурсии используется здесь
       print(x)
       exit     

Начиная с [math] x_0 [/math], [math] f(x) \gt |p| [/math].
[math]\triangleleft[/math]

Busy beaver

Утверждение:
Функция Busy beaver невычислима.
[math]\triangleright[/math]

Предположим, что это так. Тогда напишем такую программу

 p():
   for i = 1..BB(p) + 1
     do smth

Такая программа всегда совершает больше шагов, чем функция [math] BB [/math] от этой программы. А это невозможно, так [math] BB(p) [/math] равна максимальному числу шагов как раз этой программы. Получили противоречие.
[math]\triangleleft[/math]

Аналог I теоремы Гёделя о неполноте

Теорема:
В любой "достаточно богатой системе" существует истинное недоказуемое утверждение.
Доказательство:
[math]\triangleright[/math]

Можно переформулировать теорему следующим образом: невозможно доказать, что [math] p(x) = \perp [/math].

Тогда напишем такую программу:

 p(x):
   foreach q [math] \in ~ \Sigma^* [/math]
     if q proves "p(x) зависает"
       exit    
[math]\triangleleft[/math]

Аналог II теоремы Гёделя о неполноте

Теорема о неподвижной точке

Зафиксируем главную нумерацию [math] W [/math]. Обозначим за [math] W_n [/math] множество слов, допускаемых программой с номером [math] n [/math].

Утверждение:
[math] \exists n : W_n = \{n\} [/math]
[math]\triangleright[/math]

Напишем такую программу:

 p(q):
   if p == q // сравниваем как строки; так можно сделать, потому что программа знает свой код по теореме о рекурсии
     print number(p)
   else
     while true

Программа [math] p [/math] знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер.
[math]\triangleleft[/math]

Ссылки