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

Prolog. Structure(complex term) vs predicate, i dont really get the difference

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

在四处挖掘时,我发现有些人认为 f(X):-a(X) 是一个谓词,有些人认为 jealous(X,Y):-loves(X,Z), loves(Y,Z) 是一个结构(或复数项)。它们在我看来几乎一样。

有人愿意解释一下吗?

在 Prolog 中, 是常数、原子、变量或复合项

一个复合词由一个函子和一个或多个参数组成。以下是

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 中,一切都是 structureterm 形式:functor(arg1, arg2, ...).

我们来看谓词从句:

f(X) :- a(X).

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

  • 在"top level"(不是更高层次的论点)

  • 它的函子是:-

A predicate clause 也称为 rule 因为术语 :-(A, B) 定义了 关系:如果B为真,则A为真。术语 f(X) 被称为谓词从句的 head

一个或多个谓词子句的集合,它们都具有相同的函子arity(参数数量)他们的头被称为谓词

看你的第二个例子:

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

这也是谓词子句 谓词 jealous/2谓词 其函子为 jealous 且元数为 2)。它在内部表示为这个 复合词 :-(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