Page 43 - 《软件学报》2021年第6期
P. 43

郝宗寅  等:Petri 网的反向展开及其在程序数据竞争检测的应用                                                1617
















                                         Fig.4    An example of Petri net
                                              图 4   Petri 网实例
                                             •
             NE(RUnf,e)计算候选扩展集的过程如下: e 的加入会为 RUnf 添加新的 co-set,对每个新增的 co-set C,若有变
                      •
         迁 t 满足μ(C)⊆t ,则添加一个新的候选扩展 rext=(t,C)到 RExt 中.
             按照上述定义,RExt 中会存在大量冗余扩展.例如,假设{c1,c2,c3}是一个 co-set,那么按照 co-set 的定义,{c1,
         c2},{c1,c3},{c2,c3},{c1},{c2},{c3}都是 co-set.若有反向扩展(t,{c1,c2,c3}),那么同样会有反向扩展(t,{c1,c2}),(t,
         {c1,c3}),(t,{c2,c3}),(t,{c1}),(t,{c2}),(t,{c3}).可见:不加额外限制的话,RExt 的规模将会非常大.因此,为 RExt 添加
         如下两个条件.
                                                                          •
             (1)  对于 RUnf 中任意事件 e,RExt 中不存在反向扩展 rext=(t,C),使得μ(e)=t∧e =C;
             (2)  对于 RExt 内 任意两不同 的反向扩展 rext 1 =(t 1 ,C 1 ),rext 2 =(t 2 ,C 2 ), 若 t 1 =t 2 ∧C 1 ⊂C 2 ∧Mark([rext 1 ])≥
                 Mark([rext 2 ]),则将扩展 rext 1 从 RExt 中删除.这里假设 e 为 rext 在 RUnf 中对应的事件,[rext]可视为[e].
             条件(2)中,Mark([rext 1 ])≥Mark([rext 2 ])看上去有些多余.实际上,Parosh 早在文献[19]中就提出过反向展开
         的概念,且仅用到了条件(2)中 t 1 =t 2 ∧C 1 ⊂C 2 这个限制.遗憾的是,这样做会破坏反向展开的完备性,致使 Parosh 的
         反向展开算法在某些情况下出错,附录 B 给出了相关反例的分析.为此,本文添加了 Mark([rext 1 ])≥Mark([rext 2 ])
         这个限制,大量实践表明,这个限制是有效的.
             图 5 中,生成事件 e2 时用到了反向扩展 rext=(t1,{c3}),同时生成了 e2 的前驱条件{c4,c5}.{c4,c5}的加入,产
         生了新的 co-set,并产生了相应的反向扩展(t3,{c5}),(t4,{c5}),(t4,{c2,c5}).其中,对于 rext 1 =(t4,{c5}),rext 2 =(t4,{c2,
         c5}),有 Mark([rext 1 ])={p1,p5,p7}≥{p1,p7}=Mark([rext 2 ]),由 RExt 的条件(2)删除 rext 1 .故最终:
                                       NE(RUnf,e)={(t3,{c5}),(t4,{c2,c5})}.





















                            Fig.5    Reverse unfolding of the Petri net shown in Fig.4 (partial)
                                  图 5   对图 4 所示的 Petri 网进行反向扩展(部分)
   38   39   40   41   42   43   44   45   46   47   48