说我有以下代码:

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 被处理。有什么建议吗?

有帮助吗?

解决方案

您可以使用 bagof/3 为了创建满足目标的verticies列表,“ VS就是V的所有n是V的边缘。”

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top