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

K.T*_*nov 8 prolog

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

虽然挖掘我发现有些人认为 f(X): - (X) 是一个谓词,有些人认为是 嫉妒(X,Y): - 喜欢(X,Z),喜欢(Y,Z) 是一个结构(或复杂的术语).他们对我看起来几乎一样.

有人在意解释吗?

lur*_*ker 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
Run Code Online (Sandbox Code Playgroud)

空列表[]术语,更具体地说,是原子.列表[H|T]本质上表示'.'(H, T)为,因此是复合术语,因此也是术语.

您还可以使用更复杂的复合词:

a(b(c,d), e(f,g(h)))
Run Code Online (Sandbox Code Playgroud)

这里a是一个带有两个参数的仿函数:b(c,d)e(f,g(h)),等等.

一个复合词,也被称为结构,因为他们给你一个方法来组织的事实:

customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).
Run Code Online (Sandbox Code Playgroud)

谓词子句是特定结构术语.在Prolog中,一切都是形式的结构术语:functor(arg1, arg2, ...).

我们来看看谓词子句:

f(X) :- a(X).
Run Code Online (Sandbox Code Playgroud)

它本身是一个结构,其内部被表示为这样的术语::-(f(X), (a(X))).句点(.)是终止符.正如@false所表明的那样,它是谓词的原因是:

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

  • 它的算子是 :-

谓词子句也被称为规则,因为该术语,:-(A, B)定义了关系:A是真,如果B为真.该术语f(X)称为谓词子句的头部.

一个或多个谓词子句的集合,它们的头部都具有相同的functorarity(参数个数),称为谓词.

看看你的第二个例子:

jealous(X,Y) :- loves(X,Z), loves(Y,Z).
Run Code Online (Sandbox Code Playgroud)

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

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

| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))
Run Code Online (Sandbox Code Playgroud)

SWI Prolog网站有一个非常好的Prolog术语表.