逻辑编程
从20世纪70年代末到80年代中期,基于逻辑的人工智能范式开始逐步拥有影响力,到了80年代初,它已经成为人工智能的主流。研究人员开始推测,它不仅在人工智能领域有用,甚至可以推广至整个计算机领域。逻辑编程 开始广为人知,从根本上改变了人们的编程模式。长期以来,编程是一项烦琐、耗时且容易出错的工作,因为它迫使人们思考计算机程序操作的每一个步骤,并且不能出一丁点儿错,人应付起来相当艰难。而逻辑编程把程序员从这样的诅咒里解脱出来,这是它的最大卖点。在逻辑编程中,你可以利用逻辑的力量来表达你对问题的了解——剩下的事情,交给逻辑推理即可。你没必要详细写出每一个步骤,一个逻辑程序会推断出它实际上需要做什么。
逻辑编程使用的是一种非常有名的语言:PROLOG[37] ,它可能算是逻辑人工智能时代最卓越的遗产了——这种语言至今仍在广泛使用和传授。PROLOG主要是由美籍英国研究员鲍勃·科瓦尔斯基(Bob Kowalski),以及两名来自法国马赛的研究员,阿兰·科尔默劳尔(Alain Colmerauer)和菲利普·罗塞尔(Philippe Roussel)发明的。在20世纪70年代早期,科瓦尔斯基就意识到可以使用一阶逻辑规则来构建编程语言的基础,虽然他有了这个新想法,但是并没有落实细节——这项工作是在1972年科瓦尔斯基拜访之后,由科尔默劳尔和罗塞尔完成的。
PROLOG是一门非常直观的语言,我们来看一个例子。下面是如何用PROLOG表示前文举的“凡人皆有一死”的例子:
human (emma).
mortal (X):-human (X).
第一行程序是PROLOG中定义的“事实”,即艾玛是凡人。
第二行是PROLOG中的“规则”,表示若是X是凡人,X终有一死。
在实际中运用PROLOG,我们需要给它一个目标。在本例中,我们需要确认艾玛是否会死亡,可以这样表示:
mortal (emma).
这句语句的目的是向PROLOG询问“艾玛是否终有一死”,或者用更具体的方式表述,即“你能根据已知的事实和规则推断艾玛是否终有一死吗?”有了这个目标,PROLOG就能使用逻辑推理来证明,该语句为真[38] 。(有关PROLOG的深入了解,请参阅附录B。)
上述例子只展示了PROLOG强大功能的冰山一角,对于某些问题,你可以用PROLOG编写出非常简洁优雅的程序。1974年大卫·沃伦(David Warren)编写的战机计划系统可以解决积木世界内的规划问题,只需要100行PROLOG代码[39] 。如果要用Python之类的语言编写同样的系统,大概需要数千行代码以及数月的工作。此外,用PROLOG编写的程序不仅仅是程序,还是逻辑公式。因此,PROLOG程序看上去实现了麦卡锡对基于逻辑的人工智能的设想。
在20世纪70年代末到80年代初,PROLOG开始崭露头角,直到它挑战麦卡锡倍加推崇的LISP语言——人工智能黑客首选的编程语言。80年代初,PROLOG成为日本政府大规模投资的对象,被称为第五代计算机项目。当时,与美国和欧洲的经济相比,日本经济呈现蓬勃发展之势,这也让美国和欧洲政府十分担心。但同时,日本政府也有所顾虑,虽然日本工业擅长技术再开发和商业化,但在根本的创新性方面,尤其在计算机领域,它并不十分出色。第五代计算机项目旨在改变这一现状,试图确立日本全球计算机创新中心的地位,而逻辑编程是定向投资的关键技术之一。在后续的十年里,大约4亿美金被投入到第五代计算机项目中。不过,尽管它在建立日本的计算机科学基础方面发挥了重要作用,却并没有让日本的计算机产业超越美国。PROLOG也没有像逻辑编程界人士所期望的那样,成为一种通用计算机语言。
虽然PROLOG没有征服程序员的世界,但不能将它视为失败。毕竟,在世界各地,程序员每天都在愉快地使用PROLOG编写高效的程序,并感激这种语言的强大和优雅。但对我来说,PROLOG最大的贡献却是无形的:逻辑编程为计算机提供了一个全新的思路,就如何解决计算问题而言,它有着跟传统计算机完全不同的观点。一代又一代程序员因此受益匪浅。
本书评论