脱离解决问题的具体过程,仅通过向计算机描述所需程序需满足的功能,从而让计算机自己生成解决问题的方法,这无疑是计算机编程方式的必然方向。我在下文里将会称其为计算机自动编程。
曾经在csdn等处看到几篇关于计算机自动编程的文章,提出了一些设想,但它们总离不开一点,那就是计算机自动编程是要建立在未来计算机强大的计算能力之上的,因为它或多或少要和人工智能扯上联系。这样的未来真让人沮丧,因为知道现在计算机似乎还没有一点“智能”的影子,即使有了又会怎样呢?它的效率如何?它会不会继承人类智慧的缺陷呢?比如,它编出来的程序会不会也出现bug?
但仔细分析这个问题,前景或许没那么黯淡。
让我们回到第一段:
通过向计算机描述所需程序需满足的功能,从而让计算机自己生成解决问题的方法。
看来,计算机自动编程需要解决两个重大问题:
一是如何建立一种语言,用它来描述程序的功能。这种语言最好是高于现在的编程语言的,因为它不对解决问题的具体过程作出描述,我们不妨称之为“面向功能”的语言。
二是如何让计算机自己找到解决问题的办法。这无疑才是最重要的问题,我们要往下探索的也正是这个。
第一个问题中的语言是完全可以让现有语言代替的--几乎所有问题都可以用一种程序化的办法获得其解决算法,那自然就是穷举(当然也有例外,比如输出只有一个bit的算法就不行)。我们可以毫不费力的用穷举法写出某个问题的解决算法,这个算法就已经包含了要实现功能的全部描述。
下一步要做的,就是如何把这个笨的恐怖的算法转化为一个低时间复杂度的算法。到此,第二个问题就转化为:
如何进行算法化简?
或许可以说,解决了这个问题就解决了计算机自动编程的问题。
每个算法都可以实现一个函数,尽管它或许是处理字符串之类数据类型的函数,我们是可以用编码将其定义域/值域映射到自然数集N上的。换句话说,每个算法所实现的功能,都可以用数论函数来表示。
这样,算法的化简,其实也就是其对应函数的化简。
要实现算法化简,必然要求找到一系列算法之间变换的规则(这里的算法必须是计算相同的函数的,我们将称之为等效算法),这类似于数学上的运算律,而事实上,数学中的运算律也正是来自于这组规则的。
那我们可以问很多问题,比如,这会是一组很简单的规则吗?使任一个算法都可以变换到它的任意等效算法的规则存在吗?是不是所有的算法都可以化简?
我们先来看第二个问题:使任一个算法都可以变换到它的任意等效算法的规则存在吗?
对于每一个证明问题,都可以看作是判定某个集合的所有元素是否都具有某一性质。进一步的,证明某一命题就是处理定义在某一集合X上的一个函数 f(x),看是否它对所有的输入都输出1。我们要是把计算这个f(x)的算法化简,将会的到什么呢?无疑,这个算法最简单的等效算法就只有一句:return 1。这说明,算法化简意味着计算机证明。
这里便出现了新的问题:根据哥德尔不完备性定理,存在这样的命题,它确实是为真的,可对它你却无法证明。问题是,如果化简这样的命题对应的f,结果怎样?如果非要达到最简,那岂不是要永远得不到结果?
这样我们就得出了答案:
使任一个算法都可以变换到它的任意等效算法是不可能的,因为这么一组变换规则并不存在。
原因是显而易见的,上文中提到的计算f(x)的算法是等效于return 1的,然而二者却无法相互变换。
第三个问题,我们可以由混沌作出猜测。
一个简单的函数,通过迭代往往会产生不可预测的行为。比如虫口模型:
Xn+1=kXn(1-Xn)
这个方程看似简单,但它可以产生极其复杂的行为。比如,当k取大于3.5699的一些值时,若以n为x轴,X为y轴建立一个坐标系,将每次迭代获得的x值画出来,你将会发现,x的变化几乎是毫无规律可循的,换句话说,它的表现几乎和一个随机变量没什么两样,这就是混沌。
混沌在现实中无所不在。同样的现象也出现在元胞自动机(CA)中。
下面是一段引用:
分析了 256 个初级 CA 和其他更复杂的 CA 后,Wolfram 发现 CA 可以分为四类。数学家和作家 Rudy Rucker 在其报告“Things Computer Science Tells Us About Philosophy”中准确地描述了这四种类型(请参阅 参考资料)。
第 1 类:恒定。 (所有种子都“死了”)
第 2 类:重复。 (循环,条带)
第 2A 类: 嵌套。(正则分形)
第 3 类: (伪)随机。 (激变)
第 4 类: 复杂。 (“不规则”。滑行。 一般性计算)
Wolfram 作出了似乎有道理的声明,大多数第 3 类和第 4 类 CA 可能是 无法省略计算的(computationally irreducible):给出一个初始状态,要找出某一细胞在第 n 步时的值,必须从初始配置开始,完成所有 n 步计算。就是说,没有公式或者快捷方式可以预测 CA 的未来状态。
在这里,第3、4类CA显然是走向混沌了。值得注意的是最后一句话,此时,“没有公式或者快捷方式可以预测 CA 的未来状态”。这也就意味着,如果我们用算法将X和n的函数关系表示出来后,是有可能无法期望用算法化简的到一个较简单算法的,唯一预测未来状态的方法就是一步步的计算。当然,这应该只是Wolfram的一个猜测,还未被严格证明的,直觉上我对这个观点的正确性是没有怀疑的,有兴趣的朋友可以试着去证明。
其实,这两个问题的意义只是让我们窥见算法化简的某些端倪,让我们了解了它的能力极限。它们并不意味着算法化简前途渺茫,因为毕竟在实际应用中是很少碰上上述情况的。
下面是一些题外话。
哥德尔不完备性定理第一条定理是这么说的:
任何一个兼容的数学形式化理论中,只要它强到足以在其中定义自然数的概念,就可以在其中构造在体系中既不能证明也不能否证的命题。
该定理并不意味着任何公理系统都是不完备的,如欧几里德几何就可以被公理化为一个完备的系统。事实上,几何问题的计算机证明已经被解决了,这启发我们野心小一点,去寻求小范围内的化简规则或许会有好的结果。