Чому насправді проблема зупинки настільки важлива?


149

Я не розумію, чому проблема зупинки часто використовується для відхилення можливості визначити, чи припиняється програма. У Вікіпедії [стаття] [1] правильно пояснюється, що детермінована машина з обмеженою пам'яттю або зупинить, або повторить попередній стан. Ви можете використовувати алгоритм, який визначає, чи пов'язаний цикл списку реалізує функцію зупинки з складністю простору O (1).

Мені здається, що доказ проблеми зупинки - це не що інше, як так званий «парадокс», це самонавідне (хоча б циклічне) протиріччя так само, як і парадокс брехуна. Єдиний висновок, який він робить - це те, що функція зупинки сприйнятлива до таких неправильних питань.

Отже, виключаючи парадоксальні програми, функція зупинки визначальна. То чому ми вважаємо це доказом протилежного?

4 роки потому : Коли я це писав, я щойно переглядав це відео . Програміст отримує деякі програми, повинен визначити, які з них припиняються, а відео далі пояснює, чому це неможливо. Я був розчарований, бо знав, що з урахуванням деяких довільних програм існує певна можливість головного героя довести, чи вони припинені. Поняття загальності якось втрачено. Різниця між твердженням, що "деякі програми не можна довести, що вони припиняються", і "жодна програма не може бути доведена до припинення". Багато алгоритмів формально продемонстровано для цього. Нездатність зробити цю відмінність у кожному посиланні, яке я знайшов в режимі, було тим, як я дійшов до заголовка цього питання. З цієї причини я дуже ціную відповідь що перевизначає функцію зупинки як потрійну, а не булеву.


16
"детермінована машина з обмеженою пам'яттю" є "нудною", оскільки це не що інше, як кінцевий автомат; вони не корисні для моделювання обчислень загалом. Що стосується проблеми зупинки: це конкретний приклад для функції, яка не є (Тюрінг) обчислювальною. Якщо вас влаштовує неконструктивний доказ, вам це "не потрібно". Він все ще має історичну актуальність.
Рафаель

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

12
"Ви можете використовувати алгоритм, який визначає, чи пов'язаний цикл списку реалізує функцію зупинки з складністю простору O (1)", - але якщо ви хочете вирішити проблему для комп'ютера з 2 Гб пам'яті, вам знадобиться більше 2 ^ 2000000000 кроків і більший комп'ютер.
user2357112

11
Давно я балакав з товаришем про проблему зупинки, і хтось, що сидів поруч, запитав "що це за проблема зупинки? Це важливо?" і мій друг звернувся до нього і сказав: "Якщо ми зможемо вирішити проблему зупинки, ми могли б будувати міста на хмарах". Це правда.
Френсіс Дейві

8
@emory Твердження є правдиво вірним: P => Qсправедливо для будь-якого Q, якщо ми знаємо, що Pце помилково (і ми знаємо, що проблема зупинки не вирішується). Френсіс міг так само сказати: "Якби ми могли вирішити проблему зупинки, ми могли б знайти собі ліки від смерті". Це спосіб логічного визначення.
amalloy

Відповіді:


217

Тому що багато справді практичних проблем - це проблема зупинки у маскуванні. Рішення для них вирішує проблему зупинки.

Ви хочете компілятор, який знайде найшвидший машинний код для даної програми? Власне проблема зупинки.

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

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

У вас є антивірусна програма, і ви хочете перевірити, чи виконує вона коли-небудь шкідливу інструкцію. Насправді лише проблема зупинки.

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

  1. Кожен комп'ютер був би різним автоматом, залежно від точної кількості бітів оперативної пам’яті. Тому це не корисно для вивчення конкретного фрагмента коду, оскільки автомат залежить від машини, на якій він може працювати.

  2. Якщо у вас є n біт оперативної пам’яті, вам знадобиться стану. Отже, для вашого сучасного комп’ютера 8 Гб це 2 32000000000 . Це число настільки велике, що вольфрам альфа навіть не знає, як його інтерпретувати. Коли я роблю 2 10 9, він говорить, що він має 300000000 десяткових цифр. Це, очевидно, багато для зберігання в звичайному комп’ютері.2n2320000000002109300000000

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

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

ОНОВЛЕННЯ: Просто для вирішення декількох питань, порушених у коментарях.

@Tyler Fleming Cloutier: "Безглузда" проблема виникає у доказі того, що проблема зупинки не може бути вирішена, але те, що є в основі нерозбірливості, насправді має нескінченний простір пошуку. Ви шукаєте об’єкт із заданим властивістю, і якщо такого не існує, немає ніякого способу дізнатися, коли ви закінчите.

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

Докладніше про це дивіться в Арифметичній Ієрархії . Все, що вище можна визначити, хоча рівень 1 напіврозбірливий.Σ00=Π00

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

@Brent: так, це визнає, що це можна вирішити для сучасних комп'ютерів. Але це рішуче для конкретної машини. Якщо ви додасте USB-накопичувач з дисковим простором або можливістю зберігання в мережі чи щось інше, то машина змінилася і результат все ще не втримується.

Слід також сказати, що в алгоритмі буде багато разів, коли алгоритм говорить, що "цей код зупиниться", оскільки в ньому код вийде з ладу і не вистачить пам'яті, а додавання одного додаткового біта пам'яті призведе до коду досягти успіху і дати інший результат.

Річ у тому, що машини Тьюрінга не мають нескінченної кількості пам'яті. Ніколи не буває часу, коли на стрічку записується нескінченна кількість символів. Натомість машина Тьюрінга має "необмежену" пам'ять, це означає, що ви можете постійно отримувати більше джерел пам'яті, коли вам це потрібно. Комп'ютери такі. Ви можете додати оперативну пам’ять, USB-накопичувачі, жорсткі диски або мережевий накопичувач. Так, у вас не вистачає пам’яті, коли у вас залишається атомів у Всесвіті. Але наявність необмеженої пам’яті - набагато корисніша модель.


4
@Mehrdad Для будь-якого обґрунтованого визначення "найшвидшого машинного коду для даної програми" питання має сенс, а відповідь - "Не може бути такого компілятора".
Девід Річербі

13
Він також працює для пошуку найкоротшого можливого машинного коду для виводу, такого, який має найменший доступ до пам’яті тощо. Для загальних програм знайти оптимальне перетворення неможливо. Це в основному теорема Райса.
jmite

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

3
Він навіть з’являється в місцях, яких ви не очікували. Хочете написати компілятор C ++, який відхиляє всі недійсні програми, компілюючи всі дійсні? Спочатку вирішіть проблему зупинки - метапрограмування шаблонів на C ++ є завершенням Тьюрінга, тож повідомляйте, чи ваші шаблони дійсні чи ні в загальному випадку потребує вирішення.
Марк

7
@Merhrdad: Ваш приклад "моделювання всієї комп'ютерної програми" є прекрасним прикладом того, чому проблема зупинки настільки важлива. Для деяких програм моделювання програми не настільки просто, як здається (для прикладів дивіться на сторінці вікіпедії про зупинку). Якщо проблема може бути обманюючою в такому вигляді, ви можете уявити, як важко пояснити кому-небудь більш приховану форму (наприклад, антивірусну проблему)
Cort Ammon

49

На практиці це важливо, оскільки дозволяє сказати своїм неосвіченим начальникам "те, що ви просите, математично неможливо".

Проблема зупинки та різні проблеми, пов'язані з заповненням NP (наприклад, проблема продавця подорожей) виникають багато у формі "Чому ви не можете просто зробити програму, яка робить X?", І вам потрібно мати змогу дати пояснення чому це неможливо або нездійсненно протягом останнього життя Всесвіту.

Зауважте, що можна створити мову, яка не закінчена Тьюрінгом, тому її можна проаналізувати, заборонивши необмежену рекурсію та ітерацію.




8
можна створити мову, яка не закінчена Тюрінгом : Приклад корисної нетурїнської повної мови: SQL (насправді позбавлений SQL). Тюрінг-повнота автоматично додасть неприпинення до мови, що ви, мабуть, не хочете, коли виконуєте db-запит. (Хоча, я боюся, всі сучасні реалізації SQL так чи інакше пропонують
цінність

8
@FranciscoPresencia: вони використовували дослідницьку групу, тож загальна точка досі має місце.
RemcoGerlich

4
@MooingDuck: Flickr річ не вибирає між парками та птахами, вона (намагається) підтвердити те чи інше. АБО, не XOR.
рикстер

45

Ви можете використовувати алгоритм, який визначає, чи пов'язаний цикл списку реалізує функцію зупинки з складністю простору O (1).

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

Проблема зупинки для заданого комп'ютера кінцевого розміру не може бути вирішена на цьому комп'ютері кінцевого розміру. Це можна вирішити лише на великому комп’ютері. (Це стосується будь-якого методу, не лише того, який ви пропонуєте. Я не збираюся наводити офіційного підтвердження, але ось суть. Якщо комп'ютер C може запускати N різних програм, принаймні один P не припиняється , то комп'ютер V, який може перевірити, чи не повинні зупинятись ці N програми, також можна запускати N різних програм перевірки. Якщо C і V - це один і той же комп'ютер, то P не одна з N різних програм, що працює у V, тому комп'ютер повинен запускати принаймні N + 1 різних програм, що суперечить припущенню, що C запускає N різних програм.)

М2М256

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

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

Парадокс виходить не з проблеми, а з спроби вирішення. Для будь-якої програми існує алгоритм, який говорить "так", якщо програма припиняється, і "ні", якщо програма не припиняється. Це банально: print "yes"або print "no"зробить. Проблема полягає у визначенні, до кого дзвонити. Неможливість вирішити проблему зупинки означає, що не існує алгоритму, який би здійснював це визначення. Причина, якою доказ використовує аргумент діагоналізації, є те, що йому потрібно показати, що нірішення працює; для цього воно починається з довільного рішення, яке передбачається, і показує, що воно повинно пропустити деякі програми, побудувавши пропущену програму. Діагоналізація (те, що ви недоречно називаєте «парадоксом»), полягає в побудові, а не в отриманій програмі. Отримані в результаті програми не є самореференційними.

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


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

@supercat Так, ця властивість можна вирішити. Це не вирішується для загального випадку програми, яка приймає дані.
Жиль

1
У мене склалося враження, що проблема зупинки зазвичай передбачає, що весь вхід, який програма отримає в ході її виконання, входить у комплект програми. Якби в когось була машина, яка могла б магічно вирішити задачу зупинки для будь-якої програми, що подає якусь певну послідовність введення, чи може така машина визначити, чи зупинятиметься програма на всіх введеннях обмеженої довжини?
supercat

3
@supercat Ні, оракул "зупинка для всіх входів" був би на крок далі, ніж оракул "зупинки для даного введення". Це створило б гарне запитання для цього сайту ... насправді у нас він є . До речі, моя ментальна модель за замовчуванням - це рекурсивні функції, де "введення" означає "аргумент", а запуск програми означає застосувати її до аргументу; ви праві, що моє твердження неправдиве в контексті, що стосується машин Тьюрінга, я його оновлю.
Жиль

28

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

Ні, це не проблема зупинки. Парадокси, як парадокс брехуна, не є істинними або помилковими, вони просто не мають сенсу. Детермінований алгоритм з іншого боку або зупиниться на заданому вході, або він запуститься назавжди. Функціяhalts(program, input) має ідеально чітке, детерміноване значення для кожної програми, для кожного введення. Ми просто не можемо вирішити це для будь-якої програми. Або, точніше: ми не можемо написати програму, яка може вирішити її для кожної пари / вхідної пари.

Σ(н): =ннннΣ(н)


2
Варто зазначити, що в загальній формі Парадокс брехуна чітко посилається на себе, але така ж проблема може виникнути, навіть якщо цього немає. Чи є відповідь на висловлювання, утворений текстом, "Чи відповідь на заяву формується шляхом взяття тексту та вставлення після першої коми копії, доданої до лапок, ні?" і вставляючи після першої коми копію, укладену в єдині лапки, ні? Таке твердження не є явно самореференційним, але посилається на правдивість твердження, яке є ідентичним за характером.
supercat

2
@supercat: так, я не думаю, що раніше я бачив королеву англійською мовою ...
SamB

@SamB: Я бачив декілька, але вирішив спробувати свої сили в оригінальній рецептурі, яка, хоч і більш багатослівна, ніж деякі, читає (можливо) природніше.
supercat

24

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

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

І друге, навіть теоретично має сенс розглядати сучасний комп’ютер як нескінченну державну машину. У машини Тьюрінга немає нескінченної стрічки, вона має стрічку, яку завжди можна подовжити, коли у машини не вистачає пам'яті. І чи не це саме те, що ми можемо зробити з реальними комп'ютерами? (А якщо адресний простір процесора закінчиться, ми можемо використовувати хмару тощо)

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

НПхНПх

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


1
+1 для пояснення взаємозв'язку між реальними комп'ютерами, машинами з кінцевим станом та машинами Тюрінга, що є важливою частиною налаштування цього питання.
Девід Річербі

1
Ви викликали мій інтерес. Яка різниця між явним протиріччям та реальним протиріччям?
Брент

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

3
@Brent. Багато парадоксів зовсім не суперечливі, а лише з першого погляду. Коли ми придивимось ближче, виявляється помилка в міркуванні, або якесь слово, значення якого трохи змінилося, використовуючи його в іншому контексті, або щось подібне. Однак іноді парадокс виявляє на світ справжнє протиріччя.
Hoopje

Я вивчав цю проблему і вимикав з моєї ОП. Чи означає, що теорема про незавершеність Ґеделя означає, що завжди можна придумати якийсь парадокс незалежно від використовуваної логіки?
Брент

17

jmite відповів на питання дійсно чудово. Дозвольте додати невелику побічну записку щодо сприйнятої схожості з "Парадоксом брехуна", який, на мою думку, викликаний їх використанням механізму самонавіювання.

Самонавіювання не є парадоксальним!

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

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


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

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

с2с


14

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

Ще один цікавий аспект полягає в тому, що в теорії чисел (Діофантіна), що виникає з греками, виникають деякі дуже старі проблеми, що не доказуються тисячоліттями. є пов'язаний результат, що загальні питання щодо рівнянь Діофантіна не можна вирішити, називаючись 10-ю проблемою / теоремою Гільберта . Гільберт жив на межі 20 століття і запропонував як дослідницьку програму, щоб математика могла знайти систематичні підходи до математичних задач. цей виклик / план був серйозно вражений виявленням нерозбірливості через кілька десятиліть. нерозбірливість продовжує залишатися дуже розвиненою сферою досліджень, і межа між невирішеними та вирішуваними проблемами, ймовірно, завжди буде вивчатися та аналізуватися.


14

Ви, мабуть, плутаєте класичний «самореференційний» доказ, що проблема зупинки не може бути вирішена самою проблемою Холтінг (він же Halt).

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

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

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

Нехай S - деяка нетривіальна властивість 1, яку приймає машина Тьюрінга. Це означає, що існує принаймні одна машина Тьюрінга, яка приймає вхід із властивістю S, і одна, яка ні.

Тоді не можна визначити, якщо дана машина Тьюрінга T приймає вхід із властивістю S.

Ви хочете знати, чи приймає машина Тьюрінга цілі числа? Не можна визначити.

Ви хочете знати, чи приймає машина Тьюрінга приймає арифметичні послідовності? Не можна визначити.

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


1 До property ofнього не входить механізм того, як його прийнято, - лише те, що прийнято. "Це приймає в 100 і менше кроків" - це властивість, як вона приймає, а не те, що прийнято.


Ви можете пояснити, що таке "властивість", оскільки наївна інтерпретація, можливо, буде неправильною.
Рік Декер

@rick Я думаю, виноска зараз охоплює це?
Якк

7

Ви маєте рацію, що проблема зупинки, як зазвичай вводиться та заявляється, є простою суттю. Це не доводить, що не може бути тризначної ("зупинки", "петлі", "не знаю") функція зупинки, яка на практиці завжди повертає "зупинки" або "петлі" і повертає лише "Не" t know 'для спеціально побудованих кутових шаф, наприклад.

Дві причини зупинки важливі:

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

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

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


5

Є суперечливий аргумент, викладений Еріком Хенером у серії робіт, в яких стверджується, що нерозв'язність проблеми зупинки зазвичай неправильно зрозуміла. Документи "Епіменіди, Гедель, Тюрінг: вічний золотий клубок", "Проблеми з проблемою зупинки", "Реконструкція проблеми зупинки" та "Проблема зупинки" можна знайти тут . Так що ця відповідь не є "лише посиланням", я спробую узагальнити один із його висновків, але не аргумент.

f(0)=1f(0)=2годгод(М)МНгодгод


3
Я не стежу за цим. Функція зупинки - це ідеально чітко визначений і дійсний предикат - для будь-якої машини Тьюрінга та будь-якого даного вводу машина зупиняється чи петля. (Вам не вистачає належної посилання; якого папа ви підсумовуєте?)
Рафаель

@Raphael Про те, що функція добре визначена, загальноприйнято як факт. Точка зору Генера відрізняється і пояснюється в його роботах. Я відредагую свою відповідь, щоб вказати назви паперів.
Теодор Норвелл

Скажімо, що, як би не було аргументації Генера [я не читав статті], вони виявилися суперечливими, принаймні, у першому читанні / наближенні: ' cs.toronto.edu/~hehner/Shallitaffair.pdf та recursed.blogspot.com/ 2013/10 / eric-hehner-replies.html
Фіз

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

Його докази здаються дуже твердими і вказують на те, що це лише перероблення дурних речей, які ви можете зробити у філософії, наприклад, намагаючись проаналізувати таке самореференційне твердження на предмет його правдивості: "Це речення помилкове". що, якщо істина означає, що вона помилкова, це означає, що вона насправді була правдою, ні, це не робить її знову помилковою ... тож це виглядає як не настільки важливе філософське морське пильне питання. en.wikipedia.org/wiki/Liar_paradox парадокс зупинки може бути випадком, коли вчені не розмовляють з філософами.
Джеймс Уейкфілд

3

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

Це остання лекція курсу MIT 1986 «Структура та інтерпретація» ; професор запитує "Чи є питання?" і готується закінчити лекцію, коли хтось із студентів запитує: "Це останнє питання?"

Подумайте про це на мить. Як вчитель може відповісти на це? Якщо учень вирішить суперечити вчителю, то не може дати відповіді, яку вчитель може дати - це подібно до проблеми зупинки.

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

PS: Якщо ви не знаєте, про який курс я говорю, переходьте його, це приголомшливо.


Але якщо я би виконав doesHalt(programCode, input);, програма не може знати, що doesHaltфункція повертає. Програма не може зупинитися після того, як doesHaltфункція її оцінила.
Tvde1

0

Я легко можу написати програму, яка дала вхід n, або виводить найменший простий p> n такий, що p + 2 також є простим, або працює вічно, якщо такого p не існує. Якщо ви зможете вирішити проблему, щоб передбачити, чи зупиняється моя програма на кожен вхід, ви просто вирішили Twin Prime Conjecture.

Цілком можливо, що ця гіпотеза може виявитись невід’ємною, і в цьому випадку у нас буде проста програма, коли програма зупинки не вдається.


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