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

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)]不会回溯
为什么?

最佳答案

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

人(约翰)。
人(erik)。

allExceptSpider(Spider,T):-
setof(X,person(X),S),
减去(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 =约翰。

?-allExceptSpiderNU(Z,Q)。
Q = [erik],Z =约翰
; Q = [john],Z = erik
; Q = [john,erik],dif(Z,erik),dif(Z,john)。

关于prolog - 为什么我的谓词不回溯?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37634782/

10-11 17:42