本节要点
-
Choose v:v∈/S 是一个特定的不确定的值
- 只有一个状态链满足规约
(x=CHOOSE n:n∈Nat)∧□[x′=CHOOSE n:n∈Nat]x
第5.1节的内存接口中通过
Choose v:v∈/S引入了Choose 运算符,这是一个表达式,取值为一个不在S中的元素。在上面的6.3节中,我们看到它是一个功能强大的工具,可以精细化使用它。
Choose 运算符最常见的用途是“命名”唯一指定的值。例如,如果
a和
b是实数且
b=0,则
a/b是满足公式
a=b∗(a/b)的唯一实数。因此,标准模块Reals在实数集Real上定义除法如下:
a/b≜CHOOSE c∈Real:a=b∗c(表达式
CHOOSE x∈S:p表示
CHOOSE x:(x∈S)∧p)。如果
a为非零实数,则不存在实数
c,使得
a=0∗c。因此,
a/0具有不确定的值。我们不知道实数乘以字符串等于什么,所以我们不能说是否存在一个实数
c使得
a等于
“xyz”∗c。因此,我们不知道
a/“xyz”是什么。
用到数学知识比较少的程序员常常认为
CHOOSE是一个不确定的运算符。在数学中,没有诸如不确定性运算符或不确定性函数之类的东西。如果某个表达式今天等于42,则明天等于42,从明天起一百万年后仍等于42。对规约
(x=CHOOSE n:n∈Nat)∧□[x′=CHOOSE n:n∈Nat]x, 只有一个状态链满足它,在这个状态链中,
x的值永远等于
CHOOSE n:n∈Nat,这是一个特定的未指定自然数,这与下列规约有很大不同
(x∈Nat)∧□[x′∈Nat]所有状态下
x始终是自然数的状态链(
x可以不同)都满足上述规约,该规约是高度不确定的,满足它的状态链有很多。