使用存在量词的高效联盟查找?

时间:2015-01-26 10:16:19

标签: algorithm prolog union-find

是否有经典的算法来解决以下问题。 假设联合查找算法没有存在量词 有以下输入:

x1 = y1 /\ .. /\ xn = yn

然后它将构建一些数据结构u,以便我可以检查 u.root(x)== u.root(y),判断x和y是否相同 子图。

输入可以用以下语法表征:

Input :== Var = Var | Input /\ Input

现在假设我们也允许存在量词:

Input :== Var = Var | Input /\ Input | exists Var Input

什么联合查找算法可以处理这样的输入。 我仍然假设算法构建了一些数据结构 你可以通过u.root(x)== u.root(y)检查是否x和 y在同一个子图中。

此外,u.root(x)在使用时应抛出异常 带有绑定变量。这些变量应该都是 消除了,而不再是数据结构的一部分。手段 因此,子项应该相应减少 改变结果的有效性。

再见

1 个答案:

答案 0 :(得分:0)

这是一个算法草图。它将遍历AST,并且 提供一个特殊的联合查找算法。首先是遍历:

 traverse((X = Y)) :- add_conn(X, Y).
 traverse(exists(X,I)) :- push_var(X), traverse(I), pop_var_remove_conn(X).
 traverse((A /\ B)) :- traverse(A), traverse(B).

特殊联合查找算法适用于列表。此列表定义 节点的权重,列表的头部有权重0,第二个元素 权重1等... add_conn(X,Y)首先计算X'=根(X)和Y'=根(Y)。该 X'和Y'的加权越少,加权越重。

push_var(X)将X添加到列表的前面。减少加权 节点。 pop_var_remove_conn(X)从列表中再次删除X,并删除一个 可能已建立从X到其他节点的连接。