2011-08-07 15 views
6

¿Hay una implementación de Prolog o biblioteca que almacena en caché los predicados?caché de predicados

O le implementar un, digamos, caché FIFO utilizando assertz/1 y retraer/1, de esta manera:

:- 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)). 

en Eclipse-CLP, se podría al menos reemplazar el/3 línea findall usando adicional las variables-lógico:

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

En mi caja, 1000 las llamadas a este ccall/1 toma> 4,00 seg CPU, mientras que el tiempo real de la CPU objetivo es negliglible (0,04 cpu SEC). Así que supongo que un caché (particularmente un caché LRU más o menos) implementado dentro del intérprete aún superaría a assertz/1 y retraer/1.

No quiero tener el caché para cada predicado, por supuesto, solo para muy pocos. Un escenario podría ser así: p([H|T], E) :- q(H,E) ; p(T,E) con q/2 sin efectos secundarios. p/2 se llama para una lista cada vez mayor pero siempre/a menudo para el mismo E.

Respuesta

4

¿quieres tabling/memoization?
XSB ofrece presentación automática (se declara el cual predica que desea tener presentación)

y sí, assertz/1, etc. son un poco lento

+1

Gracias, memoization/presentación fueron los términos que estaba buscando. La memoización se puede implementar en ECLiPSe-CLP, el dialecto que prefiero, usando tiendas extra-lógicas. Es tan fácil si sabes las palabras clave correctas :). – chs

+0

Mercury, que combina Prolog con un sistema de tipo a la Haskell, también admite la memorización simplemente agregando un pragma. – chs

Cuestiones relacionadas