如何在Prolog回溯期间获取值列表?

如何在Prolog回溯期间获取值列表?,prolog,backtracking,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]). (由于处理成员的方式,以上部分实

假设我有以下代码:

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]).
(由于处理成员的方式,
以上部分实际上不起作用。请提供任何建议?

您可以用它来创建一个满足目标的垂直列表,“Vs是N,是V的边。”

您可以使用创建一个满足目标的垂直度列表,“Vs是V的边的所有N。”


阅读您最喜欢的Prolog实现手册中的
findall
bagof
setof
,或如中的“11.2收集解决方案”一节
(不幸的是,很难直接链接到这些资源。)

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

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

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