#prolog
#пролог
Вопрос:
У меня есть несколько кодов prolog, я печатаю процессы на терминале. Также я записываю в файл то, что печатаю на терминале. Я помещаю функции записи в файл рядом с каждой функцией записи. Но это не одно и то же. Запись файла не работает должным образом.
printrow([]) :- write(' '),
open('output.txt',append,OS), write(OS,' '), close(OS).
% I try to put same process for file
printrow([X|Xs]) :- printrepl(X,Y), write(' '), write(Y),
printrow(Xs), open('output.txt', append,OS),
write(OS,' '), write(OS,Y), close(OS).
printrepl(' ',' ') :- !.
printrepl(x,'X').
printrows([]) :- nl.
printrows([N|Ns]) :- write(N), write(' '),
open('output.txt', append,OS), write(OS,N), write(OS,' '),
printrows(Ns), write(OS,' n'), close(OS).
% I can't find alternative for writef('%2r w',[X]) below,
% for writing file, I think there is bug
writek(K,List) :- nth1(K,List,X), !, writef('%2r w',[X]),
open('output.txt',append,OS), write(OS,' '), write(OS,X), close(OS).
writek(_,_) :- write(' '),
open('output.txt',append,OS),write(OS,' '), close(OS).
Можете ли вы дать мне совет по написанию тех же выходных данных с помощью терминала?
Комментарии:
1. Вы говорите: «Я не могу найти альтернативу для writef(‘%2r w’,[X])»: вам следует переключиться с
writef
(устаревшего) наformat
(см. Этот небольшой обзор ). Вы также должны открыть файл один раз при начале обработки и закрыть после завершения, а не открывать / закрывать его при каждом выходе (хотя единственный вред в этом заключается в том, что ОС больше работает). Но что именно не работает?2. Я печатаю несколько цифр с цифрами, на терминале это печатается правильно, но когда дело доходит до файловой части, возникают некоторые дополнительные пробелы. @DavidTonhofer
Ответ №1:
Вот перезапись для writek
и printrows
. Это может быть полезно.
% ---
% Printing rows (as "~w", equal to write/1) to stream Stream
% ---
printrows([],Stream) :-
format(Stream,"~n",[]).
printrows([N|Ns],Stream) :-
format(Stream,"~w ~n",[N]),
printrows(Ns,Stream).
% ---
% Printing/Appending Rows to the file named by Filename
% ---
printrows_to_file(Filename,Rows) :-
setup_call_cleanup(
open(Filename, append, Stream), % NB append
printrows(Rows,Stream),
close(Stream)).
% ---
% Printing Rows to stdout
% ---
printrows_to_stdout(Rows) :-
printrows(Rows,user_output).
% ---
% Write "w", indented by 1-based value of List[K]
% ---
writek(K,List,Stream) :-
nth1(K,List,Element),
!,
forall(between(1,Element,_),format(Stream," ",[])), % Indent
format(Stream,"w~n",[]).
writek_to_file(Filename,K,List) :-
setup_call_cleanup(
open(Filename, append, Stream), % NB append
writek(K,List,Stream),
close(Stream)).
writek_to_stdout(K,List) :-
writek(K,List,user_output).
Например:
?- printrows_to_stdout([1,2,3]).
1
2
3
true.
?- writek_to_stdout(1,[4,5,6]).
w
true.
Аналогично для
?- printrows_to_file('filename.txt',[1,2,3]).
?- writek_to_file('filename.txt',1,[4,5,6]).