问题
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