在序言中,函子vs谓词和目标
我开始学习Prolog。 我有各种书籍,我甚至买了标准。 我喜欢像标准这样的东西,因为它们能够精确地定义事物 但我无法理解一些概念。 特别是函数和谓词之间的区别,以及完全的目标是什么? 通常这些书使用的术语是变化的,有时不够精确,增加了混淆。
在标准中,谓词被定义为“具有秩序N和一系列N个参数的谓词”,谓词是“一个标识符和秩序”。 因此,当他们在Prolog 2的艺术中写出像father(Father, Child)
这样的东西时,他们称father/2
为谓词。
好,但是当我检查语法时,我们讨论由仿函数名称和参数构成的复合项(而不是谓词或谓词)。 所以我检查了标准中的定义,并且看到一个函数是“一个标识符和一个arity”,与谓词相同的定义,以及一个复合项作为“N,N正数的函子,连同一个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程序的子句(事实和规则)。 当我们专注于事物的数据面和谓词时,我们会谈论函数,当我们关注事物的“可执行”(或可解释的)方面时,逻辑程序的意义。 问题的焦点通常取决于使用结构的上下文。
我尝试用以下方式向我的学生解释:在以下情况中father(X,Y)
是什么(独立于缺失的情境......)?
?- isA(father(X,Y)).
和
?- father(X,Y).
在第一种情况下,它是构造二元项的father
函子,在第二种情况下,它是二元谓词。
混淆(它们看起来相同)在超越普通Prolog和以下情况时也会被积极使用:
?- X = father, X(tim,john).
或在findall
查询中使用father/2
。
上一篇: In prolog, functors vs predicates, and goals
下一篇: What are the best Prolog programming practices and style guidelines?