2011-08-07 73 views
6

Có triển khai hoặc thư viện Prolog lưu trữ các vị từ không?Bộ nhớ cache dành riêng

Hoặc bạn sẽ thực hiện một, nói, FIFO bộ nhớ cache sử dụng assertz/1 và rút/1, như thế này:

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

trong Eclipse-CLP, một ít nhất có thể thay thế findall dòng/3 sử dụng thêm biến -logical:

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

Trên hộp của tôi, 1000 cuộc gọi đến ccall này/1 mất> 4.00 cpu giây, trong khi đó thời gian mục tiêu cpu thực tế là negliglible (0.04 cpu giây). Vì vậy, tôi đoán một bộ nhớ cache (đặc biệt là một bộ nhớ cache LRU hoặc như vậy) được thực hiện bên trong trình thông dịch sẽ vẫn tốt hơn các assertz/1 và rút lại/1.

Tôi không muốn có bộ nhớ đệm cho mọi biến vị ngữ, tất nhiên, chỉ dành cho rất ít vị ngữ. Kịch bản có thể như sau: p([H|T], E) :- q(H,E) ; p(T,E) với q/2 không có tác dụng phụ. p/2 được gọi cho một danh sách phát triển ổn định nhưng luôn luôn/thường xuyên cho cùng một E.

Trả lời

4

bạn có muốn tabling/memoization không?
XSB cung cấp vẫn tuân theo tự động (bạn khai báo mà predicates bạn muốn có vẫn tuân theo)

và có, assertz/1 vv là kinda chậm

+1

Cảm ơn, memoization/vẫn tuân theo các điều khoản đã tôi đang tìm kiếm. Việc ghi nhớ có thể được thực hiện trong ECLiPSe-CLP, phương ngữ mà tôi thích, sử dụng các cửa hàng bổ sung hợp lý. Thật dễ dàng nếu bạn biết từ khóa chính xác :). – chs

+0

Thủy ngân, một kết hợp Prolog với một hệ thống kiểu la la Haskell, cũng hỗ trợ ghi nhớ bằng cách thêm một pragma. – chs

Các vấn đề liên quan