TLA+ 《Specifying Systems》翻译初稿——Section 3.5 Comments(注释)

本节展示了TLA+中两种注释方式:行间注释(* *)和行内注释/* 及与注释有关的几个方面:

  • 注释非常重要,应尽可能多地注释、在合适地方注释以方便读者阅读规约;
  • 适当地拆分模块可以使大型规约更易于阅读,首先确定阅读的顺序,再组织模块结构,最后在各模块中添加合理注释以提升阅读体验;

单从纯数学角度理解像模块 A s y n c h I n t e r f a c e AsynchInterface C h a n n e l Channel 这样的简单规约也非常困难,这也是我从接口开始直观讲解的原因,这种讲解可使您更容易理解模块中的公式 S p e c Spec ,这是实际规约。每个规约都应附有非正式的行文说明,该解释可以在随附的文档中,也可以作为注释包含在规约中。

下面的图3.3展示了如何通过注释帮助解释 H o u r C l o c k HourClock 模块中的小时时钟规约。在 T L A T E X TLATEX 排版版本中,注释通过使用其他字体与规约本身区分开。如图所示,TLA+提供了两种以ASCII版本编写注释的方法。注释可能会出现在“(”和“)”之间的任何地方,行尾注释以“\*”开头。注释可能是嵌套的,因此您可以通过将规约的一部分括在(),即使该部分包含注释。

注释几乎总是单独出现在一行中或一行的末尾。我在 H C n x t HCnxt \triangleq 之间添加了一条注释,以表明可以这么做。

为了节省空间,我将在示例规约中添加少量注释,但是规约中应该包含很多注释,即使有随附的描述系统的文档,也需要注释帮助读者理解规约是如何将该描述形式化的。

在这里插入图片描述

注释可以帮助解决由规约的逻辑结构引起的问题。必须先声明或定义符号,之后才能使用它。在 C h a n n e l Channel 模块中, S p e c Spec 的定义必须遵循 N e x t Next 的定义,而后者必须遵循 S e n d Send R c v Rcv 的定义。但是,通常最容易理解的方式是自上而下的系统描述。我们可能首先要阅读 D a t a Data c h a n chan 的声明,然后是 S p e c Spec 的定义,接着是 I n i t Init N e x t Next 的定义,最后才是 S e n d Send R c v Rcv 的定义。换句话说,我们希望或多或少从下至上地阅读规约。对于较短的如 C h a n n e l Channel 这样的模块来说,这很容易完成;但对于较长的规约就不那么方便了。我们可以使用注释来指导读者阅读更长的规约。例如,我们可以在 C h a n n e l Channel 模块中的 S e n d Send 定义之前加上注释:

接下来的动作 S e n d Send R c v Rcv n e x t s t a t e \footnotesize{next-state} 动作 N e x t Next 的析取词。

模块结构还允许我们指定读取规约的顺序。例如,我们可以通过将 H o u r C l o c k HourClock 模块拆分为三个单独的模块来重写小时时钟规约:

  • H C V a r HCVar 模块中声明变量 h r hr
  • H C A c t i o n s HCActions 模块中引入 N a t u r a l s Naturals H C V a r HCVar 模块,并定义 H C i n i HCini H C n x t HCnxt
  • H C S p e c HCSpec 模块引入模块 H C A c t i o n s HCActions ,定义公式 H C HC 并声明类型正确性定理。

EXTENDS \text{EXTENDS} 关系隐含了模块的逻辑顺序: H C V a r HCVar H C A c t i o n s HCActions 之前, H C A c t i o n s HCActions H C S p e c HCSpec 之前。但是不必按此顺序阅读模块。可以告知读者首先阅读 H C V a r HCVar ,然后阅读 H C S p e c HCSpec ,最后才到 H C A c t i o n s HCActions 。下面第4章引入的 INSTANCE \text{INSTANCE} 提供了另一种用于模块化规约的工具。

以这种方式拆分像 H o u r C l o c k HourClock 这样的微小规约看起来很荒谬,但是适当地拆分模块可以使大型规约更易于阅读。在编写规约时,您应该先决定按什么顺序阅读最舒服,然后再设计组织模块结构,以方便按设定的顺序阅读,同时也允许按从头至尾的顺序阅读单个模块。最后,您应该确保以适当的顺序阅读不同的模块时,其中的注释能提升阅读体验。

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

猜你喜欢

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