6

述語をキャッシュする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/2p/2E

4

1 に答える 1

4

タブリング/メモ化が必要ですか?
XSBは自動タブリングを提供します(タブリングする述語を宣言します)

はい、assertz/1などはちょっと遅いです

于 2011-08-07T12:19:25.430 に答える