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

prolog f(X) :- X==[]

当我有 prolog 程序时

f(X) :- X==[].

输出是

|:-f(X).
false.
:-f([]).
true.

在第一个输出序言中声称没有 X,因此 f(X) 为真。

但是f([])是真的,所以序言应该说X=[]。作为第一个查询的答案。

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

a(X,X).
b(A,B) :- A==X,B==X.

有一个更糟糕的问题:

|:-a([a],[a]).
true.
:-b([a],[a]).
false.

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

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

==/2 并不像您认为的那样。引用文档,@Term1 == @Term2

True if Term1 is equivalent to Term2. A variable is only identical to a sharing variable.

表示A == A为真,A == B为假,A == []为假

你要找的是统一,=/2,其中

  • A = A 为真
  • A = B 为真(并且 AB 成为同一个变量:A = B, A = 3 导致 AB 成为3).
  • A = []为真(而A与空列表统一)。