0

假设我有以下代码:

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处理方式,上面的部分并没有真正起作用。请问有什么建议吗?

4

2 回答 2

3

阅读findall,bagofsetof您最喜欢的 Prolog 实现手册,或立即学习 Prolog 中的“11.2 收集解决方案”部分! (不幸的是,很难直接链接到这些资源。)

于 2010-10-15T07:22:08.577 回答
1

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

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

neighbors(a, Vs). % Vs = [b, c, d].
于 2010-10-15T05:51:14.660 回答