Вы можете сначала попробовать следующее, читая из консоли несколько строк:
?- repeat, read(X), (X==end_of_file, !, fail; true).
1.
X = 1 ;
2.
X = 2 ;
No
Объяснение: Предикат повторения / 0 повторяется успешно, так что
read / 1 вызывается снова и снова. Вызов read / 1 останавливается только когда end_of_file
был достигнут из-за последующего разреза.
Затем вы можете заключить его в findall / 3 и вызвать sort / 2:
?- findall(X,(repeat, read(X), (X==end_of_file, !, fail; true)),L), sort(L,R).
2.
1.
L = [2, 1],
R = [1, 2]
При необходимости вы можете использовать собственную сортировку и улучшить чтение с помощью аргумента потока.
С наилучшими пожеланиями
(с) 2010, Ян Бурс, 8004 Цюрих