谓词缓存

chs*_*chs 6 prolog

是否有Prolog实现或库来缓存谓词?

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

:- 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)).
Run Code Online (Sandbox Code Playgroud)

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

...
( getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size) ),
...
Run Code Online (Sandbox Code Playgroud)

在我的盒子上,1000次调用此ccall/1需要> 4.00 cpu sec,而实际目标cpu时间可忽略不计(0.04 cpu sec).所以我想在解释器中实现的缓存(特别是LRU缓存等)仍然优于assertz/1和retract/1.

我不想为每个谓词都进行缓存,当然,只有很少的谓词.一个场景可能是这样的:p([H|T], E) :- q(H,E) ; p(T,E)q/2没有副作用.p/2被称为一个稳定增长的名单,但总是/经常是相同的E.

Tha*_*dis 4

你想要表格/记忆吗?
XSB提供自动制表(您可以声明要制表的谓词)

是的,assertz/1 等有点慢