When reading Prolog clauses from one file, and then writing to another, the latter part can be done using writeclause/2. This is because the clauses are terminated by a period and a newline, which are not retained by prolog. writeclause/2 replaces these, and flushes the output.
writeclause/1,2 knows about the special meaning of ,/2, ;/2, ->/2, fg -->/2 and :-/2 and prints the clause with the appropriate indentation of subgoals and some (redundant) parantheses to show the clause structure. Everything else is written as with writeq/1,2, so output of writeclause/1,2 is readable for read/1,2.
Success:
?- writeclause(output, f(1,2,3)), writeclause(output, h(2,3)).
f(1, 2, 3) .
h(2, 3) .
yes.
?- writeclause(output, X + 2).
_56 + 2.
yes.
?- writeclause(output, a(k):-write(k)).
a(k) :-
write(k) .
yes.
?- writeclause(output, (a:-write(k),date(K))).
a :-
write(k),
date(_68) .
yes.
?- open(file1,update,s), writeclause(s, X + 2), close(s).
X = _72
yes.
?- sh('cat file1').
_72 + 2.
yes.
?- set_stream(a,output), writeclause(a, (:- dynamic f/1)).
:- dynamic f / 1 .
yes.
?- writeclause(output, (head:-a1,a2;a3,a4->a5;a6)).
head :-
(
a1,
a2
;
(
a3,
a4
->
a5
;
a6
)
).
yes.
Error:
writeclause(S, a(b,c)). (Error 4).
writeclause("string" a(b,c)). (Error 5).