Когда вы вводите write(X).
в интерактивном приглашении, и ничего больше, X не привязан ни к чему конкретно. Если вы хотите прочитать X от пользователя, а затем записать его, попробуйте ввести read(X), write(X).
в командной строке.
?- read(X), write(X).
|: 28.
28
X = 28.
SWI Prolog сохраняет историю привязок верхнего уровня; введите help.
, чтобы перейти в руководство, затем найдите bindings
или просто перейдите к разделу 2.8 руководства «Повторное использование привязок верхнего уровня». Там вы можете узнать, что последнее значение любой переменной, связанной с успешной целью верхнего уровня, сохраняется и может быть отнесено к использованию имени переменной с префиксом знака доллара. Так как взаимодействие следующие варианты:
?- read(X).
|: 42.
X = 42.
?- write($X).
42
true.
Но цель верхнего уровня, который как раз случается использовать имя переменной X будет интерпретироваться как использование новой переменной; иначе будет нарушена нормальная семантика Prolog.
возможно дубликат [Имена переменных в SWI Prolog] (http://stackoverflow.com/questions/9358623/variable-names-in-swi-prolog) – false