【算法】 Prolog的基本语法

2024-02-21 10:07:02 浏览数 (3)

二、基本语法

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).

上面代码中,XY都是大写,表示这是两个变量。符号:-表示推理关系,含义是只要右边的表达式friend(Y, X)true,那么左边的表达式friend(X, Y)也为true。因此,根据这条规则,friend(jack, peter)就可以推理得到friend(peter, jack)

如果一条规则取决于多个条件同时为true,则条件之间使用逗号分隔。

代码语言:javascript复制
mother(X, Y) :- child(Y,X), female(X).

上面代码中,XY的母亲(mother(X, Y))取决于两个条件:YX的小孩,X必须是女性。只有这两个条件都为truemother(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是变量名。任意的变量名都可以,只要首字母为大写。

0 人点赞