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.
Success:
[eclipse]: writeclause(output, f(1,2,3)),
> writeclause(output, h(2,3)).
f(1, 2, 3) .
h(2, 3) .
yes.
[eclipse]: writeclause(output, X + 2).
_56 + 2 .
X = _56
yes.
[eclipse]: writeclause(output, a(k):-write(k)).
a(k):-
write(k) .
yes.
[eclipse]: writeclause(output, (a:-write(k),date(K))).
a:-
write(k),
date(_68) .
K = _110 % to top-level output.
yes.
[eclipse]: open(file1,update,s), writeclause(s, X + 2),
> close(s).
X = _72
yes.
[eclipse]: sh('cat file1').
_72 + 2 .
yes.
[eclipse]: set_stream(a,output),
> writeclause(a, (:- dynamic f/1)).
:- dynamic f / 1 .
yes.
[eclipse]: 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).
writeclause(9, X + 2). (Error 192).
writeclause(atom, X + 2). (Error 193).