在亚马逊阅读Stephen Wolfram的“新种科学”评论时,我发现了以下声明:
每个计算机科学(CS)学生都知道dovetailer,这是一个非常简单的2行程序,它系统地列出并执行通用计算机(如图灵机(TM))的所有可能程序。
有人可以提供一个“简单的2行程序”来说明“dovetaling”吗?
答案 0 :(得分:27)
CS学生通常手头有图灵机到整数的编码,他们在编写软件图灵机模拟器时需要它们作为图灵机的输入,并将输出写为指定机器的输出。可以安排此编码具有每个整数都是不同的有效程序的属性。
所以列出并执行所有程序的天真双线将是:
for (int i = 0; ; ++i)
printf("%d: %d\n", i, universal_turing_machine(i));
这忽略了在C中,int
是固定宽度的类型。
现在,显然该程序并没有走得太远,因为它很快就会遇到i
,相应的图灵机不会停止。因此,“燕尾”技巧是从第一台机器运行一条指令,然后从第一台机器运行一条指令,从第一台机器运行另一条指令,然后从第三台,第二台,第一台运行一条指令,依此类推。当每台机器停机(如果它停止),当然你可以停止处理它或只是在它的“timeslices”中无所事事。
考虑到图灵机在每一步所需的上下文切换,我不知道这是一个“双线”。但燕尾计划具有理论用途(在实践中可能没有用)。关于它的一个有趣的事情是它具有以下属性:
如果存在解决的程序
P
一个问题X在多项式时间(并提供证明解决方案所需的信息),然后 燕尾计划解决了X in 多项式时间。
证明相当简单(它需要恒定的时间相当于执行P*(P-1)/2
图灵指令才能到达正确的程序P
[*]的开头,然后只有多数时间才能执行它它需要自己执行该程序)。我发现最有趣的财产的重新声明是:
如果P = NP,那么我们已经知道了 所有的多项式解 NP完全问题。
我们还没有证明它们是多项式的。 P = NP的证明将完成该证明而不实际展示哪个子程序解决问题。燕尾程序本身可以解决这个问题 - 当每台机器停止时,使用多项式时间“这是原始输入的X解决方案吗?” X是NP的算法。如果是解决方案,则输出并停止。如果不是,继续前进。
[*]好吧,也许是线性时间,因为当你创建每个新的虚拟图灵机时,你需要给它一个输入的副本来处理。同样在实践中,上下文切换可能不是恒定时间,因此将其称为二次方。手波手摇它的多项式好吗?
答案 1 :(得分:2)
嗯,图灵机程序实际上是一个表(状态x磁带符号),因此程序只会枚举所有这些可能的表。那样:
for(int symbol_count = 1; true; symbol_count++)
{
for(int state_count = 1; state_count <= symbol_count; state_count++)
{
gen_table(symbol_count, state_count);
}
}
其中gen_table枚举此类大小的所有操作表(例如,将表视为一个大数字并将其表示为数字)。这比C中的两行更长,Wolfram可能使用了其他更强大的语言。