评论由:adrianm 提供
Appendo和membero运行速度特别慢。
(dotimes (link: i ie5) (run* (link: q) (== q true))) 的执行时间约为~4500ms,这是 JVM 的约10倍慢。
经过分析,我发现问题——非常标准的递归优化是必要的,它会在代码执行时递归地重新执行lvars(通过重统一)。例如,
对于appendo,(run 5 (link: q) (fresh (link: x y) (appendo x y q))) 将扩展成类似..
((_0) (_0 . _1) (_0 _1 . _2) ... ))
而且它很慢,因为每个新的列表实际上都需要重新遍历之前已经重统一的lvars。
这个周末我将有更多时间来调查这个问题,但我认为可能只是简单地不要默认生成唯一的lvars,因为这样,unification检查中的identical?应该能够捕捉到任何尝试的遍历。