与前文中介绍的形式科学使用公理化方法,依赖极少量公理推理出大量的定理和结论,进而构建出整套学说的过程类似,麦卡锡期望提供给 AdviceTaker 的先验知识是我们人类所了解的各种知识和常识中最基础、最本质的那一小部分。他希望 Advice Taker 先使用这些先验前提推理出简单的结论,再到复杂的结论,形成越来越多的新的知识,并根据这些知识持续改进自己的行为机制,从简单到复杂逐步获得人类的所有知识乃至超过人类现有的知识。麦卡锡将这样一套理想的系统和运作机制称为“常识编程”。
关于常识编程,麦卡锡在论文中也承认目前这只是一个框架性的构想,以至于他也不得不说“这个思路还有若干关键的问题没有得到解决”。对于常识编程的具体理论,笔者就不再做过多的枯燥阐述了,仍然通过一个简单例子来介绍一下这套机制大体上是如何工作的。
请读者设想一个场景:“你现在正在家里的书桌旁边看书,接到电话要去所在城市的机场接一位朋友,你应该怎样做?”
这个场景已经算是一个非常生活化的常识性问题了,听起来与任何学术都不会有半点联系。那就来看一下这个问题应该如何输入给 Advice Taker,以及它会输出怎样的结果:
● 首先,Advice Taker 中应该事先预置了几个最基础的行为规则。在这个场景中用到的包括:谓词“ can(x)”表示“如果可以实现 x 动作”、谓词“ do(x)”和“ did(x)”分别代表“执行x 动作”和“完成x 动作”,这几个谓词与任何特定问题无关,可作为公共的规则预置在系统中。
● 接下来,需要定义几个与问题相关的先验的前提,这里我们定义一个谓词“ at(x, y)”,表示“x 在y 旁边”。显然,at(x, y) 是具有传递性的,x在y 旁边,y 在z 旁边,可以推出x 在z 旁边的结论,用谓词逻辑来表达就是:
$$
\operatorname { a t } ( x , y ) , \ \operatorname { a t } ( y , z ) \to \operatorname { a t } ( x , z )
$$
● 在这个基础上,我们可以给 Advice Taker 输入一些常识来描述客观世界,如:
78
第二部分 学派争鸣