Why is my predicate not backtracking?

可紊 提交于 2019-12-23 18:38:20

问题


I don't understand why my predicate doesnt backtrack and find all solutions.

person(john).
person(erik).

allExceptSpider(person(Spider),T ):-
    setof(person(X),person(X),S),
    subtract(S,[person(Spider) ],T).

If I call this predicate with Two variables:

allExceptSpider(person(Z),Q)

Then it will only give me the answer Z = john, Q = [person(erik)] but it won't backtrack to find Z = erik ,Q = [person(john)] why?


回答1:


TL;DR: If you use subtract/3 , your code may lose logical-purity.

person(john).
person(erik).

allExceptSpider(Spider, T) :-
   setof(X, person(X), S),
   subtract(S, [Spider], T).

Preserve purity! How? Use list_item_subtracted/3 like so:

allExceptSpiderNU(Spider, T) :-
   setof(X, person(X), S),
   list_item_subtracted(S, Spider, T).

Sample queries head-to-head:

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


来源:https://stackoverflow.com/questions/37634782/why-is-my-predicate-not-backtracking

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!