二、基本语法
2.1 常量和变量
Prolog 的变量和常量规则很简单:小写字母开头的字符串,就是常量;大写字母开头的字符串,就是变量。
?- write(abc). abc true. ?- write(Abc). _3386 true.
上面代码中,abc是常量,输出就是自身;Abc是变量,输出就是该变量的值。
2.2 关系和属性
两个对象之间的关系,使用括号表示。比如,jack 的朋友是 peter,写成friend(jack, peter).。
注意,jack 的朋友是 peter,不等于 peter 的朋友是 jack。如果两个人都认为对方是朋友,要写成下面这样。
friend(jack, peter). friend(peter, jack).
如果括号里面只有一个参数,就表示对象拥有该属性,比如 jack 是男性,写成male(jack).
。
2.3 规则
规则是推理方法,即如何从一个论断得到另一个论断。
举例来说,我们定下一条规则:所有朋友关系都是相互的,规则写成下面这样。
friend(X, Y) :- friend(Y,X).
上面代码中,X和Y都是大写,表示这是两个变量。符号:-表示推理关系,含义是只要右边的表达式friend(Y, X)为true,那么左边的表达式friend(X, Y)也为true。因此,根据这条规则,friend(jack, peter)就可以推理得到friend(peter, jack)。
如果一条规则取决于多个条件同时为true,则条件之间使用逗号分隔。
mother(X, Y) :- child(Y,X), female(X).
上面代码中,X
是Y
的母亲(mother(X, Y)
)取决于两个条件:Y
是X
的小孩,X
必须是女性。只有这两个条件都为true
,mother(X, Y)
才为true
。
如果一条规则取决于某个条件为false
,则在条件之前加上\+
表示否定。
onesidelove(X, Y) :- loves(X, Y), \+ loves(Y,X).
上面代码中,X
单相思Y
,取决于两个条件。第一个条件是X
喜欢Y
,第二个条件是Y
不喜欢X
。
2.5 查询
Prolog 支持查询已经设定的条件。我们先写一个脚本hello.pl
。
friend(john, julia). friend(john, jack). friend(julia, sam). friend(julia, molly).
然后在 SWI-Prolog 里面加载这个脚本。
?- [hello]. true.
上面代码中,true.
是返回的结果,表示加载成功。
然后,可以查询两个人是否为朋友。
?- friend(john, jack). true. ?- friend(john, sam). false.
listing()
函数可以列出所有的朋友关系。
?- listing(friend). friend(john, julia). friend(john, jack). friend(julia, sam). friend(julia, molly). true.
还可以查询john
有多少个朋友。
?- friend(john, Who). Who = julia ; Who = jack.
上面代码中,Who
是变量名。任意的变量名都可以,只要首字母为大写。