Prolog 了解将添加到堆(+;Heap0,+;优先级,键,-堆)

Prolog 了解将添加到堆(+;Heap0,+;优先级,键,-堆),prolog,heap,swi-prolog,Prolog,Heap,Swi Prolog,从: 添加到堆(+Heap0,+Priority,?Key,-heap)是semidet 将具有优先级的Key添加到Heap0,在heap中构造一个新堆 如果我理解正确,那么add_to_heap将一个键及其优先级添加到Heap0,然后将Heap0添加到heap。因此,Heap基本上是一个堆的盒子?否。Prolog是一种声明性语言。这意味着,除了进一步的基础之外,一旦变量有了值,就不能再更改该值了(通过回溯,您可以撤销该值,但在这种情况下,您当然会丢失以前调用路径的上下文)。因此,无法向现有堆添

从:

添加到堆(+Heap0,+Priority,?Key,-heap)
是semidet

将具有优先级的
Key
添加到
Heap0
,在
heap
中构造一个新堆


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

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

因此,声明性语言构造了新的结构。例如,
append(A,B,C)
将构造一个新的列表
C
,该列表相当于
A
,后跟
B
。另一个例子是

这也是这个谓词的工作方式:您构造一个新的堆
,该堆等于
Heap0
,但不同之处在于
添加了给定的
优先级
。因此,您仍然可以使用旧的

例如:

demonstrate_use_old :-
    empty_heap(H0),
    add_to_heap(H0,0,foo,H1),
    heap_size(H0,0),
    heap_size(H1,1).
因此,这将测试第一个空堆
H0
在添加
foo
后仍然具有大小0
foo
仅添加到新堆
H1
(大小为1)

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