序言。结构(复杂术语)与谓词,我真的没有区别

时间:2015-03-10 19:04:44

标签: prolog

我是prolog的新手,我似乎无法理解结构和谓词之间的区别。 真的有什么不同吗?

虽然挖掘我发现有些人考虑 f(X): - a(X)是一个谓词,有些人会考虑 嫉妒(X,Y): - 爱(X,Z),爱(Y,Z)是一个结构(或复杂的术语)。它们对我看起来几乎一样。

有人在意解释?

1 个答案:

答案 0 :(得分:14)

在Prolog中,术语是常量,原子,变量或复合词

复合词由带有1个或多个参数的仿函数 组成。以下是条款

a.          % a term with functor 'a' and 0 arguments
a(b,c).     % a term with functor 'a' and 2 arguments, b and c

空列表[] term ,更具体地说,是 atom 。列表[H|T]本质上表示为'.'(H, T),因此是复合词,因此也是

您还可以拥有更复杂的复合词

a(b(c,d), e(f,g(h)))

此处,a是一个带有两个参数的仿函数:b(c,d)e(f,g(h)),依此类推。

复合词也可以称为结构,因为它们为您提供了构建事实的方法:

customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).

谓词子句是特定的结构术语。在Prolog中,所有内容都是以下形式的结构 term functor(arg1, arg2, ...)

让我们看看谓词条款:

f(X) :- a(X).

它本身就是一个结构,它在内部表示为 term :-(f(X), (a(X)))。句点(.)是终结符。是什么使它成为谓词,如@false所示,是:

  • 它处于“顶级”(不是更高级别的论据)

  • 它的仿函数是:-

谓词子句也称为规则,因为术语:-(A, B)定义了关系A为真,则B为真。术语f(X)被称为谓词子句的<​​em> head 。

一个或多个谓词子句的集合,它们的头部都具有相同的仿函数 arity (参数个数)作为谓词

看看你的第二个例子:

jealous(X,Y) :- loves(X,Z), loves(Y,Z).

这也是谓词 jealous/2的一个谓词子句谓词,其仿函数为jealous和有2)的arity。它将在内部表示为复合词:-(jealous(X,Y), ','(loves(X,Z), loves(Y,Z)))。这意味着上面的表达式也是复合词

您可以使用write_canonical/1查看Prolog如何以规范形式查看表达式:

| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))

SWI Prolog网站非常好glossary of Prolog terms