J.doe
J.doe

Reputation: 373

Why is my predicate not backtracking?

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?

Upvotes: 3

Views: 120

Answers (1)

repeat
repeat

Reputation: 18726

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

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

Upvotes: 3

Related Questions