TLA+ 《Specifying Systems》翻译初稿——Section 4.4 A Bounded FIFO(有限制FIFO)

本节展示了一个从无限制FIFO缓冲区扩展到有限制FIFO缓冲区的规约的书写过程,有几个需要注意的点:

  • ASSUME \text{ASSUME} 语句用在常量、类型声明和公式中,不过要注意其使用是否合理。
  • T L A + TLA^+ 中,每个值都是一个集合,但不一定是个有限集合。

我们已经定义了一个无限制FIFO缓冲区,它可以容纳无限条消息,但任何真正的系统都只能处理有限数量的资源,因此它只能包含有限条在传输中的消息。在某些情况下,我们希望无视资源限制,使用无限制FIFO来描述系统,在其他情况下,我们可能要关心这个限制。这时候我们可以在无限制FIFO的基础上添加一个消息数量限制 N N 来扩展我们的规约。

有限制FIFO的规约与我们的无限制FIFO规约的唯一区别在于,除非缓冲区中的消息少于N,也就是说,除非 L e n ( q ) Len(q) 小于N,否则不应该使能动作 B u f R c v BufRcv 。通过复制 I n n e r F I F O InnerFIFO 模块并在 B u f R c v BufRcv 的定义中添加合取词 L e n ( q ) < N Len(q) < N ,可以很容易地编写一个完整的有限制FIFO新规约,但从消除重复的角度,让我们直接使用 I n n e r F l F O InnerFlFO 模块,而不是当一个剪刀手。

有限制FIFO的下一个状态动作 B N e x t BNext 和无限制FIFO的下一个状态动作一样,只除了有限制FIFO只有在 L e n ( q ) Len (q) 小于 N N 的情况下,才允许执行 B u f R c v BufRcv 步骤。换句话说, B N e x t BNext 允许一个步骤,当且仅当这个步骤满足下列条件:

  • (i)这是一个 N e x t Next 步骤;
  • (ii)如果这是一个 B u f R c v BufRcv 步骤,则在它的第一个状态中, L e n ( q ) < N Len(q)<N 必须为真。换句话说, B N e x t BNext 应该等于
    N e x t ( B u f R c v       ( L e n ( q ) < N ) ) Next \land (BufRcv \implies (Len(q)<N))

下一页图4.2中的 B o u n d e d F I F O BoundedFIFO 模块包含了新规约,它引入了新的常量参数 N N 还有假设语句 ASSUME  ( N N a t ) ( N > 0 ) \text{ASSUME }(N \in Nat)\land (N > 0)
在这里插入图片描述

也就是说,在这个模块中,我们假设 N N 是一个正整数,这种假设对模块中的其他任何定义都没有影响。但是,在证明模块中声明的任何定理时,可以将其作为假设。换句话说,可以在模块中声明,能够从这个假设推导出定理成立。对常量进行这种简单的假设会非常有用。

假设语句最好只用于对常量的假设,对公式使用假设时不应包含任何变量。将类型声明写成假设的形式可能很有诱惑力,例如,在 I n n e r F I F O InnerFIFO 模块中加入假设 q S e q ( M e s s s a g e ) q\in Seq(Messsage) ,然而,这可能是错误的。因为它断言,在任何状态下, q q 都是消息序列。正如我们在3.3节中所观察到的,状态是对变量的完全随意赋值,因此在某些状态中 q q 的值可以为 17 \sqrt{-17} 。假定这种状态不存在,会导致逻辑上的矛盾。

您可能想知道为什么在模块 B o u n d e d F I F O BoundedFIFO 中,假设 N N 是一个正整数,而不假设 M e s s a g e Message 是一个集合?同样的,为什么不假设异步接口规约中的常量参数 D a t a Data 是一个集合?答案是,在 T L A + TLA^+ 中,每个值都是一个集合。像数字3这样的值,我们不认为它是一个集合,实际上它是。我们只是不知道它的元素是什么。公式 2 3 2\in 3 是完全合理的,但是 T L A + TLA^+ 并没有说明它为真还是假。我们不需要假设 M e s s a g e Message 是一个集合因为我们知道它就是。

虽然 M e s s a g e Message 自动是一个集合,但它不一定是一个有限的集合。例如, M e s s a g e Message 可以实例化为自然数集合 N a t Nat 。如果你想要一个常量参数是一个有限集,那么你需要把它表述为一个假设。(您可以使用 F i n i t e S e t FiniteSet 模块中的 I s F i n i t e S e t IsFiniteSet 运算符来实现这一点,如第6.1节所述。)但是,不限数量的消息数和进程数对大多数规约来说都是完全合理的,因此不需要假定这些集合是有限的。

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

猜你喜欢

转载自blog.csdn.net/robinhzp/article/details/104093718