是否存在缓存谓词的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)).在ECLiPSe-CLP中,至少可以使用额外的逻辑变量替换findall/3行:
...
( 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。
发布于 2011-08-07 20:19:25
https://stackoverflow.com/questions/6970408
复制相似问题