写入文件(Prolog)

时间:2011-11-27 21:49:56

标签: 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

3 个答案:

答案 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),