prolog - 了解 add_to_heap(+Heap0, +Priority, ?Key, -Heap)

标签 prolog heap swi-prolog

来自docs :

add_to_heap(+Heap0, +Priority, ?Key, -Heap) is semidet

Adds Key with priority Priority to Heap0, constructing a new heap in Heap.

如果我理解正确的话,那么add_to_heap将一个键及其优先级添加到Heap0,然后将Heap0添加到Heap 。那么 Heap 基本上是一个堆的盒子?

最佳答案

不。Prolog 是一种声明性语言。这意味着 - 除了进一步基础 - 一旦变量有了值,您就无法再更改该值(通过回溯,您可以撤消该值) ,但在这种情况下,您当然会丢失先前调用路径的上下文)。因此您无法向现有堆添加键

因此,声明性语言构造了结构。例如 append(A,B,C) 将构造一个列表 C ,它相当于后面跟着的 AB 提供。另一个例子是 finger tree .

这也是这个谓词的工作原理:您构造一个新堆 Heap 等于 Heap0,但不同之处在于Key 使用给定的Priority 添加。因此,您仍然可以使用旧的Heap

例如:

demonstrate_use_old :-
    empty_heap(H0),
    add_to_heap(H0,0,foo,H1),
    heap_size(H0,0),
    heap_size(H1,1).

这因此测试了添加 foo 后第一个H0的大小仍然为0。 foo 仅添加到新堆 H1(其大小为 1)。

您可以公正地说,构建新的数据结构的计算成本很高。这就是为什么声明性语言通常有一组专用的数据结构 - 例如,Haskell 和 Prolog 默认情况下使用(链接)列表而不是数组,因为这允许在 O(1) 中添加到头部。 手指树是一种树状数据结构,允许快速推送/弹出/检查/...

关于prolog - 了解 add_to_heap(+Heap0, +Priority, ?Key, -Heap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42489333/

相关文章:

http - SWI-Prolog 读取 http header

swi-prolog - 解析命令行参数

prolog - 覆盖 Prolog 中预定义的谓词

list - prolog 列表中某个元素在列表中出现了多少次?

list - Prolog - 检查两个列表是否具有除一个之外的相同元素

prolog - 前言中的警告

java - while循环停止条件缺失

java - 最小堆算法

prolog - 在Prolog上计算二叉树的节点数?

algorithm - 具有动态项目优先级的优先级队列