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). g56 + 2 . X = _g56 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(_g68) . K = _g110 % to top-level output. yes. [eclipse]: open(file1,update,s), writeclause(s, X + 2), > close(s). X = _g72 yes. [eclipse]: sh('cat file1'). _g72 + 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).