TLA+ 《Specifying Systems》翻译初稿——Section 4.1 The Inner Specification(内部规约)

本节介绍了FIFO缓冲区规约,重点说明了如何引入其他模块的实例,例如
I n C h a n INSTANCE  C h a n n e l  WITH  D a t a M e s s a g e , c h a n i n InChan \triangleq \text{INSTANCE } Channel \text{ WITH } Data \leftarrow Message, chan \leftarrow in 还顺带介绍了 S e q u e n c e s Sequences 模块的几个运算符。

FIFO规约首先 E x t e n d s Extends 了模块 N a t u r a l s Naturals S e q u e n c e s Sequences S e q u e n c e s Sequences 模块定义有限序列上的运算。我们把一个有限序列表示成一个元组,所以三个数3,2,1的序列是三元组 3 , 2 , 1 \langle 3,2,1\rangle S e q u e n c e s Sequences 模块对序列定义了如下运算符:

  • S e q ( S ) Seq(S) 集合 S S 中任意元素组成的所有序列的集合,例如, 3 , 7 \langle3,7\rangle S e q ( N a t ) Seq(Nat) 的一个元素。
  • H e a d ( s ) Head(s) 序列 s s 的第一个元素。例如, H e a d ( 3 , 7 ) Head(\langle 3,7\rangle) = 3。
  • T a i l s ( s ) Tails(s) 序列s的尾部,它由去掉头部的序列s组成。例如, T a i l ( 3 , 7 ) = 7 Tail(\langle 3,7\rangle) = \langle 7 \rangle
  • A p p e n d ( s , e ) Append(s,e) 将元素e附加到 s s 的尾部得到的序列,例如, A p p e n d ( 3 , 7 , 3 ) = 3.7.3 Append(\langle 3,7\rangle,3) =\langle 3.7.3\rangle
  • s t s \circ t 将序列s和t串联起来得到的序列,例如 3 , 7 3 = 3 , 7 , 3 \langle 3,7\rangle \circ \langle 3\rangle =\langle 3,7,3\rangle 。(我们在ASCIl中输入o作为\o。)
  • L e n ( s ) Len(s) 序列 s s 的长度,例如, L e n ( 3 , 7 ) = 2 Len(\langle 3,7\rangle) = 2

FIFO规约继续声明常量 M e s s a g e Message ,其表示所有可发送消息的集合,接下来声明三个变量: i n in o u t out 代表通道,第三个变量 q q 代表缓冲消息队列。 q q 的值是发送方已发送但接收方尚未接收的消息序列。(第4.3节对这个额外变量 q q 有更多说明)。

我们希望使用 C h a n n e l Channel 模块中的定义来指定 i n in o u t out 通道上的操作。这需要该模块的两个实例:在其中一个实例中, C h a n n e l Channel 模块的变量 c h a n chan 替换为当前模块的变量 i n in , 另一个实例的 c h a n chan 替换为 o u t out 。在这两个实例中, C h a n n e l Channel 模块的常量 D a t a Data 被替换为 M e s s a g e Message 。我们使用下列语句描述第一个实例:
I n C h a n INSTANCE  C h a n n e l  WITH  D a t a M e s s a g e , c h a n i n InChan \triangleq \text{INSTANCE } Channel \text{ WITH } Data \leftarrow Message, chan \leftarrow in

定义在模块 C h a n n e l Channel 中的任意符号 σ \sigma ,与定义在当前模块中的 I n C h a n ! σ InChan!\sigma 有相同的含义,只除了 M e s s a g e Message 代替的 D a t a Data i n in 代替的 c h a n chan 。例如下列语句定义 I n C h a n ! T y p e I n v a r i a n t InChan!TypeInvariant 等于
i n [ v a l : M e s s a g e , r d y : { 0 , 1 } , a c k : { 0 , 1 } ] in \in [val:Message,rdy:\{0,1\},ack:\{0,1\}]

(该语句没有定义 I n C h a n ! D a t a InChan!Data ,是因为 D a t a Data 是在 C h a n n e l Channel 模块中声明而不是定义的。)我们用类似的语句引入 C h a n n l e Channle 模块的第二个实例:
O u t C h a n INSTANCE  C h a n n e l  WITH  D a t a M e s s a g e , c h a n o u t OutChan \triangleq \text{INSTANCE } Channel \text{ WITH } Data \leftarrow Message, chan \leftarrow out
i n in o u t out 通道的初始状态由 I n C h a n ! I n i t InChan!Init O u t C h a n ! I n i t OutChan!Init 指定。最初,没有消息被发送或接收,所以 q q 等于空序列。空序列是0元组(只有一个,它被写为 \langle \rangle )。所以我们将初始谓词定义为:
I n i t I n C h a n ! I n i t O u t C h a n ! I n i t q = \begin{aligned} Init \triangleq & \land InChan!Init \\ &\land OutChan!Init \\ &\land q=\langle \rangle \end{aligned}

接下来定义类型不变量。 i n in o u t out 的类型不变量来自 C h a n n l e Channle 模块,而 q q 的类型是消息的有限序列的集合。因此,FIFO规约的类型不变量是
T y p e I n v a r i a n t I n C h a n ! T y p e I n v a r i a n t O u t C h a n ! T y p e I n v a r i a n t q S e q ( M e s s a g e ) \begin{aligned} TypeInvariant \triangleq & \land InChan!TypeInvariant \\ &\land OutChan!TypeInvariant \\ &\land q\in Seq(Message) \end{aligned}
下一状态动作所允许的四种非重叠步骤由下列四个动作来描述:

  • S S e n d ( m s g ) SSend(msg) 发送方在 i n in 通道上发送消息;
  • B u f R c v BufRcv 缓冲区从 i n in 通道上接收消息,并将之放入 q q 的队尾;
  • B u f S e n d BufSend 缓冲区在 o u t out 通道发送 q q 的队首并将之从 q q 删除;
  • R R c v RRcv 接收方从 o u t out 通道接收消息;

这些动作的定义,以及规约的其余部分,见下一页图4.1的模块 I n n e r F I F O InnerFIFO ,下文第4.3节解释形容词 I n n e r Inner

发布了4 篇原创文章 · 获赞 1 · 访问量 5751

猜你喜欢

转载自blog.csdn.net/robinhzp/article/details/104077879
今日推荐