2024 年 Clojure 调查问卷!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于此功能的详细信息。

0
core.unify
1.9.0-alpha14 版本


dev=> (clojure.core.unify/unify {:a '?x, :c :d} {:c :d, :a :b})
nil
dev=> (clojure.core.unify/unify {:a '?x, :c :d} {:a :b, :c :d})
{?x :b}

2 个答案

0
_由:eraserhd_发表的评论

在 UNIFY-6 中有一个指示,我们预计这应该可以工作,尽管当前算法从未支持键中的变量。这是一个问题,因为它并没有统一类似键的值,而是依赖于具有相同键集合的两个映射具有相同的迭代顺序。这正是问题所在。

一个简单的修复方法将是恢复以前的行为——以前的行为是 O(n)(依赖于映射键的迭代是 O(n) 对于它们的当前顺序),简单的修复会使其变为类似于 O(n log_32 n) 对于映射。

一个更有趣的修复方法是添加对键中变量的支持。这是一件我认为很有价值(和有趣)。这将改变算法,因为集合的顺序缺失使得可能的统一变得多余,例如 (unify {:a 1, :b 2} {?x _, ?y _}) 有两个统一:{?x :a, ?y :b} 和 {?x :b, ?y :a},因此回溯(或类似的方法)变得必要。

正如在 UNIFY-8 中报告的那样,这个相同的机制可以被用于集合。

是否应该考虑“有趣的”修复,还是我应该直接进行“简单”的修复?

0
参考:https://clojure.atlassian.net/browse/UNIFY-9(由 eraserhd 报告)
...