本节提供了小时时钟规约的另一种书写方式,提出了一种在有多种表达方式下,规约的选择策略。
N
a
t
u
r
a
l
s
Naturals
N a t u r a l s 模块还定义了取模运算符,我们将其写为
%
\%
% 。公式
i
%
n
i \% n
i % n ,数学中也写作
i
mod
n
i\text{ mod }n
i mod n 是
i
i
i 除以
n
n
n 的余数,更正式地说,
i
%
n
i \% n
i % n 是小于
n
n
n 的自然数,对于某些自然数
q
q
q ,满足
i
=
q
∗
n
+
(
i
%
n
)
i = q*n +(i\%n)
i = q ∗ n + ( i % n ) 。让我们以更数学化的方式表达此条件,
N
a
t
u
r
a
l
s
Naturals
N a t u r a l s 模块将
N
a
t
Nat
N a t 定义为自然数的集合,并且在集合
N
a
t
Nat
N a t 中存在满足公式
F
F
F 的值
q
q
q ,此断言记做
∃
q
∈
N
a
t
:
F
\exists q \in Nat:F
∃ q ∈ N a t : F ,因此,如果
i
i
i 和
n
n
n 是
N
a
t
Nat
N a t 的元素且
n
>
0
n> 0
n > 0 ,则
i
%
n
i\% n
i % n 是满足下式的唯一值:
(
i
%
n
∈
0..
(
n
−
1
)
)
∧
(
∃
q
∈
N
a
t
:
i
=
q
∗
n
+
(
i
%
n
)
)
(i \% n \in 0..(n-1)) \land (\exists q \in Nat:i = q*n+(i\% n))
( i % n ∈ 0 . . ( n − 1 ) ) ∧ ( ∃ q ∈ N a t : i = q ∗ n + ( i % n ) ) 我们可以使用
%
\%
% 来简化我们的小时规约。注意到
(
11
%
12
)
+
1
(11\% 12)+1
( 1 1 % 1 2 ) + 1 等于12, 且
(
12
%
12
)
+
1
(12 \% 12)+1
( 1 2 % 1 2 ) + 1 等于1,我们可以定义一个不同的下一状态动作
H
C
n
x
t
2
HCnxt2
H C n x t 2 和一个不同的公式
H
C
2
HC2
H C 2 作为小时时钟规约:
H
C
n
x
t
2
≜
h
r
′
=
(
h
r
%
12
)
+
1
HCnxt2 \triangleq hr'=(hr \% 12)+1
H C n x t 2 ≜ h r ′ = ( h r % 1 2 ) + 1
H
C
2
≜
H
C
i
n
i
∧
□
[
H
C
n
x
t
2
]
h
r
HC2 \triangleq HCini \land \square[HCnxt2]_{hr}
H C 2 ≜ H C i n i ∧ □ [ H C n x t 2 ] h r
动作
H
C
n
x
t
HCnxt
H C n x t 和
H
C
n
x
t
2
HCnxt2
H C n x t 2 不等价。步骤
[
h
r
=
24
]
→
[
h
r
=
25
]
[hr = 24]\rightarrow [hr = 25]
[ h r = 2 4 ] → [ h r = 2 5 ] 满足
H
C
n
x
t
HCnxt
H C n x t 但不满足
H
C
n
x
t
2
HCnxt2
H C n x t 2 ,而步骤
[
h
r
=
24
]
→
[
h
r
=
1
]
[hr = 24]\rightarrow [hr = 1]
[ h r = 2 4 ] → [ h r = 1 ] 满足
H
C
n
x
t
2
HCnxt2
H C n x t 2 但不满足
H
C
n
x
t
HCnxt
H C n x t 。但是,以
h
r
∈
1..12
hr \in 1 .. 12
h r ∈ 1 . . 1 2 状态开始的任何步骤都满足
H
C
n
x
t
HCnxt
H C n x t ,也同时满足
H
C
n
x
t
2
HCnxt2
H C n x t 2 。因此,不难推断出任何以满足
H
C
i
n
i
HCini
H C i n i 状态开始的,且满足
□
[
H
C
n
x
t
]
h
r
\square [HCnxt]_{hr}
□ [ H C n x t ] h r 的行为也满足
□
[
H
C
n
x
t
2
]
h
r
\square [HCnxt2]_{hr}
□ [ H C n x t 2 ] h r 。因此,公式
H
C
HC
H C 和
H
C
2
HC2
H C 2 是等价的。换句话说,
H
C
≡
H
C
2
HC \equiv HC2
H C ≡ H C 2 是一个定理。因此指定小时时钟的规约是两个公式中的哪一个都没关系。
数学提供了无数种表达同一事物的不同方式。表达式
6
+
6
6+6
6 + 6 、
3
∗
4
3*4
3 ∗ 4 和
141
−
129
141-129
1 4 1 − 1 2 9 都具有相同的含义:它们只是数字
12
12
1 2 的不同表达方式。我们可以用上述任一表达式替换
H
o
u
r
C
l
o
c
k
HourClock
H o u r C l o c k 模块中数字
12
12
1 2 的任何一个实例,而无需更改模块公式的任一含义。
在编写规约时,我们通常会面临同一事物有多种表达方式的选择,遇到这种情况时,首先应确保这些规约都是等价的,如果是,选择一种最容易理解的,如果不是,那么,需要确认哪一种是真正想要的。