什么是统一算法?

And*_*dry 6 algorithm f# functional-programming prolog unification

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

我被建议开始实现一个良好的统一算法,但没有关于这一点的线索.

如果你想深入了解我想做什么,请参考这个问题.

非常感谢你和圣诞快乐.

Tom*_*cek 6

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

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

type Expr = 
  | Var of string              // Represents a variable
  | Call of string * Expr list // Call named function with arguments
Run Code Online (Sandbox Code Playgroud)

有两个这样的表达式:

Call("foo", [ Var("x"),                 Call("bar", []) ])
Call("foo", [ Call("woo", [ Var("z") ], Call("bar", []) ])
Run Code Online (Sandbox Code Playgroud)

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

"x" -> Call("woo", [ Var("z") ]
Run Code Online (Sandbox Code Playgroud)

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

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