gpt4 book ai didi

reflection - SWI Prolog 中的变量名

转载 作者:行者123 更新时间:2023-12-04 14:32:53 26 4
gpt4 key购买 nike

我一直在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com