|
令S0为一个状态集合,要求其从该状态集合出发所能到达的所有状态的集合S。根据定义,计算时应从S0开始,利用前向可达性计算操作image进行迭代计算,最后得到的最小不动点就是所有能到达的状态集合S。下面给出可达性计算的算法:
Reachability_Analysis(S0) {
S = S0; // 从S0出发。
do {
S_Reached = S; //保存当前状态集合。
S = S ú image(S) //image(S)表示S中个状态的下一状态,并在状态集合中。
} until S_Reached = S; //如果某一次循环找不到新的状态,循环结束。
return S; // 返回的S就是找到的所有状态的集合
}
从S0出发,找到S0的次态,形成状态集合S;在S的基础上再找S中各状态的次态,形成新的状态集合S;这样一步步找下去,直到再找到的次态中不出现新的状态为止。对于局有多条路径的情况来说,这种方法实际上就是广度优先搜索法。
请注意,其中所有的布尔操作都可以使用BDD实现,而且image操作也可以使用BDD实现。在该算法中,计算结果保存在变量S中,S的初始值设为S0,作为可达性计算的起始状态集合。然后开始进行迭代计算,直至没有新的状态加入。此时即达到了最小不动点,整个计算完成。因为问题的对象是一个有限的状态空间,因此能访问到所有状态,从而保证该算法能正常终止。
所谓不动点,就是下一次迭代的结果没有变化,即没有新的状态。最小不动点是不能再添加新的状态的情况,最大不动点是不能再去除新状态的情况。该术语后面还会出现,请读者注意。
|