如何在 Prolog 回溯期间获取值列表?
Posted
技术标签:
【中文标题】如何在 Prolog 回溯期间获取值列表?【英文标题】:How to get the list of values during Prolog backtracking? 【发布时间】:2010-10-15 05:08:12 【问题描述】:假设我有以下代码:
edge(a, b).
edge(a, c).
edge(a, d).
当我这样做的时候
neighbors(V, N) :- edge(V, N), writeln(N), fail.
我可以将邻居列表打印到控制台。但是我怎样才能得到它作为结果列表呢?类似的东西
neighbors(V, Vs) :-
edge(V, N),
not(member(N, Vs)),
neighbors(V, [N|Vs]).
(由于member
的处理方式,上面的部分并没有真正起作用。请给点建议?
【问题讨论】:
【参考方案1】:在您最喜欢的 Prolog 实现手册中了解 findall
、bagof
和 setof
,或者例如Learn Prolog Now! 中的“11.2 收集解决方案”部分
(不幸的是,很难直接链接到这些资源。)
【讨论】:
【参考方案2】:您可以使用bagof/3
创建满足目标的顶点列表,“Vs 是所有 N,即 V 的边。”
neighbors(V, Vs) :- bagof(N, edge(V, N), Vs).
neighbors(a, Vs). % Vs = [b, c, d].
【讨论】:
以上是关于如何在 Prolog 回溯期间获取值列表?的主要内容,如果未能解决你的问题,请参考以下文章