【问题标题】:Why is my predicate not backtracking?为什么我的谓词不回溯?
【发布时间】:2016-06-04 20:37:40
【问题描述】:

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

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)] 为什么?

【问题讨论】:

标签: prolog backtracking


【解决方案1】:

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

人(约翰)。 人(埃里克)。 allExceptSpider(蜘蛛,T):- 集合(X,人(X),S), 减(S,[蜘蛛],T)

保持纯洁!如何?像这样使用list_item_subtracted/3

allExceptSpiderNU(蜘蛛,T):- 集合(X,人(X),S), list_item_subtracted(S, Spider, T)

直接查询示例:

?- allExceptSpider(Z, Q)。 Q = [埃里克],Z = 约翰。 ?- allExceptSpiderNU(Z,Q)。 Q = [埃里克],Z=约翰 ; Q = [约翰],Z=埃里克 ; Q = [约翰,埃里克],差异(Z,埃里克),差异(Z,约翰)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多