Изменения

Перейти к: навигация, поиск

Теорема о рекурсии

44 байта убрано, 21:04, 6 июня 2020
Теорема о рекурсии
'''string''' getSrc():
'''string''' src = getOtherSrc()
'''return''' ```$src <font color="green">// символ $ перед названием переменной используется для подстановки значения этой переменной в строку</font>
<nowiki>|</nowiki>string getOtherSrc(): <font color="green">// многострочные строки заключаются в ``` и используют <nowiki>|</nowiki> в качестве разделителя</font>
<nowiki>|</nowiki> return $src```
Иначе говоря, если рассмотреть <tex>V(x, y)</tex>, как программу, использующую <tex>x</tex> в качестве исходного кода и выполняющую действие над <tex>y</tex>, то теорема о рекурсии показывает, что мы можем написать эквивалентную ей программу <tex>p(y) = V(p, y)</tex>, которая будет использовать собственный исходный код.
Приведем так же альтернативую альтернативную формулировку теоремы и альтернативное (неконструктивное) доказательство.
==Теорема о неподвижной точке==
По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию <tex> \mathrm{getSrc()} </tex>, которая вернёт строку {{---}} исходный код программы.
Напишем такую программу:
<code>
<tex>p(q){:}</tex>
'''if''' <tex>p. \mathrm{getSrc()}</tex> == <tex>q. \mathrm{getSrc()}</tex>
'''return''' 1
'''else'''
'''while''' ''true''
</code>
Программа <tex> p </tex> знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер.
}}
==Пример использования теоремы о рекурсии в доказательстве о неразрешимости языка==
Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка <tex>L=\{p \mid p(\varepsilon)=\perp\}</tex>.
{{Лемма
|statement= Язык <tex>L=\{p \mid p(\varepsilon)=\perp\}</tex> неразрешим.
|proof=
Предположим обратное, тогда . Тогда существует программа <tex>r</tex> разрещающая , разрешающая <tex>L</tex>.Рассмотрим следущую следующую программу:<code> <tex> p(x){:}</tex> '''if''' <tex>r(\mathrm{getSrc()})</tex> '''return''' 1 '''while''' ''true''</code>Пусть <tex>p(\epsilonvarepsilon)=\perp</tex>. Тогда условие <tex>r(p)</tex> выполняется и <tex>p(\epsilonvarepsilon)=1</tex>. Противоречие. Если <tex>p(\epsilonvarepsilon) \ne \perp</tex>, то <tex>r(p)</tex> не выполняется и <tex>p(\epsilonvarepsilon)=\perp</tex>. Противоречие.
}}
693
правки

Навигация