Map 序言关联列表

Map 序言关联列表,map,prolog,sicstus-prolog,Map,Prolog,Sicstus Prolog,我正在用Prolog编写一个简单的程序安全检查器,我需要一个数据结构来保存变量赋值。由于我想在再次访问同一状态时进行检测,因此该结构必须支持一些合理的比较语义,以便将访问的状态存储在集合中 库(avl)具有方便的getter/setter接口。 问题是,持有相同映射的AVL可以采用多种形式。 因此,如果两个相同的状态的AVL表示不同,则认为它们是不同的 在有序列表中保存映射的结构将不会出现此问题。然而,我在Sicstus文档中找不到类似的东西。是否有任何标准结构可以满足我的需要,或者我必须自己实

我正在用Prolog编写一个简单的程序安全检查器,我需要一个数据结构来保存变量赋值。由于我想在再次访问同一状态时进行检测,因此该结构必须支持一些合理的比较语义,以便将访问的状态存储在集合中

库(avl)
具有方便的getter/setter接口。 问题是,持有相同映射的AVL可以采用多种形式。 因此,如果两个相同的状态的AVL表示不同,则认为它们是不同的


在有序列表中保存映射的结构将不会出现此问题。然而,我在Sicstus文档中找不到类似的东西。是否有任何标准结构可以满足我的需要,或者我必须自己实现它?

您有,但在AVL中,您始终可以对键值对进行排序,然后对它们进行比较。

我见过有序集,但它们不允许我们为给定的键查找值(例如存储键值对;然后存储ord_成员(0-Val,Set)将找不到与键(0)关联的值。我将使用第二种解决方案,尽管它超出了使用tree的目的,
ord_成员
的行为似乎有点奇怪。不幸的是,我没有安装SICStus,但SWI的行为符合预期:
?-ord_成员(0-Val[0-[1,2,3],1-[2,3,5],6-[5,3,5,4,21]])。
返回
Val=[1,2,3]。
SICStus对您的示例回答
否。它是文档中的
ord\u成员(+Key,+Set)
,所以我猜当Key未完全实例化时,行为取决于实现。感谢您使用SICStus对其进行测试。。。当然,一个人可以自己实现命令成员/2。。。