述語をキャッシュする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 / 1への1000回の呼び出しは、> 4.00 cpu秒かかりますが、実際の目標cpu時間はごくわずかです(0.04 cpu秒)。したがって、インタープリター内に実装されたキャッシュ(特にLRUキャッシュなど)は、assertz/1およびretract/1よりもパフォーマンスが優れていると思います。
もちろん、すべての述語にキャッシュを設定したくはありません。シナリオは次のようになります。副作用はありませんp([H|T], E) :- q(H,E) ; p(T,E)
。着実に成長しているリストが求められていますが、常に/しばしば同じです。q/2
p/2
E