2017-02-27 21 views

回答

1

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)。一個手指樹是一個樹狀數據結構,它允許快速推/流行/檢查/ ...

+1

感謝了很多人! –