Чому загальні функції не перелічуються?


29

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

У короткому слові професор зазначав, що клас усіх сумарних функцій (тобто функцій, які завжди припиняються для кожного введення), не перелічується. Це означатиме, що ми не можемо розробити мову програмування, яка дозволяє нам писати всі сумарні функції, але ніяких інших ---, що було б непогано мати!

То як же, мабуть, ми маємо сприймати потенціал для припинення, якщо хочемо гідної обчислювальної потужності?

Відповіді:


24

Через діагоналізацію. Якщо було обчислювальним перерахуванням всіх загальних обчислюваних функцій від до , таким чином, щоб кожен був загальним, то також була б загальною обчислювальною функцією, але це не було б у перерахунку. Це суперечить припущенням щодо послідовності. Таким чином, жодне обчислювальне перерахування функцій не може складатися з загально обчислюваних функцій.(fe:eN)NNfeg(i)=fi(i)+1

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

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


Я просто хотів додати, що хтось виявив те, що виявляється лазівкою в діагоналізації. Якщо ви використовуєте набране представлення для програми, ви можете використовувати систему типів, щоб заборонити діагоналізацію та створити загальний самоперекладач. Докладніше див. Прорив через бар'єр нормалізації: Інтерпретатор F-омеги для деталей.
хетч22

Звичайно, Система F не є повною системою Тюрінга. Папір, яку ви зв'язали, цікава; видається, що їм вдається цікавим чином використати неповноту Тюрінга.
Карл Маммерт

Я не розумію, чому "тоді також буде загальною обчислювальною функцією". Якщо - загальна обчислювана функція, то , тоді для оцінки потрібно оцінити : контратракція. Отже, здається, що якщо є перерахування загальних обчислюваних функцій, ми навіть не можемо побудувати , щоб ми не могли досягти протиріччя, щоб спростувати початкову гіпотезу (ми можемо досягти протиріччя, але це просто спростує будучи тотально обчислюваним). g(i)=fi(i)+1gk,fk=gg(k)g(k)=fk(k)+1=g(k)+1gg
agemO

І навіть використання зміщеної діагоналі для уникнення цієї проблеми, здається, призводить до суперечностей.
agemO

10

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

Підмножина обчислюваного набору називається обчислювальною, якщо є програма, яка, елемент з відповідає "так", якщо і "ні", якщо . (І він завжди повинен щось реагувати) Набір називається рекурсивно перелічуваним, якщо програма дозволена не відповідати замість того, щоб сказати "ні". (еквівалентно вимагати, щоб програма повинна надрукувати всі елементи у будь-якому порядку)SExExSxSS

Набір усіх програм, що є загальним на кінцевому наборі, є численним, оскільки ви можете написати інтерпретатора, який просто запустить програму на всіх елементах кінцевого набору, і повернути "так", якщо всі вони закінчуються. (Але не можу побачити, чи немає цього)

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

Але це не означає, що це погано:

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

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

Є деякі мови програмування, де все, що ви пишете, гарантовано закінчується лише статичним набором тексту! Є навіть деякі, які гарантують вам поліноміальну зв’язок. Зараз вони здебільшого академічні, якщо писати в них, мабуть, ви відчуєте обмеження більше, ніж писати на Python, але над цим працює багато дослідників.

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


2
"тому що ви не можете просто запустити свою програму на безмежній кількості елементів" - це слабкий аргумент, тому що мені, можливо, не потрібно цього робити, якщо я можу врятувати всю необхідну інформацію від самої програми. Дивіться тут питання, що ілюструє небезпеку ваших міркувань.
Рафаель

Справді. Я не стверджував, що це доказ (як завжди, ви повинні побудувати діагональний аргумент), і, можливо, я не повинен був використовувати слово "тому що". Я намагався відповісти на ваше запитання, яке (я думав) стосується не доказу вашої професії, а того, чому припинення конфліктує з обчислювальною потужністю.
jmad
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.