在prolog,functor与谓词和目标

时间:2015-03-17 07:19:57

标签: prolog

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

在标准中,预测被定义为“具有arity N的谓词和N个参数的序列”,谓词被定义为“与arity一起的标识符”。因此,当他们在“Prolog Art”中写下father(Father, Child)之类的东西时,他们称father/2为谓词。

好的但是当我检查语法时,我们会讨论由仿函数名称和参数组成的复合词(不是谓词或谓词)。所以我检查了标准中的定义,发现仿函数是“与arity一起的标识符”,与谓词的定义相同,复合术语为“arity N,N positive的函子,以及N的序列参数”。

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

为了将樱桃放在首位,目标是“将要执行的预测”。我们是在谈论Prolog程序内的目标还是仅在查询中?在Prolog的艺术中,写道“目标是原子或复合术语”。那么我们可以在Prolog计划中到处谈论目标吗?我的读数让我觉得它只在查询中使用。但我不确定。

在查询中,我猜mother(X, Y)是一个目标而mother/2是一个谓词,但mother(X, Y), male(Y)是一个目标?还是由两个目标组成?据说目标可以是原子或复合词。但是如果我们用功能表示法看,那么我们有一个复合词,然后是一个由两个子目标组成的目标?我不明白。

简单地说,我不知道何时调用谓词(预测),仿函数(复合词)或目标。

修改

阅读了评论,答案和其他问题(2897203815807506)后,我得出的结论是,我们的情况与类似Lisp的语言类似:相同的表示法用于“可执行”代码和数据。因此,所有内容都是作为术语编写的,其中很多都是复合术语,涉及函子和参数。这是数据的语法。并且相同的语法用于组成Prolog程序的子句(事实和规则)。当我们专注于事物的数据方面时,我们谈论仿函数,当我们关注事物的“可执行”(或可解释)方面,逻辑程序的意义时,我们会讨论谓词。所讨论的焦点通常取决于构造使用的上下文。

1 个答案:

答案 0 :(得分:0)

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

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

?- father(X,Y).

在第一种情况下,它是构造二元术语的father仿函数,在第二种情况下,它是二元谓词。

当你超越普通的Prolog以及类似的事情时,也会积极地使用混淆(它们看起来相同):

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

或在father/2查询中使用findall