由 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) ... ))
而且它很慢,因为每个新的列表实际上都重新遍历了之前所有已统一的局部变量。
我将在周末抽出更多时间来调查这个问题,但我觉得可能只需要简单地不再默认生成唯一的局部变量,因为这样对于统一检查的 identical? 就能捕获所有的尝试遍历。