Prolog 使用findall创建列表列表

Prolog 使用findall创建列表列表,prolog,Prolog,我的目标是打印包含查询结果的列表列表解决方案 solution(G, T) :- comb(G, T), allPos(T, G), not(cycle(T)), writeln(T), false. 输出如下所示: ?- solution([a-b,a-c,a-d,b-c,c-d],X0). [c-d] [c-d] [c-d] [b-c] [b-c] [b-c] [b-c,c-d] [b-c,c-d] [b-c,c-d] [b-c,c-d] [b-c,c-d] . . .(etc...)

我的目标是打印包含查询结果的列表列表<已定义代码>解决方案

solution(G, T) :- comb(G, T), allPos(T, G), not(cycle(T)), writeln(T), false.
输出如下所示:

?- solution([a-b,a-c,a-d,b-c,c-d],X0).
[c-d]
[c-d]
[c-d]
[b-c]
[b-c]
[b-c]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
.
.
.(etc...)
到目前为止,我创建的内容如下所示:

findall_call(Input, X) :-
  findall(X0, solution(Input, X0), X).
,将
解决方案(…)
的输出转换为以下形式:

?- findall_call(X0, solution([a-b,a-c,a-d,b-c,c-d],X0), X).
[c-d]
[c-d]
[c-d]
[b-c]
[b-c]
[b-c]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
.
.
.
X = [].
是的,最后的
X=[]也是一样。预期输出应类似于列表列表:

[[c-d],[c-d],[c-d],[b-c],[b-c],[b-c],[b-c,c-d],[b-c,c-d],[b-c,c-d]...]
你知道为什么这么奇怪吗?我感觉到部分
,writeln(T),false。
不是个好主意。我之所以把它放在那里,是因为我不想重复使用分号来接收所有序言的答案。当我删除此部分时,输出为:

?- findall_call(X0, solution([a-b,a-c,a-d,b-c,c-d],X0), X).
X = [[c-d], [c-d], [c-d], [b-c], [b-c], [b-c], [b-c, ... - ...], [... - ...|...], [...|...]|...].
这显然不是我的目标


我应该如何重新编写代码以使整个列表的

writeln
直接进入输出。这不是返回给findall的结果。您根本没有用解决方案实例化
X0
。不要使用
writeln
显示解决方案。实例化
X0
解决方案(G,T):-comb(G,T),allPos(T,G),not(cycle(T))。
然后当您调用
解决方案(…,X)
时,它将显示
X
的所有解决方案。那么你的
findall
就有意义了。@TomasBy那不是一个打字错误吗?顺便说一句,在你之前的评论中更新的解决方案-无
,writeln(T),false
出现在一个问题中(许多括号和点)。@TomasBy嗯,我当然注意到了,给我这个错误
错误:未定义的过程:(^)/2错误:^/2只能作为setof/3和bagof/3的第二个参数出现错误:在:
我像这样运行:
?-findall(X[a-b,a-c,a-d,b-c,c-d]^solution([c-b,a-c,c-a,b-a,b-d],X),Xs.
@TomasBy你是对的,我刚刚更新了问题并添加了整个代码。@潜伏者我刚刚更新了问题并添加了整个代码。希望这能让事情变得清楚。