prolog - O(1) 术语查找

标签 prolog

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

我还没有找到任何证据..但我认为给定的

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

swi-prolog 引擎将不得不通过数以千计的动物试图与老虎统一,以确认动物(老虎)在我的序言数据库中。

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

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

奖金信息,我很可能必须查找一些动态添加的数据,添加到哈希集数据结构或使用 assertz

最佳答案

所有严肃的 Prolog 系统都通过哈希自动隐式地为您执行此 O(1) 查找,因此您不必自己进行。

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

您还可以通过创建具有越来越多的事实的数据库并查看在应用参数索引时查找时间大致保持不变来轻松测试这一点。

关于prolog - O(1) 术语查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29245045/

相关文章:

prolog - 在 Prolog 中制表,什么时候存储值?

c++ - 将 C++ 的相同功能/概念转换为序言

prolog - Prolog 99瓶啤酒

file - Swi Prolog,卸载源文件

prolog - 此查询的 SLD 树是什么?

Prolog/真假定义

Prolog 查询返回 H128

prolog - 如何在 SICStus Prolog 中检查 WAM 代码

prolog - YAP初始化文件?

prolog - 在Prolog中重构纠结的循环规则