我不明白为什么我的谓词不会回溯并找到所有解决方案。
person(john).
person(erik).
allExceptSpider(person(Spider),T ):-
setof(person(X),person(X),S),
subtract(S,[person(Spider) ],T).
如果我用两个变量调用这个谓词:
allExceptSpider(person(Z),Q)
然后它只会给我答案Z = john,Q = [person(erik)] 但它不会回溯找到Z = erik,Q = [person(john)] 为什么呢?
答案 0 :(得分:3)
TL; DR:如果您使用 subtract/3
,您的代码可能会丢失logical-purity。
person(john). person(erik). allExceptSpider(Spider, T) :- setof(X, person(X), S), subtract(S, [Spider], T).
保持纯洁!如何?像这样使用list_item_subtracted/3
:
allExceptSpiderNU(Spider, T) :- setof(X, person(X), S), list_item_subtracted(S, Spider, T).
样本查询头对头:
?- allExceptSpider(Z, Q). Q = [erik], Z = john. ?- allExceptSpiderNU(Z,Q). Q = [ erik] , Z=john ; Q = [john ], Z=erik ; Q = [john,erik], dif(Z,erik), dif(Z,john).