Prolog的基本概念和语法规则
的有关信息介绍如下:Prolog是逻辑编程语言,它的语法是极其简单而又独特的。在Prolog中,数据以逻辑规则的形式存在。在这篇经验中,我将介绍它的基本概念和语法规则。
3配置SWI-Prolog编程环境
在Prolog中,最简单的形式就是一些事实。现在,让我们来看下面这个事实:
狗(dog)咬(bites)人(man)
在Prolog中,这个事实的表述成以下形式:
bites(dog,man).
关系名在前,对象名在后,并用括号括上。在Prolog术语中,关系被称为谓词,对象被称为变元,整个事实叫作子句。无论是谓词还是变元,一般要用小写,且子句以英文句号“.”结束。
对象名如果非要用大写字母、空格等特殊字符,就必须要加单引号。在SWI-Prolog中,甚至支持汉字作为对象名(当然必须得加引号)。
需要注意的是,变元数可以是任意的,这取决于所期望联系在一直的对象数目,例如,要在Prolog中表达“约翰送给波林一块手表”这一事实,会是下方的语句:
give(john, pauline, watch).
在编写程序时,可以用/* */来表示注释,在其中的内容会在运行时被忽略;也可以用%来作为注释符,在那一行中,其后的内容也会被忽略。将事实录入后,再运行后,会有问号提示符“?-”,我们可以进行询问。在Prolog中,变量名的首字母必须大写。下图是一个关于学生信息的程序文件。
比如,要提出男生有谁的问题,可以这样询问:
-? male(X).
如果想看其他答案,可以键入字符“;”,这样Prolog就可以继续进行搜索。如果想到此为止,就按回车键。
如果要询问一些更复杂的问题,比如:“在一年级中,有没有20多岁,且学习化学的男生?”语句如下:
?- year(X, 1), age(X, Y), Y > 20, studies(X, chemistry).
表示“与”的逻辑意义时,要用逗号连接子句。
如果提出这样的问题:“Hazel在学数学或是化学吗?”语句如下:
?- studies(hazel, mathematics); studies(hazel, chemistry).
表示“或”的逻辑意义时,要用分号连接子句。但不建议在Prolog程序中滥用分号,因为会使程序的逻辑性不清楚,以至于难以跟踪。
如果要提问:“不学历史的男生有谁?”语句如下:
?- male(X), \+(studies(X, history)).
在SWI-Prolog中,表示否定用\+,但在其他Prolog方言中,也有用not的。使用时需要用括号将相应条件括起来。
但需要注意在这种否定子句中含有变量的情况下,需要将它放在后面。如果将否定条件放到前面,此时,X属于自由变量,也就是说,会先否定掉所有学历史的学生,达不到预期效果。
有时,我们对变量的值并不关心,我们可以使用空变量。空变量记作“_”。比如,要提问:“有学哲学的男生吗?”可以这样提问:
?- male(_), studies(_, philosophy).