2011-08-07 3 views
6

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.

Répondre

4

voulez-vous tabling/memoization?
XSB offre dépôt automatique (vous déclarez que prédicats vous voulez avoir dépôt)

et oui, assertz/1 etc sont un peu lent

+1

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

+0

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