5.2 PROLOG

  PROLOG属于逻辑程序设计语言,其理论基础是一阶谓词逻辑。该语言与我们前面介绍的基于规则的逆向演绎系统非常相似,采用深度优先、逆向推理的方式求解问题。PROLOG语言自从70年代初期被提出以后,曾经风靡一时,受到了计算机界,尤其是人工智能界研究者的高度重视,日本在开展第五代计算机计划时,曾经把PROLOG语言作为核心语言使用。PROLOG程序设计不像传统的程序设计那样描述计算机"如何做",而是描述计算机要"做什么",至于如何做,则由PROLOG语言自己完成。这正是PROLOG语言引起人们重视的主要原因。但正是由于PROLOG语言自己决定"如何做",使得求解问题的效率比较低,严重影响了它的使用。但不管怎么说,PROLOG语言必定向自动求解迈进了一步。

  PROLOG是一种基于一阶谓词的逻辑型程序设计语言,它是英文Programming in Logic的缩写。自从1972年法国的马赛大学首次发表PROLOG以来,就引起了计算机界和人工智能界的高度重视,其原因有两个方面,一方面PROLOG是基于一阶谓词逻辑的,而一阶谓词逻辑既有坚实的理论基础,又有较强的表现能力;另一方面是PROLOG具有自动推理能力,虽然这种能力目前还比较弱,但它确实由程序设计的"How to do"描述向"What to do"描述前进了一步,而这一点正是理想的人工智能程序设计语言所应具有的特点之一。
PROLOG语言的基本组成单位是项。最简单的项是数字、常量和变量,常量用一串小写字母表示,变量用以大写字母开头的一串字符表示。例如
is-father ma append Heat
如下形式的结构也是项:
<关系名>(<项1>,…,<项k>)
例如
point(X,Y,Z)
sentence(np(he),vp(v(likes,up(her))))
均是项。

PROLOG中的表与LISP中的表,在概念上是一致的,但表示形式有所不同。

  表也是项,PROLOG中的表是用符号"["和"]"包围起来的一些元素,元素之间用","号分开,元素可以是常量、变量、数字或其它的表,以下都是表的例子。
[a,b,c] [1,2,3] [ ]
其中,[ ]为空表,表示表的元素个数为零。

表头、表尾和结构符"|"在PROLOG中是非常重要的概念,一定要理解好它们的含义。

表的第一个元素被称为表头,而其余元素组成的表为表尾,如在表[a,b,c]中,a是表头,[b,c]是表尾。在表中可以使用结构符"|",在"|"前面的n个元素是表的前n个元素,在"|"后面用一个表给出表的其它元素。例如,表[a,b,c]也可以表示为[a|[b,c]]。利用结构符"|"可以表示出各种表的模式,如[a |X]表示以a为头的表,[H |T]表示一个非空表。

PROLOG中的子句,相当于一阶谓词逻辑中的蕴涵式,如子句:
P:- Q,R,S
可以理解为:
Q∧R∧S → P

一个PROLOG程序是一系列的子句,子句通常由句首和句体组成,中间用符号":-"分开,句首一定是一个项,句体可以有几个项。如在子句
P:- Q,R,S
中,P是句首,Q,R,S是句体,它表示"当Q,R,S均为真值时,P才为真"。
PROLOG程序一般可分为事实和规则两部分。事实用只有句首的子句表示,并以"."结束。