什么是统一算法?

时间:2010-12-18 10:03:51

标签: algorithm f# functional-programming prolog unification

我知道这听起来有点奇怪,但是我的问题是:“什么是统一算法”。 好吧,我正在尝试在F#中开发一个像Prolog一样的应用程序。它应该采取一系列事实并在进行查询时处理它们。

我被建议开始实施一个好的统一算法,但对此没有任何线索。

如果您想更深入了解我想做的事情,请参阅this问题。

非常感谢圣诞快乐。

3 个答案:

答案 0 :(得分:6)

如果你有两个带变量的表达式,那么统一算法会尝试匹配这两个表达式,并为变量赋值,使两个表达式相同。

例如,如果您在F#中表示表达式:

type Expr = 
  | Var of string              // Represents a variable
  | Call of string * Expr list // Call named function with arguments

有两个这样的表达式:

Call("foo", [ Var("x"),                 Call("bar", []) ])
Call("foo", [ Call("woo", [ Var("z") ], Call("bar", []) ])

然后统一算法应该给你一个任务:

"x" -> Call("woo", [ Var("z") ]

这意味着如果在两个表达式中替换所有出现的“x”变量,则两个替换的结果将是相同的表达式。如果你有表达式调用不同的函数(例如Call("foo", ...)Call("bar", ...)),那么算法会告诉你它们不是可以统一的。

还有一些explanation in WikiPedia,如果你在互联网上搜索,你肯定会找到一些有用的描述(甚至可能在一些类似于F#的函数语言中实现)。

答案 1 :(得分:3)

我发现Baader and Snyder的工作最具信息性。特别是,他们描述了几种统一算法(包括使用union-find的Martelli和Montanari的近线性算法),并描述了句法统一和各种语义统一。

一旦你统一了,你还需要回溯。 Kiselyov / Shan / Friedman的LogicT framework将在这里提供帮助。

答案 2 :(得分:2)

显然,破坏性统一将比纯粹的功能性更加有效,但F-sharpish也要少得多。如果这是你所追求的表现,那么你最终可能会以任何方式实现WAM的一个子集:

http://en.wikipedia.org/wiki/Warren_Abstract_Machine

这可能会有所帮助:

http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.3203