Проблема с остановкой - Halting problem
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Сентябрь 2018 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В теория вычислимости, то проблема остановки проблема определения по описанию произвольного компьютерная программа и вход, будет ли программа завершена или продолжена работать вечно. Алан Тьюринг в 1936 г. доказал, что генерал алгоритм для решения проблемы остановки для всех возможных пар программа-ввод не может существовать.
Для любой программы ж это может определить, останавливаются ли программы, "патологическая" программа грамм, вызываемый с некоторым входом, может передавать свой собственный источник и свой вход в ж а затем конкретно делать противоположное тому, что ж предсказывает грамм Сделаю. Нет ж может существовать, который занимается этим делом. Ключевой частью доказательства является математическое определение компьютера и программы, известное как Машина Тьюринга; проблема остановки неразрешимый над машинами Тьюринга. Это один из первых случаев проблемы решения оказалось неразрешимым. Это доказательство важно для практических вычислений, поскольку определяет класс приложений, которые никакое изобретение в области программирования не может выполнять идеально.
Джек Коупленд (2004) приписывает введение термина проблема остановки к работе Мартин Дэвис в 1950-е гг.[1]
Фон
Проблема остановки - это проблема решения о свойствах компьютерных программ на фиксированной Полный по Тьюрингу модель вычислений, то есть все программы, которые могут быть написаны в некоторой данной язык программирования это достаточно общее, чтобы быть эквивалентным машине Тьюринга. Проблема состоит в том, чтобы определить, учитывая программу и входные данные для программы, остановится ли программа в конечном итоге при запуске с этим входом. В этой абстрактной структуре нет ограничений по ресурсам на объем памяти или время, необходимое для выполнения программы; это может занять произвольно много времени и использовать произвольный объем памяти перед остановкой. Вопрос просто в том, остановится ли данная программа на определенном входе.
Например, в псевдокод, программа
- пока (правда) продолжить
не останавливается; скорее, это продолжается вечно в бесконечный цикл. С другой стороны, программа
действительно останавливается.
Хотя решить, останавливать ли эти программы просто, более сложные программы оказываются проблематичными. Один из подходов к решению проблемы может заключаться в том, чтобы запустить программу, сделав некоторое количество шагов, и проверить, не останавливается ли она. Но если программа не останавливается, неизвестно, остановится ли программа в конечном итоге или будет работать вечно. Тьюринг доказал, что не существует алгоритма, который всегда правильно решает, останавливается ли для данной произвольной программы и ввода программа при запуске с этим вводом. Суть доказательства Тьюринга состоит в том, что любой такой алгоритм может противоречить самому себе и, следовательно, не может быть правильным.
Последствия программирования
Немного бесконечные циклы может быть весьма полезным. Например, петли событий обычно кодируются как бесконечные циклы.[2]Однако большинство подпрограмм предназначены для завершения (остановки).[3]В частности, в жестких вычисления в реальном времени, программисты пытаются писать подпрограммы, которые не только гарантированно завершатся (остановятся), но также гарантированно завершатся до заданного крайнего срока.[4]
Иногда эти программисты используют какой-либо универсальный (полный по Тьюрингу) язык программирования, но пытаются писать в ограниченном стиле, например MISRA C или же ИСКРА - что позволяет легко доказать, что результирующие подпрограммы завершаются раньше заданного срока.[нужна цитата ]
В других случаях эти программисты применяют правило наименьшей мощности - они намеренно используют компьютерный язык, который не является полностью полным по Тьюрингу. Часто это языки, которые гарантируют завершение всех подпрограмм, например Coq.[нужна цитата ]
Общие подводные камни
Сложность проблемы остановки заключается в том, что процедура принятия решения должна работать для всех программ и входов. Конкретная программа либо останавливается на заданном входе, либо не останавливается. Рассмотрим один алгоритм, который всегда отвечает «останавливается», а другой - «не останавливается». Для любой конкретной программы и ввода один из этих двух алгоритмов отвечает правильно, даже если никто не знает, какой именно. Однако ни один алгоритм не решает проблему остановки в целом.
Есть программы (переводчики ), которые имитируют выполнение предоставленного им исходного кода. Такие программы могут продемонстрировать, что программа действительно останавливается, если это так: сам интерпретатор в конечном итоге останавливает свое моделирование, что показывает, что исходная программа остановилась. Однако интерпретатор не остановится, если его входная программа не остановится, поэтому этот подход не может решить проблему остановки, как указано; он не отвечает успешно "не останавливается" для программ, которые не останавливаются.
Проблема остановки теоретически разрешима при линейно ограниченные автоматы (LBA) или детерминированные машины с конечной памятью. Машина с ограниченным объемом памяти имеет конечное количество конфигураций, и поэтому любая детерминированная программа на ней должна в конечном итоге либо останавливаться, либо повторять предыдущую конфигурацию:
- ...любой конечный автомат, если его полностью предоставить самому себе, в конечном итоге превратится в идеально периодическую повторяющуюся модель. Продолжительность этого повторяющегося паттерна не может превышать количество внутренних состояний машины ... (курсив в оригинале, Минский 1967, стр. 24)
Мински, однако, отмечает, что компьютер с миллионом мелких деталей, каждая из которых имеет два состояния, будет иметь как минимум 21,000,000 возможные состояния:
- Это единица, за которой следует около трехсот тысяч нулей ... Даже если бы такая машина работала на частотах космических лучей, эоны галактической эволюции были бы ничем по сравнению со временем путешествия через такой цикл ( Минский 1967 с. 25):
Мински утверждает, что, хотя машина может быть конечной, конечные автоматы «имеют ряд теоретических ограничений»:
- ... вовлеченные величины должны наводить на мысль, что теоремы и аргументы, основанные главным образом на простой конечности [диаграммы] состояний, могут не иметь большого значения. (Минский с. 25)
Также можно автоматически решить, остановится ли недетерминированная машина с конечной памятью ни на одной, некоторых или всех возможных последовательностях недетерминированных решений, путем перечисления состояний после каждого возможного решения.
История
Проблема остановки исторически важна, потому что это была одна из первых проблем, которые нужно было доказать. неразрешимый. (Доказательство Тьюринга было опубликовано в мае 1936 г., тогда как Церковь Алонсо доказательство неразрешимости проблемы в лямбда-исчисление уже был опубликован в апреле 1936 г. [Church, 1936]). Впоследствии были описаны многие другие неразрешимые проблемы.
График
- 1900: Дэвид Гильберт задает свои «23 вопроса» (теперь известные как Проблемы Гильберта ) на втором Международный конгресс математиков в Париже. "Из них вторым было доказательство последовательности"Аксиомы Пеано 'от которого, как он показал, зависела строгость математики "(Ходжес, стр. 83, комментарий Дэвиса в Davis, 1965, стр. 108).
- 1920–1921: Эмиль Пост исследует проблему остановки для системы тегов, считая его кандидатом на неразрешимость. (Абсолютно неразрешимые проблемы и относительно неразрешимые предположения - счет предвкушения, in Davis, 1965, pp. 340–433). Его неразрешимость была установлена намного позже, Марвин Мински (1967).
- 1928: Гильберт переработал свою «Вторую проблему» на Болонском международном конгрессе. (Рейд, стр. 188–189) Ходжес утверждает, что задал три вопроса: например, №1: была ли математика полный? # 2: Была математика последовательный? # 3: Была математика разрешимый? (Ходжес стр. 91). Третий вопрос известен как Entscheidungsproblem (Проблема решения). (Ходжес стр.91, Пенроуз стр.34)
- 1930: Курт Гёдель объявляет доказательство как ответ на первые два вопроса Гильберта 1928 г. [ср. Reid p. 198]. «Сначала он [Гильберт] был только зол и разочарован, но затем он начал пытаться конструктивно решить проблему ... Сам Гёдель чувствовал - и выразил мысль в своей статье, - что его работа не противоречит формалистической точке зрения Гильберта. вид »(Рид стр. 199)
- 1931: Гедель публикует «О формально неразрешимых предложениях Principia Mathematica и родственных систем I» (перепечатано в Davis, 1965, стр. 5ff).
- 19 апреля 1935 г .: Церковь Алонсо публикует "Неразрешимую проблему элементарной теории чисел", в которой он определяет, что означает, что функция должна быть эффективно вычисляемый. Такая функция будет иметь алгоритм, и «... факт завершения работы алгоритма становится фактически известным ...» (Дэвис, 1965, стр. 100)
- 1936: Черч публикует первое доказательство того, что Entscheidungsproblem неразрешимо. (Замечание о проблеме Entscheidungsproblem, перепечатано в Davis, 1965, p. 110.)
- 7 октября 1936 г .: Эмиль Пост Получена статья «Конечные комбинаторные процессы. Формулировка I». Пост добавляет к своему «процессу» инструкцию «(C) Stop». Он назвал такой процесс «типом 1 ... если процесс, который он определяет, завершается для каждой конкретной проблемы». (Дэвис, 1965, стр. 289 и далее).
- 1937: Алан Тьюринг бумага О вычислимых числах в приложении к задаче Entscheidungs. выходит в печать в январе 1937 г. (перепечатано в Davis, 1965, стр. 115). Доказательство Тьюринга отклоняется от расчета рекурсивные функции и вводит понятие машинного вычисления. Стивен Клини (1952) называет это одним из «первых примеров проблем, связанных с решением, которые оказались неразрешимыми».
- 1939: Дж. Баркли Россер отмечает существенную эквивалентность «эффективного метода», определенного Геделем, Черчем и Тьюрингом (Россер в Дэвисе, 1965, стр. 273, «Неформальное изложение доказательств теоремы Геделя и теоремы Черча»)
- 1943: В статье, Стивен Клини утверждает, что «При создании полной алгоритмической теории мы описываем процедуру ... которая обязательно завершается таким образом, чтобы по ее результату мы могли прочитать однозначный ответ« Да »или« Нет »на вопрос: "Верно ли значение предиката?" ".
- 1952: Клини (1952) Глава XIII («Вычислимые функции») включает обсуждение неразрешимости проблемы остановки для машин Тьюринга и переформулирует ее в терминах машин, которые «в конечном итоге останавливаются», то есть останавливаются: «... нет алгоритм определения того, может ли данная машина при запуске из любой данной ситуации в конце концов останавливается. »(Клини (1952) стр. 382)
- 1952: "Мартин Дэвис считает вероятным, что он впервые использовал термин «проблема остановки» в серии лекций, которые он прочитал в Лаборатории систем управления в Университете Иллинойса в 1952 году (письмо Дэвиса Коупленду, 12 декабря 2001 г.) »(сноска 61 в Коупленд (2004), стр. 40 и далее)
Формализация
В своем первоначальном доказательстве Тьюринг формализовал понятие алгоритм путем введения Машины Тьюринга. Однако результат никоим образом не специфичен для них; это в равной степени относится к любой другой модели вычисление это эквивалентно по своей вычислительной мощности машинам Тьюринга, таким как Марковские алгоритмы, Лямбда-исчисление, Почтовые системы, зарегистрировать машины, или же системы тегов.
Важно то, что формализация позволяет напрямую отображать алгоритмы в некоторые тип данных что алгоритм можно оперировать. Например, если формализм позволяет алгоритмам определять функции над строками (такими как машины Тьюринга), тогда должно быть отображение этих алгоритмов на строки, и если формализм позволяет алгоритмам определять функции над натуральными числами (такими как вычислимые функции ) тогда должно быть отображение алгоритмов в натуральные числа. Сопоставление со строками обычно является наиболее простым, но строки по алфавит с п символы также могут быть сопоставлены с числами, интерпретируя их как числа в п-ари система счисления.
Представление в виде набора
Условное представление задач решения - это совокупность объектов, обладающих рассматриваемым свойством. В остановка
- K = {(я, Икс) | программа я останавливается при запуске на входе Икс}
представляет собой проблему остановки.
Этот набор рекурсивно перечислимый, что означает, что существует вычислимая функция, которая перечисляет все пары (я, Икс) это содержит. Однако дополнение этого набора не является рекурсивно перечислимым.[5]
Есть много эквивалентных формулировок проблемы остановки; любой набор, чей Степень Тьюринга такая формулировка равна проблеме остановки. Примеры таких наборов включают:
- {я | программа я в конечном итоге останавливается при запуске с вводом 0}
- {я | есть вход Икс такая программа я в конечном итоге останавливается при запуске с вводом Икс}.
Концепция доказательства
Доказательство неразрешимости проблемы остановки - это доказательство от противного. Чтобы проиллюстрировать концепцию доказательства, предположим, что существует общий вычислимая функция остановки (f) который возвращает истину, если подпрограмма ж останавливается (при запуске без входных данных) и возвращает false в противном случае. Теперь рассмотрим следующую подпрограмму:
def грамм(): если остановки(грамм): loop_forever()
остановки (г) должен либо вернуть истину, либо ложь, потому что остановки предполагалось, что это общий. Если остановки (г) возвращает истину, тогда грамм позвоню loop_forever и никогда не останавливаться - противоречие. Если остановки (г) возвращает false, тогда грамм остановится, потому что он не будет звонить loop_forever; это тоже противоречие. Общий, остановки (г) не может вернуть значение истинности, которое согласуется с тем, грамм останавливается. Поэтому исходное предположение, что остановки полная вычислимая функция должна быть ложной.
Метод, использованный в доказательстве, называется диагонализация - грамм делает противоположное тому, что остановки говорит грамм стоит сделать. Разница между этим наброском и фактическим доказательством состоит в том, что в фактическом доказательстве вычислимая функция остановки не принимает подпрограмму в качестве аргумента напрямую; вместо этого он берет исходный код программы. Фактическое доказательство требует дополнительной работы для решения этой проблемы. Более того, фактическое доказательство избегает прямого использования рекурсии, показанной в определении грамм.
Эскиз доказательства
Приведенная выше концепция показывает общий метод доказательства; в этом разделе будут представлены дополнительные сведения. Общая цель - показать, что нет общий вычислимая функция это решает, будет ли произвольная программа я останавливается при произвольном вводе Икс; то есть следующая функция час не вычислимо (Пенроуз 1990, стр. 57–63):