2010-10-15 49 views
0

说我有下面的代码:如何在Prolog回溯期间获取值的列表?

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

您可以使用bagof/3创建您verticies满足目标的列表, “Vs为所有N是V的边缘”在你最喜欢的Prolog的执行手册阅读findallbagofsetof

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

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

,或者如部分“11 .2收集解决方案“Learn Prolog Now! (遗憾的是很难直接链接到这些资源。)