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


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)=P⟨P⟩

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

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

Ось чому для доказування важливо виконати на собі, а не якийсь довільний ввід. Це поширена тема в доказах неможливості, відомих як діагональні аргументи.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.