reflection - SWI Prolog 中的变量名

标签 reflection prolog

我一直在使用 chr 库和 jpl 接口(interface)。不过我有一个一般性的询问。我将 SWI Prolog 中的约束从我的 CHR 程序中发送到一个 java 类的实例。问题是,如果输入约束是 leq(A,B),例如,变量的名称消失了,出现的变量名称以 _G 开头。即使我尝试在不使用界面的情况下打印 leq(A,B) 也会发生这种情况。似乎每当处理变量时,名称都会被新的名称替换。我的问题是是否有办法进行映射。比如有没有办法知道_G123对应A等等。
非常感谢你。

最佳答案

(这个问题与 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 .

关于reflection - SWI Prolog 中的变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9358623/

相关文章:

prolog - 读一剪!在序言中

parsing - Prolog DCG 中的可选或重复项

optimization - Logtalk方法调用性能优化

java - 使用反射从 Bundle 获取数据

java - 构造运行时要调用的方法名称

c# - 如何获取元数据自定义属性?

prolog - 如何从 Prolog 中的术语获取原子变量列表

c# - 如何在C#中通过字符串访问类成员?

JDBC 结果集/语句中的 Java 内存泄漏

list - Prolog:从列表中随机选择规则并传递参数