是否有经典的算法来解决以下问题。 假设联合查找算法没有存在量词 有以下输入:
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)在使用时应抛出异常 带有绑定变量。这些变量应该都是 消除了,而不再是数据结构的一部分。手段 因此,子项应该相应减少 改变结果的有效性。
再见
答案 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到其他节点的连接。