您好我有以下代码:
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'但是没有写任何文件。 我需要更改什么才能将输出写入文件?
答案 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;写"会更好。通过dcg将信息放入列表中。通过这种方式,你也可以获得一个干净的程序。
答案 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模式已被弃用,因为它会导致一些困难......