题
说我有以下代码:
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
, bagof
和 setof
在您最喜欢的Prolog实施手册中,例如,“收集解决方案”部分 现在学习序言!(不幸的是,很难直接链接到这些资源。)
不隶属于 StackOverflow