prolog中谓词的不同行为

prolog中谓词的不同行为,prolog,Prolog,我试图理解谓词在规则内外的不同行为。当我写作时: test(1,2). 在控制台中,我得到“未找到谓词”。 但是当我写作的时候 S=[test(1,2,3)],member(test(1,A,B),S). 尽管谓词测试仍然没有定义,prolog还是会给出答案。为什么会这样?在您的第一个示例中,test是arity 2的谓词,您试图证明它不存在 在第二个示例中,test是arity 3的函子。它不定义任何测试谓词。它只是一个函数,其输入值为1、2和3,其值为test(1,2,3)。因此,tes

我试图理解谓词在规则内外的不同行为。当我写作时:

test(1,2).
在控制台中,我得到“未找到谓词”。 但是当我写作的时候

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

尽管谓词测试仍然没有定义,prolog还是会给出答案。为什么会这样?

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


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


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

在第二个示例中,
test(1,2,3)
只是一个结构。在传统语言中,类似于
[test(1,2,3)]
的东西会导致语言去评估某些函数。例如,Python:

def test(x, y, z):
   return 3
然后
[测试(1,2,3)]
将减少到
[3]

这是Prolog的工作原理。Prolog没有函数,它有关系,关系没有预定义的数据流进出它们。举一个具体的例子,考虑<代码> Nth1/3 :如果调用<代码> Nth1(3,[a,b,c],x)< /c> > Prolog使您返回<代码> x= c>代码>,但也可以调用<代码> nth1(x,[a,b,c],c)< /> >,Prolog给出了<代码> x=3 < /代码>。您还可以调用
nth1(X[a,b,c],Y)
,然后Prolog将返回三种解决方案:
X=1,Y=a
X=2,Y=b
X=3,Y=c

我非常喜欢这个示例,因为它向您展示了
nth1/3
正在完成Python的
enumerate()
index()
的所有工作。但它也向您展示了为什么Prolog不能只计算谓词并用它们“返回”的内容替换它们

这仍然让您对Prolog中的
[test(1,2,3)]
的确切含义有些模糊。答案是它是一个包含Prolog术语的列表。这里只有一个术语,一个函子或结构
test(1,2,3)
。您的第二个示例显示您能够将该结构与另一个结构统一起来。这是Prolog允许您做的一件非常强大的事情。它是使Prolog成为同象语言的一部分,这意味着一种对自身成分有内在理解的语言。目前,您可以认为它类似于Javascript对象、Python字典或C结构。它恰好与谓词定义具有相同的形状。我认为这既是初学者的巨大动力,又是巨大的困惑,所以请振作起来!它不是直观的,尤其是来自其他语言