2024 年 Clojure 调查问卷! 中分享您的想法。

欢迎!有关此工作方式的更多信息,请参阅 关于 页面。

0 投票
core.logic
编辑

我正在使用 core.logic 来解决我的问题的一个子集。我预期描述问题的声明性会导致在大型输入上的性能较差。

但是我的设定是 core.logic 的输入很少改变,但我查询了很多。所以,自然地我认为记忆化会加快性能。

我只能记忆化来自顶级 (l/run* 形式的结果,但这比在每个 l/defne 或每次调用 conde 时进行记忆化要低效,因为后者可以提供与动态规划相同的加速效果。

但我不知道(例如,由 fresh 引入的 LVar)的逻辑子句之间传递什么类型的值。它们不同于常规的 clojure 值,而且我从未“通常”调用过这些子句(如 l/==l/membero),它们始终是通过 l/run* 间接调用的。

所以,如果我想要记忆化这样的 defne,我需要做任何特别的事情吗?

1 答案

0 投票
 
最佳答案

从未尝试过,但我想在clojure.core.logic中它被称为“tabling”。tabled有帮助吗?

啊,这样就解决了!更详细的解释可以在byrd的论文中找到,要不是我看到了你的评论,我绝对不会想到去查看“tabling”章节。谢谢!
...