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