本节通过小时时钟的示例,描述了如何书写一个完整的规约,及规约中各符号的书写方式及含义:
- 规约的两种版本:ASCII版本和TLATEX版本,及两种版本的关系
- 模块的开始,装饰及终止符
-
Naturals模块的两个运算符:
+和
..
-
EXTENDS和
VARIABLE关键字
下一页的图2.1显示了如何在TLA+中编写小时时钟规约,这里有两个版本:底部的ASCII版本是实际的TLA+规约,即您键盘输入的方式;顶部的排版版本是第13章中描述的
TLATEX程序可能产生的版本。在尝试理解规约之前,我们先观察两种语法之间的关系:
- 以小号大写字母(如
EXTENDS)呈现的保留字以普通ASCII大写字母书写。
- 不能与ASCII字符一一对应的情况下,符号尽可能以象形ASCII字符呈现,例如,
□键入为[],
=键入为#(您也可以输入/=代替
=)。
- 没有其他更好ASCII表达的话,则使用TEX表示法[^2],例如
∈ 其键入是 \in,最大的例外是
≜,其键入是==。
TLA+符号和其ASCII等效项的完整列表显示在第273页的表8中。本书所有规约的ASCII版本可通过TLA官网找到。
现在让我们看一下规约的内容:
┌———————– MODULE HourClock ———————–┐
以上面这个标识就开始了名为HourClock的模块。TLA+规约是由模块组成,小时时钟的规约包含这个单独模块。
像+这样的算术运算符并未内置在TLA+中,而是在模块中定义。(您可能想写一个规约,其中+表示矩阵加法而不是数字加法。)自然数的常规运算符在
Naturals模块中定义,可通过以下语句将它们的定义合并到模块
HourClock中:
EXTENDS Naturals
公式中出现的每个符号必须是TLA+的内置运算符,或是声明和定义,例如,
VARIABLE hr声明hr为变量。
为了定义
HCini,我们要正式表示集合
{1,…,12},不能用省略号
…,我们也可以直接书写完整的集合:
{1,3,4,5,6,7,8,9,10,11,12}比较繁琐。这里我们引入定义在
Naturals模块操作符“
..”,将集合记做
{1..12}。推广开来,
i..j表示对任意的
i,j,从
i到
j的所有整数。(如果
j<i,则集合是空集。)现在如何书写
HCini的定义就很明显了,而
HCnxt和
HC定义的书写方式还是如前所述。(普通数学中逻辑和集合论的操作符,如
∧和
∈,也是TLA+的内置运算符。)
下面这条线
⊢——————————————————————————⊣可以出现在语句间的任意位置,它没有其他意义,只是单纯装饰性的。接下来的语句
THEOREM HC⟹□HCini是之前讨论过的定理,它断言在语句上下文中,
HC⟹□HCini为真,更确切地来说,它声明公式从本模块中的定义、
Naturals模块中的定义和TLA+的规则来说,都是遵循逻辑的。如果公式不为真,则模块
HC也不为真。
下面这条线是模块的终止符号:
└—————————————————————————————————————┘
小时时钟的规约即
HC的定义,包括
HCnxt和
HCini公式的定义以及
HC定义中出现的运算符
..和
+的定义。形式上,模块中没有任何内容告诉我们
HC而非
HCini是小时时钟的规约。 TLA+是一种用来书写数学的语言,特别是用于书写数学定义和定理。 这些定义代表什么,以及我们对这些定理的重视程度在数学范围之外,也在TLA+范围之外。 工程师们不仅需要有使用数学工具的能力,还需要有理解数学模型的能力。
扫描二维码关注公众号,回复:
8804162 查看本文章