Prolog 序言:为什么';t此谓词在作为参数传递的空列表中失败

Prolog 序言:为什么';t此谓词在作为参数传递的空列表中失败,prolog,Prolog,我做了一个非常基本的谓词来解释我的问题,所以不要介意它是无用的。如果将空列表作为B参数传递,我希望谓词失败 predicate(_,[],_) :- fail. predicate(A,B,C) :- write(A), writeln(B), C = true. 但当我输入此查询时: ?-谓词(test,[],X)。 它不返回false(因为它应该失败),而是执行谓词,输出为: test[] X = true. 为什么即使B是空列表,谓词也不会失败?事实上,查询?-谓词(test,[],

我做了一个非常基本的谓词来解释我的问题,所以不要介意它是无用的。如果将空列表作为B参数传递,我希望谓词失败

predicate(_,[],_) :- fail.
predicate(A,B,C) :- 
write(A),
writeln(B),
C = true.
但当我输入此查询时:

?-谓词(test,[],X)。

它不返回false(因为它应该失败),而是执行谓词,输出为:

test[]
X = true.

为什么即使B是空列表,谓词也不会失败?

事实上,查询
?-谓词(test,[],X)的第一个子句失败。
。然而,当第一个子句失败时,第二个子句被触发并产生观察到的输出。要检查这一点,可以使用谓词:

示例:

[trace]  ?- predicate(test,[],X).
   Call: (10) predicate(test, [], _28066) ? creep
   Call: (11) []\=[] ? creep
   Fail: (11) []\=[] ? creep
   Fail: (10) predicate(test, [], _28066) ? creep
false.

[trace]  ?- nodebug.
true.

?- predicate(test,[],X).
false.

?- predicate(test,[a],X).
test[a]
X = true.
predicate(A, B, C) :- 
    B \= [],  % this condition forces failure when B is the empty list
    write(A), 
    writeln(B), 
    C = true.
[trace]  ?- predicate(test,[],X).
   Call: (10) predicate(test, [], _28066) ? creep
   Call: (11) []\=[] ? creep
   Fail: (11) []\=[] ? creep
   Fail: (10) predicate(test, [], _28066) ? creep
false.

[trace]  ?- nodebug.
true.

?- predicate(test,[],X).
false.

?- predicate(test,[a],X).
test[a]
X = true.