由 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) ... ))
而且它很慢,因为每个新列表实际上都会再次遍历之前统一的所有 lvar。
我将在周末有空余时间进一步调查这个问题,但我想这可能是简单地不默认生成唯一的 lvars,因为那时相同的用于统一检查的国家应该可以捕捉到任何尝试的遍历。