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).