2011-08-07 13 views
6

क्या कोई प्रोलॉग कार्यान्वयन या पुस्तकालय है जो कैश भविष्यवाणी करता है?भविष्यवाणी कैश

या आप,/1 और वापस लेना/1 assertz का उपयोग कर इस तरह की एक, कहते हैं, फीफो कैश लागू करना होगा:

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

ग्रहण-CLP में, एक कम से कम अतिरिक्त का उपयोग कर findall/3 लाइन बदल सकते -logical चर:

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

मेरी बॉक्स पर, इस ccall/1 ले> 4.00 cpu सेकंड के लिए 1000 कॉल, जबकि वास्तविक लक्ष्य CPU समय negliglible है (0.04 cpu सेकंड)। तो मुझे लगता है कि दुभाषिया के अंदर लागू एक कैश (विशेष रूप से एक एलआरयू कैश या तो) अभी भी assertz/1 और retract/1 से बेहतर प्रदर्शन करेगा।

मैं निश्चित रूप से केवल कुछ ही लोगों के लिए कैशिंग नहीं करना चाहता हूं। एक परिदृश्य इस तरह हो सकता है: p([H|T], E) :- q(H,E) ; p(T,E)q/2 के साथ कोई दुष्प्रभाव नहीं है। p/2 को लगातार बढ़ती सूची के लिए बुलाया जाता है लेकिन हमेशा E के लिए हमेशा/अक्सर कहा जाता है।

उत्तर

4

क्या आप tabling/memoization चाहते हैं?
XSB स्वत: पेश प्रदान करता है (यदि आप यह घोषणा जो predicates आप पेश करना चाहते हैं)

और हाँ, assertz/1 आदि थोड़े धीमे होते हैं

+1

धन्यवाद, Memoization/पेश मामले मैं खोज रहा था थे। अतिरिक्त लॉजिकल स्टोर्स का उपयोग करके, ईसीएलआईपीएसई-सीएलपी में बोली लगाई जा सकती है, जिस बोली को मैं पसंद करूंगा। यदि आप सही कीवर्ड जानते हैं तो यह इतना आसान है :)। – chs

+0

बुध, जो प्रोलॉग को एक प्रकार के सिस्टम ए ला हास्केल के साथ जोड़ता है, वह केवल एक प्रगति जोड़कर ज्ञापन का समर्थन करता है। – chs

संबंधित मुद्दे