首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >普罗洛。结构(复数术语)对谓词,我不太明白区别

普罗洛。结构(复数术语)对谓词,我不太明白区别
EN

Stack Overflow用户
提问于 2015-03-10 19:04:43
回答 1查看 3.8K关注 0票数 8

我对prolog很陌生,我似乎无法理解结构和谓词之间的区别。真的有什么区别吗?

在研究时,我发现有些人认为f(X):-a(X)是谓词,而有些人认为妒忌(X,Y):-(X,Z),爱(Y,Z)是一个结构(或复杂的术语)。在我看来它们看起来差不多。

有人想解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 19:40:23

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

复合项由一个具有一个或多个参数的函子组成。以下是术语:

代码语言:javascript
复制
a.          % a term with functor 'a' and 0 arguments
a(b,c).     % a term with functor 'a' and 2 arguments, b and c

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

你也可以有更复杂的复合词。

代码语言:javascript
复制
a(b(c,d), e(f,g(h)))

在这里,a是一个函子,有两个参数:b(c,d)e(f,g(h)),等等。

复合术语也可以称为结构,因为它们给了你一种构造事实的方法:

代码语言:javascript
复制
customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).

谓词子句是一个特定的结构或术语。在Prolog中,一切都是表单的结构或术语:functor(arg1, arg2, ...)

让我们看一下谓词子句:

代码语言:javascript
复制
f(X) :- a(X).

它本身就是一个内部表示为这个术语的结构::-(f(X), (a(X)))。句点(.)是终止符。如@false所示,使它成为谓词的原因是:

  • 这是在“最高层”(不是更高层次的论点)。
  • 它的函子是:-

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

一个或多个谓语从句的集合,对于它们的头都具有相同的函子和性(参数的数目),被称为谓词。

看第二个例子:

代码语言:javascript
复制
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如何以其规范形式查看表达式。

代码语言:javascript
复制
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))

SWI站点有一个非常好的Prolog术语汇编

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28972038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档