一个程序可以确定另一个程序是否下棋吗?

时间:2011-11-29 22:30:13

标签: algorithm executable theory detect chess

我想知道以下问题。我显然不希望有任何实际的解决方案,但我会感谢任何开发人员对此的想法:

理论上是否可以有一个打开其他程序的程序(为了参数,让它说打开.exe文件),并确定一个特定的可执行文件,当执行时(具有固定的输入和机器状态) ,下棋(在其可能执行的任何其他任务中)。

使用'下棋',我的意思是有一些国际象棋棋盘和棋子的代表,应用随后的内置棋牌AI引擎的黑白动作。

这种理论上的“国际象棋检测程序”可能包含虚拟机或PC模拟器,或者在必要时实际模拟扫描的可执行文件的任何内容。我们可以假设它在任意快速的计算机上运行ditto ram。


(编辑)关于暂停问题,我可以这样解决:

将程序加载到虚拟机中,该虚拟机具有N位(硬盘和存储空间以及CPU寄存器)。该虚拟机最多可以假设2 ^ N个不同的状态。

逐步执行VM中的程序。每个步骤后,检查它是否停止。 如果是:问题解决了(结果:是的,它停止了)。 如果否:获取虚拟机的当前状态,并查看此状态是否存在于我们之前已遇到的状态列表中。如果是:问题解决了(结果:不会永远运行)。如果否:将此状态添加到列表中并继续。

由于最多可能出现2 ^ N个不同的状态,因此该算法将确定程序是否在有限时间内确定停止。


(编辑2)扫描的可执行文件或其运行的(虚拟)机器的(有限)似乎有些含糊不清。假设要扫描的可执行文件最多可以是1 GB(这应该足够了,因为大多数国际象棋程序都要小得多)并且它们应该在10 GB内存的PC(或VM)上运行。

我们的理论象棋检测程序可以使用任意数量的ram。

4 个答案:

答案 0 :(得分:7)

不,没有这样的算法可以检测可执行文件是否下棋。

证明这一点的原因在于以下问题(称为暂停问题)无法通过任何算法解决:

  

鉴于计算机程序,该程序最终会终止吗?

我们可以证明,如果有一个计算机程序可以确定另一个程序是否下棋,我们可以解决停止问题。为此,我们将编写一个执行以下操作的计算机程序:

  1. 将其他计算机程序P。
  2. 作为输入
  3. 运行程序P.
  4. 如果程序P终止,请下棋。
  5. 该程序具有以下有趣的行为:当且仅当程序P终止时,它才会玩象棋游戏。换句话说,如果我们能够检测到该程序是否可以下棋,我们将检测程​​序P是否终止。但是,我们知道这是不可能的,所以一定不能有一个程序可以检测某些计算机程序是否下棋。

    这种通用方法被称为<停止问题的减少,可用于表明大量不同的问题可能无法解决。

    希望这会有所帮助,并抱歉“不”回答!

答案 1 :(得分:4)

关于你编辑的问题:是的,如果我们限制内存的大小,所以我们只有有限多个可能的程序,理论上我们可以枚举每个可能的程序并手动将它们分成“象棋”和“非棋” - 根据你想要的任何标准进行游戏。

在这种情况下,我们不再拥有图灵机,因此暂停问题不适用。相反,我们有finite state machine(是的,这意味着在现实世界中,所有计算机实际上都是图灵机的有限状态近似值。)

但是,你添加了这个限制,因为你想要“实用,而不是理论上的”,所以这里有另外一点实用性:枚举所有256位程序(有十亿台PC,每台其中列举了十亿个节目的数量将比宇宙的年龄要长得多。你很难想象,枚举所有低于1 GB(~1,000,000,000位)的程序需要多长时间。

因此,将真实计算机建模为图灵机而不是有限状态机实际上更为实用;在这个模型下,正如@templatetypedef证明的那样,这是不可能的。

答案 2 :(得分:1)

没有。这相当于停止问题。

答案 3 :(得分:0)

程序下棋是什么意思?我不相信存在一个无法比拟的问题的精确数学定义,并且不会轻易地等同于无法解决的问题。

例如,如果你问“是否存在此程序下棋的动作编码?”然后一个简单的Python解释器下棋 - 在编码规定你需要输入:

  • 一个下棋的Python程序加上对手的第一步,如果你想让它发挥黑色
  • 如果你想让它玩白色的国际象棋游戏Python程序

如果您修复了编码,那么问题就变得无聊了。国际象棋游戏是有限的(通过50步规则),所以唯一的难题是“这个程序是否在任何有限的国际象棋游戏中移动”。如果它没有并始终尊重编码(并进行有效的移动,所有这一切都很容易检查)然后它下棋。当然检查它是否挂起是无法治愈的。列举所有国际象棋比赛是可以治疗的,但考虑到实际考虑因素当然也是完全不可能的。