写入Prolog中的文件

时间:2014-10-19 10:20:20

标签: file prolog

您好我有以下代码:

show_result(Squares,MaxRow,MaxCol) :-
    show_result(Squares,MaxRow,MaxCol,1), nl.

show_result(_,MaxRow,_,Row) :- Row > MaxRow, !.
show_result(Squares,MaxRow,MaxCol,Row) :- 
    show_result(Squares,MaxRow,MaxCol,Row,1), nl,
    Row1 is Row+1, show_result(Squares,MaxRow,MaxCol,Row1).

show_result(_,_,MaxCol,_,Col) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col) :- 
    (memberchk(sq(Row,Col,X),Squares), !, write(X); write('#')),
    Col1 is Col+1, show_result(Squares,MaxRow,MaxCol,Row,Col1).  

当我运行代码时,它会在屏幕上显示正确的输出。

但是我想将它写入一个我用这种方式修改过代码的文件:

show_result(Squares,MaxRow,MaxCol,SolutionFile) :-
   show_result(Squares,MaxRow,MaxCol,1,SolutionFile),
   open(SolutionFile,write,Stream),
   nl(Stream), close(Stream).

show_result(_,MaxRow,_,Row,SolutionFile) :- Row > MaxRow, !.
show_result(Squares,MaxRow,MaxCol,Row,SolutionFile) :- 
   show_result(Squares,MaxRow,MaxCol,Row,1,SolutionFile),
   open(SolutionFile,write,Stream),nl(Stream), close(Stream),
   Row1 is Row+1,
   show_result(Squares,MaxRow,MaxCol,Row1,SolutionFile).

show_result(_,_,MaxCol,_,Col,SolutionFile) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col,SolutionFile) :- 
   (  memberchk(sq(Row,Col,X),Squares),
      !,
      open(SolutionFile,write,Stream), write(Stream,X), close(Stream)
   ;  open(SolutionFile,write,Stream), write(Stream,'#'), close(Stream)
   ),
   Col1 is Col+1,
   show_result(Squares,MaxRow,MaxCol,Row,Col1,SolutionFile).  

这会返回' true'但是没有写任何文件。 我需要更改什么才能将输出写入文件?

2 个答案:

答案 0 :(得分:1)

使用您的原始程序并:

..., once_to_file(show_result(Squares,MaxRow,MaxCol)), ...

once_to_file(Goal, File) :-
   open(File, write, S),
   with_output_to(S,once(Goal)),
   close(S).

使用setup_call_cleanup/3可以进一步改善这一点。

但是说真的,对你来说,#34;写"会更好。通过将信息放入列表中。通过这种方式,你也可以获得一个干净的程序。

答案 1 :(得分:0)

虽然这似乎效率过低,但您可以尝试更改open / 3模式,从write更改为append

更好的方法是传递文件描述符,而不是SolutionFile。所以我建议

show_result(Squares,MaxRow,MaxCol,SolutionFile) :-
   open(SolutionFile,write,Stream),
   show_result(Squares,MaxRow,MaxCol,1,Stream),
   nl(Stream), close(Stream).

并从这些谓词中删除所有其他open / 3,然后写入SolutionFile

how_result(_,MaxRow,_,Row,SolutionFile) :- Row > MaxRow, !.
show_result(Squares,MaxRow,MaxCol,Row,SolutionFile) :- 
   show_result(Squares,MaxRow,MaxCol,Row,1,SolutionFile),
   nl(SolutionFile),
   Row1 is Row+1,
   show_result(Squares,MaxRow,MaxCol,Row1,SolutionFile).

show_result(_,_,MaxCol,_,Col,SolutionFile) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col,SolutionFile) :- 
   (  memberchk(sq(Row,Col,X),Squares),
      !,
      write(SolutionFile,X)
   ;  write(SolutionFile,'#')
   ),
   Col1 is Col+1,
   show_result(Squares,MaxRow,MaxCol,Row,Col1,SolutionFile).  

注意:未经测试的代码。

由于您提到输出已经正确,因此SWI-Prolog中提供的替代方法是保持原始程序不变,并使用with_output_to进行调用。

另一种选择,使用旧式IO,使用tell / 1作为前缀执行,并在执行后使用tell / 0恢复。但是这种IO模式已被弃用,因为它会导致一些困难......