评论者:adrianm
appendo 和 membero 特别慢。
(dotimes (link: i ie5) (run* (link: q) (== q true))) 的执行时间大约在 ~4500ms 左右,比 JVM 要慢约 10 倍。
通过剖析,我发现问题所在——确实需要标准的递归优化,代码在执行过程中会递归地重复行走(通过重新绑定)局部变量。例如,
对于 appendo,(run 5 (link: q) (fresh (link: x y) (appendo x y q))) 会展开成类似的一些内容...
((_0) (_0 . _1) (_0 _1 . _2) ... ))
它之所以慢,是因为每个新列表实际上都会重新遍历之前已绑定的所有局部变量。
我将在周末有更多时间来研究这个问题,但是我认为这可能是很简单的问题,只需默认不生成唯一的局部变量,因为这样,在统一检查中应该能够捕获所有的尝试。