是否有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) ),
...
在我的方框中,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
。