如何在 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 实现手册中了解 findallbagofsetof,或者例如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 回溯期间获取值列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用append / 3以递归方式在prolog中构建列表?

如何在 Prolog 中附加列表?

Prolog,失败,不要回溯

你能用纯序言写 between/3 吗?

Prolog 中的返回值

Prolog:如何调整跟踪中显示的列表的最大长度?