如何解决无赖图的支配树
是否有一种使用命令式方法从Graph type计算支配树的方法?该语言是否支持直接创建此类数据结构?
我正在尝试使用以下算法(here is the link for the original article)从Graph中提取支配树:
但是我在适应那些python -m pip install jupyterlab
和for
语句时遇到麻烦。
解决方法
有一些选择,例如如何表示输出控制树。一种典型的方法是再次选择图。以后,如果愿意,可以将Graph转换为构造函数树。
考虑到Graph [&T]的选择,以下模板可以变成给定算法到Rascal的字面翻译:
Graph[&T] dominators(Graph[&T] graph,&T root) {
result = {};
V = carrier(graph);
Pred = graph<to,from>;
solve(result) {
for (v <- V,u <- Pred[v]) {
if (...)
}
}
return result;
}{
但是,不必通过先反转图形然后连续查找前任图形来变为图形的“ pred”形式,我们也可以直接在边上循环,这要快得多:
Graph[&T] dominators(Graph[&T] graph,&T root) {
result = {};
solve(result) {
for (<u,v> <- graph) { // u is the predecessor of v
if (...) {
result += { };
}
}
}
return result;
}
直接从Dragon书中的定义(以及您引用的论文中的方程3.2)定义的基本不动点求解器。 (请注意,我只是输入了此内容,尚未对其进行测试,因此可能有问题):
rel[&T,set[&T]] dominators(graph[&T] graph) {
nodes = carrier(graph);
result = {};
preds = graph<to,from>;
solve(result) {
for (n <- nodes) {
result[n] = {n} + intersect({result[p] | p <- preds[n]?{}});
}
}
return result;
}
(与Set
模块的库函数相交)
这是一个“关系演算”解决方案,它使用reachX
库函数解决了该问题,并从每个节点返回了它所控制的节点集的关系(取自Rascal文档文件):>
rel[&T,set[&T]] dominators(rel[&T,&T] PRED,&T ROOT) {
set[&T] VERTICES = carrier(PRED);
return { <V,(VERTICES - {V,ROOT}) - reachX({ROOT},{V},PRED)> | &T V : VERTICES};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。