2015-03-24 38 views
5

我希望能夠在當前的prolog程序中儘可能快地查找一個術語的存在,沒有prolog引擎遍歷所有術語,直到它最終達到現有術語。O(1)term look up

我還沒有發現它的任何證據。但我認爲,鑑於

animal(lion). 
animal(zebra). 
... 
% thousands of other animals 
... 
animal(tiger). 

的SWI-Prolog的發動機將要經過數以千計的動物試圖與老虎統一的,以確認動物(老虎)在我的序言數據庫中。

在其他語言中,我相信HashSet可以解決這個問題,使O(1)查找...但是我似乎無法在swi-prolog文檔中找到任何哈希集或哈希表。

是否有一個用於哈希集的swi-prolog庫,或者我可以用term_hash \ 2自己構建它嗎?

獎金的信息,我將最有可能不得不做一些動態添加數據的查找,或者加入到HashSet的數據結構或使用assertz

+1

不過你可能會介意一些注意事項。 「動物(老虎)」在O(1)中,但「動物(X),X =老虎」在O(n)中。 – repeat 2015-03-25 17:52:46

回答

6

所有嚴重的序言中執行此O(1 )通過散列查找自動爲您提供,所以您不必自己動手。

它被稱爲參數索引,你會發現這在所有優秀的Prolog書籍中都有解釋。另請參閱許多Prolog系統(包括SWI)的更新版本中的「JIT(即時)索引」。索引也適用於動態添加的子句,這也是爲什麼assertz/1速度變慢的原因之一,因此對於數據讀取次數更多的數據不是一個好的選擇。

您還可以通過創建具有越來越多事實的數據庫並查看適用參數索引時查找時間大致保持不變的情況來輕鬆地進行測試。

+0

不錯,謝謝。基於你的回答,我剛剛發現了JIT索引的一些信息http://www.swi-prolog.org/pldoc/man?section=jitindex – Michelrandahl 2015-03-25 00:05:00

2

當內置的第一個參數索引不夠時(請注意,一些Prolog系統也提供多參數索引),根據系統的不同,您可以使用內置或庫項哈希來構建自己的索引方案謂詞。在ECLiPSe,GNU Prolog,SICStus Prolog,SWI-Prolog和YAP的情況下,請查看term_hash/4謂詞的文檔。