PROLOG语言
PROLOG是英文“PROgramming in LOG”的缩写,意思为逻辑程序设计,它最早由R·Knowalski首先提出。世界上第一个PROLOG系统于1972年由A·Colmerauer及其研究小组在法国马赛研制成功。
PROLOG以逻辑程序设计为基础,最初设计PROLOG的目的是作为处理逻辑推理问题的会话式语言,并以处理一阶谓词演算为背景。后来,由于PROLOG具有简洁的文法,丰富的表达力和独特的非过程型等特点,从而日益受到了计算机界的重视,引起了越来越多的人的注意,现在PROLOG语言已被广泛应用于关系数据库、抽象问题求解、数理逻辑、公式处理、自然语言理解、专家系统以及人工智能的许多领域。
PROLOG是一种人工智能语言,它同其它大多数程序设计语言一样,也有许多不同的实现系统,它们具有各自的语义语法特色。本章主要介绍一种称为“核心PROLOG”的标准文本,目前,多数PROLOG系统基本上遵从这个标准文本的规定。
一、PROLOG的基本内容
1.PROLOG的特点
作为一种程序设计语言,PROLOG具有两方面的特性:一是它描述求解问题的方式;二是语言本身的特点。
如众所周知,用通常程序设计语言(如FORTRAN,PASCAL)来解问题时需指明算法,即对一给定的问题指明一系列计算机要执行的计算步骤,告诉计算机“如何做”。与这些通常的程序设计语言不同,PROLOG语言求解问题时,要求程序员描述所解问题中的对象和反映它们之间关系的某些已知事实,描述和定义诸对象和它们之间关系的某些规则。它强调描述对象(和事实)之间的逻辑关系,程序员一般不必告诉计算机运行执行的先后次序。因此,从能够描述问题本
身,而不必描述求解问题的详细计算步骤这一点讲,PROLOG是更高级的语言,它可看作为一种描述性语言。
目前,人们往往把语言分为函数型语言、逻辑型语言和其它语言,这是因为这三类语言在性质上和描述问题的方式上有着很大的差异。
PROLOG语言除了上述的特性外,还有下面一些特点:
①PROLOG的数据和程序结构统一,PROLOG提供一种一致的数据结构,称为项(term)。所有数据和程序都由项构造而成的。在智能程序中常需要将一段程序的输出数据作为新产生的程序来执行,因此人工智能语言就具有数据和程序结构一致的特性,LISP在这方面是当之无愧的,它的程序和数据都是S—表达式。而PROLOG也不逊色,它的程序和数据都是以项为基本单位,并且都是树型结构。
②PROLOG能够自动实现模式匹配和回溯,这些是人工智能系统中最常使用的,最基本的操作。由于PROLOG系统提供了自动完成这些操作的功能,使用户在PROLOG语言这一级上不必考虑这些问题。
③与LISP语言一样,递归是PROLOG语言的重要特点,它反映在程序和数据结构中,由于这一特性,一个大的数据结构常常能够由一个小的程序来处理。
PROLOG的所有这些特性,使得PROLOG语言特别适用于描述智能程序,因此人们习惯把PROLOG称为人工智能程序设计语言,并将它作为进行人工智能系统设计的工具。
2、PROLOG的简单实例
我们从一个简单例子开始介绍PROLOG程序,设有一有向图,如图6-8所示,现用PROLOG来描述图中的两点之间的关系。
c d e a b
图6-8 一个简单的有向图例子
若用connected(X,Y)表示从X到Y有一条有向边,则图6-8可用下面的PROLOG事实来描述:
connected(e,b). connected(c,d). connected(d,e).
现在定义两点有通路的概念,点X到Y有通路是指:
①X到Y有一条有向边。
②存在一点Z,X到Z有一条有向边,并且Z到Y有一通路。 上面这个通路的定义,可以用PROLOG的规则来描述: path(X,Y):—connected(X,Y).
path(X,Y):—connected(X,Z),path(Z,Y).
这path(X, Y)表示X到Y有一通路,符号“:—”表示“如果”,逗号“,”表示“并且”。
因此上面第一条规则的含义是:如果X到Y有一条有向边,则X到Y有通路。第二条规则的含义是:如果X到Z有一条有向边,并且Z到Y有通路,则X到Y有通路。
输入了上述事实的规则之后,就可以向机器询问图中各点之间的关系。 ?—path(a, b). a到b有通路吗?
yes
?—path(b, a). b到a有通路吗?
no
?—path(d, Y). d到哪一点有通路?
Y=e (Y代表变量)
?—path(b, X), path(c, X).
x=d
以上就是一个简单的PROLOG程序,以及一旦这个程序进入机器后,用户以会话方式运行这个程序的情况:
从这个实例中,我们可以看出,PROLOG语言提供了三种基本语句: ①事实:它说明一个问题中的对象和它们之间的关系的一些已知事实。 ②规则:它用来定义对象和它们之间的关系,用来描述一个事实依赖于其它
一组事实。
③用来询问有关对象和它们之间的关系。 3.事实
从上一节看到,为了表达从点a到b有一条有向边这一事实,写了connected(a, b)。这个事实由两个对象(a和b)以及一个关系(connected)所组成。
在PROLOG中事实一般形式是:
①首先写关系,接着是括在一对圆括号内的若干对象,对象间用逗号隔开。 ②对象和关系名必须以小写字母开头。 ③在事实的末尾名必须写上实心点“·”。
在PROLOG中,关系connected被称为谓词,括号中的(a, b)被称为变元,谓词名是任意的,变元的个数也是任意的,但应注意在圆括号中的诸变元的书写次序。实际上,这种次序是任意的,但在书写事实时必须确定某种次序,一旦确定后,在以后这一事实的使用时要保持这种次序的一致性,例如事实connected(a, b)是指从点a到b有一条有向边,下面是一些事实例子以及解释:
on(book, desk). 书在桌子上面 owns(john, book). john有书 valuable(gold). 金是值钱的 father(john,mary). joho是mary的父亲 play(jane, jin, badminton) . jane和jin打羽毛球 4.规则
假设我们要叙述这样的事实:john喜欢所有的人,表示这一事实的一种方法是写出下列所有各个事实:
likes (john, david). likes (john, tom). likes (john, jane). ?
显然这种表示法是不方便的。因此表示john喜欢所有人的另一种方法是把它说成:“john喜欢任一对象,只要这一对象是人。”于是,便可以用下面的规则来表示:
likes(john, X):—person(X).
它的含义是:如果X是人,则john就喜欢这个X所指的人。注意,这里X是大写字母代表变量。
在PROLOG中,当你要描述一个事实依赖于其它一组事实时,则用规则来表示。我们用“如果”、“则”来表示一个规则,例如:
“如果某人有钱,则他就买汽车。” 用规则描述为:
buy(X, car):-have(X, money). 规则可用来表示定义,例如:
如果X是一动物,并且X有羽毛,则X是鸟。 bird(X):-animal(X), feather(X).
从上面例子可以看出:规则是诸对象和它们的关系的一般陈述。一个规则由头和体组成。头是:—符号的左部,体是“:—”符号的右部。“ :—”的意思是如果,规则以“.”结尾。
规则的头描述了这条规则企图定义的事实。规则的体描述了一些目标的连结。为使头成为真的,这些目标必须逐个被满足。体中目标一个接着一个写,中间用逗号“,”分开,逗号的意思是并且,它们把体中目标连结起来。
现把规则的各部分形象地描述如下: bird(X) :- animal(X),feathers(X). 头 如果 并且 体
这里的“:—”也读作“只要”。显然规则的这种形式类似于Horn子句。 通常一个谓词能用事实和规则的混合来定义。 例:likes(john, food).
likes(john, X):- person(X).
我们再举出规则的几个例子:John喜欢任何喜欢讲话的人。换句话说,John喜欢某个人,如果这个喜欢讲话。
用规则表示:
like(john, X):-person(X), likes(X, talk).
如果我们希望表示,John喜欢任何喜欢讲话和游泳的人,则只要简单地加一目标到上面体中,并用逗号隔开。