在序言中,仿函数与谓词和目标

In prolog, functors vs predicates, and goals

我开始学习Prolog。我有各种各样的书,我什至买了标准书。我喜欢标准之类的东西,因为它们可以精确地定义事物。但我无法理解一些概念。特别是仿函数和谓词之间的区别,目标到底是什么?通常,书籍使用的术语各不相同,有时不够精确,这会增加混淆。

在标准中,谓词定义为 "a predicate with arity N and a sequence of N arguments",谓词定义为 "an identifier together with an arity"。因此,当他们在 The Art of Prolog 2nd 中写类似 father(Father, Child) 的内容时,他们称 father/2 为谓词。

好的,但是当我检查语法时,我们讨论的是复合术语(不是谓词或谓词),它们由函子名称和参数组成。所以我检查了标准中的定义,看到函子是 "an identifier together with an arity",与谓词相同的定义,以及复合术语 "a functor of arity N, N positive, together with a sequence of N arguments".

那么函子和谓词之间的关系是什么?从语法上看,它们看起来是一样的。为什么 father(Father, Child) 不能用函子 father/2 而不是谓词 father/2 称为复合词(我猜它确实是句法上的)?我们什么时候使用一种或另一种术语?

为了把樱桃放在首位,目标是 "a predication which is to be executed"。我们是在 Prolog 程序内部还是只在查询中讨论目标?在序言的艺术中,写着"goals are atoms or compound terms"。因此我们可以在 Prolog 程序中到处谈论目标吗?我的阅读让我觉得它只在查询中使用。但我不确定。

在查询中,我猜 mother(X, Y) 是一个目标,mother/2 是一个谓词,但 mother(X, Y), male(Y) 是一个目标吗?还是由两个目标组成?据说目标可以是一个原子或一个复合词。但是如果我们在函数符号中查看 , 那么我们有一个复合项,然后是一个由两个子目标组成的单一目标?没看懂。

简而言之,我不知道什么时候称事物为predicate(谓词)、functor(复合词)或goal。

编辑

阅读了评论、答案和其他问题 ( and 15807506),我得出的结论是我们遇到的情况类似于类 Lisp 语言中的情况:相同的符号用于 "executable"代码和数据。因此,一切都写成术语,其中很多是涉及仿函数和参数的复合术语。这是数据的语法。同样的句法用于构成 Prolog 程序的子句(事实和规则)。当我们关注事物的数据方面时,我们谈论仿函数;当我们关注事物的 "executable"(或可解释的)方面,即逻辑程序的含义时,我们谈论谓词。所讨论的重点通常取决于使用结构的上下文。

我尝试通过以下方式向我的学生解释这一点:在以下情况下,father(X,Y) 是什么(独立于缺失的上下文...)?

?- isA(father(X,Y)).

?- father(X,Y).

第一种情况是father仿函数构造了一个二元项,第二种情况是一个二元谓词。

当您超越普通的 Prolog 以及诸如以下内容时,也会积极使用混淆(它们看起来相同):

?- X = father, X(tim,john).

或在 findall 查询中使用 father/2