<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=87.117.189.44&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=87.117.189.44&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/87.117.189.44"/>
		<updated>2026-04-08T21:06:03Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=62388</id>
		<title>Теорема о рекурсии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=62388"/>
				<updated>2017-12-01T19:22:58Z</updated>
		
		<summary type="html">&lt;p&gt;87.117.189.44: /* Теорема о рекурсии */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теорема о рекурсии== &lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольную вычислимую функцию от двух аргументов — &amp;lt;tex&amp;gt;V(x, y)&amp;lt;/tex&amp;gt;. Теорема о рекурсии утверждает, что всегда можно найти эквивалентную ей &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;, которая будет использовать саму себя для вычисления значения. Сформулируем теорему более формально.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1&lt;br /&gt;
|author=Клини&lt;br /&gt;
|about=о рекурсии / ''Kleene's recursion theorem''&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;V(n, x)&amp;lt;/tex&amp;gt; {{---}} [[Вычислимые функции|вычислимая функция]]. Тогда найдётся такая вычислимая &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall y:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Приведем конструктивное доказательство теоремы.&lt;br /&gt;
&lt;br /&gt;
Введем новые обозначения для псевдокода. Внутри блока '''program''' располагаются функции, среди которых есть функция &amp;lt;tex&amp;gt;\mathrm{main}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
 '''program int''' p('''int''' x):&lt;br /&gt;
   ...&lt;br /&gt;
 &lt;br /&gt;
   '''int''' main():&lt;br /&gt;
     ...&lt;br /&gt;
  &lt;br /&gt;
  ...&lt;br /&gt;
Тогда вызов &amp;lt;tex&amp;gt;\mathrm{p(x)}&amp;lt;/tex&amp;gt; — вызов функции &amp;lt;tex&amp;gt;\mathrm{main}&amp;lt;/tex&amp;gt; от соответствующего аргумента.&lt;br /&gt;
&lt;br /&gt;
Все входные данные далее можно интерпретировать как строки, поэтому все типы аргументов и возвращаемых значений будут иметь тип '''string'''. Пусть есть вычислимая &amp;lt;tex&amp;gt;V(x,y)&amp;lt;/tex&amp;gt;. Будем поэтапно строить функцию &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt; Предположим, что у нас в распоряжении есть функция &amp;lt;tex&amp;gt;\mathrm{getSrc()}&amp;lt;/tex&amp;gt;, которая вернет код &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;. Тогда саму &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; можно переписать так:&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       ...&lt;br /&gt;
Теперь нужно определить функцию &amp;lt;tex&amp;gt;\mathrm{getSrc()}&amp;lt;/tex&amp;gt;. Предположим, что внутри &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; мы можем определить функцию &amp;lt;tex&amp;gt;\mathrm{getOtherSrc()}&amp;lt;/tex&amp;gt;, состоящую из одного оператора &amp;lt;tex&amp;gt;\mathrm{return}&amp;lt;/tex&amp;gt;, которая вернет весь предшествующий ей код. Тогда &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; перепишется так.&lt;br /&gt;
&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       '''string''' src = getOtherSrc()&lt;br /&gt;
       '''return''' ```$src                    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// символ $ перед названием переменной  используется для подстановки значения этой переменной в строку&amp;lt;/font&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc():   &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// многострочные строки заключаются в ``` и используют &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; в качестве разделителя&amp;lt;/font&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return $src```&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getOtherSrc():&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;\mathrm{getOtherSrc()}&amp;lt;/tex&amp;gt; определяется очевидным образом, и мы получаем '''итоговую версию''' функции &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       '''string''' src = getOtherSrc()&lt;br /&gt;
       '''return''' ```$src &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc(): &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return $src```&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getOtherSrc():&lt;br /&gt;
       '''return''' ```function  p(int y):       &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  int V(string x, int y):&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    ...&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  int main():&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return V(getSrc(), y)&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  string getSrc():&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    string src = getOtherSrc()&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return \```$src &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;              &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc(): &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;              &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;   return \$src\```&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
Иначе говоря, если рассмотреть &amp;lt;tex&amp;gt;V(x, y)&amp;lt;/tex&amp;gt;, как программу, использующую &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в качестве исходного кода и выполняющую действие над &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, то теорема о рекурсии показывает, что мы можем написать эквивалентную ей программу &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;, которая будет использовать собственный исходный код.&lt;br /&gt;
&lt;br /&gt;
Приведем так же альтернативую формулировку теоремы и альтернативное (неконструктивное) доказательство.&lt;br /&gt;
&lt;br /&gt;
==Теорема о неподвижной точке==&lt;br /&gt;
Введем на множестве натуральных чисел следующее отношение: &amp;lt;tex&amp;gt;x \equiv y \Leftrightarrow U_x = U_y&amp;lt;/tex&amp;gt; и докажем вспомогательную лемму.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Функция &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением (&amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} continuation)''' функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;, если для всех таких &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; определено, &amp;lt;tex&amp;gt;g(x) \equiv f(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Для всякой вычислимой функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt;, являющаяся ее &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением.&lt;br /&gt;
|proof= Рассмотрим вычислимую функцию от двух аргументов &amp;lt;tex&amp;gt; V(n, x) = U(f(n), x)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — вычислимая, то существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; такая, что: &amp;lt;tex&amp;gt;V(n, x) = U(s(n), x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; будет являться &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением функции &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; определено, то &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; вернет другой номер той же вычислимой функции. Если же &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; не определено, то &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; вернет номер нигде не определенной функции.&lt;br /&gt;
Таким образом, мы нашли &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжение для произвольно взятой вычислимой функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|author=Роджерс&lt;br /&gt;
|about=о неподвижной точке / ''Rogers' fixed-point theorem''&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; {{---}} [[Диагональный_метод|универсальная функция]] для класса вычислимых функций одного аргумента, &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; {{---}} всюду определённая [[Вычислимые_функции|вычислимая функция]] одного аргумента. Тогда найдется такое &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;U_n=U_{h(n)}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(n)&amp;lt;/tex&amp;gt; — номера одной функции.&lt;br /&gt;
|proof=&lt;br /&gt;
Будем доказывать теорему от противного: предположим, что существует всюду определенная вычислимая функция &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, такая, что &amp;lt;tex&amp;gt;U_n \neq U_{h(n)}&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. В терминах введенного нами отношения, это значит, что &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; не имеет &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} неподвижных точек. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторую вычислимую функцию, от которой никакая вычислимая функция не может отличаться всюду. Такой будет, например &amp;lt;tex&amp;gt;f(x) = U(x, x)&amp;lt;/tex&amp;gt; (действительно, если предположить, что существует вычислимая функция &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, всюду отличная от &amp;lt;tex&amp;gt;f(n) = U(n, n)&amp;lt;/tex&amp;gt;, то нарушается определение универсальной функции.)&lt;br /&gt;
&lt;br /&gt;
Согласно доказанной нами лемме, существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;g(x)&amp;lt;/tex&amp;gt;, являющаяся &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением функции &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt;. Давайте зададим функцию &amp;lt;tex&amp;gt;t(x)&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;t(x) = h(g(x))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;h(x)&amp;lt;/tex&amp;gt; — искомая всюду определенная, вычислимая функция, не имеющая &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} неподвижных точек. Тогда &amp;lt;tex&amp;gt;t(x)&amp;lt;/tex&amp;gt; всюду отличается от &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; (в силу того, что &amp;lt;tex&amp;gt;h(x)&amp;lt;/tex&amp;gt; не имеет неподвижных точек.) Получили противоречие, из чего следует, что такой функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; не существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=идентификатор (необязательно), пример: proposalF. &lt;br /&gt;
|statement = &amp;lt;tex&amp;gt; \exists n : W_n = \{n\} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; W_n &amp;lt;/tex&amp;gt; {{---}} множество слов, допускаемых программой с номером &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию &amp;lt;tex&amp;gt; \mathrm{getSrc()} &amp;lt;/tex&amp;gt;, которая вернёт строку {{---}} исходный код программы. &lt;br /&gt;
Напишем такую программу:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;tex&amp;gt;p(q){:}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''if''' &amp;lt;tex&amp;gt;p. \mathrm{getSrc()}&amp;lt;/tex&amp;gt; == &amp;lt;tex&amp;gt;q. \mathrm{getSrc()}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''return''' 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      '''while''' ''true''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Программа &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Пример использования теоремы о рекурсии в доказательстве о неразрешимости языка==&lt;br /&gt;
Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка &amp;lt;tex&amp;gt;L=\{p \mid p(\varepsilon)=\perp\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=st2&lt;br /&gt;
|statement= Язык &amp;lt;tex&amp;gt;L=\{p \mid p(\varepsilon)=\perp\}&amp;lt;/tex&amp;gt; неразрешим. &lt;br /&gt;
|proof=&lt;br /&gt;
Предположим обратное, тогда существует программа &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; разрещающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим следущую программу:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;p(x){:}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;r(\mathrm{getSrc()})&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''return''' 1&lt;br /&gt;
   '''while''' ''true''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p(\epsilon)=\perp&amp;lt;/tex&amp;gt;. Тогда условие &amp;lt;tex&amp;gt;r(p)&amp;lt;/tex&amp;gt; выполняется и &amp;lt;tex&amp;gt;p(\epsilon)=1&amp;lt;/tex&amp;gt;. Противоречие. Если &amp;lt;tex&amp;gt;p(\epsilon) \ne \perp&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;r(p)&amp;lt;/tex&amp;gt; не выполняется и &amp;lt;tex&amp;gt;p(\epsilon)=\perp&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Участник:Shersh/Теорема_о_рекурсии]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:Kleene's_recursion_theorem | Wikipedia {{---}} Kleene's recursion theorem]]&lt;br /&gt;
* ''Верещагин Н. К., Шень А.'' '''Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции''' — М.: МЦНМО, 1999 - С. 176&lt;br /&gt;
* ''Kleene, Stephen'' '''On notation for ordinal numbers''' - The Journal of Symbolic Logic, 1938 - С. 150-155&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Теория вычислимости]]&lt;br /&gt;
[[Категория:Разрешимые и перечислимые языки]]&lt;/div&gt;</summary>
		<author><name>87.117.189.44</name></author>	</entry>

	</feed>