序言中谓词的不同行为

时间:2019-08-16 20:28:43

标签: prolog

我试图了解规则内外谓词的不同行为。当我写:

test(1,2).

在控制台中,我得到“找不到谓词”。 但是当我写

S=[test(1,2,3)],member(test(1,A,B),S).

序言回答,尽管还没有定义谓词测试。为什么呢?

2 个答案:

答案 0 :(得分:1)

在第二个示例中,test(1,2,3)只是一个结构。在常规语言中,类似[test(1,2,3)]的语言会导致该语言运行并评估一些功能。例如Python:

def test(x, y, z):
   return 3

然后[test(1,2,3)]减少[3]

不是这是Prolog的工作方式。 Prolog没有功能,它具有关系,并且关系没有预定义的数据流入和流出。举一个具体的例子,考虑nth1/3:如果您致电nth1(3, [a,b,c], X),那么Prolog会给您退回X = c,但是您也可以致电nth1(X, [a,b,c], c),而Prolog会给您退回{{1 }}。您还可以致电X = 3,然后Prolog会给您三种解决方案:nth1(X, [a,b,c], Y)X = 1, Y = aX = 2, Y = b

我非常喜欢这个示例,因为它向您展示了X = 3, Y = c正在完成Python的nth1/3 enumerate() index()。但这也向您展示了为什么Prolog不能仅评估谓词并将其替换为谓词“返回”。

这仍然使您对__getitem__()在Prolog中的确切含义有所含糊。答案是它是一个包含Prolog术语的列表。那里只有一个术语,函子或结构[test(1,2,3)]。第二个示例表明,您可以将该结构与另一个结构统一。这是Prolog可以让您做的非常强大的事情。这是使Prolog成为语言的一部分,Prolog是对自己的成分具有内在理解的语言。目前,您可以将其视为类似于Javascript对象或Python字典或C结构。它恰好具有与谓词定义相同的形状。我认为这个事实既给初学者带来了强大的力量,也给他们带来了极大的困惑,所以请多加注意!这是不直观的,尤其是来自其他语言。

答案 1 :(得分:0)

在第一个示例中,test是您尝试证明的arity 2的谓词,但不存在。

在第二个示例中,test是Arity 3的仿函数。它没有定义任何test谓词。它只是一个函数,其输入为值123,其值为test(1,2,3)。因此,test(1,2,3)是函数test/3的值。像a这样的常量也可以看作一个函数,它没有输入,其值为a

谓词定义函数之间的关系。