(Этот вопрос не имеет отношения к CHR и не относится к SWI).
Имена переменных, которые вы используете при написании программы Prolog, полностью отбрасываются системой Prolog. Причина в том, что эта информация не может быть использована для точной печати переменных. Там может быть несколько независимых экземпляров этой переменной. Таким образом, необходимо добавить некоторый уникальный идентификатор к имени переменной. Кроме того, поддержание этой информации во время выполнения повлечет за собой значительные накладные расходы.
Чтобы увидеть это, рассмотрим предикат mylist/1
.
?- [user].
|: mylist([]).
|: mylist([_E|Es]) :- mylist(Es).
|: % user://2 compiled 0.00 sec, 4 clauses
true.
Здесь мы использовали переменную _E
для каждого элемента списка. На верхнем уровне теперь печатаются все эти элементы с уникальным идентификатором:
?- mylist(Fs).
Fs = [] ;
Fs = [_G295] ;
Fs = [_G295, _G298] .
Fs = [_G295, _G298, _G301] .
Второй ответ может быть напечатан как Fs = [_E]
. Но как насчет третьего? Он не может быть напечатан как Fs = [_E,_E]
, поскольку элементы являются разными переменными. Так что что-то вроде Fs = [_E_295,_E_298]
- лучшее, что мы можем получить. Тем не менее, это будет означать много дополнительного бухгалтерского учета.
Но есть и другая причина, по которой связывание имен переменных исходного кода с переменными времени выполнения может привести к чрезвычайным сложностям: в разных местах эта переменная может иметь другое имя. Вот искусственный пример, чтобы проиллюстрировать это:
p1([_A,_B]).
p2([_B,_A]).
И запрос:
?- p1(L), p2(L).
L = [_G337, _G340].
Какие имена, вы бы хотели, чтобы эти два элемента имели? Первый элемент может иметь имя _A
или _B
или, может быть, даже лучше: _A_or_B
. Или даже _Ap1_and_Bp2
. Для кого это будет выгодно?
Обратите внимание, что имена переменных, упомянутые в запросе на верхнем уровне, сохраняются:
?- Fs = [_,F|_], mylist(Fs).
Fs = [_G231, F] ;
Fs = [_G231, F, _G375] ;
Fs = [_G231, F, _G375, _G378]
Так что есть способ получить эту информацию. О том, как получить имена переменных в SWI и YAP при чтении термина, см. этот вопрос .