Ваш подход кажется разумным: из документов SWI-Prolog: «Блокирующий ввод / вывод может быть обработан с использованием опции тайм-аута read_term / 3. .
Это не совсем информативно: изменение времени ожидания пользователя приводит к некоторой ошибке (я протестирую больше и сообщу в список рассылки SWI_prolog, если это необходимо), даже в catch / 3.
Кажется, работает следующее
...,
current_input(I),
wait_for_input([I], A, 30),
...
Если не указан ввод данных (более короткое время для проверки здесь ...)
?- current_input(I), wait_for_input([I],A,5).
I = <stream>(0x7fa75bb31880),
A = [].
РЕДАКТИРОВАТЬ : переменная A будет хранить список, который будет содержать список потоков с готовым вводом: я только что сообщил о случае, когда пользователь ничего не вводил до истечения времени ожидания. Чтобы получить фактический ввод, используя ваш код:
tql :-
current_player(I),
writef('Its %d. players turn: ', [I]),
flush_output,
current_input(Input),
wait_for_input([Input], [Input], 5),
read(Input, Move),
writeln(Move).
current_player(1).
НТН