В теории вычислимости проблема остановки — это проблема определения из описания произвольной компьютерной программы и ввода, завершит ли программа выполнение или продолжит выполняться вечно. Проблема остановки неразрешима , что означает, что не существует общего алгоритма , который решает проблему остановки для всех возможных пар программа-ввод. Проблема часто возникает в обсуждениях вычислимости , поскольку она показывает, что некоторые функции математически определимы , но не вычислимы .
Ключевой частью формальной постановки проблемы является математическое определение компьютера и программы, обычно через машину Тьюринга . Затем доказательство показывает, что для любой программы f , которая может определять, останавливаются ли программы, существует «патологическая» программа g , для которой f делает неверное определение. В частности, g — это программа, которая при вызове с некоторыми входными данными передает свой собственный источник и свои входные данные в f и делает противоположное тому, что f предсказывает, что g будет делать. Поведение f на g показывает неразрешимость, поскольку это означает, что никакая программа f не решит проблему остановки во всех возможных случаях.
Проблема остановки — это проблема принятия решений о свойствах компьютерных программ на фиксированной Тьюринг-полной модели вычислений, то есть всех программ, которые могут быть написаны на некотором заданном языке программирования , который достаточно общий, чтобы быть эквивалентным машине Тьюринга. Проблема состоит в том, чтобы определить, учитывая программу и входные данные для программы, остановится ли программа в конечном итоге при запуске с этими входными данными. В этой абстрактной структуре нет ограничений на ресурсы по объему памяти или времени, требуемому для выполнения программы; она может выполняться сколь угодно долго и использовать произвольное количество дискового пространства перед остановкой. Вопрос просто в том, остановится ли данная программа когда-либо на определенном входе.
Например, в псевдокоде программа
while (true) continue
не останавливается; скорее, он продолжается вечно в бесконечном цикле . С другой стороны, программа
останавливается.
В то время как решение вопроса об остановке этих программ является простым, более сложные программы оказываются проблематичными. Одним из подходов к проблеме может быть запуск программы на некоторое количество шагов и проверка того, остановится ли она. Однако, пока программа выполняется, неизвестно, остановится ли она в конечном итоге или будет работать вечно. Тьюринг доказал, что не существует алгоритма, который всегда правильно решает, останавливается ли программа для данной произвольной программы и ввода при запуске с этим вводом. Суть доказательства Тьюринга заключается в том, что любой такой алгоритм можно заставить выдавать противоречивый вывод и, следовательно, он не может быть правильным.
Некоторые бесконечные циклы могут быть весьма полезны. Например, циклы событий обычно кодируются как бесконечные циклы. [1] Однако большинство подпрограмм предназначены для завершения. [2] В частности, в жестких вычислениях в реальном времени программисты пытаются писать подпрограммы, которые не только гарантированно завершатся, но и гарантированно завершатся до заданного крайнего срока. [3]
Иногда эти программисты используют какой-либо язык программирования общего назначения (полный по Тьюрингу), но пытаются писать в ограниченном стиле, например, MISRA C или SPARK , что позволяет легко доказать, что полученные подпрограммы завершатся до указанного крайнего срока. [ необходима цитата ]
В других случаях эти программисты применяют правило наименьшей мощности — они намеренно используют компьютерный язык, который не является полностью полным по Тьюрингу. Часто это языки, которые гарантируют завершение всех подпрограмм, например Coq . [ необходима цитата ]
Трудность проблемы остановки заключается в требовании, чтобы процедура принятия решения работала для всех программ и входов. Конкретная программа либо останавливается на заданном входе, либо не останавливается. Рассмотрим один алгоритм, который всегда отвечает «остановится», и другой, который всегда отвечает «не останавливается». Для любой конкретной программы и входа один из этих двух алгоритмов отвечает правильно, даже если никто не знает, какой именно. Однако ни один из алгоритмов не решает проблему остановки в общем случае.
Существуют программы ( интерпретаторы ), которые имитируют выполнение любого исходного кода, который им дан. Такие программы могут продемонстрировать, что программа останавливается, если это так: сам интерпретатор в конечном итоге остановит свою симуляцию, что показывает, что исходная программа остановилась. Однако интерпретатор не остановится, если его входная программа не останавливается, поэтому этот подход не может решить проблему остановки, как указано; он не дает успешного ответа «не останавливается» для программ, которые не останавливаются.
Проблема остановки теоретически разрешима для линейных ограниченных автоматов (LBA) или детерминированных машин с конечной памятью. Машина с конечной памятью имеет конечное число конфигураций, и поэтому любая детерминированная программа на ней должна в конечном итоге либо остановиться, либо повторить предыдущую конфигурацию: [4]
... любой конечный автомат, если его полностью предоставить самому себе, в конце концов впадет в идеально периодически повторяющийся шаблон . Длительность этого повторяющегося шаблона не может превышать количество внутренних состояний автомата...
Однако компьютер с миллионом мелких деталей, каждая из которых имеет два состояния, будет иметь по крайней мере 2 1 000 000 возможных состояний: [5]
Это единица, за которой следует около трехсот тысяч нулей... Даже если бы такая машина работала на частотах космических лучей, эоны галактической эволюции были бы ничем по сравнению со временем путешествия по такому циклу:
Хотя машина может быть конечной, а конечные автоматы «имеют ряд теоретических ограничений»: [5]
...приведенные величины должны навести на мысль, что теоремы и аргументы, основанные главным образом на конечности диаграммы состояний, могут не иметь большого значения.
Также можно автоматически решить, останавливается ли недетерминированная машина с конечной памятью ни на одной, на некоторых или на всех возможных последовательностях недетерминированных решений, перечисляя состояния после каждого возможного решения.
В апреле 1936 года Алонзо Чёрч опубликовал своё доказательство неразрешимости проблемы в лямбда-исчислении . Доказательство Тьюринга было опубликовано позже, в январе 1937 года. С тех пор было описано много других неразрешимых проблем, включая проблему остановки, возникшую в 1950-х годах.
Многие статьи и учебники относят определение и доказательство неразрешимости проблемы остановки к статье Тьюринга 1936 года. Однако это неверно. [19] [24] Тьюринг не использовал термины «остановка» или «остановка» ни в одной из своих опубликованных работ, включая статью 1936 года. [25] Поиск в академической литературе с 1936 по 1958 год показал, что первым опубликованным материалом, использующим термин «проблема остановки», был Роджерс (1957). Однако Роджерс говорит, что у него был черновик Дэвиса (1958), [19] а Мартин Дэвис утверждает во введении, что «эксперт, возможно, найдет некоторую новизну в расположении и трактовке тем», [26] поэтому терминология должна быть приписана Дэвису. [19] [24] Дэвис заявил в письме, что он ссылался на проблему остановки с 1952 года. [23] В книге Дэвиса это употребляется следующим образом: [27]
«[...] мы хотим определить, остановится ли [машина Тьюринга] Z, если ее поместить в заданное начальное состояние. Мы называем эту проблему проблемой остановки для Z. [...]
Теорема 2.2 Существует машина Тьюринга, проблема остановки которой рекурсивно неразрешима .
Связанной проблемой является задача печати для простой машины Тьюринга Z относительно символа S i ".
Возможным предшественником формулировки Дэвиса является утверждение Клини 1952 года, которое отличается только формулировкой: [19] [22]
не существует алгоритма, который бы решал, остановится ли в конечном итоге та или иная машина, запущенная из той или иной ситуации.
Проблема остановки эквивалентна по Тьюрингу как проблеме печати Дэвиса («печатает ли машина Тьюринга, начиная с заданного состояния, заданный символ?»), так и проблеме печати, рассмотренной в статье Тьюринга 1936 года («печатает ли машина Тьюринга, начиная с чистой ленты, заданный символ?»). Однако эквивалентность по Тьюрингу довольно свободна и не означает, что эти две проблемы одинаковы. Существуют машины, которые печатают, но не останавливаются, и останавливаются, но не печатают. Проблемы печати и остановки решают разные проблемы и демонстрируют важные концептуальные и технические различия. Таким образом, Дэвис просто скромничал, когда говорил: [19]
Можно также упомянуть, что неразрешимость этих проблем по сути была впервые получена Тьюрингом.
В своем оригинальном доказательстве Тьюринг формализовал концепцию алгоритма , введя машины Тьюринга . Однако результат никоим образом не является специфическим для них; он в равной степени применим к любой другой модели вычислений , эквивалентной по своей вычислительной мощности машинам Тьюринга, таким как алгоритмы Маркова , лямбда-исчисление , системы Поста , регистровые машины или системы тегов .
Важно то, что формализация допускает прямое отображение алгоритмов в некоторый тип данных , с которым алгоритм может работать. Например, если формализм позволяет алгоритмам определять функции над строками (например, машины Тьюринга), то должно быть отображение этих алгоритмов в строки, а если формализм позволяет алгоритмам определять функции над натуральными числами (например, вычислимые функции ), то должно быть отображение алгоритмов в натуральные числа. Отображение в строки обычно является самым простым, но строки над алфавитом с n символами также можно отобразить в числа, интерпретируя их как числа в n -арной системе счисления .
Традиционное представление задач принятия решений — это множество объектов, обладающих рассматриваемым свойством. Остановочное множество
представляет собой проблему остановки.
Этот набор рекурсивно перечислим , что означает, что существует вычислимая функция, которая перечисляет все пары ( i , x ), которые он содержит. Однако дополнение этого набора не является рекурсивно перечислимым. [28]
Существует много эквивалентных формулировок проблемы остановки; любой набор, степень Тьюринга которого равна степени проблемы остановки, является такой формулировкой. Примеры таких наборов включают:
Кристофер Стрейчи набросал доказательство от противного , что проблема остановки неразрешима. [29] [30] Доказательство проводится следующим образом: предположим, что существует полная вычислимая функция halts(f) , которая возвращает true, если подпрограмма f останавливается (при запуске без входных данных), и возвращает false в противном случае. Теперь рассмотрим следующую подпрограмму:
def g (): если останавливается ( g ): loop_forever ()
halts(g) должен либо возвращать true, либо false, поскольку предполагалось, что halts является total . Если halts(g) возвращает true, то g вызовет loop_forever и никогда не остановится, что является противоречием. Если halts(g) возвращает false, то g остановится, поскольку он не вызовет loop_forever ; это также является противоречием. В целом, g делает противоположное тому, что halts говорит g , поэтому halts(g) не может возвращать значение истинности, которое согласуется с тем, останавливается ли g . Следовательно, первоначальное предположение о том, что halts является полной вычислимой функцией, должно быть ложным.
Концепция выше показывает общий метод доказательства, но вычислимая функция halts не принимает напрямую подпрограмму в качестве аргумента; вместо этого она принимает исходный код программы. Более того, определение g является самореферентным . Строгое доказательство решает эти проблемы. Общая цель состоит в том, чтобы показать, что не существует полной вычислимой функции , которая решает, останавливается ли произвольная программа i на произвольном входе x ; то есть следующая функция h (для «halts») не является вычислимой: [31]
Здесь программа i относится к i- й программе в перечислении всех программ фиксированной Тьюринг-полной модели вычислений.
Возможные значения для общей вычислимой функции f, расположенной в двумерном массиве. Оранжевые ячейки — диагональ. Значения f ( i , i ) и g ( i ) показаны внизу; U указывает, что функция g не определена для конкретного входного значения.
Доказательство проводится путем прямого установления того, что никакая полностью вычислимая функция с двумя аргументами не может быть требуемой функцией h . Как и в наброске концепции, если задана любая полностью вычислимая бинарная функция f , следующая частичная функция g также вычислима некоторой программой e :
Проверка того, что g вычислима, основана на следующих конструкциях (или их эквивалентах):
Следующий псевдокод для e иллюстрирует простой способ вычисления g :
процедура e ( i ) : если f ( i , i ) == 0 , то вернуть 0 , иначе цикл бесконечен
Поскольку g частично вычислима, должна быть программа e , которая вычисляет g , исходя из предположения, что модель вычисления является полной по Тьюрингу. Эта программа является одной из всех программ, в которых определена функция остановки h . Следующий шаг доказательства показывает, что h ( e , e ) не будет иметь то же значение, что и f ( e , e ).
Из определения g следует , что должен иметь место только один из следующих двух случаев:
В любом случае f не может быть той же функцией, что и h . Поскольку f была произвольной полной вычислимой функцией с двумя аргументами, все такие функции должны отличаться от h .
Это доказательство аналогично диагональному аргументу Кантора . Можно визуализировать двумерный массив с одним столбцом и одной строкой для каждого натурального числа, как указано в таблице выше. Значение f ( i , j ) помещается в столбец i , строку j . Поскольку предполагается, что f является полностью вычислимой функцией, любой элемент массива может быть вычислен с помощью f . Построение функции g можно визуализировать с помощью главной диагонали этого массива. Если массив имеет 0 в позиции ( i , i ), то g ( i ) равно 0. В противном случае g ( i ) не определено. Противоречие возникает из того факта, что есть некоторый столбец e массива, соответствующий самому g . Теперь предположим, что f была функцией остановки h , если g ( e ) определена ( в этом случае g ( e ) = 0), g ( e ) останавливается, поэтому f ( e,e ) = 1. Но g ( e ) = 0 только тогда, когда f ( e,e ) = 0, что противоречит f ( e,e ) = 1. Аналогично, если g ( e ) не определена, то функция остановки f ( e,e ) = 0, что приводит к g ( e ) = 0 при построении g . Это противоречит предположению, что g ( e ) не определена. В обоих случаях возникает противоречие. Следовательно, любая произвольная вычислимая функция f не может быть функцией остановки h .
Типичный метод доказательства неразрешимости проблемы — свести проблему остановки к . Например, не может быть общего алгоритма, который решает, является ли данное утверждение о натуральных числах истинным или ложным. Причина этого в том, что утверждение о том, что определенная программа остановится при определенном вводе, можно преобразовать в эквивалентное утверждение о натуральных числах. Если алгоритм может найти истинностное значение каждого утверждения о натуральных числах, он, безусловно, может найти истинностное значение этого; но это определит, остановится ли исходная программа.
Теорема Райса обобщает теорему о том, что проблема остановки неразрешима. Она утверждает, что для любого нетривиального свойства не существует общей процедуры принятия решения, которая для всех программ определяет, имеет ли частичная функция, реализованная входной программой, это свойство. (Частичная функция — это функция, которая не всегда может выдавать результат, и поэтому используется для моделирования программ, которые могут либо выдавать результаты, либо не останавливаться.) Например, свойство «остановка для входного значения 0» неразрешимо. Здесь «нетривиальный» означает, что множество частичных функций, удовлетворяющих свойству, не является ни пустым множеством, ни множеством всех частичных функций. Например, «остановка или неудача остановки при входном значении 0» явно верно для всех частичных функций, поэтому это тривиальное свойство и может быть решено алгоритмом, который просто сообщает «истина». Кроме того, эта теорема справедлива только для свойств частичной функции, реализованной программой; теорема Райса не применима к свойствам самой программы. Например, «остановка при вводе 0 в течение 100 шагов» не является свойством частичной функции, реализуемой программой, — это свойство программы, реализующей частичную функцию, и оно вполне разрешимо.
Грегори Хайтин определил вероятность остановки , представленную символом Ω , тип действительного числа, который неформально считается представляющим вероятность того, что случайно созданная программа остановится. Эти числа имеют ту же степень Тьюринга , что и проблема остановки. Это нормальное и трансцендентное число , которое можно определить , но нельзя полностью вычислить . Это означает, что можно доказать, что не существует алгоритма , который производит цифры Ω, хотя его первые несколько цифр можно вычислить в простых случаях.
Поскольку отрицательный ответ на проблему остановки показывает, что существуют проблемы, которые не могут быть решены машиной Тьюринга, тезис Чёрча–Тьюринга ограничивает то, что может быть достигнуто любой машиной, реализующей эффективные методы . Однако не все машины, мыслимые человеческим воображением, подчиняются тезису Чёрча–Тьюринга (например, машины-оракулы ). Открытым является вопрос о том, могут ли существовать реальные детерминированные физические процессы , которые в долгосрочной перспективе избегают моделирования машиной Тьюринга, и, в частности, может ли любой такой гипотетический процесс быть с пользой использован в форме вычислительной машины (гиперкомпьютера ) , которая могла бы решить проблему остановки для машины Тьюринга среди прочего. Также открытым является вопрос о том, участвуют ли какие-либо такие неизвестные физические процессы в работе человеческого мозга , и могут ли люди решить проблему остановки. [32]
Доказательство Тьюринга показывает, что не может быть никакого механического, общего метода (т. е. машины Тьюринга или программы в некоторой эквивалентной модели вычислений ) для определения того, останавливаются ли алгоритмы. Однако каждый отдельный случай проблемы остановки имеет определенный ответ, который может быть или не быть практически вычислимым. При наличии конкретного алгоритма и входных данных часто можно показать, останавливается он или нет, и на самом деле специалисты по информатике часто делают именно это как часть доказательства корректности . Существуют некоторые эвристики , которые можно использовать в автоматическом режиме, чтобы попытаться построить доказательство, что часто удается в типичных программах. Эта область исследований известна как автоматизированный анализ завершения .
Некоторые результаты были получены по теоретической производительности эвристик проблемы остановки, в частности, доля программ заданного размера, которые могут быть правильно классифицированы рекурсивным алгоритмом. Эти результаты не дают точных чисел, поскольку доли невычислимы и также сильно зависят от выбора кодировки программы, используемой для определения «размера». Например, рассмотрим классификацию программ по их числу состояний и использование определенной модели вычисления «полубесконечной ленты Тьюринга», которая допускает ошибки (без остановки), если программа запускается с левой стороны ленты. Затем , по программам, выбранным равномерно по числу состояний. Но этот результат в некотором смысле «тривиален», поскольку эти разрешимые программы — это просто те, которые спадают с ленты, а эвристика заключается просто в прогнозировании отсутствия остановки из-за ошибки. Таким образом, казалось бы, несущественная деталь, а именно обработка программ с ошибками, может оказаться решающим фактором при определении доли программ. [33]
Чтобы избежать этих проблем, было разработано несколько ограниченных понятий «размера» программы. Плотная гёделевская нумерация назначает номера программам таким образом, что каждая вычислимая функция встречается в положительной дроби в каждой последовательности индексов от 1 до n, т. е. гёделизация φ плотна тогда и только тогда, когда для всех , существует такое, что . Например, нумерация, которая назначает индексы нетривиальным программам и всем другим индексам состояние ошибки не является плотной, но существует плотная гёделевская нумерация синтаксически правильных программ Brainfuck . [34] Плотная гёделевская нумерация называется оптимальной, если для любой другой гёделевской нумерации существует 1-1 полная рекурсивная функция и константа такие, что для всех , и . Это условие гарантирует, что все программы имеют индексы, не намного превышающие их индексы в любой другой гёделевской нумерации. Оптимальные гёделевские нумерации строятся путем нумерации входов универсальной машины Тьюринга . [35] Третье понятие размера использует универсальные машины, работающие с двоичными строками, и измеряет длину строки, необходимую для описания входной программы. Универсальная машина U — это машина, для которой для любой другой машины V существует общая вычислимая функция h такая, что . Оптимальная машина — это универсальная машина, которая достигает границы инвариантности сложности Колмогорова , т. е. для каждой машины V существует c такое, что для всех выходов x , если V -программа длины n выводит x , то существует U -программа не более длины, выдающая x . [36]
Мы рассматриваем частично вычислимые функции (алгоритмы) . Для каждого мы рассматриваем долю ошибок среди всех программ размера метрики не более , подсчитывая каждую программу , для которой не удается завершить работу, выдает ответ «не знаю» или выдает неправильный ответ, т.е. останавливается и выводит , или не останавливается и выводит . Поведение может быть описано следующим образом для плотных гёделизаций и оптимальных машин: [34] [36]DOES_NOT_HALT
HALTS
Сложная природа этих границ обусловлена колебательным поведением . Существуют редко встречающиеся новые разновидности программ, которые поступают в произвольно больших «блоках», и постоянно растущая доля повторений. Если блоки новых разновидностей полностью включены, частота ошибок составляет по крайней мере , но между блоками доля правильно классифицированных повторений может быть произвольно высокой. В частности, эвристика «подсчета», которая просто запоминает первые N входов и распознает их эквиваленты, позволяет достигать произвольно низкой частоты ошибок бесконечно часто. [34]
Концепции, поднимаемые теоремами Гёделя о неполноте , очень похожи на те, которые поднимаются проблемой остановки, и доказательства довольно похожи. Фактически, более слабая форма первой теоремы о неполноте является простым следствием неразрешимости проблемы остановки. Эта более слабая форма отличается от стандартной формулировки теоремы о неполноте, утверждая, что аксиоматизация натуральных чисел, которая является одновременно полной и обоснованной , невозможна. «Обоснованная» часть — это ослабление: это означает, что мы требуем, чтобы рассматриваемая аксиоматическая система доказывала только истинные утверждения о натуральных числах. Поскольку обоснованность подразумевает согласованность , эту более слабую форму можно рассматривать как следствие сильной формы. Важно отметить, что формулировка стандартной формы первой теоремы Гёделя о неполноте совершенно не касается истинностного значения утверждения, а касается только вопроса о том, можно ли найти его с помощью математического доказательства .
Более слабая форма теоремы может быть доказана из неразрешимости проблемы остановки следующим образом. [37] Предположим, что у нас есть обоснованная (и, следовательно, непротиворечивая) и полная аксиоматизация всех истинных логических утверждений первого порядка о натуральных числах . Тогда мы можем построить алгоритм, который перечисляет все эти утверждения. Это означает, что существует алгоритм N ( n ), который, учитывая натуральное число n , вычисляет истинное логическое утверждение первого порядка о натуральных числах, и что для всех истинных утверждений существует по крайней мере одно n такое, что N ( n ) дает это утверждение. Теперь предположим, что мы хотим решить, останавливается ли алгоритм с представлением a на входе i . Мы знаем, что это утверждение можно выразить с помощью логического утверждения первого порядка, скажем, H ( a , i ). Поскольку аксиоматизация является полной, следует, что либо существует n , такое что N ( n ) = H ( a , i ), либо существует n ′, такое что N ( n ′ ) = ¬ H ( a , i ). Таким образом, если мы будем итерировать по всем n, пока не найдем H ( a , i ) или его отрицание, мы всегда остановимся, и, более того, ответ, который он нам даст, будет истинным (по обоснованности). Это означает, что это дает нам алгоритм для решения проблемы остановки. Поскольку мы знаем, что такого алгоритма не может быть, следует, что предположение о том, что существует непротиворечивая и полная аксиоматизация всех истинных логических утверждений первого порядка о натуральных числах, должно быть ложным.
Множество вариантов проблемы остановки можно найти в учебниках по вычислимости. [38] Обычно эти проблемы являются RE-полными и описывают наборы сложности в арифметической иерархии , такие же, как стандартная проблема остановки. Таким образом, варианты неразрешимы, и стандартная проблема остановки сводится к каждому варианту и наоборот. Однако некоторые варианты имеют более высокую степень неразрешимости и не могут быть сведены к стандартной проблеме остановки. Следующие два примера являются общими.
Универсальная проблема остановки , также известная (в теории рекурсии ) как тотальность , — это проблема определения того, остановится ли данная компьютерная программа для каждого ввода (название тотальность происходит от эквивалентного вопроса о том, является ли вычисляемая функция тотальной ). Эта проблема не только неразрешима, как проблема остановки, но и крайне неразрешима. С точки зрения арифметической иерархии она является -полной. [39]
Это означает, в частности, что ее невозможно решить даже с помощью оракула для проблемы остановки.
Существует множество программ, которые для некоторых входных данных возвращают правильный ответ на проблему остановки, в то время как для других входных данных они вообще не возвращают ответа. Однако проблема «данная программа p , является ли она частично останавливающимся решателем» (в описанном смысле) по крайней мере так же сложна, как и проблема остановки. Чтобы увидеть это, предположим, что существует алгоритм PHSR («частично останавливающийся решатель-распознаватель») для этого. Тогда его можно использовать для решения проблемы остановки следующим образом: чтобы проверить, останавливается ли входная программа x на y , постройте программу p , которая на входных данных ( x , y ) сообщает true и расходится на всех других входных данных. Затем проверьте p с помощью PHSR.
Приведенный выше аргумент сводит проблему остановки к распознаванию PHS, и таким же образом можно свести и более сложные проблемы, такие как остановка на всех входах , что подразумевает, что распознавание PHS не только неразрешимо, но и находится выше в арифметической иерархии , в частности, является -полным.
Машина Тьюринга с потерями — это машина Тьюринга, в которой часть ленты может недетерминированно исчезнуть. Проблема остановки разрешима для машины Тьюринга с потерями, но не примитивно рекурсивной . [40]
Машина с оракулом для проблемы остановки может определить, остановятся ли конкретные машины Тьюринга при определенных входных данных, но она не может определить в общем случае, остановятся ли машины, эквивалентные ей самой.
... если программа застревает в определенном цикле, ... выясните, в чем проблема.
Поэтому для систем жесткого реального времени важно писать подпрограммы, которые всегда выполняются за одинаковое время или имеют четко идентифицируемый наихудший случай.
{{cite book}}
: CS1 maint: location missing publisher (link). Глава 3 Раздел 1 содержит качественное описание проблемы остановки, доказательство от противного и полезное графическое представление проблемы остановки.