Each thread has five stream aliases: user_input,
user_output, user_error, current_input, 
and
current_output. Newly created threads inherit these stream 
aliases from their parent. The user_input, user_output 
and user_error aliases of the main thread are 
initially bound to the standard operating system I/O streams (stdin,
stdout and stderr, normally bound to the POSIX file 
handles 0, 1 and 2). These aliases may be re-bound, for 
example if standard I/O refers to a window such as in the swipl-win.exe 
GUI executable for Windows. They can be re-bound by the user using
set_prolog_IO/3 
and set_stream/2 
by setting the alias of a stream (e.g,
set_stream(S, alias(user_output))). An example of rebinding 
can be found in library library(prolog_server), providing a telnet 
service. The aliases current_input and current_output 
define the source and destination for predicates that do not take a 
stream argument (e.g., read/1, write/1, get_code/1, 
... ). Initially, these are bound to the same stream as user_input 
and
user_error. They are re-bound by see/1, tell/1, set_input/1 
and
set_output/1. 
The current_output stream is also temporary re-bound by with_output_to/2 
or format/3 
using e.g.,
format(atom(A), .... Note that code which explicitly writes 
to the streams user_output and user_error will 
not be redirected by with_output_to/2.
Compatibility
Note that the ISO standard only defines the user_* 
streams. The‘current’streams can be accessed using current_input/1 
and
current_output/1. 
For example, an ISO compatible implementation of
write/1 
is
write(Term) :- current_output(Out), write_term(Out, Term).
while SWI-Prolog additionally allows for
write(Term) :- write(current_output, Term).