我正在使用 core.logic
解决我的问题的一部分。我预计描述问题的声明性会导致在大输入时性能较差。
但是,我所拥有的设置是 core.logic 的输入很少变化,但是查询它们的频率很高。因此,自然地我想到记忆化可以加速性能。
我只能对 top-level 的 (l/run*
表达式进行记忆化,但这比在每个 l/defne
或每次调用 conde
时进行记忆化要低效,因为后者可以提供与动态规划相同的加速效果。
但我不明白什么样的值(例如由 fresh 引入的 LVar
)在逻辑子句之间传递。它们与常规 Clojure 值不同,我甚至从未“正常”调用过其中一个子句(如 l/==
或 l/membero
)。它们总是通过 l/run*
间接调用。
所以,如果我想对这样的 defne
进行记忆化,我需要做些特别的事情吗?