【问题标题】:Predicate cache谓词缓存
【发布时间】:2011-08-07 02:46:42
【问题描述】:

是否有缓存谓词的 Prolog 实现或库?

或者你会使用 assertz/1 和retract/1 实现一个 FIFO 缓存吗,像这样:

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

在 ECLiPSe-CLP 中,至少可以使用额外的逻辑变量替换 findall/3 行:

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

在我的机器上,对此 ccall/1 的 1000 次调用需要 >4.00 cpu 秒,而实际目标 cpu 时间可以忽略不计(0.04 cpu 秒)。 所以我猜想在解释器内部实现的缓存(尤其是 LRU 缓存左右)仍然会优于 assertz/1 和retract/1。

我不想为每个谓词都缓存,当然,只缓存极少数谓词。一个场景可能是这样的:p([H|T], E) :- q(H,E) ; p(T,E)q/2 没有副作用。 p/2 被称为稳定增长的列表,但总是/经常使用相同的 E

【问题讨论】:

    标签: prolog prolog-directive-dynamic


    【解决方案1】:

    你想要 tabling/memoization 吗?
    XSB 提供自动表(你声明你想要表的谓词)

    是的,assertz/1 等有点慢

    【讨论】:

    • 谢谢,记忆/表格是我正在寻找的术语。记忆化可以在我更喜欢的方言 ECLiPSe-CLP 中使用额外的逻辑存储来实现。如果您知道正确的关键字,那就太容易了:)。
    • Mercury 结合了 Prolog 和 Haskell 的类型系统,还支持通过简单地添加 pragma 进行记忆。
    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多