我正在广泛使用swi assoc库。当使用160K元素加载prolog KB时,我注意到查找并将新密钥写入assoc时需要花费大量时间。
传递并包含当前状态信息的assoc增长到大约150K字节/字。
我想知道是否有一些像assoc这样的高性能库可以帮助显着提高性能至少一个数量级。
谢谢,
丹尼尔
答案 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.