try
p(L) :-
( read(Head),
Head \= end_of_file
-> p(Tail),
L = [Head|Tail]
; L = []
).
Prolog больше предназначен для символьной обработки, IO, он основан на побочных эффектах и часто подвержен ошибкам.
Обратите внимание, что read / 1 на самом деле оченьмощный 'синтаксический анализатор', способный обрабатывать обобщенные термины Пролога (структуры, выражения, списки, с произвольным вложением).
В EOF SWI-Prolog возвращает атом end_of_file, следовательно, тест, который вы видите вкод.