首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谓词高速缓存

谓词高速缓存
EN

Stack Overflow用户
提问于 2011-08-07 10:46:42
回答 1查看 933关注 0票数 6

是否存在缓存谓词的Prolog实现或库?

或者您是否会使用assertz/1和retract/1实现一个FIFO缓存,如下所示:

代码语言:javascript
复制
:- dynamic cache/1.
ccall(G) :- cache(G).
ccall(G) :-
    \+ cache(G),
    call(G),
    ( findall(G0,cache(G0),Gs), length(Gs,N), N =:= 100 -> once retract(cache(_)) ; true ),
    assertz(cache(G)).

在ECLiPSe-CLP中,至少可以使用额外的逻辑变量替换findall/3行:

代码语言:javascript
复制
...
( getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size) ),
...

在我的机器上,对这个ccall的1000次调用/1花费>4.00CPU秒,而实际的目标cpu时间可以忽略不计(0.04CPU秒)。因此,我猜测在解释器中实现的缓存(尤其是LRU缓存)仍然会比assertz/1和retract/1性能更好。

当然,我不希望每个谓词都有缓存,只有很少的谓词才有缓存。一个场景可能是这样的:q/2没有副作用的p([H|T], E) :- q(H,E) ; p(T,E)p/2用于稳定增长的列表,但总是/经常用于相同的E

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-07 20:19:25

你想要tabling/memoization

XSB提供了自动的表(声明您想要表的谓词)

是的,assertz/1等速度有点慢

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6970408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档