我试图了解规则内外谓词的不同行为。当我写:
test(1,2).
在控制台中,我得到“找不到谓词”。 但是当我写
S=[test(1,2,3)],member(test(1,A,B),S).
序言回答,尽管还没有定义谓词测试。为什么呢?
答案 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 = a
和X = 2, Y = b
。
我非常喜欢这个示例,因为它向您展示了X = 3, Y = c
正在完成Python的nth1/3
和 enumerate()
和 index()
。但这也向您展示了为什么Prolog不能仅评估谓词并将其替换为谓词“返回”。
这仍然使您对__getitem__()
在Prolog中的确切含义有所含糊。答案是它是一个包含Prolog术语的列表。那里只有一个术语,函子或结构[test(1,2,3)]
。第二个示例表明,您可以将该结构与另一个结构统一。这是Prolog可以让您做的非常强大的事情。这是使Prolog成为
答案 1 :(得分:0)
在第一个示例中,test
是您尝试证明的arity 2的谓词,但不存在。
在第二个示例中,test
是Arity 3的仿函数。它没有定义任何test
谓词。它只是一个函数,其输入为值1
,2
和3
,其值为test(1,2,3)
。因此,test(1,2,3)
是函数test/3
的值。像a
这样的常量也可以看作一个函数,它没有输入,其值为a
。
谓词定义函数之间的关系。