写入文件(Prolog)

chu*_*tsu 6 prolog

我一直试图遍历列表并将其写入文件,为什么以下不起作用?

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
Run Code Online (Sandbox Code Playgroud)

m09*_*m09 7

首先,它为什么失败:
你使用失败引发回溯,这可能是一个很好的技术,但不是那里.因为当成员用完解决方案时,它最终会使你的谓词错误.然后,一旦loop_through_list为false,则告知未到达并且写入不正确(当我测试它时,文件被创建但没有写入任何内容).
如果您使用:

loop_through_list([]).
loop_through_list([Head|Tail]) :-
    write(Head),
    write(' '),
    loop_through_list(Tail).
Run Code Online (Sandbox Code Playgroud)

相反,它的工作原理.

但是,即使使用此代码,您可能希望使用open(文件名,写入,流),写(流,元素)和关闭(流)而不是告诉并告知在此底部的链接中解释的原因回答.
例如 :

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).
Run Code Online (Sandbox Code Playgroud)

要么

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).
Run Code Online (Sandbox Code Playgroud)

使用你的代码和joel76技巧.

请参阅Prolog如何在现有文件中保存文件
它涵盖了同样的问题.