【问题标题】:faster dictionary than assoc, but with same relational/backtracking capabilities比 assoc 更快的字典,但具有相同的关系/回溯功能
【发布时间】:2018-01-02 19:04:11
【问题描述】:

我正在广泛使用 swi assoc 库。在加载具有 160K 元素的 prolog KB 时,我注意到查找新键并将新键写入 assoc 需要花费大量时间。

并且传递并包含当前状态信息的 assoc 增长到大约 150K 字节/字。

我想知道是否有一些性能更高的库,例如 assoc,可以帮助将性能显着提高至少一个数量级。

谢谢你,

丹尼尔

【问题讨论】:

  • 如何回溯数据库中加载的数据
  • 前段时间我探索了哈希表,但在移植到 YAP 时遇到了一些麻烦 - 我选择了一个更简单的界面,例如 here
  • 谢谢。知道这如何将性能与 assoc 数据结构进行比较
  • 我认为我不能按原样使用这个实现有两个原因:我需要几个字典同时工作,而且在我看来这个实现不处理回溯——即删除最后一个回溯点的条目——如果谓词失败。
  • 哎呀,你说得对。需要事务内存!接口可以返回一个属性变量?

标签: prolog swi-prolog


【解决方案1】:

使用自平衡red-black trees怎么样? SWI-Prolog 包括library(rbtrees)

将它与iwhen/2 一起使用以防止实例化不足,如下所示:

:- 使用模块(库(rbtrees))。 assoc_to_rb(Ps, T) :- iwhen(ground(Ps), groundassoc_to_rb(Ps,T))。 groundassoc_to_rb(Ps0, T) :- 键排序(Ps0,Ps), (追加(_, [K-_,K-_|_], Ps) -> 抛出(错误(domain_error(unique_keyed_assoc,Ps0),_)) ; list_to_rbtree(Ps, T) )。

使用 SWI-Prolog 8.0.0 的示例查询:

?- assoc_to_rb([three-3,two-2,one-1,four-4], T), rb_in(four,Value,T)。 T = t(black('', _7860, _7862, ''), black(black('', _7860, _7862, ''), 四, 4, black('', _7860, _7862, '') ), 一, 1, 黑(黑('', _7860, _7862, ''), 三, 3, 红(黑('', _7860, _7862, ''), 二, 2, 黑('', _7860 , _7862, ''))))), 值 = 4 ;错误的。 ?- assoc_to_rb([3-3,2-2,1-1,4-4,4-vier], T)。 错误:域错误:预期为 `unique_keyed_assoc',发现 `[3-three,2-two,1-one,4-four,4-vier]'

【讨论】:

    【解决方案2】:

    在 SWI-Prolog 中,您可以将值存储在全局变量中:

    backtrackable b: b_setval, b_getval
    not backtrackable nb:  nb_setval, nb_getval
    besides using dynamic predicates: assert/retract.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 2021-04-18
      • 1970-01-01
      • 2022-06-14
      • 2022-11-29
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多