This predicate could be defined as
repeat. repeat :- repeat.repeat/0 succeeds when reached on backtracking.
!/0 may be added to exit from a clause containing repeat/0, as it removes all choice points above it in the clause.
Success:
[eclipse]: [p].
/home/user/p compiled 408 bytes in 0.03 seconds
yes.
[eclipse]: print_file(p).
print_file(File) :-
open(File, read, S),
repeat,
get(S,Char),
put(Char),
at_eof(S),
!,
close(S),
flush(output).
yes.