我一直在尝试遍历列表并将其写入文件,为什么以下不起作用?
loop_through_list(List) :-
member(Element, List),
write(Element),
write(' '),
fail.
write_list_to_file(Filename,List) :-
tell(Filename), % open file to be written
loop_through_list(List),
told. % flush buffer
答案 0 :(得分:7)
首先,为什么失败:
你使用失败引发回溯,这可能是一个很好的技术,但不是那里。因为当成员用完解决方案时,它最终会使你的谓词错误。然后,一旦loop_through_list为false,则告知未到达且写入不正确(当我测试时,文件已创建,但没有写入任何内容)。
如果您使用:
loop_through_list([]).
loop_through_list([Head|Tail]) :-
write(Head),
write(' '),
loop_through_list(Tail).
相反,它有效。
但是,即使使用此代码,您也可以使用
打开(文件名,写入,流),写(流,元素)和关闭(流)而不是告诉并告诉本答复底部链接中解释的原因。
例如:
loop_through_list(_File, []) :- !.
loop_through_list(File, [Head|Tail]) :-
write(File, Head),
write(File, ' '),
loop_through_list(File, Tail).
write_list_to_file(Filename,List) :-
open(Filename, write, File),
loop_through_list(File, List),
close(File).
或
loop_through_list(File, List) :-
member(Element, List),
write(File, Element),
write(File, ' '),
fail.
write_list_to_file(Filename,List) :-
open(Filename, write, File),
\+ loop_through_list(File, List),
close(File).
使用你的代码和joel76技巧。
见Prolog how to save file in an existing file
它涵盖了同样的问题。
答案 1 :(得分:3)
我没有看到使用此方法将列表写入文件的原因
prolog中的编程通常不应涉及循环;
此外,这不是一个循环结构,它更像是一个黑客(甚至滥用)
(就像你的情况会导致意想不到的错误和问题)
只需使用递归并打印列表中的元素:
write_list([]).
write_list([H|T]):-
write(H),
write(' '),
write_list(T).
更优雅,也可以更高效。
除此之外,使用open / 4等(ISO IO)代替tell / 1等(爱丁堡IO)通常更好;检查false's post
答案 2 :(得分:2)
谓词 loop_through_list(列表),总是失败,所以要成功,你只需写 \ + loop_through_list(List),