检测程序是否处于无限循环中(读取:解决暂停问题)

时间:2011-07-04 06:48:20

标签: infinite-loop halting-problem

检测确定性程序(即状态机)是否处于等效于解决暂停问题的无限循环中?

我提出了一个解决方案,我不确定为什么它不起作用:

  • 让程序运行
  • 如果您认为它处于无限循环中,请定期记录其内存的快照
  • 如果您检测到相同的快照,则程序处于无限循环
  • 只要您没有两次获得相同的快照,它可能是(1)不在无限循环中,或者(2)您需要更快地拍摄快照(可能每次访问内存一次?)

我认为这不起作用......但为什么?

这似乎是一种非常合理的方法来检测程序是否处于无限循环中(例如,特别是如果你存储哈希而不是内存本身,虽然这不会100%准确)...它有什么问题,如果有的话?

2 个答案:

答案 0 :(得分:3)

理论上,等同于暂停问题,因为真实计算机具有有限数量的可能状态(即使它很大)。暂停问题适用的图灵机具有无限存储空间。

但是,让我们进一步探索你的想法。您还必须拍摄“隐藏”状态的快照:CPU的程序计数器和其他寄存器,并且必须在每条指令之前拍摄快照。 (如果内存快照相同并且即将执行相同的指令,程序将处于无限循环中。如果内存内容相同,那么程序将无效,但是除了最后一个内容之外还会执行其他操作。你看到同样的快照的时间。)

在实践中,即使是非常小的计算机也有如此多的潜在状态,您永远无法存储(甚至没有哈希!)所有快照。例如,即使是具有64kB RAM的古代商品64的小型计算机也具有256 ^ 65536个潜在状态(不包括5个CPU寄存器)。可能如此长的跟踪周期在时间和空间上都是绝对不可能的。

答案 1 :(得分:2)

解决方案即使在原则上也不会起作用。图灵机不必处于完全相同的状态(相同配置的磁带)进入无限循环。

您的算法可能适用于上下文相关语言和线性有界自动机,但如果您不知道TM需要多少磁带,您永远不会知道您是否有无限循环或即将击中顶部。请注意,由于各种原因,您的方法显然适用于真实计算机......其中最主要的是您的计算机不如(大)有限自动机强大。