我开始学习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)
是一个目标?还是由两个目标组成?据说目标可以是原子或复合词。但是如果我们用功能表示法看,
那么我们有一个复合词,然后是一个由两个子目标组成的目标?我不明白。
简单地说,我不知道何时调用谓词(预测),仿函数(复合词)或目标。
修改
阅读了评论,答案和其他问题(28972038和15807506)后,我得出的结论是,我们的情况与类似Lisp的语言类似:相同的表示法用于“可执行”代码和数据。因此,所有内容都是作为术语编写的,其中很多都是复合术语,涉及函子和参数。这是数据的语法。并且相同的语法用于组成Prolog程序的子句(事实和规则)。当我们专注于事物的数据方面时,我们谈论仿函数,当我们关注事物的“可执行”(或可解释)方面,逻辑程序的意义时,我们会讨论谓词。所讨论的焦点通常取决于构造使用的上下文。
答案 0 :(得分:0)
我尝试通过以下方式向我的学生解释:在以下情况下father(X,Y)
是什么(独立于缺失的背景......)?
?- isA(father(X,Y)).
和
?- father(X,Y).
在第一种情况下,它是构造二元术语的father
仿函数,在第二种情况下,它是二元谓词。
当你超越普通的Prolog以及类似的事情时,也会积极地使用混淆(它们看起来相同):
?- X = father, X(tim,john).
或在father/2
查询中使用findall
。