2011-08-07 20 views
6

Ön yüklemeleri önbelleğe alan bir Prolog uygulaması veya kitaplığı var mı?Ön belleği önbellekleme

Yoksa böyle,/1 ve geri çekme/1 assertz kullanarak, diyelim ki, FIFO önbellek uygulamak istiyoruz:

Eclipse-CLP olarak
:- 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)). 

, biri en az ekstra kullanarak findall/3 satır yerini alabilir -Mantıksal değişkenler:

... 
(getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size)), 
... 
benim kutusunda

, bu ccall/1 take> 4.00 cpu sn 1000 çağrılar, asıl amacının cpu zamanı negliglible oysa (0.04 cpu sn). Bu yüzden yorumlayıcı içinde uygulanan bir önbellek (özellikle bir LRU önbellek vb.) Hala assertz/1'den daha iyi performans gösterecek ve geri çekilecek/1 olacaktır.

Tabii ki sadece çok azı için, her yüklemede önbelleğe almak istemiyorum. Bir senaryo şu şekilde olabilir: q/2 ile yan etkisi olmayan p([H|T], E) :- q(H,E) ; p(T,E). p/2 sürekli büyüyen bir liste için çağrılır, ancak her zaman/aynı E için sık sık.

cevap

4

tabling/memoization?
XSB otomatik tablolama sunmaktadır/1 vs tür yavaş assertz, evet

ve (sen tablolama olmasını istediğiniz yüklemler beyan)

+1

sayesinde memoization/aradığım terimlerdi tablolama. Memnuniyet, ECLiPSe-CLP'de, tercih ettiğim lehçede, ekstra-mantıksal depolar kullanılarak uygulanabilir. Doğru anahtar kelimeleri biliyorsanız çok kolay :). – chs

+0

Prolog, Haskell tipi bir sistemle birleştiren Mercury'yi de bir pragma ekleyerek hafızaya almayı destekliyor. – chs