Участник: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
Программа знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер.  |