¿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
.
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
Mercury, que combina Prolog con un sistema de tipo a la Haskell, también admite la memorización simplemente agregando un pragma. – chs