O(1)术语查找

时间:2015-03-24 23:50:31

标签: prolog

我希望能够在我当前的prolog程序中尽快查找一个术语的存在,而prolog引擎遍历所有术语,直到它最终到达现有术语。

我还没有找到任何证据......但我认为给出了

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

swi-prolog引擎必须通过数千只试图与老虎统一的动物才能确认动物(老虎)在我的prolog数据库中。

在其他语言中,我相信HashSet会解决这个问题,启用O(1)查找...但是我似乎无法在swi-prolog文档中找到任何hashsets或hashtables。

是否有用于hashsets的swi-prolog库,或者我可以使用term_hash \ 2以某种方式自己构建它?

奖励信息,我很可能不得不查看一些动态添加的数据,要么添加到哈希集数据结构中,要么使用assertz

2 个答案:

答案 0 :(得分:6)

所有认真的Prolog系统都会通过哈希自动隐式为您执行此O(1)查找,因此您无需亲自执行此操作。

它被称为参数索引,你可以在所有好的Prolog书籍中找到这个解释。另请参阅许多Prolog系统(包括SWI)的更新版本中的“JIT(即时)索引”。索引也适用于动态添加的子句,这也是assertz/1速度减慢的一个原因,因此对于比读取更频繁更改的数据而言,这不是一个好的选择。

您也可以通过创建具有越来越多事实的数据库并在适用参数索引时看到查找时间大致保持不变来自行测试。

答案 1 :(得分:2)

当内置的第一个参数索引不够时(注意一些Prolog系统也提供多参数索引),根据系统,您可以使用内置或库术语哈希谓词构建自己的索引方案。对于ECLiPSe,GNU Prolog,SICStus Prolog,SWI-Prolog和YAP,请查看term_hash/4谓词的文档。