在前几章中,讨论了如何运用人工智能技术求解一些问题的一般方法,这些方法可运用于定理证明、自然语言理解、模式识别、机器人规划以及专家系统等各个领域。然而,如何在计算机上实现这些方法呢?这就涉及到了计算机语言问题,也就是说,是否需要一种专门的人工智能语言。严格地讲,可以使用任何计算机语言来实现这些算法,但是大量  事实表明,使用专门的人工智能语言,可以方便而有效地建立人工智能系统。
  在人工智能的研究发展过程中,从一开始就注意到了语言问题,开发出了适合于各种用途的计算机语言,较早地被作为人工智能语言使用的计算机语言是LISP。LISP语言最初是在1960年作为定义数学函数的一种记法来介绍的,但因其具有较强的符号处理功能和较灵活的控制结构,特别适合于人工智能的研究,从而很快受到了人工智能工作者的青睐,在很长的一个时期内,LISP语言一直被用作人工智能系统的主要设计语言。
  从七十年代开始,在LISP语言的基础上,通过扩充功能的方法,设计出了PLANNER,CONNIVER以及POP-2等语言,同时推出了程序设计环境更为完善的强化LISP版本---INTERLISP。
  八十年代初,在总结了各种LISP不同版本的优缺点的基础上,又推出了功能更强的COMMON LISP版本。
  六十年代末期,以谓词逻辑为基础,开发了运用于定理证明的QA1、QA2和QA3语言,后来受到PLANNER的影响,又推出了QA4语言。
  随着功能的扩充,系统变得越来越大,这样既降低了处理速度,又为程序调试带来了困难,为此,于1972年开发了基于一阶谓词逻辑的逻辑型语言---PROLOG,该语言实现了自动推理等功能,显示了一定程度上的智能性。
  从七十年代中期开始,随着几个具有代表性的专家系统的推出,又产生了各种专门适合于建立专家系统的工具语言,如较典型的EMYCIN、KAS、EXPERT、OPS5以及ART等,将计算机语言推向了一个更高的层次。
  本章主要介绍LISP语言和PROLOG语言,以便使读者对人工智能语言有一个概貌的了解。

5.1 LISP

  LISP语言被称之为表处理语言,它的基本数据结构就是表。LISP语言在人工智能历史上有着重要的地位,80年代中期以前的人工智能系统几乎都是用LISP语言实现的。
  LISP是一种计算机的表处理语言,它是英文List Processing的缩写。自从1960年J. McCathy在美国MIT首先发表LISP以来,很快就被人工智能工作者所接受,成为在人工智能领域应用的最广泛的计算机语言。人工智能所取得的各项成果,都是和LISP的功劳分不开的,人们曾这样对LISP语言做出评价:LISP语言是人工智能的数学,不仅对人工智能的机器实现有重要意义,而且是人工智能理论研究的重要工具。LISP语言武装了一代人工智能科学家。
  很长一个时期内,LISP语言并不规范,很多公司推出了具有不同特点的LISP语言,就如同各种"方言"一样,不同版本的LISP语言之间差异很大,虽然他们的设计思想都是一样的,这一点妨碍了LISP语言的普及和使用。直到80年代中期,由美国一些大学和公司共同制定了一个被称之为COMMON LISP的LISP语言规范,各种不同的LISP语言才逐渐规范起来,COMMON LISP成为了事实上的标准。
  目前,流行的LISP语言具有各种不同的版本,使用最广泛的是INTERLISP、MACLISP和COMMON LISP。COMMON LISP自从80年代中期推出以来,已经成为了LISP语言事实上的标准。本节将以COMMON LISP为蓝本,对LISP语言做一个简单的介绍。

  1.基本结构
  LISP语言的基本结构是S-表达式,其中最常用的是原子和表这两种形式。表是一类特殊的S-表达式的简化表示。LISP语言的程序和数据具有统一的结构,即S-表达式。
  组成S-表达式的基本要素是原子,原子是由一些排列在一起的字符组成的,它含有以下三类:
(1)文字原子。又名符号(Symbol),一般指由英文字母开头的一串字符。如ABC、append、X12等。
(2)串原子。串原子是用双引号括起来的一串任意字符。如"This is an atom"、"ABC"等。
(3)数字原子。定点数和浮点数统称为数字原子。如123、3.14等。
S-表达式可以由下面的递归定义得到
(1)原子是S-表达式;
(2)两个S-表达式组成的点对,即形式(<S-表达式1>・<S-表达式2>)是S-表达式。
由以上的递归定义可知,以下的都是S-表达式。
(A・B)(A・(B・C))((A・B)・(C・D))
在LISP语言中,最常用的结构是表,表是一种特殊的S-表达式,其定义如下:
表是由用圆括号包围的若干个元素组成的,各元素之间以分隔符分开,元素可以是原子或者是表。
例如,(A B C)、(x y(A B))、(1(2(3)))等都是表。
特别,当表的元素数为零时,我们称之为空表。记为( )或NIL。
表面上看来,表与S-表达式有很大的不同,实际上表是一种特殊的S-表达式的简写形式,每个表都对应着一个S-表达式。
下面举例说明其对应关系:
(A)(A#NIL)
(A B)(A#(B#NIL))
((A B) C D)((A#(B#NIL))#(C#(D#NIL)))