목록을 문자열로 변환하는 방법을 식별하는 데 어려움을 겪고 있습니다. 이 목록은 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])).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다