Gluey

Gluey 是一个精简的统一化框架。它定义了用于统一对象的底层原语,包括支持递归统一化回溯。虽然它没有定义树状的统一化类型,但它定义的原语可以非常简单地构建这些类型。对于一个功能齐全的逻辑框架(构建在 Gluey 之上!),请查看 Axiomatic

Binding (绑定)

你方便的统一化原语。

一个 Binding 是一种变量,可以链接到另一个 binding,这样它们将始终具有相同的值。两个 Binding 的统一化总是会成功,除非两者都已经有值,并且这些值不相等。如果两者不兼容,则会抛出一个 UnificationError 异常。在幕后,Binding 通过共享一个共同的 Glue 来保持联系,但你无需担心这一点。你只需要知道,一旦两个 Binding 被绑定,它们将始终具有相同的值。

let a = Binding<Int>()
let b = Binding<Int>()
let c = Binding<Int>()

try Binding.unify(a, b) // all good
try Binding.unify(b, c) // we're cool

a.value = 10
print(c.value) // -> 10

let d = Binding<Int>()
try Binding.unify(a, d) // no problem
print(d.value) // -> 10
// Since d.value = nil, it will take on a's value.

let e = Binding<Int>()
e.value = 20
try Binding.unify(a, e) // UNIFICATION ERROR!!!
// Since a.value = 10 and b.value = 20, they cannot be unified.

Unifiable (可统一的)

递归统一化的超级明星!

Gluey 还定义了一个泛型枚举 Unifiable<Element>,它包含 Variable(Binding<Element>)Literal(Element) 两个 case,这使得将已知的字面量与未知的变量统一起来变得容易。Unifiable 一个非常有用的属性是,如果 Element: UnifiableType,它也会尝试递归地统一字面量 case。 这允许使用 Unifiable 创建强大的树状结构,这些结构可以很容易地被统一。

// Unification of literal and variable
let a = Unifiable.Literal(10)
let b = Unifiable.Variable(Binding<Int>())
try Unifiable.unify(a, b)
print(b.value) // -> 10

// Recursive unification
let c = Unifiable.Literal(Unifiable.Literal(10))
let d = Unifiable.Literal(Unifiable.Variable(Binding<Int>()))
try Unifiable.unify(c, d)
print(d.value?.value) // -> 10

Documentation (文档)

仍然感到困惑?请在文档中阅读更多关于 Gluey 的信息,查看一些测试用例,或者看看它在 Axiomatic 中是如何使用的! 或者,如果你仍然需要帮助,请 在 Twitter 上给我发消息。:)