【问题标题】:O(1) term look upO(1) 术语查找
【发布时间】:2015-03-24 23:50:30
【问题描述】:

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

我还没有找到任何证据.. 但我假设给定

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

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

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

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

额外信息,我很可能需要查找一些动态添加的数据,要么添加到哈希集数据结构中,要么使用 assertz

【问题讨论】:

  • 不过,您可能会介意一些警告。 "animal(tiger)" 在 O(1) 中,但 "animal(X), X=tiger" 在 O(n) 中。

标签: prolog


【解决方案1】:

所有严肃的 Prolog 系统都通过散列自动隐式为你执行这个 O(1) 查找,所以你不必自己做。

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多