如何在Prolog回溯过程中获取值列表?

时间:2010-10-15 05:08:12

标签: prolog backtracking

说我有以下代码:

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的方式,上面的内容确实不起作用。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在您最喜欢的Prolog实施手册中了解findallbagofsetof,或者Learn Prolog Now!中的“11.2收集解决方案”部分 (不幸的是,很难直接链接到这些资源。)

答案 1 :(得分:1)

您可以使用bagof/3创建满足目标的顶点列表,“Vs是V的边缘的所有N.”

neighbors(V, Vs) :- bagof(N, edge(V, N), Vs).

neighbors(a, Vs). % Vs = [b, c, d].