我知道这听起来有点奇怪,但是我的问题是:“什么是统一算法”。 好吧,我正在尝试在F#中开发一个像Prolog一样的应用程序。它应该采取一系列事实并在进行查询时处理它们。
我被建议开始实施一个好的统一算法,但对此没有任何线索。
如果您想更深入了解我想做的事情,请参阅this问题。
非常感谢圣诞快乐。
答案 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)
http://en.wikipedia.org/wiki/Warren_Abstract_Machine
这可能会有所帮助:
http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.3203