Ö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.
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
Prolog, Haskell tipi bir sistemle birleştiren Mercury'yi de bir pragma ekleyerek hafızaya almayı destekliyor. – chs