比assoc更快的字典,但具有相同的关系/回溯功能

时间:2018-01-02 19:04:11

标签: prolog swi-prolog

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

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

我想知道是否有一些像assoc这样的高性能库可以帮助显着提高性能至少一个数量级。

谢谢,

丹尼尔

2 个答案:

答案 0 :(得分:2)

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

iwhen/2一起使用,以防止实例化不足,例如:

:- use_module(library(rbtrees)).

assoc_to_rb(Ps, T) :-
   iwhen(ground(Ps), groundassoc_to_rb(Ps,T)).

groundassoc_to_rb(Ps0, T) :-
   keysort(Ps0, Ps),
   (  append(_, [K-_,K-_|_], Ps)
   -> throw(error(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(black('', _7860, _7862, ''), four, 4, black('', _7860, _7862, '')), one, 1, black(black('', _7860, _7862, ''), three, 3, red(black('', _7860, _7862, ''), two, 2, black('', _7860, _7862, ''))))), Value = 4
;  false.

?- assoc_to_rb([3-three,2-two,1-one,4-four,4-vier], T).
ERROR: Domain error: `unique_keyed_assoc' expected, found `[3-three,2-two,1-one,4-four,4-vier]'

答案 1 :(得分:0)

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

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