什么是“鸠尾”?

时间:2011-02-24 16:03:06

标签: algorithm programming-languages recursion turing-machines

在亚马逊阅读Stephen Wolfram的“新种科学”评论时,我发现了以下声明:

  

每个计算机科学(CS)学生都知道dovetailer,这是一个非常简单的2行程序,它系统地列出并执行通用计算机(如图灵机(TM))的所有可能程序。

有人可以提供一个“简单的2行程序”来说明“dovetaling”吗?

2 个答案:

答案 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可能使用了其他更强大的语言。