Райан, ответ окончательно ДА.
Вопреки первому ответу, проблема остановки ничего не доказывает. На самом деле, Райан, то, что вы предлагаете, доказывает, что проблема остановки неправильно не относится к реальным цифровым компьютерам, и я использовал этот самый пример как доказательство ранее.
В детерминированной цифровой системе (то есть программе, работающей на реальном цифровом оборудовании) число возможных состояний конечно, и поэтому все возможные состояния перечислимы.
Точный объем памяти, необходимый для хеширования, будет:
(2)*(program state size)*(number of initial states)
Начальное состояние будет вашим хеш-ключом, а конечное состояние будет хеш-значением, и тогда у вас будет пара ключ / значение для каждого начального состояния.
Для операционной системы «размер состояния программы» равен 2 ^ (общее количество гигабайт памяти на всех системных устройствах). Очевидно, что такая большая программа общего назначения потребует непрактичного объема памяти для хеширования, и в любом случае она не будет полезна, поскольку система является самоссылающейся / неснижаемо сложной (т. Е. Следующий пользовательский ввод зависит от предыдущего вывода системы).
Пояснение:
Это очень полезно, потому что если вы индексируете каждое возможное начальное состояние и связываете его с завершающим состоянием, вы фактически сведете время выполнения ЛЮБОЙ ПРОГРАММЫ к нулю! Любой под нулем я подразумеваю очень быстрое время работы O (1) - время, необходимое для поиска состояния завершения (если оно завершается).
Запуск программы, начиная с каждого из всех возможных состояний, предоставит своего рода карту состояний, показывающую циклы. Таким образом, проблема остановки решена, потому что существует только три (фактически четыре коллапса на три) возможности при любом возможном начальном состоянии:
- Программа повторно войдет в ранее обнаруженное состояние (начиная с исходного состояния), прежде чем исчерпать все возможные состояния, и, следовательно, логически зацикливается навсегда.
- Программа достигает состояния, определенного как «завершающий», прежде чем она имеет шанс повторно войти в ранее обнаруженное состояние или исчерпать все возможные состояния (начиная с исходного состояния).
или 4. Простейшая программа запускается из начального состояния, будет входить во все возможные состояния ровно один раз, а затем не имеет другого выбора, кроме как (3) остановить или (4) повторно войти в ранее обнаруженное состояние и выполнить цикл навсегда .
для (int i = 0; true; i ++); // я достигну максимального значения, вернемся к нулю, после чего он вернется в исходное состояние
Итак, в принципе, ваш индекс можно описать так:
- Для каждого начального состояния существует ровно одно или ноль конечных состояний.
Другими словами, для каждого начального состояния программа либо достигает завершающего состояния, либо
повторно входит в состояние, с которым уже сталкивались, начиная с начального состояния, и циклически бесконечно.
Итак, для любой программы, работающей на детерминированном цифровом оборудовании , абсолютно возможно (но часто непрактично ) определить все ее состояния и определить, является ли она останавливается или зацикливается навсегда.
- Практичность зависит исключительно от того, сколько допустимых начальных состояний у вас есть (которые вы можете резко уменьшить с входными ограничениями), и насколько возможно потратить время на запуск программы для каждого из них, чтобы Завершение и сохранить полученное состояние в хеш-таблице.
Помимо принудительного выполнения любой программой времени выполнения операции O (1), другие способы использования состояния захвата включают функцию сохранения состояния в эмуляторах игровой консоли и функцию гибернации компьютеров (хотя и не в идеальном восстановлении состояния, поскольку некоторая системная память должен использоваться для кода, восстанавливающего состояние, и часть памяти может никогда не сохраняться (например, память графического процессора)).
Это доказывает, что любая программа может быть представлена хеш-таблицей.Любая программа может быть представлена картой перехода между начальным и конечным состояниями.
Все программы можно упростить до одной большой функции с огромным объемом памяти!