Чи зупиняється проблема, яку можна підрахувати для конкретних входів / припущень


19

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

Отже, моє запитання: чи зупиняється проблема, яку можна обчислити програмою P для всіх інших програм, що використовуються в якості вхідних даних, крім самого P? Іншими словами: чи проблема зупинки не піддається обчисленню лише в цьому спеціальному випадку, або доказ більш загальний, і я чогось пропускаю?


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

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

Відповіді:


10

Якщо - будь-яка обчислювана функція, то , визначена якgfг

г(н)={f(н)якщо нкvінакше

також обчислюється для будь-якого вибору .к,v

В основному, якщо у вас є програма яка обчислює g ( n ) для всіх n ' s, крім n = k , ви можете "виправити" цей випадок (наприклад, використовуючи an) і отримати іншу програму P, яка обчислює g ( n ) для всі н .П'г(н)нн=кif then elseПг(н)н

Отже, якщо ви могли обчислити функцію зупинки "за винятком одного випадку", ви можете також обчислити функцію зупинки (без винятку). З цього можна отримати протиріччя, як зазвичай.

Висновок: ні, ви не можете вирішити проблему зупинки "за винятком однієї справи" (ні "за винятком безлічі випадків").


1
Гаразд, я думаю, що це я отримав математично ... Але мені було цікаво: якщо я спробую написати програму, яка обчислює HP, з якими конкретними проблемами я зіткнувся б? Чому і як я в якийсь момент зрозумів, що не можу написати таку програму?
Алессіо Марторана

@AlessioMartorana Це залежить: як би ви підійшли до такої проблеми? Основне питання полягає в тому, що завжди повинен зупинятися, навіть коли його вхід є програмою, що не зупиняється, тому ви не можете просто спробувати імітувати програму введення. П
чі

І припустимо, що ми можемо побачити код програми введення? Чи не можемо ми з коду побачити, чи зупиняється програма?
Алессіо Марторана

2
@AlessioMartorana Ми дійсно можемо побачити код, але якщо є, наприклад, цикл часу, ми взагалі не можемо сказати багато. Певний час цикл може перевірити всі можливі докази довільної математичної гіпотези та зупинитись лише в тому випадку, якщо буде знайдено доказ. Вирішити, чи припиняється ця петля, означає вирішити, чи можна вважати доказову. Вирішення HP дасть нам машину, яка відповіла б так (підтверджується) / ні (не можна довести) на будь-яке формальне математичне запитання. Це було б нереально сильно.
чі

1
@AlessioMartorana Якщо ви думаєте, що ви написали програму, яка вирішує HP, то ваша програма вийде з ладу одним із двох способів: для деяких програм вона може повернути неправильний результат (сказати, що щось зупиняється, коли це не відбувається, або говорити, що щось не робить " не зупинятись, коли це станеться) та / або сама програма вирішення не зупиниться на багатьох входах, не знаючи, чи справді вона не зупиниться, чи їй просто потрібно більше часу для обчислення відповіді.
Shufflepants

21

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

Ні. Розглянемо нескінченну послідовність програм , де P i - "Перемістіть голову i  квадрати вправо, тоді я  квадрати ліворуч, тоді зробіть саме те, що зробить P ". Кожна з цих програм дає точно такий же результат , як  P для кожного входу (включаючи зациклення , якщо P  зациклюється), але вони всі різні програми.П1,П2,ПiiiППП

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


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

3
@Owen Якщо обмеження саме по собі не можна визначити, ви не можете накладати обмеження, щоб воно не могло купити вам нічого в реальності.
Девід Річербі

5

Існують алгоритми, які показують, що певні класи програм роблять або не зупиняються. Наприклад,

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

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


Що це стосується goto? Чи не можемо ми мати програму, яка використовує goto, і все ж вирішувати, чи зупиняється вона, доки вона моделює машину з кінцевим станом?
Бергі

Я збирався писати про зупинку з точки зору for-циклів, а потім змінив її, щоб лише поговорити про машини з кінцевим станом і про що
Антоніо Перес

4

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


3

Доказ дійсно більш загальний: проблема зупинки - це особливий випадок теореми Райса , який стверджує

Φ

АБΦ(А)Φ(Б)

хх

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

NкББ(к)


1
N

1
Останній абзац нагадує зайнятого бобра.
Злий

Що стосується "досить різких" обмежень: загальна мова програмування - річ. Вони, як правило, вимагають відносно високого ступеня витонченості, тому, можливо, ви вважаєте це радикальним, але реально вирішити проблеми можна в просторі програм, які суттєво зупиняються.
Бен Мілвуд

Включення посилання на en.wikipedia.org/wiki/Rice%27s_theorem має сенс IMO.
Дмитро Григор’єв

Дякую, я оновив відповідь. @BenMillwood Безумовно, але враховуючи, що їх рішення - "зробити все зупиненим", я не впевнений, що це дійсно те, що шукає Алессіо. Однак випадок, коли поведінка зупинки вирішальна, але нетривіальна, було б цікавим: можливо, Agin + коіндуктивні типи?
Антон Голов

0

Нехай R - будь-яка рекурсивно перелічувана, але нерекурсивна множина. Таких наборів нескінченно багато. Нехай T - машина Тьюрінга, яка зупиняється на вході k тоді і тільки тоді, коли k знаходиться в R. Такий T існує для будь-якого рекурсивно переліченого набору. Неможливо написати програму, яка може вирішити проблему зупинки для цієї Т. Це пов'язано з тим, що будь-який алгоритм визначає, чи не зупинився б T-алгоритм визначення належності до R, що неможливо, якщо R нерекурсивний. Оскільки існує нескінченно багато таких R, кожен з яких дає різні машини Тьюрінга, є нескінченно багато машин Тьюрінга, на яких будь-яка спроба зупинки програми P не вдасться.

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