Почему все функции не перечисляются?

29

Мы узнали о концепции перечисления функций. На практике они соответствуют языкам программирования.

В проходящем замечании профессор упомянул, что класс всех полных функций (то есть функций, которые всегда заканчиваются для каждого входа) не является перечисляемым. Это означало бы, что мы не можем разработать язык программирования, который позволил бы нам писать все полные функции, но не другие - что было бы неплохо иметь!

Так почему же мы (по-видимому) должны принять потенциал для прекращения, если мы хотим приличной вычислительной мощности?

Рафаэль
источник

Ответы:

24

Из-за диагонализации. Если бы было вычислимым перечислением всех полных вычислимых функций от N до N , так что каждое f e было бы полным, то g ( i ) = f i ( i ) + 1 также было бы полным вычислимым функция, но это не будет в перечислении. Это противоречило бы предположениям о последовательности. Таким образом, никакое вычислимое перечисление функций не может состоять из точно вычисляемых функций.(fe:eN)NNfeg(i)=fi(i)+1

Предположим, что мы думаем об универсальной вычислимой функции , где «универсальный» означает, что h является вычислимой двоичной функцией, и что для любой суммарной вычислимой унарной функции f ( n ) существует некоторая e, такая что f ( i ) = h ( е , я ) для всех я . Тогда также должно быть некоторое e, такое что g ( n ) = h ( e , n )h(e,i)hf(n)ef(i)=h(e,i)ieg(n)=h(e,n)не полная функция, из-за предыдущего абзаца. В противном случае даст вычислимое перечисление всех вычислимых унарных функций, которое включает в себя все суммарные вычислимые унарные функции.h

Таким образом, требование, чтобы каждая функция была системой функций, является тотально несовместимым с существованием универсальной функции в этой системе. Для некоторых слабых систем, таких как примитивные рекурсивные функции, каждая функция является тотальной, но не существует универсальных функций. Более сильные системы, которые имеют универсальные функции, такие как вычислимость по Тьюрингу, просто должны иметь частичные функции, чтобы позволить универсальной функции существовать.

Карл Муммерт
источник
Я просто хотел добавить, что кто-то нашел лазейку в диагонализации. Если вы используете типизированное представление для программы, вы можете использовать систему типов, чтобы запретить диагонализацию и создать общий самоинтерпретатор. См. Прорыв через барьер нормализации: самоинтерпретатор для F-omega для деталей.
хэтч 22
Конечно, система F не является полной системой Тьюринга. Документ, на который вы ссылаетесь, интересен; кажется, что им удается интересно использовать полноту Тьюринга интересным способом.
Карл Маммерт
Я не понимаю, почему «тогда также будет полностью вычислимой функцией». Если g - полная вычислимая функция, то k , f k = g , тогда оценка g ( k ) требует вычисления g ( k ) = f k ( k ) + 1 = g ( k ) + 1g(i)=fi(i)+1gk,fk=gg(k)g(k)=fk(k)+1=g(k)+1противоречие. Таким образом, кажется, что если существует перечисление всех вычислимых функций, мы не можем даже построить , поэтому мы не можем прийти к противоречию, чтобы опровергнуть исходную гипотезу (мы можем прийти к противоречию, но это просто опровергает, что g является полностью вычислимой). gg
agemO
И даже использование сдвинутой диагонали, чтобы избежать этой проблемы, может привести к противоречиям.
agemO
10

Просто чтобы прояснить ситуацию, нам нужно различать математические функции (я буду называть их функциями, и их часто неисчислимо много, так что они совсем не перечислимы) и функциями, которые вы можете написать: я буду называть их программами или также вычислимыми функциями .

SExExSxSS

Набор всех программ, которые являются общими для конечного набора , перечислим, потому что вы можете написать интерпретатор, который просто запустит программу для всех элементов конечного набора и вернет «да», если все они завершаются. (Но не вижу, если кто-то из них не делает)

Ваш профессор сказал, что набор всех программ, которые являются суммарными на бесконечном множестве , не перечисляем, потому что вы не можете просто запустить свою программу на бесконечном количестве элементов.

Но это не значит, что это плохо

  1. Например, набор, если все программы, которые доказуемо полны, является перечислимым, потому что вы можете перечислить все доказательства и механически проверить, доказывают ли они, что ваша программа полна.

  2. Даже перечислимый набор не будет практичным, потому что вам, возможно, придется ждать вечно, не будучи уверенным, что процедура прекратится однажды. Я не вижу, как использовать программы, которые перечисляют все общие функции ...

Есть некоторые языки программирования, в которых все, что вы пишете, гарантированно заканчивается только статической типизацией! Есть даже такие, которые гарантируют вам полиномиальную оценку. На данный момент они в основном академические, их написание, вероятно, заставит вас чувствовать больше ограничений, чем на Python, но над этим работает много исследователей.

Итак, чтобы ответить на ваш вопрос: в некотором смысле, да. Потенциальное отсутствие завершения необходимо, чтобы быть полным по Тьюрингу (самая высокая вычислительная мощность на данный момент). Но я не считаю, что это имеет непосредственное отношение к тому факту, что все функции перечислимы или нет. Вы все еще можете написать все программы!

jmad
источник
2
«потому что вы не можете просто запустить свою программу на бесконечном количестве элементов» - это слабый аргумент, поскольку мне может не потребоваться делать это, если я могу получить всю необходимую информацию из самой программы. Смотрите здесь вопрос, иллюстрирующий опасность ваших рассуждений.
Рафаэль
Верно. Я не утверждал, что это было доказательство (как всегда, вы должны построить диагональный аргумент) и, возможно, мне не следовало использовать слово «потому что». Я пытался ответить на ваш вопрос, который (я думал) был не о доказательстве утверждения вашего профессора, а о том, почему завершение противоречит вычислительной мощи.
Джмад