queue in the answer,对于您链接的问题,我觉得很好。 “更好的东西”是什么意思?
编辑:和here is a link to a hash-table implementation in Prolog。
关于哈希表,这是一个定义问题。 “制作哈希集”是什么意思?为什么你认为你会使用现成的数据结构?
您至少有三个选择:
- 使用现有的键值数据结构(查看
library(assoc) 和 SWI-Prolog dict),而不关心它是如何实现的;
- 根据您的确切规范实施数据结构;
- 不要使用Prolog中定义的数据结构,而是通过
assert*和retract*使用数据库。
我们不知道(根据您的问题)您是否必须为您的“哈希集”实现哈希表;或者如果您认为您需要包含“hash”一词的东西,或者如果您想要通常在其他语言中实现为哈希表的东西,而您只需使用了“哈希集”这个词,但您不需要特定于哈希表的特定属性。是哪一个?
根据您的问题:
有更快的方法吗?
没有人知道。这是不可知的。您需要一个用例,然后您需要为该用例编写一些测试,然后您需要分析您的实现并测量时间(和内存?)。例如,您可以将它们相互比较或与 Java HashSet 进行比较。在那之前,一切都只是猜测。
如果您想使用选项 2。并实现具有 hash table 属性的数据结构,您必须自己做。
如果您在决定如何实现散列函数或如何在 Prolog 中创建数组时需要帮助,您应该提出更具体的问题。
如果您在决定什么是最适合您的选择(上述三个之一或其他)方面需要帮助,您需要提出更具体的问题。
简单介绍一下 Prolog 中的数组。许多谓词都记录在in the section on Term manipulation。
您可以使用 Prolog 术语来创建数组。例如,这是一个大小为 5 的数组,其中包含 [a,b,c,d,e] 原子:
array(a, b, c, d, e)
您可以使用arg/3 获取索引处的元素:
?- A = array(a, b, c, d, e), arg(3, A, X).
A = array(a, b, c, d, e),
X = c.
您可以使用*setarg 谓词在索引处重新分配值。
?- A = array(a, b, c, d, e), arg(3, A, X), setarg(3, A, hello), arg(3, A, Y).
A = array(a, b, hello, d, e),
X = c,
Y = hello.
使用arg 和setarg 获取和设置应该是常数时间操作。
如果您有更具体的问题,您必须提出。