【发布时间】:2015-04-21 15:37:16
【问题描述】:
最近在浏览一些与prolog相关的问题时,偶然发现this answer by @mat向How to represent directed cyclic graph in Prolog with direct access to neighbour verticies提问。
到目前为止,我个人在 Prolog 中使用属性变量的经验非常有限。但是@mat 给出的用例引起了我的兴趣。所以我尝试用它来回答另一个问题,ordering lists with constraint logic programming。
首先,好消息:我第一次使用属性变量的结果如我所愿。
然后,不太好的消息:当我通过答案发布时,我意识到 Prolog 中有几个 API 和属性变量的实现。
我觉得我在这里不知所措......我特别想知道以下内容:
- 广泛使用哪些 API?到目前为止,我找到了两个:SICStus 和 SWI。
- 不同的属性变量实现提供了哪些功能?一样的吗?还是一个包含另一个?
- 语义上有区别吗?
- 实际执行情况如何?有些比其他的更有效吗?
- 使用属性变量是否会(或是否)存在可移植性问题?
这里有很多问号...请分享您的经验/立场? 提前谢谢!
编辑 2015-04-22
这是上面提到的answer的代码sn-p:
init_att_var(X,Z) :-
put_attr(Z,value,X).
get_att_value(Var,Value) :-
get_attr(Var,value,Value).
到目前为止,我“只”使用 put_attr/3 and get_attr/3,但是——根据 SICStus Prolog 关于属性变量的文档——SICStus 提供 put_attr/2 and get_attr/2。
所以即使是这个非常浅的用例 需要一些仿真层(一种或另一种)。
【问题讨论】:
-
请不要忘记用户的观点。也就是说,只使用约束的人!
call_residue_vars/2是最重要的。 -
...和
copy_term/3