序言 f(X) :- X==[]

Joh*_*old 1 prolog

当我有序言程序时

f(X) :- X==[].
Run Code Online (Sandbox Code Playgroud)

输出是

|:-f(X).
false.
:-f([]).
true.
Run Code Online (Sandbox Code Playgroud)

在第一个输出 prolog 中声称没有X,所以这f(X)是真的。

f([])确实如此,所以序言应该说X=[]。作为第一个查询的答案。

为什么是这样?我该如何解决。

a(X,X).
b(A,B) :- A==X,B==X.
Run Code Online (Sandbox Code Playgroud)

还有一个更严重的问题:

|:-a([a],[a]).
true.
:-b([a],[a]).
false.
Run Code Online (Sandbox Code Playgroud)

我相信,ab是完全一样的语句,只是有不同的写法。

IDE 声称这A==X总是错误的,所以我想我对变量在 prolog 中的工作方式有严重的误解。

Nic*_*rey 5

==/2不会做你认为它会做的事情。引用文档,@Term1 == @Term2

如果Term1等价于 ,则为真Term2。变量仅与共享变量相同。

这意味着这A == A是真的,但是A == B是假的,A == []是假的。

你所寻找的是统一的=/2其中

  • A = A 是真的
  • A = B是真实的(而AB成为相同的变量:A = B, A = 3在两个结果AB变3)。
  • A = []为真(并A与空列表统一)。