我正在使用 core.logic
来解决我的问题的一个子集。我预期描述问题的声明性会导致在大型输入上的性能较差。
但是我的设定是 core.logic 的输入很少改变,但我查询了很多。所以,自然地我认为记忆化会加快性能。
我只能记忆化来自顶级 (l/run*
形式的结果,但这比在每个 l/defne
或每次调用 conde
时进行记忆化要低效,因为后者可以提供与动态规划相同的加速效果。
但我不知道(例如,由 fresh 引入的 LVar
)的逻辑子句之间传递什么类型的值。它们不同于常规的 clojure 值,而且我从未“通常”调用过这些子句(如 l/==
或 l/membero
),它们始终是通过 l/run*
间接调用的。
所以,如果我想要记忆化这样的 defne
,我需要做任何特别的事情吗?