Является ли проблема остановки вычислимой для определенных входных данных / предположений

19

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

Поэтому мой вопрос: является ли проблема остановки вычисляемой программой P для всех других программ, используемых в качестве входных данных, кроме самого P? Другими словами: проблема остановки не вычислима только в этом особом случае, или доказательство носит более общий характер, и я что-то упускаю?

Алессио Марторана
источник
Я думаю, вы неправильно понимаете доказательство того, что проблема остановки не вычислима. P (P) просто возвращает true, потому что P всегда определяет, останавливается ли программа за конечное время. Вам нужно сделать немного более хитрую конструкцию, чтобы достичь противоречия.
Дэн Стейли
Я думаю, что вы бы получили лучшие и, возможно, практически более актуальные ответы, если бы спросили, существует ли много программ, для которых решается проблема остановки. В конце концов, многие программы даже формально проверяемы , что, безусловно, включает определение, останавливаются ли они с заданными данными. Я настоятельно полагаю, что эту группу нельзя определить (потому что это будет равносильно решению ..., вы знаете), но для подавляющего большинства программ реального мира нет никаких препятствий для определения того, останавливаются они или нет, для соответствующих входных данных.
Питер - Восстановить Монику

Ответы:

10

Если - любая вычислимая функция, то g , определенный какfg

g(n)={f(n)if nkvotherwise

также вычислимо, для любого выбора .k,v

В принципе, если у вас есть программа которая вычисляет g ( n ) для всех n , кроме n = k , вы можете «исправить» этот случай (например, с помощью an ) и получить другую программу P, которая вычисляет g ( n ) для все п .Pg(n)nn=kif then elsePg(n)n

Следовательно, если бы вы могли вычислить функцию остановки «за исключением одного случая», вы также можете вычислить функцию остановки (без исключений). Из этого вы можете получить противоречие, как обычно.

Вывод: нет, вы не можете решить проблему остановки «кроме одного случая» (ни «кроме конечного числа случаев»).

чи
источник
1
Хорошо, я думаю, что получил математически ... Но мне было интересно: если бы я попытался написать программу, которая вычисляет HP, с какими конкретными проблемами я столкнулся бы? Почему и как в какой-то момент я бы понял, что не могу написать такую ​​программу?
Алессио Марторана
@AlessioMartorana Это зависит: как бы вы подошли к такой проблеме? Основная проблема заключается в том, что всегда должен останавливаться, даже если его ввод является программой без остановки - поэтому вы не можете просто попытаться смоделировать программу ввода. P
Чи
И предположим, что мы можем увидеть код входной программы? Разве мы не можем из кода увидеть, останавливается ли программа?
Алессио Марторана
2
@AlessioMartorana Мы действительно можем видеть код, но если есть, например, цикл while, мы не можем сказать много вообще. Цикл while может проверять все возможные доказательства произвольной математической гипотезы и останавливаться, только если доказательство найдено. Решение о том, останавливается ли этот цикл, означает решение о том, является ли гипотеза доказуемой. Решение HP даст нам машину, которая ответит Да (доказуемо) / Нет (не доказуемо) на любой формальный математический вопрос. Это было бы нереально мощным.
Чи
1
@AlessioMartorana Если вы думали, что написали программу, которая решает проблему HP, то если ваша программа не сработает, это можно сделать одним из двух способов: для некоторых программ это может привести к неверному результату (сказать, что что-то останавливается, если нет, или сказать, что что-то не ' не останавливаться, когда это происходит) и / или ваша решающая программа сама не остановится на многих входах, так что вы не можете знать, действительно ли она не остановится или ей просто нужно больше времени для вычисления ответа.
Shufflepants
21

вычисляется ли проблема остановки программой P для всех других программ, используемых в качестве входных данных, кроме самого P?

Нет. Рассмотрим бесконечную последовательность программ , где P i - это «Переместите  квадраты i вправо, затем  квадраты i влево, затем сделайте в точности то, что сделал бы P ». Каждая из этих программ выдает точно такой же вывод, что и  P, для каждого входа (включая цикл навсегда, если P  цикл навсегда), но все они разные программы.P1,P2,PiiiPPP

И вы не можете обойти это, только требуя, чтобы работал с программами, которые функционально не эквивалентны самому себе, поскольку это свойство также неразрешимо. Возможно, проблема была бы разрешима, когда она ограничена этими экземплярами (хотя я подозреваю, что это не так), но набор экземпляров неразрешим, поэтому вы не можете выполнить ограничение.P

Дэвид Ричерби
источник
15
Я подозреваю, что ваше последнее предложение, вероятно, верно, но я не думаю, что из этого следует, что, поскольку свойство неразрешимо, ограничение входного набора, основанного на этом свойстве, сделает проблему неразрешимой. В качестве глупого примера, если вы ограничите входной набор завершающими программами (неразрешимое свойство), проблема будет решаема (программой, которая всегда возвращает значение true).
Оуэн
3
@Owen Когда само ограничение неразрешимо, вы не можете наложить ограничение, чтобы оно ничего не купило в реальности.
Дэвид Ричерби
5

Существуют алгоритмы, которые показывают, что определенные классы программ останавливаются или не останавливаются. Например,

  • Можно алгоритмически определить, останавливается ли программа, которая моделирует конечный автомат.
  • Можно определить арифметически, останавливается ли линейно ограниченная машина Тьюринга
  • Если вы знаете, в каком классе сложности находится программа, то вы знаете, что программа останавливается для конечных входов.

Хотя нет алгоритма для определения того, останавливается ли произвольная программа, большая часть кода была разработана либо для остановки (как большинство подпрограмм), либо не для остановки (как бесконечный цикл для обработки событий), и возможно алгоритмически определить, что есть что. Другими словами, у вас может быть алгоритм, который отвечает либо «останавливается», «не останавливается», либо «я не знаю», и такой алгоритм может быть разработан для охвата достаточного количества программ, что было бы полезно.

Антонио Перес
источник
Какое это имеет отношение к goto? Разве у нас не может быть программа, которая использует goto и все еще решает, останавливается ли она, пока она моделирует конечный автомат?
Берги
Я собирался написать об остановке в терминах циклов for, а затем изменил ее, чтобы рассказать о машинах с конечным числом состояний и еще много чего
Антонио Перес
4

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

Дмитрий Григорьев
источник
3

Доказательство действительно более общее: проблема остановки является частным случаем теоремы Райс , которая утверждает

Φ

ABΦ(A)Φ(B)

xx

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

NkBB(k)

Антон Голов
источник
1
N
1
Последний абзац напоминает Busy Beaver.
Зло
Что касается «довольно радикальных» ограничений: тотальные языки программирования - это вещь. Они, как правило, требуют относительно высокой степени сложности, поэтому, возможно, вы считаете это радикальным, но возможно решить реальные проблемы в пространстве программ, которые могут быть остановлены.
Бен Милвуд
Включение ссылки на en.wikipedia.org/wiki/Rice%27s_theorem имело бы смысл для ИМО.
Дмитрий Григорьев
Спасибо, я обновил ответ. @BenMillwood Конечно, но учитывая, что их решение - «прекратить все», я не уверен, что это именно то, что ищет Алессио. Интересно было бы рассмотреть случай, когда поведение остановки является решающим, но нетривиальным: возможно, Agda + коиндуктивные типы?
Антон Голов
0

Пусть R - любое рекурсивно перечислимое, но нерекурсивное множество. Таких множеств бесконечно много. Пусть T машина Тьюринга, которая останавливается на входе k тогда и только тогда, когда k находится в R. Такой T существует для любого рекурсивно перечислимого множества. Невозможно написать программу, которая может решить проблему остановки для этого T. Это связано с тем, что любой алгоритм для определения того, останавливается ли T, даст алгоритм определения принадлежности к R, что невозможно, если R нерекурсивен. Поскольку существует бесконечно много таких R, каждый из которых дает разные машины Тьюринга, существует бесконечно много машин Тьюринга, на которых любая попытка остановить программу P потерпит неудачу.

Джон Колман
источник