将列表从 findall 谓词转换为字符串序言

Convert a list from findall predicate to a string prolog

我正在努力寻找一种将列表转换为字符串的方法。此列表是 findall 谓词的输出。

看下面我的代码。

edge(a,b).
edge(a,c).
edge(b,c).
edge(c,d).
edge(c,e).
edge(d,e).
edge(f,g).
edge(g,h).

route(X, Z, [])    :-  edge(X, Z).
route(X, Z, [Y|T]) :-  edge(X, Y), route(Y, Z, T).

allways(X, Y) :- findall(E, (route(X, Y, E), write(E), nl), _).
%allways(X, Y) :- findall(E, (route(X, Y, E), with_output_to(atom(_),maplist(write, E)), nl), _).
%allways(X, Y) :- findall(E, (route(X, Y, E), atomic_list_concat(E,'',A), nl), _),write(A).

我的输出

?- allways(a,e).
[b,c]
[b,c,d]
[c]
[c,d]

预期输出

?- allways(a,e).
bc
bcd
c
cd

我尝试了使用 with_output_to 谓词和 atomic_list_concat 谓词将列表转换为字符串的不同方法,但没有任何效果。

当你说“字符串”时,你是什么意思?

有许多谓词可用于将列表连接到原子。在你的情况下 atomic_list_concat/2 听起来是对的。

然而,您的问题在于您如何编写 findall,您正在捕获错误的变量。

?- findall(Str, ( route(a, e, E), atomic_list_concat(E, Str) ), Strs),
   forall(member(Str, Strs), format("~w~n", [Str])).

或者,如果您根本不需要该列表,则根本不要使用 findall。

?- forall(( route(a, e, E),
            atomic_list_concat(E, Str)
          ),
          format("~w~n", [Str])).