本节要点:
- 模块 S e q u e n c e s Sequences Sequences定义了有限序列为元组,因此,长度为 n n n的序列就是一个定义域为 1.. n 1..n 1..n的函数
在编写缓存内存规约之前,让我们仔细回顾一下元组: ⟨ a , b , c ⟩ \langle a, b, c\rangle ⟨a,b,c⟩是 T L A + TLA^+ TLA+中包含元素 a , b , c a, b, c a,b,c的三元组。这个三元组实际上是定义域 { 1 , 2 , 3 } \{1,2,3\} {1,2,3}的函数,它将 1 1 1映射到 a , 2 a, 2 a,2映射到 b , 3 b,3 b,3映射到 c c c。因此 ⟨ a , b , c ⟩ [ 2 ] \langle a, b, c\rangle[2] ⟨a,b,c⟩[2]等于 b b b。
T L A + TLA^+ TLA+提供普通数学的笛卡儿积算子 × \times ×,这里 A × B × C A \times B \times C A×B×C是包含所有三元组 ⟨ a , b , c ⟩ \langle a, b, c\rangle ⟨a,b,c⟩的集合,使得 a ∈ A , b ∈ B , c ∈ C a \in A,b \in B, c \in C a∈A,b∈B,c∈C。注意到 A × B × C A \times B \times C A×B×C不同于 A × ( B × C ) A \times (B \times C) A×(B×C),后者是 ⟨ a , p ⟩ \langle a,p\rangle ⟨a,p⟩的集合,其中 a ∈ A , p ∈ B × C a \in A, p \in B \times C a∈A,p∈B×C。
模块 S e q u e n c e s Sequences Sequences定义了有限序列为元组,因此,长度为 n n n的序列就是一个定义域为 1.. n 1..n 1..n的函数。事实上, s s s是一个序列当且仅当 [ i ∈ 1.. L e n ( s ) ↦ s [ i ] ] [i \in 1..Len(s) \mapsto s[i]] [i∈1..Len(s)↦s[i]]。接下来是一些定义在模块 S e q u e n c e s Sequences Sequences的运算符。(运算符的定义在第4.1节有描述。)
H e a d ( s ) ≜ s [ 1 ] Head(s) \triangleq s[1] Head(s)≜s[1]
T a i l s ( s ) ≜ [ i ∈ 1.. L e n ( s ) − 1 ↦ s [ i + 1 ] ] Tails(s) \triangleq [i \in 1..Len(s)-1 \mapsto s[i+1]] Tails(s)≜[i∈1..Len(s)−1↦s[i+1]]
s ∘ t ≜ [ i ∈ 1.. L e n ( s ) + L e n ( t ) ↦ IF i ≤ L e n ( s ) THEN s [ i ] ELSE t [ i − L e n ( s ) ] ] s \circ t \triangleq [i \in 1..Len(s)+Len(t) \mapsto \\ \qquad \text{ IF }i\leq Len(s)\text{ THEN }s[i]\text{ ELSE }t[i-Len(s)]] s∘t≜[i∈1..Len(s)+Len(t)↦ IF i≤Len(s) THEN s[i] ELSE t[i−Len(s)]]