XSB 文档在手册卷 2 第 1.16.5 节中有一段关于堆数据结构库的内容。但是我在源代码或版本历史记录中或通过 Google 都找不到该库的任何迹象。如果这个库实际上仍然存在,有什么想法吗?
我唯一的线索是 logtalk 中的一个库,它显然来自同一个原件。但是我正在使用 Prolog,因此必须将 logtalk 移植回 Prolog。
XSB 文档在手册卷 2 第 1.16.5 节中有一段关于堆数据结构库的内容。但是我在源代码或版本历史记录中或通过 Google 都找不到该库的任何迹象。如果这个库实际上仍然存在,有什么想法吗?
我唯一的线索是 logtalk 中的一个库,它显然来自同一个原件。但是我正在使用 Prolog,因此必须将 logtalk 移植回 Prolog。
您可以将 XSB(或任何其他支持的 Prolog 编译器)中的 Logtalk 用作另一个库,并从普通 Prolog 或 Prolog 模块调用其资源。关于 Logtalk 的堆库支持,它确实基于(如其文档中所述)原始 Richard O'Keefe 代码,但经过增强以提供最小堆和最大堆。堆接口可以在这里浏览,例如:
http://logtalk.org/library/heapp_0.html
http://logtalk.org/library/heap_1.html
一个简单的使用示例:
?- heap(<)::(new(Heap), insert_all([1-a,4-d,2-b,5-e,6-f,3-c,7-g], Heap, UpdatedHeap), top(UpdatedHeap, Key, Value)).
Heap = t(0, [], t),
UpdatedHeap = t(7, [], t(1, a, t(3, c, t(5, e, t, t), t(4, d, t, t)), t(2, b, t(6, f, t, t), t(7, g, t, t)))),
Key = 1,
Value = a.
?- heap(>)::(new(Heap), insert_all([1-a,4-d,2-b,5-e,6-f,3-c,7-g], Heap, UpdatedHeap), top(UpdatedHeap, Key, Value)).
Heap = t(0, [], t),
UpdatedHeap = t(7, [], t(7, g, t(4, d, t(1, a, t, t), t(3, c, t, t)), t(6, f, t(2, b, t, t), t(5, e, t, t)))),
Key = 7,
Value = g.
然而,有一个警告。与普通 Prolog 相比, ::/2 调用仅在从 Logtalk 对象(或 Logtalk 类别)中进行时才提供性能。顶级解释器或 Prolog 模块中的查询被解释(意味着消息在运行时解析)而不是编译(消息将在编译时解析)。性能影响是否对您的应用程序有意义,只有您可以判断(在支持术语扩展的 Prolog 编译器中,很容易减少模块内 ::/2 调用的性能影响)。