分类
事实上,现在已经有多种对应于各种不同知识表示方式的人工智能编程语言。按所对应的知识表示方式不同。大体上可以区分为以下几类:
1.对应于产生式规则知识表示的语言。例如,由美国卡耐基·梅农大学的C·L·福基(C.L.Forgy)等人于1 977年开发的OPS(official production system),当时’就用它来为DEC公司开发了一个解决VAX计算机系统配置问题的专家系统X1/XCON。
2.对应于逻辑公式知识表示的语言。一种已广为应用的逻辑语言就是PROLOG。它是1 970年由法国马塞大学的 A.柯迈豪埃(Alain Colmerauer)所开发的。
3.对应于框架或语义网知识表示的语言。这是一类所谓“面向对象”的(object-oriented)语言。其中一个有代表性的语种就是Smalltalk。它是在1980年首创,后来发展了好几个版本,通常以发布的年份来标记,例如,第1个版本叫Smalltalk-80等等。
4.对应于函数知识表示或函数式程序设计风格的语言。首先是由计算机科学家J.巴科斯(J. Backus)在1978年发表的一篇获图灵奖的著名论文中提出。这篇论文的题目就叫做:“程序设计能够摆脱诺依曼风格吗?程序的函数风格及其代数”。它提出的函数式编程语言,虽然在理论上很完美,而且建立在坚实的数学基础之上,但是在常规计算机上很难实现。倒是早在20世纪50年代末、60年代初美国麻省理工学院的约翰·麦卡锡等人首先开发的列表处理语言LISP(LISt Processing)迄今仍然广泛用于编写人工智能应用程序,特别是用于开发专家系统。函数语言在解释执行机制上的特点是递归地由最内层向外层归约(reduction),而每次归约都是把一个函数“作用”,于它的变元而得出函数值的过程。所以又称这类语言为“作用式”(applicative)语言。2
特性人工智能编程语言有一个共同的特点,那就是这些语言都是面向所要解决的问题、结合知识表示、完全脱离当代计算机的诺依曼结构特性而独立设计的;它们又处于比面向过程的高级编程语言更高的抽象层次。因此,用这些语言编写的程序,在现代计算机环境中,无论是解释或编译执行,往往效率很低。尤其当程序规模很大、很复杂时,将浪费大量系统资源(主要指处理机占用时间和存储空间占用量),使系统性能下降到难以容忍的地步。2
典型类型LISP语言早在20世纪50年代后期,麻省理工学院的John McCarthy就开始了人工智能的研究,他当时致力于设计一个用表处理的递归系统,并在20世纪60年代初研制出了LISP语言。LISP语言是一个用于处理符号表达式的、相当简单的函数式程序设计语言,其以数学中的函数与函数作用的概念作为设计原理,它奠定了函数式语言的基础。纯LISP语言是完全非vonNeumann风格的,它没有使用ALGOL60等语言中所采用的可修改变量、赋值语句、转向语句等yon Neumann结构语言中的有关概念。LISP程序与其数据结构采用了完全相同的结构形式与处理方式。因此可以相当方便地用LISP来编写它的解释程序。LISP语言除了用s一表达式来统一处理数据与程序外,还引入了前缀运算符表示法、递归数据结构、递归控制结构以及新的条件表达式形式。
Prolog语言Prolog(Programming in Logic)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。同时,对一些通常的应用程序的编写也很有帮助,能够比其他的语言更快速地开发程序,因为Prolog的编程方法更像是使用逻辑的语言来描述程序。
Prolog程序具有鲜明的逻辑编程语言特色,包括:没有特定的运行顺序,其运行顺序是由计算机决定的,而不是编程序的人;Prolog程序中没有if、when、case、for这样的控制流程语句;Prolog程序和数据高度统一,其程序实际上是一个智能数据库;Prolog语言具有强大的递归功能。自1981年日本政府宣布第5代计算机系统(FGCS)项目以Prolog为基础以来,Prolog已成为人工智能研究领域的主导语言。1
发展方向一是研制与某种语言完全适应的所谓新一代计算机。例如LlSP机、数据流机、PROLOG机、面向对象的体系结构等等。但是实践早已表明,此路前景渺茫。因为以诺依曼机为核心的现代通用计算机已经广泛普及而且性能还在不断提高,同时已经积累了巨大的软件资源。任何与现代计算机不兼容的专用机,最多因能满足个别特殊需求而在某些场合发挥作用,难以与现代通用计算机相抗衡。
第二条途径是,把几种不同风格的编程语言结合起来,发展复合语言或嵌入式语言,以便取长补短,使系统性能得以进一步提高。当前最为流行的是把面向对象语言的设计思路融汇到常用的面向过程的高级语言中。C++语言就是一个突出的例子。
第三条途径是,充分利用面向问题的人工智能编程语言的特点,先选择某种语言编写出一个简洁明了而易于调试的程序原型。通过验证、调试后,再仿照这个原型,改编为某种面向过程的高级语言程序,例如C或C++,甚至BASIC,以此来达到提高最终应用系统开发质量和执行效率的目的。用PROLOG、 LISP、OPS等来开发专家系统原型,已有不少先例。2