Prolog 序言:为什么';t此谓词在作为参数传递的空列表中失败
我做了一个非常基本的谓词来解释我的问题,所以不要介意它是无用的。如果将空列表作为B参数传递,我希望谓词失败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,[],
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.