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