述語をキャッシュするProlog実装またはライブラリはありますか?述語キャッシュ
それともassertz/1を使用して、たとえば、FIFOキャッシュを実装し、/ 1を後退、次のようになります:ECLIPSE-CLPで
:- 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)).
、1は少なくとも余分を使用してのfindAll/3行を置き換えることができます-logical変数:
...
(getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size)),
...
私のボックスで
、このccall/1テイク> 4.00 CPU秒1000回の呼び出し、実際のゴールCPU時間がnegliglibleであるのに対し(0.04 CPU秒)。 私は、インタプリタ内で実装されているキャッシュ(特にLRUキャッシュなど)は、assertz/1より優れており、/ 1を引き戻すと推測します。
私はすべての述語にキャッシュすることを望んでいません。シナリオは次のようになります。p([H|T], E) :- q(H,E) ; p(T,E)
とq/2
副作用がない。 p/2
は、着実に成長しているリストのために呼び出されていますが、常に同じ/同じ場合は同じE
です。
おかげで、メモ化/テーブリングは、私が探していた用語だったされています。 Memoizationは、私が好む方言であるECLiPSe-CLPで余分な論理的な記憶を使って実装することができます。あなたが正しいキーワードを知っているなら、それはとても簡単です:)。 – chs
PrologとHaskellの型システムを組み合わせたMercuryは、プラグマを追加するだけでメモをサポートします。 – chs