为什么我的谓词没有回溯?

时间:2016-06-04 20:37:40

标签: prolog backtracking

我不明白为什么我的谓词不会回溯并找到所有解决方案。

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)] 为什么呢?

1 个答案:

答案 0 :(得分:3)

TL; DR:如果您使用 subtract/3 ,您的代码可能会丢失

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).