我有另一个Stack Exchange问题的算法:
让
S = {x_1,x_2,x_3,x_4,x_5}
是州空间和
R = {
(x_1,a,x_2),
(x_1,b,x_3),
(x_2,a,x_2),
(x_3,a,x_4),
(x_3,b,x_5),
(x_4,a,x_4), // loop
(x_5,a,x_5), // loop (a-transition)
(x_5,b,x_5) // loop (b-transition)
}
是过渡关系
然后我们从分区
开始Pi_1 = {{x_1,x_2,x_3,x_4,x_5}}
所有州都集中在一起。
现在,x_2
和x_4
都可以始终执行a
- 转换为状态,但没有b
- 转换,而其余状态可以同时执行a
{1}} - 和b
- 转换,因此我们将状态空间拆分为
Pi_2 = {{x_1,x_3,x_5},{x_2,x_4}}.
接下来,x_5
可以执行a
- 过渡到班级{x_1,x_3,x_5}
,
但是x_1
和x_3
不能,因为他们的a
- 过渡进入了班级{x_2,x_4}
。因此,这些应该再分开,所以我们得到
Pi_3 = {{x_1,x_3},{x_5},{x_2,x_4}}.
现在x_3
可以b
- 过渡到班级{x_5}
,但x_1
不能,所以它们也必须分开,所以我们得到
Pi_4 = {{x_1},{x_3},{x_5},{x_2,x_4}},
如果你再做一步,你会看到Pi_4 = Pi_5
,所以这就是结果。
我不知道如何在JavaScript中实现此算法。
// blocks in initial partition (only consist of 1 block)
const initialPartition = { block1: getStates() };
// new partition
const partition = {};
// loop through each block in the partition
Object.values(initialPartition).forEach(function (block) {
// now split the block into subgroups based on the relations.
// loop through each node in block to see to which nodes it has relations
block.forEach(function (node) {
// recursively get edges (and their targets) coming out of the node
const successors = node.successors();
// ...
}
});
我想我应该创建一个函数,每个节点可以说明它可以进行哪些转换。如果我有这样的功能,我可以遍历每个块中的每个节点,找到转换,并使用
之类的东西创建一个键const key = getTransitions(node).sort().join();
并使用此键将节点分组为子块,从而可以执行类似
的操作// blocks in initial partition (only consist of 1 block)
const initialPartition = { block1: getStates() };
// new partition
const partition = {};
// keep running until terminating
while (true) {
// loop through each block in the partition
Object.values(initialPartition).forEach(function (block) {
// now split the block into subgroups based on the relations.
// loop through each node in block to see to which nodes it has relations
block.forEach(function (node) {
// get possible transitions
const key = getTransitions(node).sort().join();
// group by key
partition[key].push(node);
}
});
}
但我需要记住哪些节点已经分成块,所以子块不断变小(即如果我有{{x_1,x_3,x_5},{x_2,x_4}}
,我应该记住,这些块只能变小,永远不会'交换')
有人可以就如何实施算法提出想法吗?只是在伪代码或其他东西,所以我可以实现如何获取节点的后继者,收入者,标签(例如a-transition或b-transition)等。这是bisimulation algorithm,并且算法在Haskell中实现在slides here,但我不明白Haskell。