评论者: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 来解决,因为这样,用于统一的 identical? 检查应该可以捕获任何尝试的遍历。