6
是否有Prolog實現或緩存謂詞的庫?謂詞緩存
或者你會使用assertz/1和收回/ 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秒,而實際目標的CPU時間negliglible(0.04 CPU秒)。 所以我想在解釋器內部實現的緩存(尤其是LRU緩存等)仍然會優於assertz/1和retract/1。
我不想爲每個謂詞緩存,當然,只有極少數的謂詞。情景可能是這樣的:p([H|T], E) :- q(H,E) ; p(T,E)
與q/2
沒有副作用。 p/2
被稱爲一個穩步增長的名單,但總是/經常爲相同的E
。
謝謝,記憶化/桌遊戲是我一直在尋找的條款。記憶可以在ECLiPSe-CLP中實現,我更喜歡使用額外邏輯存儲的方言。如果你知道正確的關鍵字,那麼這很容易:)。 – chs
Mercury將Prolog與類型系統la Haskell相結合,通過簡單地添加一個附註來支持記憶。 – chs