Automata
-演算、图灵机、正规算法……而这些表面看起来截然不同的刻画最后都被证明是等价的,使人们更有理由进一步宣称:它们所刻画的可计算性概念就是我们所需要的可计算性概念。
当下我就有种遇到了想要抓住的东西的心情,将其列为一定要深入学习的事项之一。也找了本书来看,不过我当时资历尚浅,那本复旦的递归论教材可读性又极低1,并没能看下去。这学期万事俱备,可以好好学习一番了,于是选了一门计算理论,一门程序理论的课程,又在编译原理课程上偶然再次邂逅了它。仅仅是NFA(非确定型有穷自动机)与DFA(确定型有穷自动机)的等价性证明就在三门课上学了三遍,应该是刻进DNA这辈子不会忘记了。
虽是学了三遍,却不代表是在重复完全一样的内容,同样的事物我们从不同的角度去刻画就可能得到崭新而有趣的结论——这也是我最近一个很深的体会。上次有这样的体会,是在学习Fraisse Theorem的时候。对于两个数学结构,要试着去刻画它们之间的关系,首先能想到的是代数刻画,就像我们在抽象代数课程上所做的那样,在两个结构之前建立态射,对其加以限制得到各种强度的同态关系。这是一种将结构“剥开”的方法,因为我们要去观察结构上的各种函数与关系的行为与特征;除此之外我们还可以进行逻辑刻画,完全不考虑这些结构本身是什么样的,而去比较对它们而言为真的逻辑公式集的范围;更进一步地,还可以采用博弈论刻画,即构造一种特殊的博弈,用这种博弈的必胜策略来模拟结构的关系。最后我们要回过头来考察不同刻画方法之间的关系,Fraisse Theorem所做的正是这样一件事,它在有穷同构、初等等价和E-F博弈三者之间建立了关系。
而在计算理论的学习中,这种体会就更深了。对于某种强度的计算能力,我们可以直接去构造抽象机,描述这些机器的装置与行为,也就是去关注计算的每一个步骤;我们同样可以不考虑计算究竟是如何进行的,而去描述机器可识别的语言集合;对这些语言,又可以去问它们有怎样的语法结构,能生成它们的文法规则是怎样的。从不同角度出发、甚至根本就是不同领域的研究者又往往会合于一处:语言学上划分的四型语言恰好对应四个典型的计算强度,为编译器而生的Backus-Naur范式、语言学的乔姆斯基范式、下推自动机这种抽象机三者是等价的。上学期听王彦晶老师讲做模态逻辑的人和做CS的人从完全不同的问题需求出发都得到了互模拟这个概念,大约也是如此。
对“计算”从不同角度进行的考察,不仅影响上面提到过的各种抽象模型,还影响我们实际使用的程序设计语言。如果去刻画的是参与计算的事物以及计算的每一个步骤,得到的就是C、Java这种我们熟悉的面向过程的、对象的语言;如果将过程封装起来,用输入与输出去刻画计算,那么得到的就是函数式编程语言;甚至还可以连计算的顺序都抛掉,去刻画使能条件,得到Prolog这种逻辑型语言。可以确定的是,这些不同视角下得到的语言在理论(可计算能力)上显然是等同的,在工程上显然是不同的,而这些不同的刻画是否本身就“本质地”反映了某些东西,却是一个很难回答的问题。
以上大约就是最近的一点学习心得,好像是在谈技术细节,又好像是在谈一些形而上的东西。不过这二者也分不开,我现在笃信类似世界观、方法论这种东西只有在科学实践中去体会、去谈论才是有意义的2。类似于“视角不同结论就不同”这种话,如果离开具体的技术细节,那么就和所谓一分为二、把握重点的辩证法一样,都是永远正确也永远没有意义的废话。这绝非说它们不重要,相反它们非常重要,就像Church-Turing Thesis恐怕比任何一个具体的定理都反映了更多、更“本质”的东西,只是说要去把握这些非得从最具体的问题做起不可。
评论
发表评论