Existe-t-il une implémentation ou une bibliothèque Prolog qui met en cache les prédicats?Cache de prédicat
Ou mettre en œuvre un, par exemple, le cache FIFO en utilisant assertz/1 et se rétracter/1, comme ceci:
:- 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)).
Dans eclipse-CLP, on pourrait au moins remplacer la ligne de findall/3 en utilisant supplémentaires Variables -LogiCal:
...
(getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size)),
...
Sur ma boîte, 1000 appels à cette ccall/1 prendre> 4,00 sec cpu, alors que le temps cpu objectif réel est negliglible (0,04 cpu s). Donc je suppose qu'un cache (en particulier un cache LRU ou similaire) implémenté dans l'interpréteur surpasserait toujours l'assertz/1 et retract/1.
Je ne veux pas avoir de cache pour chaque prédicat, bien sûr, seulement pour très peu. Un scénario pourrait être comme ceci: p([H|T], E) :- q(H,E) ; p(T,E)
avec q/2
sans effets secondaires. p/2
est appelé pour une liste sans cesse croissante mais toujours/souvent pour la même E
.
Merci, memoization/dépôt étaient les termes que je recherchais. Memoization peut être mis en œuvre dans ECLiPSe-CLP, le dialecte que je préfère, en utilisant des magasins extra-logiques. C'est si facile si vous connaissez les mots-clés corrects :). – chs
Mercury, qui combine Prolog avec un système de types à la Haskell, prend également en charge la mémorisation en ajoutant simplement un pragma. – chs