康辉(1968),女,副教授.研究方向:Web服务与服务组合技术.E-mail:kanghui@jlu.edu.cn
针对π演算中的递归结构,本文给出了一种递归π演算向Petri网的转换方法。该转换遵循基本进程转换规则以及组合规则,采用层次化方法,针对递归次数较多时产生的Petri网结点过多的情况,本文给出了一种更简洁的Petri网表示,它保留了系统的语义,且编码完全相同的轨迹集合,对于在规模较大的复杂系统中应用Petri网模型有着积极的意义。本文还分别证明了递归π演算与转换的Petri网的互模拟等价性以及Petri网与其简洁表示的等价性。
In view of the recursive structure in π-calculus, a kind of Petri net translation of recursion π-calculus is presented. Following the basic process translation rules and combination rules, the translation uses the hierarchical method. When the recursive structure executes many times, excessive more Petri net nodes will be generated. To solve this problem, a more compact representation for this Petri net is defined, which preserves the semantics of the system in that it encodes exactly the same set of traces. The bisimulation of recursion π-calculus and the Petri net transition is proved, as well as the equivalence between Petri net and its more compact representation.
随着面向服务的计算(Service-oriented computing SOC/Service-oriented architecture,SOA)技术[ 1]和业务流程管理(Business process management,BPM)技术[ 2]的广泛应用以及对软件可信性要求越来越高,很多学者用π演算和Petri网作为服务组合和业务流程技术的理论基础。π演算用来描述拓扑结构动态变化的并发系统,通过相应的数学分析方法,对系统的属性和行为进行分析。但是π演算[ 3, 4, 5, 6, 7]的进程表达式比较繁琐,不能形象地反应系统物理结构信息,不能刻画系统的真并发行为,而且从系统验证角度来看,其支持工具少,仅有MVB和HAL等几种自动验证工具,这样给后续的形式化验证带来了困难。Petri网[ 8, 9]是一种形式化图形验证工具,它侧重于系统的结构描述和性质分析,并且能有效地刻画系统真正的并发语义。它是一种可用网状图形表示的系统模型[ 10, 11],适合描述异步、并发、分布式的系统,既可用于静态的结构分析,又可用于动态的行为分析。
由于π演算存在固有缺陷,很多学者已经在将π演算向Petri网转换这方面做了很多研究[ 12, 13],例如Raymond Devillers[ 12]等人已经提出了其转换的一般方法。但是对于π演算中递归结构的转换,目前仍然空白。在π演算中,对递归的表达是其基本的语义,较为简单;而在一般Petri网中,对递归的描述非常困难。实际应用π演算时递归结构经常出现,因此,本文给出了一种π演算中递归结构转换为Petri网的方法。
关于π演算的基本概念,在文献[3]中已有详细介绍在此不再赘述。在给出π演算中递归表达式基本形式之前,先看一个例子:
(1) |
式(1)中每个通道 a、 b、 c、…中都保存着一个数值 h'(这个数值可以不一样),从已知通道 a开始,读取通道内当前值 h'加到现有的值上,直到得到的 h值大于10时可以选择执行输出该值。这样,从 a开始到输出 h时所有计算过的通道即是该get函数的路径。
在式(1)中,既有自调用的算子,又有非自调用的算子,并且有选择运算符“+”将两个进程相连。在不满足递归出口条件时,多次执行前缀算子 ab获取下一个通道,并执行计算 h值操作。当满足递归出口条件时,可以选择继续自调用,也可以终止调用过程。
本文给出了一种一般π演算的递归表达式的基本形式:
(2) |
式中:
当然,在一些表达式中也会出现有多个自调用表达式的形式,比如:
(3) |
(4) |
(5) |
在式(3)至式(5)中,均有两次自调用,虽然在转换时与式(2)有点不同,但基本转换思路大致相同。为了方便描述转换过程,在本文中,以式(2)这种递归形式为例。
为了更好地记录递归运算的层次,本文引入轨迹的概念。通常,轨迹一般用来指进程P所依次执行的一系列活动,一般用
定义1 轨迹:π演算递归结构执行时,为了记录递归运算的层次,我们将递归调用的顺序称为轨迹,用字母trail表示。调用一次用 σ1 表示,调用第二次用 σ2 表示,以此类推,调用第 n次用 σ n 表示,则进程中递归结构执行的轨迹trail=< σ1, σ2,…, σn>。
定义2 逆轨迹:与轨迹相应地,在递归返回时其轨迹称为逆轨迹,记为trail-1,上述递归返回的逆轨迹即为trail-1=< σ n, σ n-1,…, σ1>。
在本文中,π演算进程P转换而成的Petri网记为 NP, N P是一个有向连通图,其节点分别称为库所和变迁。这些节点通过有向弧相连。相同类型的两个节点之间是不允许相连的。
递归π演算向Petri网转换要遵循一些转换规则,在本文中将这些规则概括为两类:基本进程的转换规则以及组合规则。
1.2.1 基本进程转换规则
对于向子网 K( ρ)的转换,是根据表达式
由于不涉及任何的名字操作,因此进步进程项0和内部动作前缀 τ十分简单。进程调用 X( α1,…, α nX)也类似,但是结果将产生一个层次变迁,它将通过标识等价规则进行激发变换[ 10]。
每个输出前缀
具体的转换规则如图1所示。
1.2.2 组合规则
本节中的组合规则用于合并Petri网的算子,包括前缀组合规则、选择组合规则、并行组合规则以及范围处理规则,其中前3个规则给出了合并标签库所、相应的持有者的方法[ 12]。
假设有网
前缀组合规则: N1. N2 。假设 N1有唯一的入口控制库所和唯一的出口控制库所(出口控制库所记作 s1),通过如下步骤获得组合结果:
(1)网 N1和网 N2并排放置。
(2)对应每个
(3)对于有相同标识符号和类型的持有者库所将被合并为一个持有者库所,并且如前一样,具有相同的标识符号和类型,在原来的网 N1和网 N2中连接合并的持有者库所与变迁之间的弧及注释标识在合并后的持有者库所中保持不变。
1)选择组合规则: N1+ N2,可通过如下过程获得图转换结果:
①网 N1和网 N2并排放置。
对于每个
②具有相同名字的持有者库所的合并可参见前缀组合规则。
2)并行组合规则: N1| N2,可通过如下过程获得图转换结果:
①网 N1和网 N2并排放置;
②具有相同名字的持有者库所的合并可参见前缀组合规则。
3)范围处理规则: N= sco( N1),可通过如下过程获得图转换结果:
①对于每对变迁 t1, t2∈ T1,其中 t1和 t2分别被snd或rcv所标识,创建一个新的变迁 t,用符号 τ标识,而在变迁 t与库所 s上的弧注释符号是在变迁 t1与库所 s以及变迁 t2与库所 s的弧注释符号的简单合并。在这里注意在snd所标识的变迁周围的弧与rcv所标识的变迁周围的弧是互不相干的,所以不需要进行反复的合并操作。
②最后删除被snd和rcv所标识的变迁以及与其相连接的弧。
类似于式(1)中的例子,当数据 h满足 h>10时才可以选择执行
对于如何记录当前数据属于哪次递归操作,本文采用trail.data.place的形式,即当前轨迹.数据值.所在库所的形式存储在栈库所中。
对于轨迹,在执行递归调用时,调用一次用 σ1 标记,调用第二次用 σ2 标记,…,调用第 n次用 σ n 表示,进程中递归结构执行的轨迹trail=< σ1, σ2,…, σ n >。例如递归主体 X( a1,…, an)将用轨迹标记为 σ1, σ2,…, σ n. X( a1,…, an)。对于递归主体后面的
对于π演算递归结构向Petri网的转换,本文采用层次化方法,即将表达式中的每一个子表达式(包括递归主体)都先转换成对应的子网,然后组合起来;如果自调用表达式没有满足递归出口条件,那么对自调用表达式的网结构进行进一步细化,将下一次调用的网结构展开代替上一层中自调用表达式对应的网结构。
下面给出关于式(2)的递归结构全景图第一层,如图3所示。
说明:
(1)最开始的库所
(2)图中的库所
(3)在自调用表达式对应的网结构与判定库所 d之间有一条弧相连,表示在执行自调用表达式时,其中的条件发生了变化,这个变化的条件要及时传给判定库所,使判定库所做出合理的判断。
(4)在
(5)判定库所对应一个判断逻辑,严格来讲,如果系统中有多个递归表达式,则每一个表达式单独对应一个判定库所。
(6)出于版面考虑,这里没有画出栈库所、名字持有者库所、标签库所以及相关弧。
式(2)递归结构全景的第二层如图4所示。
类似地,调用多次的π演算表达式对应的网结构也能够给出。
对于形如式(2)的π演算表达式,采用层次化方法,将π演算递归结构转换成Petri网的步骤为:
(1)按照1.2节中的基本进程转换规则及组合规则将
(2)将自调用表达式 X(a'1,…,a'n)先看做一个整体表示,对应的网结构先用 NP0 表示。各个组成部分用构造sco( NP1 | NP2 | NP3 | NP0)网连接起来,这将多种标签库所和可能来自不同部分的有 uv和
(3)判断
(4)将图3中的变迁 P( a1,…, a n)用子网 NP1 替换,如果 NP1 只有一个输入库所 e,那么将此库所与开始的库所 e合并,仍旧记为 e;否则创建一个辅助变迁 t1,使开始库所 e指向辅助变迁 t1,然后由变迁 t1 指向 NP1 所有的输入库所 e,再将 NP1 所有的输入库所 e改为内部库所 i。
同样地,如果 NP1 只有一个输出库所 x,将此库所与最后库所 x合并,记为 x;否则创建一个辅助变迁 t2,使 NP1 所有的输出库所 x指向辅助变迁 t2,然后由变迁 t2 指向最后的库所 x,再将 NP1 所有的输出库所 x改为内部库所 i。
在用 NP2 、 NP3 替换 R( b1,…, b n)、 Q( a″1,…, a″n)时也做同样的处理。
(5)将相同的名字持有者库所合并,与原库所相连的弧以原方式练到合并后的库所上。将需要保存数据的变迁用弧与栈库所相连。
(6)为了得到完整的变迁网 N p,向输入库所中插入一个小黑点作为托肯,并把下面的通道插入到持有者库所中去:
①把 ζ( α)插入到每个 α标记的持有者库所中,其中 α∈ domain( ζ);
②把 a. a. K插入到标签库所中,其中对于每一个 α∈ known( ζ);
③把 n. N插入到标签库所中,其中 n∈ C\ konwn( ζ);
④把 Δ. R插入到标签库所中,其中 Δ∈ rstr( ζ)。
本文定义了从递归π演算到Petri网的语义转换,从而产生了有限结构转换网—— N P,它是具有有限库所、变迁和弧的网结构,该递归结构的标号迁移系统 ItsP与转换后的Petri网所对应的标号迁移系统It
定理1 N p是具有有限库所、变迁和弧的Petri网图,并且使得ItsP和It
证明 基本π演算部分的Petri网语义等价证明在文献[ 12]中详细介绍了转换的思想、方法以及相关的语义等价证明,在此不再赘述。
关于递归结构的Petri网语义等价的证明采用数学归纳法。具体如下:
设 K为递归结构执行次数,即递归层数。
(1)当 K=1时,按照文中所述递归π演算向Petri网的转换方法,其直接转换为不带递归结构的基本π演算,其互模拟等价性是已知的。
(2)假设当 K= n时,从递归π演算向Petri网的转换具有互模拟等价性,那么证明当 K= n+1时互模拟等价仍成立。由于当 K= n时,前 n层的递归调用已经实现,即可以将前 n层递归调用得到的π演算表达式看做一个复杂无递归的基本π演算表达式,这样再加上第 n+1层的递归调用转化为(1)中的形式,此时 K'=1,符合(1)中所证互模拟等价。因此当 K= n+1时递归π演算向Petri网转化的互模拟等价性成立。证毕。
Petri网是一个很好的描述与分析并行系统的模型。但是当递归结构递归的次数较多时,会产生巨大的Petri网。尤其是在实际应用中,如果系统过大或较复杂时,会遇到结点数过多的情况。系统的组合状态数又随结点数成指数函数增长,这就是所谓的组合爆炸问题。解决结点数过多引起的组合爆炸问题的办法是尽量减少模型的结点个数。为了使转换后的Petri网较为简洁,本文给出了压缩的Petri网图,它保留了系统的语义,并编码完全相同的轨迹集合。
分析如式(2)形式的π演算的递归结构,如果该π演算表达式不满足递归出口条件,那么会循环执行自调用表达式之前的子表达式 P( a1,…, a n),执行过程大致如图5所示。
如果π演算表达式的递归结构执行多次,那么会产生巨大的Petri网,因此本文考虑将其进行简化,得到一种更简洁的Petri网表示。受图3启发,本文将典型π演算递归结构转换结果用全景图表示,如图6所示。
这里需要考虑以下几个问题:
对于递归出口之前每次执行的表达式 P(a1,…, a n),其每次具体执行是不一样的,我们在其前面用轨迹标记,表示按照轨迹 σ1, σ2,…, σn 执行,这里的轨迹是根据判定库所的变化一步一步生成的。然后在执行递归返回时, Q(a″1,…,a″n)按照轨迹 σ1, σ2,…, σn 的逆轨迹 σn, σn-1,…, σ1执行。
经过判断,只有执行P(a1,…,an)时,判定条件发生的改变,那么需要将与自调用表达式对应的网结构相连的弧改为表达式P(a1,…,an)对应的网结构与判定库所相连。
本文给出了 N p 的一种更简洁Petri网表示,记为 N c,它是具有有限库所、变迁和弧的网结构,保留了系统的语义,编码完全相同的轨迹集合。
定理2 N c是具有有限库所、变迁和弧的Petri网图,并且使得 N p和 N c编码完全相同的轨迹集合(激发顺序)。
证明 针对递归结构,分别从递归调用、递归出口及递归返回三部分考虑其执行的轨迹集合。
(1)对每次递归调用执行的表达式 P( a1,…, a n), N p 和 N c 的执行轨迹均为{ σ1, σ2,…, σn}。
(2)对递归出口执行的表达式 R( b1,…, b n),由于只执行一次,因此其轨迹集合可以忽略。
(3)对递归返回表达式 Q( a″1,…, a″ n), N p 和 N c 的轨迹集合均为{ σn, σn-1,…, σ1}。证毕。
通过对π演算递归结构和Petri网的经典理论进行研究分析,本文首先给出了递归π演算的基本形式,然后将递归π演算向Petri网进行转换,并证明这种转换的互模拟等价性;随后针对多次递归的情况对由π演算递归结构转换得到的Petri网进行简化,得到了一种保持系统语义的、编码完全相同的轨迹集合的更简洁的Petri网,与原Petri网相比能够提高对于模型验证的效率,比如对移动系统的验证等。