(这个问题与 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中的变量名称,请参考this question。