问题
最有效的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文章似乎暗示它相当昂贵。
有关信息,我问的原因是因为我知道类型推断也涉及这种“统一”算法,我想了解它。
答案 0 :(得分:8)
在实践中使用的简单算法(例如在Prolog中)是病态病例的指数。
Martelli和Montanari(IIRC它是线性的)理论上有一个更有效的算法,但对于实际出现的简单情况来说它要慢得多,所以它用得不多。
答案 1 :(得分:4)
Baader and Snyder发布了几种统一算法,用于句法统一和等式统一。
他们声称他们的第三个句法统一算法(在2.3节中)在O(n alpha(n))中运行,其中alpha(n)是逆Ackermann函数 - 在实际情况下它相当于一个小常数。