前面一二章所学习的进程分裂或协作的方式有:

  • 选择(P∣QP|QPQ):用于和环境交互,由环境(CSP里亦用进程表示)选择当前动作以决定进程接下来的分支。
  • 并发(P∣∣QP||QPQ):用于进程间的协作,或用于为进程施加影响它的环境进程。

如上面所述的,一条竖线表达的选择即是确定性(deterministic)选择,确定性选择是环境能把控的

与之相对地可以引入不确定性(nondeterministic)。不确定性指不仅无法控制,甚至无法被预测,这可以基于以下的考虑:

  1. 对环境无法充分了解(如天气的不确定)
  2. 刻意忽视决定选择的条件(如换零机coin的存储顺序决定出币序列)
  3. 量子力学中的不确定性(uncertainty principle)

总之,引入不确定性可以提高对物理系统的抽象程度。

1 不确定的或关系(Nondeterministic or)

1.1 简述

P⊓QP \sqcap QPQ是进程PPP和进程QQQ之间的不确定选择,这表示在PPPQQQ中只选择其一,但遇到⊓\sqcap符号时总是无法预测选择的是哪一个。

不确定的或关系P⊓QP \sqcap QPQ实际使用场景很有限,一般用于表示在需求上只要实现PPPQQQ其一即可。

1.2 例子

例如,由
CH5A=(in3p→out2p→out1p→CH5A)CH5B=(in3p→out1p→out2p→CH5B) CH5A=(in3p \to out2p \to out1p \to CH5A) \\ CH5B=(in3p \to out1p \to out2p \to CH5B) CH5A=(in3pout2pout1pCH5A)CH5B=(in3pout1pout2pCH5B)
构造的
CH5E=CH5A⊓CH5B CH5E = CH5A \sqcap CH5B CH5E=CH5ACH5B
表示CH5ECH5ECH5E是从CH5ACH5ACH5ACH5BCH5BCH5B中选择其一实现,使用时出币的序列组合不变,只是使用前并不知道实现的是哪一个。



CH5D=(in3p→((out2p→out1p→CH5D)⊓(out1p→out2p→CH5D))) \begin{aligned} CH5D =& (in3p \to ((out2p \to out1p \to CH5D) \\ & \sqcap (out1p \to out2p \to CH5D))) \end{aligned} CH5D=(in3p((out2pout1pCH5D)(out1pout2pCH5D)))
则表示CH5DCH5DCH5D每次出币的序列都是无法预测的,每次都会不确定地选择两种出币序列中的其一。

1.3 规则

相关规则见课本P83~84。其中值得注意的是,不确定选择不能在递归操作内部展开:
P=μ⋅X((a→X)⊓(b→X))Q=(μX⋅(a→X))⊓(μX⋅(b→X)) \begin{aligned} P &= \mu \cdot X ((a \to X) \sqcap (b \to X)) \\ Q &= (\mu X \cdot (a \to X)) \sqcap (\mu X \cdot (b \to X)) \end{aligned} PQ=μX((aX)(bX))=(μX(aX))(μX(bX))
两进程不同,因为它们的traces不同,显然traces(Q)⊆traces(P)traces(Q) \subseteq traces(P)traces(Q)traces(P),仅当a=ba=ba=b时取到等号。

注意,不确定选择没有"单位元"(因为⊓\sqcap是幂等的),不确定选择唯一的"零"是CHAOSCHAOSCHAOSCHAOSCHAOSCHAOS同时也是很多算子的"零"),这在7中给出。

2 通用选择(General choice)

2.1 简述

通用选择(P□QP \Box QPQ)结合了确定性选择(P∣QP|QPQ)和不确定选择(P⊓QP\sqcap QPQ)。具体是,当第一个动作相同时它是确定选择,当第一个动作不同时它是不确定选择:
(c→P)□(d→Q)=(c→P ∣ d→Q)if c≠d(c→P)□(c→Q)=(c→P)⊓(c→Q)=c→(P⊓Q) \begin{aligned} (c \to P) \Box (d \to Q) &= (c \to P \ | \ d \to Q) & if \ c \neq d \\ (c \to P) \Box (c \to Q) &= (c \to P) \sqcap (c \to Q) = c \to (P \sqcap Q) \end{aligned} (cP)(dQ)(cP)(cQ)=(cP  dQ)=(cP)(cQ)=c(PQ)if c=d

2.2 规则

因为STOPSTOPSTOP中没有开始动作,认为STOPSTOPSTOP是通用选择的单位元:
P□STOP=PP \Box STOP = PPSTOP=P
通用选择的一般描述,应对所选的首个动作分情形讨论:
(x:A→P(x))□(y:B→Q(y))=(z:(A∪B)→(if z∈(A−B) then P(z)else if z∈(B−A) then Q(z)else if z∈(A∩B) then (P(z)∩Q(z)))) \begin{aligned} (x:A \to P(x)) \Box & (y:B \to Q(y)) = \\ & (z:(A \cup B) \to \\ &(if \ z \in (A-B) \ then \ P(z) \\ & else \ if \ z \in (B-A) \ then \ Q(z) \\ & else \ if \ z \in (A \cap B) \ then \ (P(z) \cap Q(z)) \\ & )) \end{aligned} (x:AP(x))(y:BQ(y))=(z:(AB)(if z(AB) then P(z)else if z(BA) then Q(z)else if z(AB) then (P(z)Q(z))))
通用选择的after操作,应对所经过的trace分情形讨论:
(P□Q)/s=P/sif s∈traces(P)−traces(Q)=Q/sif s∈traces(Q)−traces(P)=(P/s)⊓(Q/s)if s∈traces(P)∩traces(Q) \begin{aligned} (P \Box Q)/s &= P/s & if \ s \in traces(P) - traces(Q) \\ & = Q/s & if \ s \in traces(Q) - traces(P) \\ &= (P/s) \sqcap(Q/s) & if \ s \in traces(P) \cap traces(Q) \end{aligned} (PQ)/s=P/s=Q/s=(P/s)(Q/s)if straces(P)traces(Q)if straces(Q)traces(P)if straces(P)traces(Q)

3 Refusal

3.1 简述

由于使用traces无法区分不确定选择和通用选择:
traces(P□Q)=traces(P⊓Q)=traces(P)∪traces(Q)traces(P \Box Q) = traces(P \sqcap Q) = traces(P) \cup traces(Q)traces(PQ)=traces(PQ)=traces(P)traces(Q)
引入refusals操作,定义为与PPP并发时,使PPP在首个动作上即发生死锁的所有动作集合XXX的幂集:
2X=refusals(P)2^X=refusals(P)2X=refusals(P)
注意,引入Refusal同引入Trace一样,都可作为观测进程行为的重要手段,特别是在6中定义存在不确定性的进程的规范时尤为重要。

3.2 规则

相关规则在课本P89~90,只记录些关键部分:

  • L1:refusals(STOPA)=2Arefusals(STOP_A)=2^Arefusals(STOPA)=2A
  • L3:refusals(x:B→P(x))={X∣X⊆(αP−B)}refusals(x:B \to P(x)) = \{X|X \subseteq (\alpha P-B)\}refusals(x:BP(x))={XX(αPB)}
  • L4:refusals(P⊓Q)=refusals(P)∪refusals(Q)refusals(P \sqcap Q) = refusals(P) \cup refusals(Q)refusals(PQ)=refusals(P)refusals(Q)
  • L5:refusals(P□Q)=refusals(P)∩refusals(Q)refusals(P \Box Q) = refusals(P) \cap refusals(Q)refusals(PQ)=refusals(P)refusals(Q)
  • L6:refusals(P ∣∣ Q)={X∪Y ∣ X∈refusals(P)∧Y∈refusals(Q)}refusals(P \ || \ Q) = \{X \cup Y \ | \ X \in refusals(P) \wedge Y \in refusals(Q)\}refusals(P  Q)={XY  Xrefusals(P)Yrefusals(Q)}

4 隐藏(Concealment)

4.1 简述

与投影(↾\upharpoonright)操作相对立,隐藏(∖\setminus)会将进程中指定集合里的动作从字母表中移除:
α(P∖C)=(αP)−C\alpha(P \setminus C) = (\alpha P) - Cα(PC)=(αP)C

注意区分,进程的隐藏使用的是反斜杠(∖\setminus),而迹的after操作使用的是正斜杠(///)。

同样可以定义与之相对的,将进程的字母表扩展:
α(P+B)=αP∪BP+B=(P ∣∣ STOPB)   当B∩αP=ϕ \alpha (P_{+B}) = \alpha P \cup B \\ P_{+B} = (P \ || \ STOP_B) \ \ \ 当B \cap \alpha P = \phi α(P+B)=αPBP+B=(P  STOPB)   BαP=ϕ
扩展后的进程实际还是只执行了之前那些动作,至于字母表中新加进来的动作,仍不在执行序列中:
traces(P+B)=traces(P)traces(P_{+B}) = traces(P)traces(P+B)=traces(P)

4.2 规则

隐藏相关规则见课本P92~93,两条基本的规则如下:

  • L4:STOPA∖C=STOPA−CSTOP_A \setminus C = STOP_{A-C}STOPAC=STOPAC
  • L8:若B∩C=ϕB \cap C = \phiBC=ϕ,则(x:B→P(x))∖C=(x:B→(P(x)∖C))(x:B \to P(x)) \setminus C = (x:B \to (P(x) \setminus C))(x:BP(x))C=(x:B(P(x)C))
  • L9:若BBBCCC的有限非空子集,则(x:B→P(x))∖C=⊓x∈B(P(x)∖C)(x:B \to P(x)) \setminus C = \sqcap_{x\in B}(P(x) \setminus C)(x:BP(x))C=xB(P(x)C)
    这条是说对每个x∈Bx \in BxB求其接下来进程在CCC上的隐藏,再合起来做不确定选择。

隐藏(∖\setminus)和投影(↾\upharpoonright)操作的关系,可从traces里得出:
traces(P∖C)={t↾(αP−C) ∣ t∈traces(P)}traces(P \setminus C) = \{t \upharpoonright (\alpha P-C) \ | \ t \in traces(P)\}traces(PC)={t(αPC)  ttraces(P)}

5 Interleaving

5.1 简述

Interleaving(∣∣∣|||)描述一种最单纯的并发关系,即若干进程可以以任意次序各自推进,同一时刻只能推进一个进程的一个动作,动作之间互不影响。

如两个VMS=(coin→choc→VMS)VMS = (coin \to choc \to VMS)VMS=(coinchocVMS)的interleaving是:
VMS∣∣∣VMS=(coin→μX⋅(coin→choc→X∣ choc→coin→X)) \begin{aligned} VMS|||VMS = (coin \to \mu X \cdot ( & coin \to choc \to X \\ & | \ choc \to coin \to X)) \end{aligned} VMSVMS=(coinμX(coinchocX choccoinX))

5.2 规则

Interleaving的"单位元"是STOPSTOPSTOP,“零"是RUNRUNRUN,对”⊓\sqcap“满足分配律,但对”□\Box"不满足分配律。

两进程使用Interleaving结合:
(x→P) ∣∣∣ (y→Q)=(x→(P∣∣∣(y→Q)) □ y→((x→P)∣∣∣Q)))(x \to P) \ ||| \ (y \to Q) = (x \to (P ||| (y \to Q)) \ \Box \ y\to ((x \to P) ||| Q)))(xP)  (yQ)=(x(P(yQ))  y((xP)Q)))
注意refusals无法区分Interleaving和通用选择:
refusals(P∣∣∣Q)=refusals(P□Q)=refusals(P)∩refusals(Q)refusals(P ||| Q) = refusals(P \Box Q) = refusals(P) \cap refusals(Q)refusals(PQ)=refusals(PQ)=refusals(P)refusals(Q)

6 规范(specification)

6.1 简述

在本章学习中,引入的refusalsrefusalsrefusals操作和之前的tracestracestraces操作共同描述进程的规范:
P sat S(tr,ref)P \ sat \ S(tr,ref)P sat S(tr,ref)

即是说:
∀tr,ref⋅tr∈traces(P)∧ref∈refusals(P/tr)⇒S(tr,ref)\forall tr,ref \cdot tr \in traces(P) \wedge ref \in refusals(P/tr) \Rightarrow S(tr,ref)tr,reftrtraces(P)refrefusals(P/tr)S(tr,ref)

6.2 例子

为了付了款的用户不会得不到巧克力,支付的硬币比吐出的巧克力多时,不能拒绝吐出巧克力:
FAIR=(tr↓choc<tr↓coin⇒choc∉ref)FAIR = (tr \downarrow choc < tr \downarrow coin \Rightarrow choc \notin ref)FAIR=(trchoc<trcoinchoc/ref)

为了商家能持续盈利,吐出的巧克力和支付的硬币一样多时,不能拒绝支付硬币:
PROFIT1=(tr↓choc=tr↓coin⇒coin∉ref)PROFIT1 = (tr \downarrow choc = tr \downarrow coin \Rightarrow coin \notin ref)PROFIT1=(trchoc=trcoincoin/ref)

7 发散(Divergence)

7.1 CHAOSCHAOSCHAOS进程

定义混乱的、最不确定的进程CHAOSCHAOSCHAOS,以下算子对CHAOSCHAOSCHAOS是严格的,也即CHAOSCHAOSCHAOS是以下算子的"零"(即结合后的进程仍是CHAOSCHAOSCHAOS):
⊓, /s, ∣∣, f, □, ∖C, ∣∣∣, μX\sqcap, \ / s, \ ||, \ f, \ \Box, \ \setminus C, \ |||, \ \mu X, /s, , f, , C, , μX
CHAOSCHAOSCHAOS进程的特殊行为,在描述规范的tracestracestracesrefusalsrefusalsrefusals操作上,既表现出RUNRUNRUN的特性又表现出STOPSTOPSTOP的特性:
traces(CHAOSA)=traces(RUNA)=A∗refusals(CHAOSA)=refusals(STOPA)=2A traces(CHAOS_A) = traces(RUN_A) = A^* \\ refusals(CHAOS_A) = refusals(STOP_A) = 2^A traces(CHAOSA)=traces(RUNA)=Arefusals(CHAOSA)=refusals(STOPA)=2A

7.2 divergencesdivergencesdivergences操作

进程PPPdivergencesdivergencesdivergences操作得到的是其tracestracestraces操作的子集,仅保留那些经过后会使进程变成混乱的CHAOSCHAOSCHAOS进程的迹:
divergences(P)={s ∣ s∈traces(P)∧(P/s)=CHAOSαP}divergences(P) = \{ s \ | \ s \in traces(P) \wedge (P/s)=CHAOS_{\alpha P}\}divergences(P)={s  straces(P)(P/s)=CHAOSαP}
7.1可以看到,refusalsrefusalsrefusals操作无法区分STOPSTOPSTOPCHAOSCHAOSCHAOS,而divergencesdivergencesdivergences操作可将其区分:
divergences(STOP)=ϕdivergences(CHAOS)=A∗ divergences(STOP) = \phi \\ divergences(CHAOS) = A^* divergences(STOP)=ϕdivergences(CHAOS)=A
但无法区分"⊓\sqcap“和”□\Box"算子:
divergences(P⊓Q)=divergences(P□Q)=divergences(P)∪divergences(Q)divergences(P \sqcap Q) = divergences(P \Box Q) =divergences(P) \cup divergences(Q)divergences(PQ)=divergences(PQ)=divergences(P)divergences(Q)

8 整理

整理一下各个操作在特殊进程上的操作结果:

进程\操作 traces()traces()traces() refusals()refusals()refusals() divergences()divergences()divergences()
P ∣ QP\ \vert \ QP  Q traces(P)∪traces(Q)traces(P) \cup traces(Q)traces(P)traces(Q) refusals(P)∩refusals(Q)refusals(P) \cap refusals(Q)refusals(P)refusals(Q) divergences(P)∪divergences(Q)divergences(P) \cup divergences(Q)divergences(P)divergences(Q)
P ∣∣ QP \ \vert\vert \ QP  Q 课本P53-L1 课本P90-L6 课本P108-L8
P ⊓ QP \ \sqcap \ QP  Q traces(P)∪traces(Q)traces(P) \cup traces(Q)traces(P)traces(Q) refusals(P)∪refusals(Q)refusals(P) \cup refusals(Q)refusals(P)refusals(Q) divergences(P)∪divergences(Q)divergences(P) \cup divergences(Q)divergences(P)divergences(Q)
P □ QP \ \Box \ QP  Q traces(P)∪traces(Q)traces(P) \cup traces(Q)traces(P)traces(Q) refusals(P)∩refusals(Q)refusals(P) \cap refusals(Q)refusals(P)refusals(Q) divergences(P)∪divergences(Q)divergences(P) \cup divergences(Q)divergences(P)divergences(Q)
P ∣∣∣ QP \ \vert\vert\vert \ QP  Q 课本P101-L1 refusals(P)∩refusals(Q)refusals(P) \cap refusals(Q)refusals(P)refusals(Q) 课本P108-L9
STOPASTOP_ASTOPA {⟨⟩}\{ \langle \rangle \}{} 2A2^A2A ϕ\phiϕ
RUNARUN_ARUNA A∗A^*A
CHAOSACHAOS_ACHAOSA A∗A^*A 2A2^A2A A∗A^*A

其中,2A2^A2AAAA的幂集,即AAA的所有子集组成的集合。注意和A∗A^*A(见第一篇2.4)的区分。其实也就是要注意,traces()traces()traces()divergences()divergences()divergences()操作得到的都是迹集合,而refusals()refusals()refusals()操作得到的是动作集合。

另外,还要注意区分"{⟨⟩}\{ \langle \rangle \}{}“和”ϕ\phiϕ",前者是仅包含一个单位迹"⟨⟩\langle \rangle"的集合,后者则是不包含任何元素的空集。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐