本节展示了一个从无限制FIFO缓冲区扩展到有限制FIFO缓冲区的规约的书写过程,有几个需要注意的点:
- 语句用在常量、类型声明和公式中,不过要注意其使用是否合理。
- 在 中,每个值都是一个集合,但不一定是个有限集合。
我们已经定义了一个无限制FIFO缓冲区,它可以容纳无限条消息,但任何真正的系统都只能处理有限数量的资源,因此它只能包含有限条在传输中的消息。在某些情况下,我们希望无视资源限制,使用无限制FIFO来描述系统,在其他情况下,我们可能要关心这个限制。这时候我们可以在无限制FIFO的基础上添加一个消息数量限制 来扩展我们的规约。
有限制FIFO的规约与我们的无限制FIFO规约的唯一区别在于,除非缓冲区中的消息少于N,也就是说,除非 小于N,否则不应该使能动作 。通过复制 模块并在 的定义中添加合取词 ,可以很容易地编写一个完整的有限制FIFO新规约,但从消除重复的角度,让我们直接使用 模块,而不是当一个剪刀手。
有限制FIFO的下一个状态动作 和无限制FIFO的下一个状态动作一样,只除了有限制FIFO只有在 小于 的情况下,才允许执行 步骤。换句话说, 允许一个步骤,当且仅当这个步骤满足下列条件:
- (i)这是一个 步骤;
- (ii)如果这是一个
步骤,则在它的第一个状态中,
必须为真。换句话说,
应该等于
下一页图4.2中的
模块包含了新规约,它引入了新的常量参数
还有假设语句
也就是说,在这个模块中,我们假设 是一个正整数,这种假设对模块中的其他任何定义都没有影响。但是,在证明模块中声明的任何定理时,可以将其作为假设。换句话说,可以在模块中声明,能够从这个假设推导出定理成立。对常量进行这种简单的假设会非常有用。
假设语句最好只用于对常量的假设,对公式使用假设时不应包含任何变量。将类型声明写成假设的形式可能很有诱惑力,例如,在 模块中加入假设 ,然而,这可能是错误的。因为它断言,在任何状态下, 都是消息序列。正如我们在3.3节中所观察到的,状态是对变量的完全随意赋值,因此在某些状态中 的值可以为 。假定这种状态不存在,会导致逻辑上的矛盾。
您可能想知道为什么在模块 中,假设 是一个正整数,而不假设 是一个集合?同样的,为什么不假设异步接口规约中的常量参数 是一个集合?答案是,在 中,每个值都是一个集合。像数字3这样的值,我们不认为它是一个集合,实际上它是。我们只是不知道它的元素是什么。公式 是完全合理的,但是 并没有说明它为真还是假。我们不需要假设 是一个集合因为我们知道它就是。
虽然 自动是一个集合,但它不一定是一个有限的集合。例如, 可以实例化为自然数集合 。如果你想要一个常量参数是一个有限集,那么你需要把它表述为一个假设。(您可以使用 模块中的 运算符来实现这一点,如第6.1节所述。)但是,不限数量的消息数和进程数对大多数规约来说都是完全合理的,因此不需要假定这些集合是有限的。