從docs:瞭解add_to_heap(?+ Heap0,+優先,重點,-heap)
add_to_heap(+Heap0, +Priority, ?Key, -Heap)
是semidet添加
Key
優先Priority
到Heap0
,構建一個新的堆在Heap
。
如果我理解正確的話,那麼add_to_heap
添加一個鍵及其優先Heap0
,然後添加到Heap0
Heap
?那麼Heap
基本上是一堆堆?
從docs:瞭解add_to_heap(?+ Heap0,+優先,重點,-heap)
add_to_heap(+Heap0, +Priority, ?Key, -Heap)
是semidet添加
Key
優先Priority
到Heap0
,構建一個新的堆在Heap
。
如果我理解正確的話,那麼add_to_heap
添加一個鍵及其優先Heap0
,然後添加到Heap0
Heap
?那麼Heap
基本上是一堆堆?
第 Prolog是聲明式語言。這意味着, - 除了進一步接地 - 一次的變量有一個值,你不能改變的值了(通過回溯可以撤消這一點,但在這種情況下,你失去了先前的呼叫的過程上下文路徑)。所以你不能添加密鑰到現有的堆。
因此,聲明性語言構造了新的結構。例如append(A,B,C)
將建立一個新的名單這C
相當於A
隨後B
。另一個例子是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).
因此,這試驗,第一空堆H0
仍具有大小0添加foo
後。 foo
僅被添加到新的堆H1
(其大小爲1)。
您可能 - 公正 - 說,建設新的數據結構的計算成本高昂。這就是爲什麼聲明性語言通常有一組專用的數據結構的 - 例如,Haskell和Prolog的默認使用數組的(鏈接)列表,而不是因爲這允許在增加了頭部O(1)。一個手指樹是一個樹狀數據結構,它允許快速推/流行/檢查/ ...
感謝了很多人! –