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

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,我可以通过u.root(x)==u.root(y)检查x和
y在同一个子图中。
另外,u.root(x)在使用时应该抛出一个异常
有一个绑定变量这些变量都应该是
被删除,不再是数据结构的一部分手段
子图应该相应地减少,而不是
更改结果的有效性。
拜伊

最佳答案

这是一个算法的草图它将穿过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'的权重越小,则与权重越大的X'和Y'相连。
push_var(X)将X添加到列表的前面使其重量减轻
节点。pop_var_remove_conn(x)再次从列表中删除x,并删除
可能还建立了从X到其他节点的连接。

关于algorithm - 使用现有量词进行有效的联合查找?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28148184/

10-12 15:54