我不明白为什么我的谓词不回溯并找到所有解决方案。
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/