Підтвердження невирішеності проблеми зупинки


25

У мене виникають проблеми з розумінням доказів нерозбірливості проблеми зупинки.

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

Якщо повертає програма чи ні а привали на вході б , то чому ми повинні передати код P і для а і б ?H(a,b)abPab

Чому ми не можемо подати з P та деяким довільним введенням, скажімо, x ?H()Px


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

2
Ви можете годувати будь-яким входом. Структура цього доказу вимагає врахування конкретного вкладу. H
Девід Річербі

1
Ви можете надати будь-який вхід до програми. Мета - знайти протиріччя. Теоретично машина 'H' повинна працювати для всіх видів входів. Таким чином, ми розглядаємо один із усіх можливих даних, що призводить до суперечності.
Угнес

Цей доказ тонко хибний. Подумайте, чи є у мене H (), який працює для всього, крім самого себе; це все-таки було б загальним рішенням проблеми зупинки.
Джошуа

Пов’язаний, можливо, дублікат: cs.stackexchange.com/questions/42819/…
Ilmari Karonen

Відповіді:


27

Доказ має на меті знайти протиріччя. Ви повинні зрозуміти, що таке протиріччя, щоб зрозуміти, чому використовується як вхід до себе. Суперечність полягає в неофіційному: якщо у нас є машина H (a, b), яка вирішує "a accept b", то ми можемо побудувати машину, яка приймає машини, які не приймають себе. (Read , що кілька разів , поки ви НЕ отримаєте.) Машина , вказаний на зображенні - давайте назвемо його M - M ( P ) = це P не приймає P ?PMM(P)=PP

Протиріччя відбувається , коли ви запитаєте: це приймає M ? Спробуйте опрацювати два варіанти, щоб побачити, як існує суперечність.MM

приймаєM тоді і тільки тодіколи M не приймаєM ; це явно суперечність.MMMM

Ось чому для доказування важливо виконати на собі, а не якийсь довільний ввід. Це поширена тема в доказах неможливості, відомих як діагональні аргументи.P


38

На хвилину проігноруйте малюнок; ми незабаром дістанемося до цього. Програма повинен бути привал тестер: коли ми даємо H вхід програми а (думати про як лістинг програми) і взагалі нічого для Ь , Н ( , б ) діє такH(a,b)HaabH(a,b)

  1. Якщо програма представлена привалах , коли дається б в якості вхідних даних, H ( , б ) буде відповідати «так». З іншого боку, якщо програма описується через пробіги назавжди , коли не задані вхідні Ь , то H ( , б ) буде відповідати «ні».abH(a,b)abH(a,b)
  2. Важливо, що програма завжди зупиняється і дасть правильну відповідь для будь-яких пар ( a , b ) .H(a,b)

Аргумент про те, що неможливо побудувати, покладається на дію певної "збоченої" програми Р , тієї, яка використовує Н як підпрограму. P приймає в якості списку будь-яку програму, x , і робить наступне:HPHPx

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

Це не важко побачити

зупиняється тоді і лише тоді, коли програма x буде працювати назавжди, коли давати власний опис як вхідний.P(x)x

Поки що добре: , безумовно, буде програмою , якщо її підпрограма H - це програма.PH

Тепер поверніться до картини. Що станеться, якщо дано власний опис як вхідний? Малюнок описує саме такий сценарій: Нехай p - опис програми P , тоді, замінюючи виділену вище частину, у нас будеPpP

зупиняється тоді і лише тоді, коли програма P ( p ) буде працювати вічно.P(p)P(p)

Зрозуміло, що ця парадоксальна поведінка неможлива, тому ми змушені зробити висновок, що підпрограма не може бути тестером зупинки, оскільки вона не спрацьовує в одному випадку, коли вона введена ( p , p ) як вхід. Можуть бути й інші випадки, коли Н працює як слід, але оскільки H не працює принаймні в одній ситуації, він не може бути повним тестером зупинки, як потрібно.H(p,p)HH


Мені подобається ця відповідь. Хоча тепер, коли я розумію докази, це, як видається, доводить, що H може кинути виняток із обмеження рекурсії.
Факс

2
@Fax Hне дзвонять більше одного разу, рекурсії в жодному разі немає P. H(P, P)не виконується P, він просто "магічно" визначає, Pзупиняється чи ні, коли він передається сам.
Ajedi32

@ Ajedi32 H(P,P)не потрібно виконувати P, але він повинен виконуватись H(x ↦ H(x,x), P)як частина визначення, чи Pзупиняється. Який розширюється на H(x ↦ H(y ↦ H(y,y), x), P)тощо.
Факс

@Fax Реалізація Hне вказана в цьому доказі. Так що ні, не потрібно нічого виконувати, будь то Pчи сам. Доказ починається з припущення, що Hіснує якась програма , яка магічно вирішує проблему зупинки, а потім доводить, що саме існування такої програми було б протиріччям, і, отже, такої програми не існує.
Ajedi32

1
@Fax Ви хочете сказати, що може існувати програма, яка вирішує проблему зупинки, за винятком випадків, коли вона викликається. Див. Чи є докази нерозв'язності проблеми зупинки, яка не залежить від самонаправлення або діагоналізації? за цікаве запитання з цього приводу.
Ajedi32

9

Спробуйте гарніший доказ з анімацією. А оскільки ansewrs має містити більше, ніж просто посилання на сайт, ось відповідь на ваше запитання.

Спочатку згадаймо, як працює доказ існування оракула Халтінг. Ми доводимо, що з урахуванням будь-якого кандидата Hна оракул Halting є програма Pта вхід, aдля яких Hне можна правильно передбачити, що P(a)робить.

Теорема: Нехай Hбудь-яка програма, яка бере два входи і завжди повертає haltабо loop. Тоді існує програма Qі вхід aтакий, що Q(a)зупиняє, якщо і тільки тоді, H(Q,a)повертається loop.

Доказ. Розгляньте програму

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Нехай Q = Pі a = P. Або H(Q,a) = haltабо H(Q,a) = loop:

  • якщо H(Q,a) = haltтоді Q(a)(що просто P(P)) працює вічно за визначенням P.
  • якщо H(Q,a) = loopтоді Q(a)зупиниться на дефінітоїні P.

QED

Ви запитали, чому ми розглядаємо H(P,P)замість H(P,X)когось іншого X. Очевидна відповідь - «бо H(P,P)це те, що змушує довести роботу»! Якби ви використовували H(P,X)якусь довільну X, то ви застрягли б. Дійсно, доказ виглядав би так:

Зламаний доказ. Розгляньте програму

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Нехай Q = Pі a = Xдля деяких довільно X. Або H(Q,X) = haltабо H(Q,X) = loop:

  • припустимо, H(Q,X) = haltтоді ми не можемо сказати, що P(X)робить, бо чи P(X)зупинки залежать від того, що H(X,X)повертається. Ми застрягли. Однак, якби ми це знали P(X)і X(X)були однаковими, ми могли б досягти прогресу. (Отже, ми насправді повинні брати X = P).
  • якби H(Q,a) = loopтоді ми знову застрягли, і ми були б відклеєні, якби X = P.

Немає QED.

Я сподіваюся, що це свідчить про те, що ми повинні розглянути H(P,P), щоб наша ідея спрацювала.


Ха-ха. Дивовижно! :)
aelguindy

2

Результатом підтвердження є така аналогія:

P(P)P(P)P(P)(P)(P)

(P)(P)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.