序言 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.
我相信 a
和 b
是完全相同的语句,只是写法不同。
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
为真(并且 A
和 B
成为同一个变量:A = B, A = 3
导致 A
和 B
成为3).
A = []
为真(而A
与空列表统一)。
见
当我有 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.
我相信 a
和 b
是完全相同的语句,只是写法不同。
IDE 声称 A==X
总是错误的,所以我想我对变量在序言中的工作方式有严重的误解。
==/2
并不像您认为的那样。引用文档,@Term1 == @Term2
是
True if
Term1
is equivalent toTerm2
. A variable is only identical to a sharing variable.
表示A == A
为真,A == B
为假,A == []
为假
你要找的是统一,=/2
,其中
A = A
为真A = B
为真(并且A
和B
成为同一个变量:A = B, A = 3
导致A
和B
成为3).A = []
为真(而A
与空列表统一)。
见