Prolog 序言。结构(复合词)和谓词,我真的没有区别

Prolog 序言。结构(复合词)和谓词,我真的没有区别,prolog,Prolog,我不熟悉prolog,似乎无法理解结构和谓词之间的区别。 真的有什么区别吗 边挖边发现有些人在考虑。 f(x):-a(x)< /强>为谓词,并考虑 嫉妒(X,Y):-loves(X,Z),loves(Y,Z)是一个结构(或复杂术语)。它们在我看来几乎一样 有人想解释一下吗?在序言中,术语是常数、原子、变量或复合术语 复合项由具有1个或多个参数的函子组成。以下是条款: 空列表[]是一个术语,更具体地说,是一个原子。列表[H | T]本质上表示为'。(H,T),因此是一个复合术语,因此也是一个术语

我不熟悉prolog,似乎无法理解结构和谓词之间的区别。 真的有什么区别吗

边挖边发现有些人在考虑。 <强> f(x):-a(x)< /强>为谓词,并考虑 嫉妒(X,Y):-loves(X,Z),loves(Y,Z)是一个结构(或复杂术语)。它们在我看来几乎一样

有人想解释一下吗?

在序言中,术语是常数、原子、变量或复合术语

复合项由具有1个或多个参数的函子组成。以下是条款:

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

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

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

复合术语也可以称为结构,因为它们提供了构造事实的方法:

customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).
谓语从句是一种特定的结构或术语。在Prolog中,所有内容都是一个结构或术语,其形式为:
函子(arg1,arg2,…)

让我们看一下谓词子句:

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

  • 这是“最高层次”(不是更高层次术语中的论点)

  • 它的函子是
    :-

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

一个或多个谓词子句的集合称为谓词,这些子句的头都具有相同的函子和arity(参数数)

看看你的第二个例子:

jealous(X,Y) :- loves(X,Z), loves(Y,Z).
这也是谓词
嫉妒/2
的一个谓词子句(其函子为
嫉妒
且算术数为2的谓词)。它在内部可以表示为这样一个复合术语:
:-(嫉妒(X,Y),“,”(爱(X,Z),爱(Y,Z))
。这意味着上述表达式也是一个复合术语

通过使用
write\u 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站点具有非常好的语法特性。

从语法上讲,唯一的区别在于术语出现的位置。如果它出现在顶部,它将被解释为一条规则,但如果它出现在参数中,它将是一个术语。有必要编辑您的答案,区分谓词和谓词子句。在问题和答案中,对谓语的引用实际上是对谓语从句的引用。值得注意的是,谓词定义了关系,而谓词子句定义了部分关系。只有当谓词由单个子句定义时,这种区别才是无声的。@PauloMora事实上,我已经考虑过为这种区别进行编辑。我只是不确定相对于原来的问题,术语的讨论应该走多远,因为原来的问题似乎更侧重于结构方面。但是,我更新了答案。这是一个重要的区别,所以谢谢你指出。非常好的帖子,回答了我关于这个话题的所有问题!然而,它提出了一个新的问题:
是什么?它似乎在Prolog中被含糊不清地使用:一次作为包含多个文本的结构的函子,一次用于分离结构的元素<代码>:-(嫉妒(X,Y),“,”(爱(X,Z),爱(Y,Z))@NiklasPeter,是的,我认为
有两个角色。一个是操作符,所以如果你写规范((a,b,c))你会得到
,,,,,,,,(b,c))
。在这种情况下,Prolog将
解释为逻辑连接。但是如果你写规范(a(b,c))你会得到
a(b,c)
。所以
a(b,c)
只是使用
作为参数分隔符。事实上,即使是这两个查询的结果也说明了
的双重性,因为
。你知道
a,b,c
周围的另一对括号是什么意思吗?是的,当然,如果您删除它,
write\u canonical
将失败,因为它收到了3个参数
a
b
c
,但我不知道这些圆括号是如何定义的。
(a,b,c)
的标准形式是
,”(a),”(b,c))
(a;b;c)
的标准形式是
;(a,;(b,c))
。括号仅用于分别对操作数和中缀运算符进行分组
jealous(X,Y) :- loves(X,Z), loves(Y,Z).
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))