引导程序系列:学习Prolog(第一部分)

ZDNet软件频道 时间:2006-11-30 作者:Builder.com.cn |  我要评论()
本文关键词:
本周我们来讨论Prolog——一门说明性语言。它之所以有趣是因为它工作的方式与大多数流行的编程语言完全不同。

那么你可能会问,解释器知道到底john是kate的家长还是kate是john的家长吗?
它不知道——而且它也不在乎是不是,只要这种关系对于你有意义就行了。我们会决定说parent(X, Y)表示“X是Y的家长”。这样kate就有两个父母——john和joan。我们现在就开始一些有趣的东西……

parent(john, kate).
parent(joan, kate).

female(joan).
female(kate).
male(john).

mother(X, Y) :- female(X), parent(X, Y).

这里我们开始看到了这门语言的威力。新的语句“mother(X,Y)”引入了两个新的概念:
1)变量——Prolog里的变量可以是任何以大写字母开头的词。与之不同的是,就如前面提到的,原子总是以小写字母开头的(kate、joan和john)。一个变量可以被程序的任何原子替换。
2)条件——最开始使用的语句“mother(X, Y)”后面接有冒号和短横“:-”。然后接那些最开始的语句为真的条件。用普通的语言来表述就是,“如果X是女性,且X是Y的家长,那么X就是Y的母亲”。

如果不解释Prolog的另外一面是没有意义的——Querying。到现在为止,你看到的是如何声明“事实”。Querying允许我们向Prolog解释程序询问它知道什么。了解Prolog能做什么的一种简单方式就是这样的。你可以把上面的代码复制到顶端的文本框里,并在下面的文本框里输入查询。

在查询框里输入下面这个问题:
female(joan).
结果会返回“是”,表示joan确实是个女孩
parent(joan, kate).
这也会返回“是”,因为joan是kate的家长。

下一个很有意思,它告诉你的东西要比你直接输入进去希望获得的新东西多。如果你在查询里使用一个变量(特征要以大写字母开头),那么Prolog会给出满足这一条件的变量的所有可能的值。因此,如果你运行查询:
parent(X, kate).
Prolog将返回下面这些值(还有我删掉的一些时间信息):

X=john
yes

X=joan
yes

如果Prolog引擎用“john”去替换X,或者用joan替换X,那么它会确定查询为真。试试这样一个查询:
mother(X, kate).
Prolog将通过上面的定义确定为了让X成为kate的母亲,X必须是kate的家长,且X必须还是女性。满足这两个条件的原子只有joan。

试着向上面的程序添加新的事实,甚至编写更多附有条件的语句(比如上面的“母亲”)。本教程将继续,我们要更加深入地了解这门语言的核心。

责任编辑:张琎

查看本文的国际来源


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134