我想知道以下问题。我显然不期望任何实用的解决方案,但我会感谢任何开发人员对此的想法:
理论上是否有可能让一个程序打开其他程序(为了论证,假设它打开 .exe 文件),并确定特定可执行文件在执行时(具有固定输入和机器状态)是否播放国际象棋游戏(在它可能执行的任何其他任务中)。
对于“下棋”,我的意思是对棋盘和棋子进行一些表示,然后应用源自内置国际象棋 AI 引擎的黑白棋步。
这样一个理论上的“国际象棋检测程序”可能包含一个虚拟机或 PC 模拟器或其他任何东西,以便在必要时实际模拟扫描的可执行文件。我们可以假设它在具有同上 ram 的任意速度的计算机上运行。
(编辑)关于停机问题,我可以这样解决:
将程序加载到具有 N 位(硬盘和内存空间以及 CPU 寄存器)的虚拟机中。这个虚拟机最多可以假设 2^N 个不同的状态。
逐步执行VM中的程序。在每一步之后,检查它是否停止。如果是:问题已解决(结果:是,它停止了)。如果不是:获取虚拟机的当前状态,并查看该状态是否存在于我们之前已经遇到的状态列表中。如果是:问题已解决(结果:否,它将永远运行)。如果否:将此状态添加到列表并继续。
由于最多可以出现 2^N 种不同的状态,因此该算法将在有限时间内确定程序是否停止。
(Edit2)关于扫描的可执行文件或它运行的(虚拟)机器的(无限)有限性似乎有些模棱两可。假设要扫描的可执行文件最多为 1 GB(这应该足够了,因为大多数国际象棋程序要小得多),并且它们应该在具有 10 GB 内存的 PC(或 VM)上运行。
我们的理论国际象棋检测程序可以使用任意数量的 ram。