瑞安,答案是肯定的。
与第一个答案相反,停止问题并不能证明任何事情。事实上,瑞恩,你的建议证明了错误的停机问题不适用于真正的数字计算机,我以前曾用这个例子作为证明。
在确定性数字系统(即在真实数字硬件上运行的程序)中,可能状态的数量是有限的,因此所有可能的状态都是可枚举的。
哈希所需的确切内存量为:
(2)*(program state size)*(number of initial states)
初始状态将是您的哈希键,最终状态将是哈希值,然后每个初始状态都有一个键/值对。
对于操作系统,“程序状态大小”为 2^(所有系统设备的总内存千兆位)。显然,如此大的通用程序需要不切实际的内存量来散列,并且无论如何都不会有用,因为系统是自引用/不可约复杂的(即下一个用户输入取决于先前的系统输出)。
解释:
这非常有用,因为如果您索引每个可能的初始状态并将其与终止状态相关联,您将有效地将任何程序的运行时间归零!任何为零,我的意思是非常快的 O(1) 运行时间——查找终止状态(如果它终止)所需的时间。
运行一个程序,从所有可能的状态开始,将提供一种显示循环的状态图。 因此解决了停止问题,因为在给定任何可能的初始状态时,只有三种(实际上是四种折叠为三种)可能性:
- 在耗尽所有可能的状态之前,程序将重新进入先前遇到的状态(从初始状态开始),因此在逻辑上永远循环。
- 程序在有机会重新进入先前遇到的状态或用尽所有可能的状态(自初始状态以来)之前达到标识为“终止”的状态。
或 4. 最简单的程序将从初始状态开始,将进入所有可能的状态仅一次,然后别无选择,只能 (3) 停止或 (4) 重新进入先前遇到的状态并永远循环。
for (int i = 0; true; i++); //i 将达到最大值,回滚到零,此时它将重新进入初始状态
因此,基本上,您的索引可以这样描述:
换句话说,对于每个初始状态,程序要么达到终止状态,要么重新进入自初始状态以来已经遇到的状态并无限循环。
因此,对于在确定性数字硬件上运行的任何程序,绝对有可能(但通常不切实际)确定其所有状态以及它是否永远停止或循环。
- 实用性仅取决于您拥有多少有效初始状态(可以通过输入约束大幅减少),以及花时间运行程序以终止它们并将结果状态存储在哈希中的可行性桌子。
除了强制任何程序的运行时间为 O(1) 操作之外,捕获状态的其他用途包括游戏控制台模拟器中的保存状态功能和计算机的休眠功能(尽管不是完美的状态恢复,因为必须使用一些系统内存对于恢复状态的代码和一些内存可能永远不会被存储(例如GPU内存))。
这证明了任何程序都可以用哈希表来表示。任何程序都可以用初始到最终状态转换图来表示。
所有程序都可以简化为一个具有大量内存占用的大功能!