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