从原则上来说,我们可以用“生成与测试”的方法,也就是试错的方法,来解决任何已经知道解决方案的问题。但在实际操作中,就算是最强大的计算机,要测试出可能的解决方案所需的时间也还是会太长。就算是用十几根木头组装一个简单的房子,要搜索完所有的可能性,一个孩子一生可能都试不完。下面是对盲目试错方法的一个改良版本。
进展原则(The Progress Principle) :如果我们拥有某种方法可以检测到“进展”,任何穷举搜索程序都可以在很大程度上简化。之后我们可以朝着解决问题的方向追踪,就像一个人可以在黑暗中攀登不熟悉的山峰一样,通过在每一步感觉四周来寻找上升坡度最大的方向。
许多简单的问题都可以通过这种方式来解决,但对于一个困难的问题,识别出“进展”几乎和解决问题本身一样难。如果没有更宽阔的视野,那个“登山者”可能会一直被困在某个小山丘上,永远也找不到顶峰。要避免这一点没有什么简单的方法。
目标与子目标(goal and subgoal) :想知道如何解决一个困难的问题,我们所知的最有力的方式就是想办法把这个问题拆分成若干个简单一些的问题,每个问题都可以分别解决。
在所谓的人工智能(Artificial Intelligence)领域,许多研究关注的都是找到一些方法可以把一个问题拆分成若干个子问题,然后如果有必要,再把这些子问题拆分成更小的问题。在接下来的几部分中,我们将会看到如何用“目标”的形式来表述问题,从而可以实现上述过程。
使用知识(using knowledge) :解决一个问题最高效的方法就是已经知道如何解决它。这样人们就可以避免检索所有可能性。
相应地,人工智能研究的另一个分支就是找到一些方法把知识收录到机器中去。但这个问题本身就分为几个部分:我们必须知道如何获得所需的知识,必须学会如何表述这些知识,最后必须开发一些程序以有效地利用这些知识。要完成所有这些事,记忆必须优先呈现那些对我们实现目标可能有帮助的关系,而不是大量的细枝末节。这类研究已经引领出许多可以实际操作的问题解决系统,它们都是“以知识为基础”的系统。其中有一些常常被称为“专家系统”,因为它们的基本原理就是模仿一些特别的从业人员的方法。
这类研究中还浮现出一个奇怪的现象。与大部分人认为很容易的问题相比,比如用儿童积木搭建一个玩具房子,让机器去解决一些只有受过教育的人努力思考才能解决的特殊问题反而更容易一些,比如下棋,或者证明逻辑或几何定理。这也是我在本书中常常强调“简单”问题的原因。