Участник:Shersh/Теорема о рекурсии — различия между версиями
Shersh (обсуждение | вклад) м (→Теорема о неподвижной точке) |
|||
| Строка 124: | Строка 124: | ||
</code> | </code> | ||
Программа <tex> p </tex> знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер. | Программа <tex> p </tex> знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер. | ||
| + | }} | ||
| + | |||
| + | ==Пример использования== | ||
| + | Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка <tex>L=\{p|p(\epsilon)=\perp\}</tex>. | ||
| + | {{Лемма | ||
| + | |id=st2 | ||
| + | |statement= Язык <tex>L=\{p|p(\epsilon)=\perp\}</tex> неразрешим. | ||
| + | |proof= | ||
| + | Предположим обратное, тогда существует программа <tex>r</tex> разрещающая <tex>L</tex>. | ||
| + | Рассмотрим следущую программу: | ||
| + | <code> | ||
| + | p(x) | ||
| + | if r(p) | ||
| + | return 1 | ||
| + | while true | ||
| + | </code> | ||
| + | Пусть <tex>p(\epsilon)=\perp</tex>. Тогда условие <tex>r(p)</tex> выполняется и <tex>p(\epsilon)=1</tex>. Противоречие. Если <tex>p(\epsilon) \ne \perp</tex>, то <tex>r(p)</tex> не выполняется и <tex>p(\epsilon)=\perp</tex>. Противоречие. | ||
}} | }} | ||
Версия 21:41, 14 декабря 2016
По теореме о рекурсии, программа может знать свой исходный код. Значит, в неё можно написать функцию , которая вернёт строку — исходный код программы. Далее будем считать, что такая функция определена в каждой программе.
Содержание
Неразрешимость универсального языка
| Утверждение: |
Универсальный язык неразрешим |
|
Допустим, что он разрешим. Тогда напишем такую программу:
p(x):
if u(getSrc(), x)
while true
else
return 1
Если , тогда программа на входе должна вернуть , но по условию она зависает, а следовательно, не принадлежит универсальному языку. Если же , то мы пойдём во вторую ветку условного оператора и вернём , значит, пара принадлежит универсальному языку, но , значит, пара не принадлежит. Опять получили противоречие. |
Теорема Успенского-Райса
— разрешимое семейство языков.
— множество программ, удовлетворяющих св-ву .
Теперь допустим, что язык разрешим. Тогда напишем такую программу:
propA(code): // программа, разрешающее свойство языка f(x): // такая программа , что ; существует потому что — нетривиальное свойство g(x): // такая программа , что ; существует потому что — нетривиальное свойство p(x): if propA(getSrc()) return g(x) else return f(x)
Если не удовлетворяет свойству , тогда будет выполняться всегда вторая ветка, и . Но язык программы принадлежит . Получили противоречие.
Если удовлетворяет свойству , то , а . Опять получили противоречие.
Колмогоровская сложность
| Определение: |
| Колмогоровской сложностью строки называется функция , которая равна минимальной длине программы . |
Сложность считается в каком-то фиксированном языке программирования. Так, например, у языков C++ и Python будет разная колмогоровская сложность одной программы.
Пример
Колмогоровская сложность программы, выводящей нулей . Просто программа, в которой записано нулей. Но можно записать и более короткую программу для больших со сложностью , например вот такую:
():
for i = 1..n
print(0)
| Теорема (Невычислимость Колмогоровской сложности): |
Колмогоровская сложность — невычислимая функция. |
| Доказательство: |
|
, если только или — невычислима. Допустим, что вычислима, тогда напишем такую программу:
p(): foreach x // перебираем слова по возрастанию длины if // теорема о рекурсии используется здесь print(x) exit Начиная с , . |
Busy beaver
| Утверждение: |
Функция Busy beaver невычислима. |
|
Предположим, что это не так. Тогда напишем такую программу
p():
for i = 1..BB() + 1
do smth
Такая программа всегда совершает больше шагов, чем функция от этой программы. А это невозможно, так равна максимальному числу шагов как раз этой программы. Получили противоречие. |
Аналог I теоремы Гёделя о неполноте
| Теорема: |
В любой "достаточно богатой системе" существует истинное недоказуемое утверждение. |
| Доказательство: |
|
Поясним, что это значит. Так как любой язык программирования эквивалентен машине Тьюринга, то всё связанное с ним кодируется в логике первого порядка с аксиомами Пеано (для этого достаточно, чтобы программа умела прибавлять к числу единицу и вызывать подпрограммы), поэтому можно в терминах программ получать утверждения, эквивалентные тем, что строил Гёдель. Можно переформулировать теорему следующим образом: невозможно доказать, что . Тогда напишем такую программу:
p(x):
foreach q
if q proves "p(x) зависает"
exit
|
Теорема о неподвижной точке
Зафиксируем главную нумерацию . Обозначим за множество слов, допускаемых программой с номером .
| Утверждение: |
|
Напишем такую программу:
p(q):
if p.getSrc() == q.getSrc()
return 1
else
while true
Программа знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число — свой номер. |
Пример использования
Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка .
| Лемма: |
Язык неразрешим. |
| Доказательство: |
|
Предположим обратное, тогда существует программа разрещающая .
Рассмотрим следущую программу:
p(x)
if r(p)
return 1
while true
Пусть . Тогда условие выполняется и . Противоречие. Если , то не выполняется и . Противоречие. |