我希望能够在我当前的prolog程序中尽快查找一个术语的存在,而prolog引擎遍历所有术语,直到它最终到达现有术语.
我没有找到任何证据......但我认为给出了
animal(lion).
animal(zebra).
...
% thousands of other animals
...
animal(tiger).
Run Code Online (Sandbox Code Playgroud)
swi-prolog引擎将不得不通过成千上万的动物试图与老虎统一,以确认动物(老虎)在我的prolog数据库中.
在其他语言中,我相信HashSet会解决这个问题,启用O(1)查找...但是我似乎无法在swi-prolog文档中找到任何hashsets或hashtables.
是否有用于hashsets的swi-prolog库,或者我可以使用term_hash\2以某种方式自己构建它?
奖金信息,我很可能不得不查看一些动态添加的数据,要么添加到哈希集数据结构,要么使用assertz
所有严肃的Prolog系统都会自动和隐式地为您执行此O(1)查找,因此您无需亲自执行此操作.
它被称为参数索引,你可以在所有好的Prolog书籍中找到它.另请参阅许多Prolog系统(包括SWI)的更新版本中的"JIT(即时)索引".索引也应用于动态添加的子句,这assertz/1也是减慢速度的一个原因,因此对于比读取更频繁更改的数据而言,这不是一个好的选择.
您还可以通过创建具有越来越多事实的数据库并在应用参数索引时查看查找时间大致保持不变来轻松地自行测试.