什么是最佳的“最通用的统一者”算法?

时间:2009-05-13 13:52:46

标签: computer-science scheme logic unification

问题

最有效的MGU算法是什么?它的时间复杂度是多少?它是否足以简单地描述为堆栈溢出答案?

我一直试图在Google上找到答案,但一直在寻找我只能通过ACM订阅访问的私人.PDF。

我在SICP中找到了一个讨论:here

解释“最常见的统一算法”是什么: 取两个包含“自由变量”和“常量”的表达式树......例如

 e1 = (+ x? (* y? 3) 5)
 e2 = (+ z? q? r?)

然后,Most General Unifier算法返回最通用的一组绑定,使两个表达式等效。

mgu(e1,e2) = (x = z), q = (* y 3), y = unbound, r = 5

通过“最一般”,您可以改为绑定(x = 1)和(z = 1),这也会使e1和e2等效,但它会更具体。

SICP文章似乎暗示它相当昂贵。

有关信息,我问的原因是因为我知道类型推断也涉及这种“统一”算法,我想了解它。

2 个答案:

答案 0 :(得分:8)

在实践中使用的简单算法(例如在Prolog中)是病态病例的指数。

Martelli和Montanari(IIRC它是线性的)理论上有一个更有效的算法,但对于实际出现的简单情况来说它要慢得多,所以它用得不多。

答案 1 :(得分:4)

Baader and Snyder发布了几种统一算法,用于句法统一和等式统一。

他们声称他们的第三个句法统一算法(在2.3节中)在O(n alpha(n))中运行,其中alpha(n)是逆Ackermann函数 - 在实际情况下它相当于一个小常数。