2011-08-07 10 views
6

述語をキャッシュする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です。

答えて

4

お望みですかtabling/memoization
XSB自動テーブリング(あなたがテーブル化したい述語どの宣言)

を提供しています、はい、/ 1 assertzなどちょっと遅い

+1

おかげで、メモ化/テーブリングは、私が探していた用語だったされています。 Memoizationは、私が好む方言であるECLiPSe-CLPで余分な論理的な記憶を使って実装することができます。あなたが正しいキーワードを知っているなら、それはとても簡単です:)。 – chs

+0

PrologとHaskellの型システムを組み合わせたMercuryは、プラグマを追加するだけでメモをサポートします。 – chs